aboutsummaryrefslogtreecommitdiffstats
Commit message (Collapse)AuthorAgeFilesLines
* Prevent extra string allocations when no 'rel' arg passedDillon Welch2017-10-261-3/+7
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Do a check if the 'rel' argument is passed in, and simply set it to 'nofollow' if 'rel' was not passed in. This prevents three string allocations for each call to `link_to` in that scenario. In the scenario where the 'rel' argument is passed in, performance is around the same as before as the `key?` check is very fast. ```ruby begin require "bundler/inline" rescue LoadError => e $stderr.puts "Bundler version 1.10 or later is required. Please update your Bundler" raise e end gemfile(true) do source "https://rubygems.org" gem "benchmark-ips" gem "rails" end def allocate_count GC.disable before = ObjectSpace.count_objects yield after = ObjectSpace.count_objects after.each { |k,v| after[k] = v - before[k] } after[:T_HASH] -= 1 # probe effect - we created the before hash. GC.enable result = after.reject { |k,v| v == 0 } GC.start result end @hash = {} def master_version "#{@hash['rel'.freeze]} nofollow".lstrip end def fast_version if @hash.key?('rel'.freeze) "#{@hash["rel"]} nofollow".lstrip else "nofollow".freeze end end puts 'no rel key' puts "master_version" puts allocate_count { 1000.times { master_version } } puts "fast_version" puts allocate_count { 1000.times { fast_version } } Benchmark.ips do |x| x.report("master_version") { master_version } x.report("fast_version") { fast_version } x.compare! end puts 'rel key' @hash['rel'] = 'hi'.freeze puts "master_version" puts allocate_count { 1000.times { master_version } } puts "fast_version" puts allocate_count { 1000.times { fast_version } } Benchmark.ips do |x| x.report("master_version") { master_version } x.report("fast_version") { fast_version } x.compare! end ``` ``` no rel key master_version {:FREE=>-2791, :T_STRING=>3052} fast_version {:FREE=>-1} Warming up -------------------------------------- master_version 80.324k i/100ms fast_version 200.262k i/100ms Calculating ------------------------------------- master_version 2.049M (±11.9%) i/s - 10.121M in 5.025613s fast_version 6.645M (±21.3%) i/s - 29.439M in 5.007488s Comparison: fast_version: 6644506.3 i/s master_version: 2048833.0 i/s - 3.24x slower rel key master_version {:FREE=>-2001, :T_STRING=>2000} fast_version {:FREE=>-2001, :T_STRING=>2000} Warming up -------------------------------------- master_version 155.673k i/100ms fast_version 106.515k i/100ms Calculating ------------------------------------- master_version 2.652M (±20.4%) i/s - 12.610M in 5.036494s fast_version 2.237M (±16.8%) i/s - 10.865M in 5.035366s Comparison: master_version: 2651702.2 i/s fast_version: 2237470.6 i/s - same-ish: difference falls within error ```
* Merge pull request #30682 from ahorek/fix_scope_forRyuta Kamizono2017-10-276-1/+11
|\ | | | | delegate scope_for on PolymorphicReflection
| * delegate scope forpavel2017-10-276-1/+11
| |
* | Merge pull request #30995 from ahorek/fix_initial_countRyuta Kamizono2017-10-272-1/+5
|\ \ | |/ |/| fix initial count
| * fix initial countpavel2017-10-272-1/+5
|/
* Merge pull request #30674 from prognostikos/allow_procs_for_length_validatorRafael França2017-10-263-2/+43
|\ | | | | Allow passing a Proc or Symbol as an argument to length validator values
| * Allow passing a Proc or Symbol as an argument to length validator valuesMatt Rohrer2017-10-263-2/+43
|/ | | | | This brings the Length validator in line with the Numericality validator, which currently supports Proc & Symbol arguments
* Merge pull request #30991 from y-yagi/remove_mention_about_evented_redisRyuta Kamizono2017-10-261-2/+2
|\ | | | | Remove mention about Evented Redis [ci skip]
| * Remove mention about Evented Redis [ci skip]yuuji.yaginuma2017-10-261-2/+2
| | | | | | | | Evented Redis adapter was removed in 48766e32d31651606b9f68a16015ad05c3b0de2c.
* | Merge pull request #30989 from joevandyk/patch-3Ryuta Kamizono2017-10-261-3/+1
|\ \ | |/ |/| remove incorrect comment about serializable transactions [ci skip]
| * remove incorrect statement about serializable transactionsJoe Van Dyk2017-10-251-3/+1
|/ | | using serializable isolation would prevent the duplicate insert as done in the example from happening
* Merge pull request #30813 from y-yagi/remove_unused_secrets_ymlRyuta Kamizono2017-10-262-36/+0
|\ | | | | Remove unused `secrets.yml` template
| * Remove unused `secrets.yml` templateyuuji.yaginuma2017-10-062-36/+0
| | | | | | | | | | `secrets.yml` no longer used since #30067. Together, removed `app_secret` method that only used in `secrets.yml`
* | Third party adapters doesn't support index orders yetRyuta Kamizono2017-10-261-2/+2
| |
* | Merge pull request #30984 from yahonda/schema_dumper_pgRyuta Kamizono2017-10-262-9/+13
|\ \ | | | | | | Move `extensions` to `PostgreSQL::SchemaDumper`
| * | Implement `PostgreSQL::SchemaDumper#extensions`Yasuo Honda2017-10-252-9/+13
| | | | | | | | | | | | | | | | | | | | | and abstract `SchemaDumper#extensions` is now an empty method. Since #30337, every database adapter has its own `SchemaDumper`. `extensions` are only supported by PostgreSQL database and postgresql database adapter.
* | | Remove CHANGELOG entry that was backported to Rails 5.1.3. [ci skip] (#30986)प्रथमेश Sonpatki2017-10-251-7/+0
| | | | | | | | | - Backport commit: https://github.com/rails/rails/commit/7122a2cdc3634e170129f8b6cabd1e8fbed13c3d
* | | Merge pull request #30965 from kmanzana/masterRafael Mendonça França2017-10-252-0/+22
|\ \ \ | | | | | | | | | | | | Wrap accepted nested attributes params
| * | | checking for nested attributes when attribute names specified to wrap them ↵Kelton Manzanares2017-10-252-6/+21
| | | | | | | | | | | | | | | | as well
| * | | Fixed functionality to include method in params_wrapper.rbRyan Perez2017-10-251-0/+7
|/ / / | | | | | | | | | to properly wrap all attributes, including those which are nested.
* | | Merge pull request #30970 from rohitpaulk/fix-sqlite-3-index-order-dumpRafael França2017-10-253-2/+19
|\ \ \ | | | | | | | | Save index order :desc to schema.rb (sqlite). Fixes #30902
| * | | Avoid using index_xinfo, only available in sqlite >= 3.8.9Paul Kuruvilla2017-10-251-9/+12
| | | |
| * | | Save index order :desc to schema.rb (sqlite). Fixes #30902Paul Kuruvilla2017-10-243-3/+17
| | | | | | | | | | | | | | | | | | | | Although the sqlite adapter supports index sort orders, they weren't being written to db/schema.rb.
* | | | Merge pull request #30982 from willnet/add-space-before-curly-braceRafael França2017-10-251-2/+2
|\ \ \ \ | | | | | | | | | | [ci skip]Add space before closing curly brace
| * | | | [ci skip]Add space before closing curly bracewillnet2017-10-251-2/+2
| | | | |
* | | | | Require capybara 2.15 because we depend on the new puma integrationRafael Mendonça França2017-10-251-1/+1
| |_|/ / |/| | |
* | | | Merge pull request #30513 from y-yagi/fix_30444Akira Matsuda2017-10-252-2/+4
|\ \ \ \ | |/ / / |/| | | Does not include disabled element in params
| * | | Does not include disabled element in paramsyuuji.yaginuma2017-09-032-2/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | In the case of remote, it should be the same behavior as submitting HTML form. Fixes #30444
* | | | Merge pull request #30978 from y-yagi/change_vendor_path_to_app_rootGeorge Claghorn2017-10-241-2/+2
|\ \ \ \ | | | | | | | | | | Change `VENDOR_PATH` to `APP_ROOT` in `bin/yarn`
| * | | | Change `VENDOR_PATH` to `APP_ROOT` in `bin/yarn`yuuji.yaginuma2017-10-251-2/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This variable was initially used to hold the vendor directory. https://github.com/rails/rails/commit/3dac36b Therefore, the variable name `VENDOR_PATH` was appropriate. However, `package.json` is now placed in the root of the project. https://github.com/rails/rails/commit/8e9e943 Therefore, like other bin scripts, I think the variable name `APP_ROOT` is appropriate. https://github.com/rails/rails/blob/2c845f6b03ddf2aa233b00385d24d769a4a34fa6/railties/lib/rails/generators/rails/app/templates/bin/setup.tt#L5 https://github.com/rails/rails/blob/2c845f6b03ddf2aa233b00385d24d769a4a34fa6/railties/lib/rails/generators/rails/app/templates/bin/update.tt#L5
* | | | | Merge pull request #30976 from yahonda/supports_extensions_always_trueRafael França2017-10-246-488/+466
|\ \ \ \ \ | | | | | | | | | | | | `supports_extensions?` return always true since PostgreSQL 9.1
| * | | | | `supports_extensions?` return always true since PostgreSQL 9.1Yasuo Honda2017-10-246-488/+466
|/ / / / / | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | since the minimum version of PostgreSQL currently Rails supports is 9.1, there is no need to handle if `supports_extensions?` Refer https://www.postgresql.org/docs/9.1/static/sql-createextension.html "CREATE EXTENSION"
* | | | | Merge pull request #30975 from ↵Rafael França2017-10-242-33/+10
|\ \ \ \ \ | | | | | | | | | | | | | | | | | | | | | | | | bogdanvlviv/simplify-api-domcumentation-of-durations Simplify API documentation of methods that return a Duration
| * | | | | Simplify API documentation of methods that return a Durationbogdanvlviv2017-10-242-33/+10
|/ / / / / | | | | | | | | | | | | | | | Related to #30972
* | | | | Merge pull request #30972 from jcmfernandes/update-core_ext-time-documentationRafael França2017-10-243-11/+39
|\ \ \ \ \ | |_|_|/ / |/| | | | Make clear that Time core extensions are split between Numeric and Integer
| * | | | Make clear that Time core extensions are split between Numeric and IntegerJoão Fernandes2017-10-243-11/+39
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The documentation wrongly suggests that Time extensions to Numeric include methods months and years, when these belong to Integer. Update both classes and guides.
* | | | | Merge pull request #30966 from gurgelrenan/patch-1Rafael França2017-10-241-1/+1
|\ \ \ \ \ | | | | | | | | | | | | Space between { and | missing.
| * | | | | add _ for unused last argRenan Gurgel2017-10-241-1/+1
| | | | | |
| * | | | | Space between { and | missing.Renan Gurgel2017-10-231-1/+1
| |/ / / / | | | | | | | | | | Improve a code style recommendation following Rubocop instructions https://codeclimate.com/github/rails/rails/issues
* / / / / Ensure associations doesn't table name collide with aliased joinsRyuta Kamizono2017-10-242-1/+9
|/ / / / | | | | | | | | | | | | | | | | | | | | Currently alias tracker only refer a table name, doesn't respect an alias name. Should use `join.left.name` rather than `join.left.table_name`.
* | | | Merge pull request #30964 from ↵Ryuta Kamizono2017-10-241-25/+17
|\ \ \ \ | |/ / / |/| | | | | | | | | | | yahonda/remove_supports_disable_referential_integrity Remove `supports_disable_referential_integrity?`
| * | | Remove `supports_disable_referential_integrity?`Yasuo Honda2017-10-231-25/+17
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `supports_disable_referential_integrity?` used to handle if PostgreSQL database supports `ALTER TABLE <table name> DISABLE/ENABLE TRIGGER` statements. Refer https://github.com/rails/rails/commit/9a947af0e79cfb8692eb7e5ae94c1b8c40756f49 These statements have been documented since 8.1. https://www.postgresql.org/docs/8.1/static/sql-altertable.html > DISABLE/ENABLE TRIGGER Now Rails supports PostgreSQL 9.1 or higher only. No need to handle `supports_disable_referential_integrity?` anymore. Also, this method does not exist in any other adapters including AbstractAdapter.
* | | | Merge pull request #30961 from q-centrix/performance-improvement-acts-likeRafael França2017-10-231-1/+10
|\ \ \ \ | |/ / / |/| | | Performance improvements for acts_like? method
| * | | Performance improvements for acts_like? method.Dillon Welch2017-10-231-1/+10
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | activesupport/lib/active_support/core_ext/object/acts_like.rb acts_like? Add a case statement to use direct symbols instead of string interpolation for the three scenarios I found in the Rails codebase: time, date, and string. For time/date/string, this change prevents two string allocations for each time the method is called and speeds up the method by ~2.7x. For other arguments, there is no memory difference and performance difference is within margin of error. begin require "bundler/inline" rescue LoadError => e $stderr.puts "Bundler version 1.10 or later is required. Please update your Bundler" raise e end gemfile(true) do source "https://rubygems.org" gem "rails", github: "rails/rails" gem "arel", github: "rails/arel" gem "benchmark-ips" end def allocate_count GC.disable before = ObjectSpace.count_objects yield after = ObjectSpace.count_objects after.each { |k,v| after[k] = v - before[k] } after[:T_HASH] -= 1 # probe effect - we created the before hash. GC.enable result = after.reject { |k,v| v == 0 } GC.start result end class Object def fast_acts_like?(duck) case duck when :time respond_to? :acts_like_time? when :date respond_to? :acts_like_date? when :string respond_to? :acts_like_string? else respond_to? :"acts_like_#{duck}?" end end end puts puts " acts_like? ".center(80, '=') puts obj = ''.freeze %i(time date string super_hacka).each do |type| puts " #{type} ".center(80, '=') puts " Memory Usage ".center(80, "=") puts puts "value.acts_like?" puts allocate_count { 1000.times { obj.acts_like?(type) } } puts "value.fast_acts_like?" puts allocate_count { 1000.times { obj.fast_acts_like?(type) } } puts puts " Benchmark.ips ".center(80, "=") puts Benchmark.ips do |x| x.report("acts_like?") { obj.acts_like?(type) } x.report("fast_acts_like?") { obj.fast_acts_like?(type) } x.compare! end end ================================== acts_like? ================================== ===================================== time ===================================== ================================= Memory Usage ================================= value.acts_like? {:FREE=>-1983, :T_STRING=>2052, :T_IMEMO=>1} value.fast_acts_like? {:FREE=>-1} ================================ Benchmark.ips ================================= Warming up -------------------------------------- acts_like? 104.281k i/100ms fast_acts_like? 155.523k i/100ms Calculating ------------------------------------- acts_like? 1.688M (±10.7%) i/s - 8.342M in 5.003804s fast_acts_like? 4.596M (±12.1%) i/s - 22.551M in 5.000124s Comparison: fast_acts_like?: 4596162.4 i/s acts_like?: 1688163.8 i/s - 2.72x slower ===================================== date ===================================== ================================= Memory Usage ================================= value.acts_like? {:FREE=>-2001, :T_STRING=>2000} value.fast_acts_like? {:FREE=>-1} ================================ Benchmark.ips ================================= Warming up -------------------------------------- acts_like? 85.372k i/100ms fast_acts_like? 166.097k i/100ms Calculating ------------------------------------- acts_like? 1.720M (± 8.3%) i/s - 8.537M in 5.001003s fast_acts_like? 4.695M (±10.1%) i/s - 23.254M in 5.010734s Comparison: fast_acts_like?: 4695493.1 i/s acts_like?: 1719637.9 i/s - 2.73x slower ==================================== string ==================================== ================================= Memory Usage ================================= value.acts_like? {:FREE=>-2001, :T_STRING=>2000} value.fast_acts_like? {:FREE=>-1} ================================ Benchmark.ips ================================= Warming up -------------------------------------- acts_like? 100.221k i/100ms fast_acts_like? 182.841k i/100ms Calculating ------------------------------------- acts_like? 1.706M (± 7.3%) i/s - 8.519M in 5.022331s fast_acts_like? 3.968M (±22.8%) i/s - 18.650M in 5.006762s Comparison: fast_acts_like?: 3967972.9 i/s acts_like?: 1705773.7 i/s - 2.33x slower ================================= super_hacka ================================== ================================= Memory Usage ================================= value.acts_like? {:FREE=>-2004, :T_STRING=>2002, :T_SYMBOL=>1} value.fast_acts_like? {:FREE=>-2003, :T_STRING=>2001, :T_SYMBOL=>1} ================================ Benchmark.ips ================================= Warming up -------------------------------------- acts_like? 100.344k i/100ms fast_acts_like? 101.690k i/100ms Calculating ------------------------------------- acts_like? 1.617M (± 7.5%) i/s - 8.128M in 5.055285s fast_acts_like? 1.534M (±10.1%) i/s - 7.627M in 5.031052s Comparison: acts_like?: 1617390.7 i/s fast_acts_like?: 1533897.3 i/s - same-ish: difference falls within error
* | | | Merge pull request #30953 from rohitpaulk/fix-io-to-jsonRafael Mendonça França2017-10-233-0/+18
|\ \ \ \ | | | | | | | | | | | | | | | Fix #to_json for IO objects, fixes #26132
| * | | | Fix #to_json for unreadable IO objects, fixes #26132Paul Kuruvilla2017-10-233-0/+18
| | | | |
* | | | | Merge pull request #30959 from lostapathy/capybara_versionRafael França2017-10-231-0/+2
|\ \ \ \ \ | | | | | | | | | | | | specify minimum capybara version for system tests
| * | | | | specify minimum capybara version for system testsJoe Francis2017-10-231-0/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Upgraded rails applications may have a Gemfile without a new enough capybara to run system tests. Setting a version here gives the user a more direct error message than they get otherwise. Resolves #30952
* | | | | | Merge pull request #30920 from lugray/attributes_to_amSean Griffin2017-10-233-0/+376
|\ \ \ \ \ \ | | | | | | | | | | | | | | Start bringing attributes API to AM
| * | | | | | Start bringing attributes API to AMLisa Ugray2017-10-183-0/+376
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This is the first PR of a WIP to bring the attributes API to ActiveModel. It is not yet ready for public API. The `attributes_dirty_test.rb` file was created based on `dirty_test.rb`, and the simplifications in the diff do much to motivate this change. ``` diff activemodel/test/cases/dirty_test.rb activemodel/test/cases/attributes_dirty_test.rb 3a4 > require "active_model/attributes" 5c6 < class DirtyTest < ActiveModel::TestCase --- > class AttributesDirtyTest < ActiveModel::TestCase 7,41c8,12 < include ActiveModel::Dirty < define_attribute_methods :name, :color, :size < < def initialize < @name = nil < @color = nil < @size = nil < end < < def name < @name < end < < def name=(val) < name_will_change! < @name = val < end < < def color < @color < end < < def color=(val) < color_will_change! unless val == @color < @color = val < end < < def size < @size < end < < def size=(val) < attribute_will_change!(:size) unless val == @size < @size = val < end --- > include ActiveModel::Model > include ActiveModel::Attributes > attribute :name, :string > attribute :color, :string > attribute :size, :integer ```