aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport
Commit message (Collapse)AuthorAgeFilesLines
* define hash on durationlsylvester2014-10-032-0/+8
|
* Merge pull request #17088 from robin850/jruby-devRafael Mendonça França2014-10-011-1/+1
|\ | | | | Follow up to #16613
| * Follow up to #16613Robin Dupret2014-09-281-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | Since we want this flag to be enabled anytime we are running the tests under JRuby, let's enable this at the Rakefile level so people get the performance boost on their local checkout. Moreover, we avoid having to update this particular line anytime the option changes on the JRuby side. The only drawback is that we have to define it in every Rakefile but there's no big deal, this is already the case for other options.
* | fixes typo in AS CHANGELOG [ci skip]Xavier Noria2014-09-291-2/+2
| | | | | | | | References f92ac24.
* | Merge pull request #17093 from ↵Aaron Patterson2014-09-291-6/+15
|\ \ | | | | | | | | | | | | phiggins/remove-dynamic-send-on-built-in-callbacks Reduce allocations when running AR callbacks.
| * | Reduce allocations when running AR callbacks.Pete Higgins2014-09-281-6/+15
| |/ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Inspired by @tenderlove's work in c363fff29f060e6a2effe1e4bb2c4dd4cd805d6e, this reduces the number of strings allocated when running callbacks for ActiveRecord instances. I measured that using this script: ``` require 'objspace' require 'active_record' require 'allocation_tracer' ActiveRecord::Base.establish_connection adapter: "sqlite3", database: ":memory:" ActiveRecord::Base.connection.instance_eval do create_table(:articles) { |t| t.string :name } end class Article < ActiveRecord::Base; end a = Article.create name: "foo" a = Article.find a.id N = 10 result = ObjectSpace::AllocationTracer.trace do N.times { Article.find a.id } end result.sort.each do |k,v| p k => v end puts "total: #{result.values.map(&:first).inject(:+)}" ``` When I run this against master and this branch I get this output: ``` pete@balloon:~/projects/rails/activerecord$ git checkout master M Gemfile Switched to branch 'master' pete@balloon:~/projects/rails/activerecord$ bundle exec ruby benchmark_allocation_with_callback_send.rb > allocations_before pete@balloon:~/projects/rails/activerecord$ git checkout remove-dynamic-send-on-built-in-callbacks M Gemfile Switched to branch 'remove-dynamic-send-on-built-in-callbacks' pete@balloon:~/projects/rails/activerecord$ bundle exec ruby benchmark_allocation_with_callback_send.rb > allocations_after pete@balloon:~/projects/rails/activerecord$ diff allocations_before allocations_after 39d38 < {["/home/pete/projects/rails/activesupport/lib/active_support/callbacks.rb", 81]=>[40, 0, 0, 0, 0, 0]} 42c41 < total: 630 --- > total: 590 ``` In addition to this, there are two micro-optimizations present: * Using `block.call if block` vs `yield if block_given?` when the block was being captured already. ``` pete@balloon:~/projects$ cat benchmark_block_call_vs_yield.rb require 'benchmark/ips' def block_capture_with_yield &block yield if block_given? end def block_capture_with_call &block block.call if block end def no_block_capture yield if block_given? end Benchmark.ips do |b| b.report("block_capture_with_yield") { block_capture_with_yield } b.report("block_capture_with_call") { block_capture_with_call } b.report("no_block_capture") { no_block_capture } end pete@balloon:~/projects$ ruby benchmark_block_call_vs_yield.rb Calculating ------------------------------------- block_capture_with_yield 124979 i/100ms block_capture_with_call 138340 i/100ms no_block_capture 136827 i/100ms ------------------------------------------------- block_capture_with_yield 5703108.9 (±2.4%) i/s - 28495212 in 4.999368s block_capture_with_call 6840730.5 (±3.6%) i/s - 34169980 in 5.002649s no_block_capture 5821141.4 (±2.8%) i/s - 29144151 in 5.010580s ``` * Defining and calling methods instead of using send. ``` pete@balloon:~/projects$ cat benchmark_method_call_vs_send.rb require 'benchmark/ips' class Foo def tacos nil end end my_foo = Foo.new Benchmark.ips do |b| b.report('send') { my_foo.send('tacos') } b.report('call') { my_foo.tacos } end pete@balloon:~/projects$ ruby benchmark_method_call_vs_send.rb Calculating ------------------------------------- send 97736 i/100ms call 151142 i/100ms ------------------------------------------------- send 2683730.3 (±2.8%) i/s - 13487568 in 5.029763s call 8005963.9 (±2.7%) i/s - 40052630 in 5.006604s ``` The result of this is making typical ActiveRecord operations slightly faster: https://gist.github.com/phiggins/e46e51dcc7edb45b5f98
* / Use Hash#each_key instead of Hash#keys.eachErik Michaels-Ober2014-09-291-1/+1
|/ | | | | | Hash#keys.each allocates an array of keys; Hash#each_key iterates through the keys without allocating a new array. This is the reason why Hash#each_key exists.
* Preparing for 4.2.0.beta2 releaseRafael Mendonça França2014-09-261-1/+1
|
* Fix another false assertionsYuki Nishijima2014-09-211-2/+2
| | | | | | | | | | | | * The assertions in AS::Duration don't actually assert. * The assertion in Railtie will pass even when `eager_load_namespaces` doesn't include `AppTemplate::Application` if `Rails.application` is truthy. For more details, see here: * https://github.com/rails/rails/pull/16998 * https://github.com/rails/rails/pull/17000
* [ci skip] Reword a comment in concern's documentationGenadi Samokovarov2014-09-191-1/+1
| | | | | Nothing biggie. Skimmed through `ActiveSupport::Concern` docs these days and this one comment seemed a bit off.
* Delegation works with reserved words passed to `:to`Agis-2014-09-193-1/+26
| | | | Fixes #16956.
* Merge pull request #16950 from akshay-vishnoi/docs-rails-4point2Abdelkader Boudih2014-09-171-4/+4
|\ | | | | Grammar correction in ActiveSupport CHANGELOG [ci skip]
| * Grammar correction in ActiveSupport CHANGELOG [ci skip]Akshay Vishnoi2014-09-181-4/+4
| |
* | Merge pull request #16948 from akshay-vishnoi/docs-rails-4point2Rafael Mendonça França2014-09-172-20/+21
|\| | | | | [ci skip] ActiveSupport CHANGELOG fixes
| * [ci skip] ActiveSupport CHANGELOG fixesAkshay Vishnoi2014-09-182-20/+21
| | | | | | | | | | | | | | 1. spacing issues 2. spelling correction 3. grammar correction 4. Add missing docs
* | Merge pull request #11794 from yoazt/duration-eqlRafael Mendonça França2014-09-173-1/+22
|\ \ | |/ |/| | | | | | | | | | | | | Added method `#eql?` to `ActiveSupport::Duration`, in addition to `#==`. Conflicts: activesupport/CHANGELOG.md activesupport/lib/active_support/duration.rb activesupport/test/core_ext/duration_test.rb
| * Added method `#eql?` to `ActiveSupport::Duration`, in addition to `#==`.Joost Lubach2013-08-073-0/+29
| | | | | | | | | | | | | | | | | | | | | | | | | | Currently, the following returns `false`, contrary to expectation: 1.minute.eql?(1.minute) Adding method `#eql?` will make this behave like expected. Method `#eql?` is just a bit stricter than `#==`, as it checks whether the argument is also a uration. Their parts may be different though. 1.minute.eql?(60.seconds) # => true 1.minute.eql?(60) # => false
* | As of Unicode 6.3, Mongolian Vowel Separator is not whitespaceMatthew Draper2014-09-153-5/+4
| | | | | | | | | | Ruby 2.2 knows this, and no longer matches it with [[:space:]], so it's not a good candidate for testing String#squish.
* | add implementation of respond_to? for ActiveSupport::Durationlsylvester2014-09-153-2/+19
| |
* | Time#change can now change nanoseconds (:nsec)Agis-2014-09-143-6/+25
| | | | | | | | Closes #16392.
* | Changes "if secret.nil?" to unless secret in MessageVerfierKostiantyn Kahanskyi2014-09-121-1/+1
| |
* | MessageVerifier raises an appropriate exception if the secret is nilKostiantyn Kahanskyi2014-09-123-0/+13
| | | | | | | | | | Otherwise this will lead to another error later on when generating a signature: TypeError (no implicit conversion of nil into String).
* | Define the configuration at Active SupportRafael Mendonça França2014-09-112-10/+17
| |
* | Default to sorting user's test cases for nowGodfrey Chan2014-09-084-7/+86
| | | | | | | | | | | | | | | | | | | | | | Goals: 1. Default to :random for newly generated applications 2. Default to :sorted for existing applications with a warning 3. Only show the warning once 4. Only show the warning if the app actually uses AS::TestCase Fixes #16769
* | Fix for inflector's incorrect camelCase replacement for acronymsMatthew Draper2014-09-064-1/+10
| | | | | | | | | | | | Fixes #8015, #9756. [Fred Wu & Matthew Draper]
* | Time#change throws exception with an out-of-range :usecAgis-2014-09-043-0/+7
| | | | | | | | | | | | | | | | | | | | https://github.com/rails/rails/commit/98b46bf5e201307cae56ee14bf41363a539779c5 did not properly handled out-of-range `:usec`s. Passing a `:usec` that's out of range now throws an `ArgumentError` as it should. Fixes #16759.
* | Methods are not duplicable.Peter Jaros2014-09-033-1/+16
| |
* | Leave all our tests as order_dependent! for nowMatthew Draper2014-09-021-0/+5
| | | | | | | | | | | | | | | | | | We're seeing too many failures to believe otherwise. This reverts commits bc116a55ca3dd9f63a1f1ca7ade3623885adcc57, cbde413df3839e06dd14e3c220e9800af91e83ab, bf0a67931dd8e58f6f878b9510ae818ae1f29a3a, and 2440933fe2c27b27bcafcd9019717800db2641aa.
* | Merge pull request #16450 from ↵Yves Senn2014-09-025-5/+48
|\ \ | | | | | | | | | | | | | | | tgxworld/dont_swallow_error_when_identifying_constant_from_test_name Do not swallow exception on NameError within constant.
| * | Use `safe_constantize`.Guo Xiang Tan2014-09-024-5/+41
| | | | | | | | | | | | Fixes https://github.com/rails/rails/issues/9933.
* | | remove trailing whitespace. [ci skip]Yves Senn2014-09-021-2/+2
|/ /
* | Refer to the library name instead of the constantRobin Dupret2014-08-301-1/+1
| | | | | | | | | | | | | | | | | | When we are loading a component and we want to know its version, we are actually not speaking about the constant but the library itself. [ci skip] [Godfrey Chan & Xavier Noria]
* | Bring back the test cases for `presence`Godfrey Chan2014-08-291-0/+5
| | | | | | | | This was removed by mistake in 5e51bdd
* | reduce object allocations in utc_offsetAaron Patterson2014-08-291-2/+2
| | | | | | | | | | | | `try` allocates an array on every call, we should avoid calling it in hotspots. This reduced AttributeMethodsTest#test_setting_time_zone_aware_attribute_with_string from 18k allocations to 14k
* | We tenderized the wrong method! Object#try already had the yield option, ↵David Heinemeier Hansson2014-08-295-34/+20
| | | | | | | | just needed some tenderloving instance_eval to fit the bill
* | Clarify the origin of this great addition to Rails :trollface: :trollface ↵David Heinemeier Hansson2014-08-291-1/+1
| | | | | | | | :trollface:
* | Use instance_eval on @tenderlove's suggestion :trollface:David Heinemeier Hansson2014-08-293-7/+8
| |
* | Update examples to show real worthDavid Heinemeier Hansson2014-08-292-2/+11
| |
* | Added yield to Object#presenceDavid Heinemeier Hansson2014-08-293-1/+23
| |
* | Merge branch 'master' of github.com:rails/railsDavid Heinemeier Hansson2014-08-2910-8/+31
|\ \
| * | Keep the first string we fetchMatthew Draper2014-08-271-1/+1
| | | | | | | | | | | | Otherwise, it's possible for GC to run in between, and fail the test.
| * | [ci skip] use proper apostropheankit19102014-08-251-1/+1
| | |
| * | Skip #eql? tests on Rubinius for AS::DurationRobin Dupret2014-08-241-0/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | Since Rubinius is relying on #instance_of? for its definition of #eql? (http://git.io/MtmbbA) but ActiveSupport::Duration should behave like is_a? it returns true with `Fixnum`. Thus, for the moment, the last assertion is failing so we have to skip this test.
| * | Follow-up to #16560Robin Dupret2014-08-243-9/+11
| | | | | | | | | | | | | | | | | | | | | For the sake of backward-compatibility, we need to make #instance_of? return true for Fixnum. On the other hand, the method should still give true for ActiveSupport::Duration itself which was not the case before.
| * | Use zero-padding for number_to_rounded_converterZachary Scott2014-08-221-1/+1
| | |
| * | Merge pull request #16560 from robin850/rbx-duration-eqlRafael Mendonça França2014-08-223-2/+16
| |\ \ | | | | | | | | Define the Duration#instance_of? method
| | * | Define the Duration#instance_of? methodRobin Dupret2014-08-183-2/+16
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Since Duration is extending from ProxyObject which extends itself from BasicObject, the Duration object doesn't respond to the #instance_of? method. Thus, the #method_missing hook get triggered, delegating the method to its `value` attribute. However, Rubinius' #eql? definition relies on #instance_of?, thus this will equal to true with a Fixnum (since its `value` attribute is a Fixnum) while it should not. The previous behavior was wrong anyway, no matter the implementation.
| * | | Fixes the digits counter of AS's NumberToRoundedConverterXavier Noria2014-08-202-1/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Zero has one digit, but Math.log10(0) returns -Infinity. The method needs to special-case zero. The patch adds a regression test that is not clearly related to the underlying issue because digit_count is private and has no coverage. Gray area. This bug was uncovered by 60062cf.
| * | | Merge pull request #16573 from zzak/test_test_to_test_case_testSantiago Pastorino2014-08-201-0/+0
| |\ \ \ | | | | | | | | | | Move as/test_test to as/test_case_test
| | * | | Move as/test_test to as/test_case_testZachary Scott2014-08-191-0/+0
| | | | |