aboutsummaryrefslogtreecommitdiffstats
Commit message (Collapse)AuthorAgeFilesLines
* Validate multiple contexts on `valid?` and `invalid?` at once.Dmitry Polushkin2015-09-075-2/+50
| | | | | | | | | | | | | | | | | | Example: ```ruby class Person include ActiveModel::Validations attr_reader :name, :title validates_presence_of :name, on: :create validates_presence_of :title, on: :update end person = Person.new person.valid?([:create, :update]) # => true person.errors.messages # => {:name=>["can't be blank"], :title=>["can't be blank"]} ```
* Use Hash[] instead of Hash#dup in resolve_column_aliasesRafael Mendonça França2015-09-071-1/+3
| | | | Related with #20418
* Merge pull request #21534 from Vratislav/clarify-custom-config-guideRafael Mendonça França2015-09-071-1/+1
| | | [Rails Guides] Clarify custom code configuration [ci skip]
* Revert "Merge pull request #21069 from ↵Rafael Mendonça França2015-09-075-50/+2
| | | | | | | | | dmitry/feature/validate-multiple-contexts-at-once" This reverts commit 51dd2588433457960cca592d5b5dac6e0537feac, reversing changes made to ecb4e4b21b3222b823fa24d4a0598b1f2f63ecfb. This broke Active Record tests
* Merge pull request #21069 from dmitry/feature/validate-multiple-contexts-at-onceRafael Mendonça França2015-09-075-2/+50
|\ | | | | | | Validate multiple contexts on `valid?` and `invalid?` at once
| * Validate multiple contexts on `valid?` and `invalid?` at once.Dmitry Polushkin2015-07-305-2/+50
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Example: ```ruby class Person include ActiveModel::Validations attr_reader :name, :title validates_presence_of :name, on: :create validates_presence_of :title, on: :update end person = Person.new person.valid?([:create, :update]) # => true person.errors.messages # => {:name=>["can't be blank"], :title=>["can't be blank"]} ```
* | Merge pull request #21522 from tgxworld/scope_perfRafael Mendonça França2015-09-074-5/+13
|\ \ | | | | | | PERF: Scope performance.
| * | Cache check if `default_scope` has been overridden.Guo Xiang Tan2015-09-071-1/+8
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Benchmark Script: ``` 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', ref: 'f1f0a3f8d99aef8aacfa81ceac3880dcac03ca06' gem 'rails', path: '~/rails' gem 'arel', github: 'rails/arel', branch: 'master' gem 'rack', github: 'rack/rack', branch: 'master' gem 'sass' gem 'sprockets-rails', github: 'rails/sprockets-rails', branch: 'master' gem 'sprockets', github: 'rails/sprockets', branch: 'master' gem 'pg' gem 'benchmark-ips' end require 'active_record' require 'benchmark/ips' ActiveRecord::Base.establish_connection('postgres://postgres@localhost:5432/rubybench') ActiveRecord::Migration.verbose = false ActiveRecord::Schema.define do create_table :users, force: true do |t| t.string :name, :email t.timestamps null: false end end class User < ActiveRecord::Base; end attributes = { name: "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", email: "foobar@email.com", } 1000.times { User.create!(attributes) } Benchmark.ips(5, 3) do |x| x.report('where with hash') { User.where(name: "Lorem ipsum dolor sit amet, consectetur adipiscing elit.") } x.report('where with string') { User.where("users.name = ?", "Lorem ipsum dolor sit amet, consectetur adipiscing elit.") } x.compare! end key = if RUBY_VERSION < '2.2' :total_allocated_object else :total_allocated_objects end before = GC.stat[key] User.where(name: "Lorem ipsum dolor sit amet, consectetur adipiscing elit.") after = GC.stat[key] puts "Total Allocated Object: #{after - before}" ``` Stackprof output truncated. ``` TOTAL (pct) SAMPLES (pct) FRAME 52 (10.6%) 10 (2.0%) ActiveRecord::Scoping::Default::ClassMethods#build_default_scope ``` Before: ``` Calculating ------------------------------------- where with hash 2.789k i/100ms where with string 4.407k i/100ms ------------------------------------------------- where with hash 29.170k (± 1.9%) i/s - 147.817k where with string 46.954k (± 2.7%) i/s - 237.978k Comparison: where with string: 46954.3 i/s where with hash: 29169.9 i/s - 1.61x slower Total Allocated Object: 85 Calculating ------------------------------------- all 16.773k i/100ms ------------------------------------------------- all 186.102k (± 3.6%) i/s - 939.288k ``` After: ``` Calculating ------------------------------------- where with hash 3.014k i/100ms where with string 4.623k i/100ms ------------------------------------------------- where with hash 31.524k (± 1.3%) i/s - 159.742k where with string 49.948k (± 2.3%) i/s - 249.642k Comparison: where with string: 49948.3 i/s where with hash: 31524.3 i/s - 1.58x slower Total Allocated Object: 84 Calculating ------------------------------------- all 20.139k i/100ms ------------------------------------------------- all 227.860k (± 2.5%) i/s - 1.148M ```
| * | Reduce calls to stringify_keys.Guo Xiang Tan2015-09-073-4/+5
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Stackprof output truncated. ``` TOTAL (pct) SAMPLES (pct) FRAME 23 (4.7%) 12 (2.4%) Hash#transform_keys 11 (2.2%) 11 (2.2%) block in Hash#transform_keys 30 (6.1%) 7 (1.4%) Hash#stringify_keys ``` Benchmark Script: ``` 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', path: '~/rails' # master against ref "f1f0a3f8d99aef8aacfa81ceac3880dcac03ca06" gem 'arel', github: 'rails/arel', branch: 'master' gem 'rack', github: 'rack/rack', branch: 'master' gem 'sass' gem 'sprockets-rails', github: 'rails/sprockets-rails', branch: 'master' gem 'sprockets', github: 'rails/sprockets', branch: 'master' gem 'pg' gem 'benchmark-ips' end require 'active_record' require 'benchmark/ips' ActiveRecord::Base.establish_connection('postgres://postgres@localhost:5432/rubybench') ActiveRecord::Migration.verbose = false ActiveRecord::Schema.define do create_table :users, force: true do |t| t.string :name, :email t.timestamps null: false end end class User < ActiveRecord::Base; end attributes = { name: "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", email: "foobar@email.com", } 1000.times { User.create!(attributes) } Benchmark.ips(5, 3) do |x| x.report('where with hash') { User.where(name: "Lorem ipsum dolor sit amet, consectetur adipiscing elit.") } x.report('where with string') { User.where("users.name = ?", "Lorem ipsum dolor sit amet, consectetur adipiscing elit.") } x.compare! end key = if RUBY_VERSION < '2.2' :total_allocated_object else :total_allocated_objects end before = GC.stat[key] User.where(name: "Lorem ipsum dolor sit amet, consectetur adipiscing elit.") after = GC.stat[key] puts "Total Allocated Object: #{after - before}" ``` Before: ``` Calculating ------------------------------------- where with hash 2.796k i/100ms where with string 4.338k i/100ms ------------------------------------------------- where with hash 29.177k (± 1.5%) i/s - 148.188k where with string 47.419k (± 2.8%) i/s - 238.590k Comparison: where with string: 47419.0 i/s where with hash: 29176.6 i/s - 1.63x slower Total Allocated Object: 85 ``` After: ``` Calculating ------------------------------------- where with hash 2.895k i/100ms where with string 4.416k i/100ms ------------------------------------------------- where with hash 30.758k (± 2.0%) i/s - 156.330k where with string 47.708k (± 2.6%) i/s - 238.464k Comparison: where with string: 47707.9 i/s where with hash: 30757.7 i/s - 1.55x slower Total Allocated Object: 84 ```
* | | Correct query for PostgreSQL 8.2Matthew Draper2015-09-082-1/+5
| | | | | | | | | | | | Generic cast-to-text was only added in 8.3.
* | | Merge pull request #21523 from tgxworld/improve_perf_allRafael Mendonça França2015-09-071-1/+2
|\ \ \ | | | | | | | | PERF: Don't create a Relation when it is not needed.
| * | | PERF: Don't create a Relation when it is not needed.Guo Xiang Tan2015-09-071-1/+2
| |/ / | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Benchmark script used: ``` 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', path: '~/rails' # master against ref "f1f0a3f8d99aef8aacfa81ceac3880dcac03ca06" gem 'arel', github: 'rails/arel', branch: 'master' gem 'rack', github: 'rack/rack', branch: 'master' gem 'sass' gem 'sprockets-rails', github: 'rails/sprockets-rails', branch: 'master' gem 'sprockets', github: 'rails/sprockets', branch: 'master' gem 'pg' gem 'benchmark-ips' end require 'active_record' require 'benchmark/ips' ActiveRecord::Base.establish_connection('postgres://postgres@localhost:5432/rubybench') ActiveRecord::Migration.verbose = false ActiveRecord::Schema.define do create_table :users, force: true do |t| t.string :name, :email t.timestamps null: false end end class User < ActiveRecord::Base; end attributes = { name: "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", email: "foobar@email.com", } 1000.times { User.create!(attributes) } Benchmark.ips(5, 3) do |x| x.report('all') { User.all } end key = if RUBY_VERSION < '2.2' :total_allocated_object else :total_allocated_objects end before = GC.stat[key] User.where(name: "Lorem ipsum dolor sit amet, consectetur adipiscing elit.") after = GC.stat[key] puts "Total Allocated Object: #{after - before}" ``` Before: ``` Calculating ------------------------------------- all 17.569k i/100ms ------------------------------------------------- all 190.854k (± 3.3%) i/s - 966.295k Total Allocated Object: 85 ``` After: ``` Calculating ------------------------------------- all 22.237k i/100ms ------------------------------------------------- all 262.715k (± 5.5%) i/s - 1.312M Total Allocated Object: 80 ```
* | | Merge pull request #21531 from amitsuroliya/typo_fix1Arun Agrawal2015-09-071-1/+1
|\ \ \ | | | | | | | | Typo fix (ci skip)
| * | | Typo fix [ci skip]amitkumarsuroliya2015-09-071-1/+1
|/ / / | | | | | | `lengh` should be `length`
* | | Merge pull request #20534 from qnm/activesupport-require-issueYves Senn2015-09-071-0/+1
|\ \ \ | | | | | | | | Add require to ensure Time#advance works without implicit required
| * | | Remove accidental ruby-versionRob Sharp2015-06-121-1/+0
| | | |
| * | | Add missing require to ensure #advance will work without being implicity ↵Rob Sharp2015-06-122-0/+2
| | | | | | | | | | | | | | | | required
* | | | Merge pull request #21527 from rngtng/fix-migrator-path-setupYves Senn2015-09-073-2/+10
|\ \ \ \ | | | | | | | | | | | | | | | Use global migrations_path configuration in Migrator
| * | | | Allow global migrations_path configuration with using value from ↵Tobias Bielohlawek2015-09-073-2/+15
|/ / / / | | | | | | | | | | | | database_tasks instead of Migrator
* | | | changelog, minor formatting changes.Yves Senn2015-09-071-9/+9
| | | |
* | | | Merge pull request #21524 from gfx/do_not_localize_for_to_sentenceAkira Matsuda2015-09-071-1/+1
|\ \ \ \ | | | | | | | | | | Fix strange messages for `rails g foo`
| * | | | Fix strange messages for `rails g foo`FUJI Goro (gfx)2015-09-071-1/+1
|/ / / /
* | | | Merge pull request #21250 from ronakjangir47/safe_constYves Senn2015-09-071-0/+4
|\ \ \ \ | | | | | | | | | | | | | | | safe_constantize - Added Object scoped missing test cases
| * | | | safe_constantize - Added Object scoped missing test casesRonak Jangir2015-09-061-0/+2
| | | | |
* | | | | Merge pull request #21480 from amitsuroliya/add_return_value_descriptionKasper Timm Hansen2015-09-071-1/+1
|\ \ \ \ \ | | | | | | | | | | | | adding description of return value [ci skip]
| * | | | | adding description of return value [ci skip]amitkumarsuroliya2015-09-031-1/+1
| | | | | |
* | | | | | Merge pull request #21521 from yui-knk/fix/ar_task_descRichard Schneeman2015-09-061-1/+1
|\ \ \ \ \ \ | |_|_|_|/ / |/| | | | | [ci skip] Replace `AR` with `Active Record` in task desc
| * | | | | [ci skip] Replace `AR` with `Active Record` in task descyui-knk2015-09-071-1/+1
|/ / / / / | | | | | | | | | | | | | | | | | | | | Many user look `desc` of rake task and they are not familiar with `AR`. `Active Record` is more familiar word.
* | | | | Fix test failures from premature merge of #21317Matthew Draper2015-09-072-5/+16
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Apparently I managed to forget how similar the "tests passing" and "no status reported" merge indicators look. Note that the previous `stubs` in test_add_index wasn't working: the method was still called, and just happened to return false.
* | | | | Merge pull request #21317 from ↵Matthew Draper2015-09-076-9/+30
|\ \ \ \ \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | greysteil/support-postgres-drop-index-concurrently Support dropping indexes concurrently in Postgres
| * | | | | Support dropping indexes concurrently in PostgresGrey Baker2015-09-056-9/+30
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | See http://www.postgresql.org/docs/9.4/static/sql-dropindex.html for more details.
* | | | | | Merge pull request #21505 from ↵Matthew Draper2015-09-075-15/+29
|\ \ \ \ \ \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | morgoth/deprecate-passing-conditions-to-destroy_all-and-delete_all Deprecate passing conditions to AR::Relation destroy_all and delete_all methods
| * | | | | | Deprecate passing conditions to AR::Relation destroy_all and delete_all methodsWojciech Wnętrzak2015-09-065-15/+29
| |/ / / / /
* | | | | | Merge pull request #21514 from ronakjangir47/remove_extra_theXavier Noria2015-09-062-2/+2
|\ \ \ \ \ \ | | | | | | | | | | | | | | Removed Extra ‘the’ [ci skip]
| * | | | | | Removed Extra ‘the’ [ci skip]Ronak Jangir2015-09-062-2/+2
| | |_|/ / / | |/| | | |
* / | | | | Use ERB::Utils to percent encode `hfvalue` parts of mailtoAaron Patterson2015-09-052-5/+5
|/ / / / / | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `hfvalue` parts should always be percent encoded, so lets do that! Revert "use path escaping for email addresses" This reverts commit 21ffef38a5dc5a6a21f7e841aecab5b51f4fd185.
* | | | | Merge pull request #21506 from rodzyn/remove_mocha_part_3Kasper Timm Hansen2015-09-058-90/+132
|\ \ \ \ \ | |/ / / / |/| | | | Remove mocha from ActionPack tests
| * | | | Remove mocha from ActionPack testsMarcin Olichwirowicz2015-09-058-90/+132
|/ / / /
* | | | implement abstract store methodsAaron Patterson2015-09-044-8/+8
| | | | | | | | | | | | | | | | converts old ID methods to the new abstract store methods in Rack
* | | | stop using deprecated Abstract::ID classAaron Patterson2015-09-045-5/+5
| | | |
* | | | stop inheriting from Rack::RequestAaron Patterson2015-09-0412-22/+24
| | | | | | | | | | | | | | | | | | | | | | | | Just include the modules necessary in the Request object to implement the things we need. This should make it easier to build delegate request objects because the API is smaller
* | | | Merge pull request #21504 from ioquatix/patch-1Sean Griffin2015-09-041-1/+1
|\ \ \ \ | | | | | | | | | | #where fails if opts.responds_to?(:==) unexpectedly
| * | | | #where fails if opts.responds_to?(:==) unexpectedlySamuel Williams2015-09-051-1/+1
|/ / / / | | | | | | | | Sometimes opts passed in might respond to ==, e.g. `Arel::Nodes::Grouping`. In this case, `opts == :chain` returns `Arel::Nodes::Equality` which causes odd behaviour. Prefer `if :chain == opts` which guarantees that `Symbol#==` would be invoked. Alternatively consider `eql?`.
* | | | use path escaping for email addressesAaron Patterson2015-09-042-4/+4
| | | | | | | | | | | | | | | | | | | | | | | | Due to e25fdad2f147e6f368958f9a06a5ac9d10288408, we are correctly using path escaping for email addresses. This commit fixes the tests to expect path escaping.
* | | | use `Rack::Utils.unescape_path` to unescape pathsAaron Patterson2015-09-042-4/+4
| | | | | | | | | | | | | | | | | | | | | | | | Escaping and unescaping paths is different than query parameters, and we need to respect that. This commit uses the new method in Rack to escape and unescape paths. Fixes #11816
* | | | Merge pull request #21412 from yui-knk/feature/irreversible_migration_error_msgYves Senn2015-09-042-2/+77
|\ \ \ \ | | | | | | | | | | | | | | | Add detailed error message to `IrreversibleMigration`
| * | | | Revert mistakenly added Gemfile.lockyui-knk2015-09-031-4/+0
| | | | |
| * | | | Add detailed error message to `IrreversibleMigration`yui-knk2015-08-301-1/+6
| | | | |
| * | | | [ci skip] Add comments for `IrreversibleMigration`yui-knk2015-08-291-0/+70
| | | | |
| * | | | Add detailed error message to `IrreversibleMigration`yui-knk2015-08-282-1/+5
| | | | |