aboutsummaryrefslogtreecommitdiffstats
path: root/activemodel/test
Commit message (Collapse)AuthorAgeFilesLines
* Merge pull request #30676 from artofhuman/import-assert-attrs-error-messageRafael França2018-09-261-1/+3
|\ | | | | Improve error message when assign wrong attributes to model
| * Improve error message when assign wrong attributes to modelSemyon Pupkov2018-04-281-1/+3
| |
* | Change the empty block style to have space inside of the blockRafael Mendonça França2018-09-251-1/+1
| |
* | Merge pull request #33949 from sjain1107/no-private-defKasper Timm Hansen2018-09-231-8/+10
|\ \ | | | | | | Remove private def
| * | Remove private defSakshi Jain2018-09-231-8/+10
| | |
* | | Enable `Performance/UnfreezeString` copyuuji.yaginuma2018-09-233-4/+4
|/ / | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | In Ruby 2.3 or later, `String#+@` is available and `+@` is faster than `dup`. ```ruby # frozen_string_literal: true require "bundler/inline" gemfile(true) do source "https://rubygems.org" gem "benchmark-ips" end Benchmark.ips do |x| x.report('+@') { +"" } x.report('dup') { "".dup } x.compare! end ``` ``` $ ruby -v benchmark.rb ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux] Warming up -------------------------------------- +@ 282.289k i/100ms dup 187.638k i/100ms Calculating ------------------------------------- +@ 6.775M (± 3.6%) i/s - 33.875M in 5.006253s dup 3.320M (± 2.2%) i/s - 16.700M in 5.032125s Comparison: +@: 6775299.3 i/s dup: 3320400.7 i/s - 2.04x slower ```
* | Merge pull request #33804 from yskkin/num_stringRyuta Kamizono2018-09-083-3/+13
|\ \ | | | | | | Fix non_numeric_string?
| * | Fix non_numeric_string?Yoshiyuki Kinjo2018-09-073-3/+13
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | For example, dirty checking was not right for the following case: ``` model.int_column = "+5" model.float_column = "0.5E+1" model.decimal_column = "0.5e-3" ``` It is enough to see whether leading character is a digit for avoiding invalid numeric expression like 'wibble' to be type-casted to 0, as this method's comment says. Fixes #33801
* | | Merge pull request #33615 from ↵Rafael França2018-09-071-1/+58
|\ \ \ | |/ / |/| | | | | | | | Larochelle/i18n_full_message_with_nested_attributes `ActiveModel.full_message` interaction with `index_errors`
| * | Call human_attribute_name with a string instead of a symboleMartin Larochelle2018-08-161-1/+1
| | |
| * | `ActiveModel.full_message` interaction with `index_errors`Martin Larochelle2018-08-141-0/+57
| | |
* | | Fix numericality validator to still use value before type cast except Active ↵Ryuta Kamizono2018-08-242-0/+24
|/ / | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Record The purpose of fe9547b is to work type casting to value from database. But that was caused not to use the value before type cast even except Active Record. There we never guarantees that the value before type cast was going to the used in this validation, but we should not change the behavior unless there is some particular reason. To restore original behavior, still use the value before type cast if `came_from_user?` is undefined (i.e. except Active Record). Fixes #33651. Fixes #33686.
* | Fix test failurebogdanvlviv2018-08-111-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ``` ... (snip) ............F Failure: JsonSerializationTest#test_as_json_should_return_a_hash_if_include_root_ in_json_is_true [/home/travis/build/rails/rails/activemodel/test/cases/serializers/json_serialization_test.rb:145]: Expected: 2006-08-01 00:00:00 UTC Actual: "2006-08-01T00:00:00.000Z" rails test home/travis/build/rails/rails/activemodel/test/cases/serializers/json_serialization_test.rb:136 (snip) ... ``` Related to #31503
* | Merge pull request #31503 from bogdan/timestamp-as-jsonEileen M. Uchitelle2018-08-111-0/+4
|\ \ | | | | | | Fix AM::Serializers::JSON#as_json method for timestamps
| * | Fix AM::Serializers::JSON#as_json method for timestampsBogdan Gusiev2017-12-211-0/+4
| | | | | | | | | | | | | | | According to doc the method should return non-json compatible types as strings.
* | | Turn on performance based copsDillon Welch2018-07-231-15/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Use attr_reader/attr_writer instead of methods method is 12% slower Use flat_map over map.flatten(1) flatten is 66% slower Use hash[]= instead of hash.merge! with single arguments merge! is 166% slower See https://github.com/rails/rails/pull/32337 for more conversation
* | | Ensure attribute is a symbol in the added? methodJeremy Baker2018-07-141-0/+6
| | |
* | | has_secure_password: use `recovery_password` instead of `activation_token`bogdanvlviv2018-07-082-5/+5
| | | | | | | | | | | | | | | | | | Since we have `has_secure_token`, it is too confusing to use `_token` suffix with `has_secure_password`. Context https://github.com/rails/rails/pull/33307#discussion_r200807185
* | | Improve `SecurePasswordTest#test_authenticate`bogdanvlviv2018-07-061-4/+7
| | | | | | | | | | | | | | | | | | - Ensure that execution of `authenticate`/`authenticate_XXX` returns `self` if password is correct, otherwise `false` (as mentioned in the documentation). - Test `authenticate_password`.
* | | Fix Ruby warnings tickled by the test suiteutilum2018-06-301-1/+2
| | |
* | | Merge pull request #26764 from choncou/improve_has_secure_passwordRafael Mendonça França2018-06-282-1/+6
|\ \ \ | | | | | | | | | | | | Allow configurable attribute name on `#has_secure_password`
| * | | Remove method for regenerating a token, and update `#authenticate`.Unathi Chonco2016-10-121-11/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | This change now creates a method `#authenticate_XXX` where XXX is the configured attribute name on `#has_secure_password`. `#authenticate` is now an alias to this method when the attribute name is the default 'password'
| * | | This addition will now allow configuring an attribute name for theUnathi Chonco2016-10-122-1/+15
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | existing `#has_secure_password`. This can be useful when one would like to store some secure field as a digest, just like a password. The method still defaults to `password`. It now also allows using the same `#authenticate` method which now accepts a second argument for specifying the attribute to be authenticated, or will default to 'password`. A new method is also added for generating a new token for an attribute by calling `#regenerate_XXXX` where `XXXX` is the attribute name.
* | | | Merge pull request #32956 from Shopify/i18n_activemodel_errors_full_messageRafael França2018-06-112-0/+79
|\ \ \ \ | | | | | | | | | | Allow to override the full_message error format
| * | | | Add global config for config.active_model.i18n_full_messageMartin Larochelle2018-06-052-0/+43
| | | | |
| * | | | Allow to override the full_message error formatMartin Larochelle2018-05-221-0/+36
| | | | |
* | | | | Fix user_input_in_time_zone to coerce non valid string into nilAnnie-Claude Côté2018-05-161-0/+15
| | | | | | | | | | | | | | | | | | | | Before it was coercing an invalid string into "2000-01-01 00:00:00".
* | | | | Fix `CustomCops/AssertNot` to allow it to have failure messageRyuta Kamizono2018-05-133-13/+13
| |_|_|/ |/| | | | | | | | | | | Follow up of #32605.
* | | | Replace `assert !` with `assert_not`Daniel Colson2018-04-194-7/+7
|/ / / | | | | | | | | | | | | This autocorrects the violations after adding a custom cop in 3305c78dcd.
* | | Alias `assign_attributes` to `attributes=` for `AttributeAssignment`Ryuta Kamizono2018-02-281-0/+8
| | | | | | | | | | | | There is no reason `attributes=` doesn't take `assign_attributes`.
* | | Merge pull request #31926 from composerinteralia/am-attributesRafael França2018-02-281-0/+20
|\ \ \ | | | | | | | | Add ActiveModel::Attributes#attributes
| * | | Add ActiveModel::Attributes#attributesDaniel Colson2018-02-071-0/+20
| | | | | | | | | | | | | | | | | | | | | | | | This starts to fix #31832. ActiveModel::Attributes includes ActiveModel::AttributeMethods, which requires an `#attributes` method that returns a hash with string keys.
* | | | Merge pull request #28270 from mmangino/dont_ignore_seralization_optionsRyuta Kamizono2018-02-271-0/+7
|\ \ \ \ | | | | | | | | | | | | | | | Don't accidentally lose includes in serialization
| * | | | Fix styleMike Mangino2017-03-031-1/+1
| | | | |
| * | | | Don't accidentally lose includes in serializationMike Mangino2017-03-031-3/+9
| | | | |
* | | | | Rails 6 requires Ruby 2.3+Jeremy Daer2018-02-171-4/+1
| | | | |
* | | | | Remove usage of strip_heredoc in the framework in favor of <<~Rafael Mendonça França2018-02-161-2/+1
| |/ / / |/| | | | | | | | | | | | | | | Some places we can't remove because Ruby still don't have a method equivalent to strip_heredoc to be called in an already existent string.
* | | | PERF: Recover marshaling dump/load performance (#31827)Ryuta Kamizono2018-02-021-0/+16
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * PERF: Recover marshaling dump/load performance This performance regression which is described in #30680 was caused by f0ddf87 due to force materialized `LazyAttributeHash`. Since 95b86e5, default proc has been removed in the class, so it is no longer needed that force materialized. Avoiding force materialized will recover marshaling dump/load performance. Benchmark: https://gist.github.com/blimmer/1360ea51cd3147bae8aeb7c6d09bff17 Before: ``` it took 0.6248569069430232 seconds to unmarshal the objects Total allocated: 38681544 bytes (530060 objects) allocated memory by class ----------------------------------- 12138848 Hash 10542384 String 7920000 ActiveModel::Attribute::Uninitialized 5600000 ActiveModel::Attribute::FromDatabase 1200000 Foo 880000 ActiveModel::LazyAttributeHash 400000 ActiveModel::AttributeSet 80 Integer 72 ActiveRecord::ConnectionAdapters::SQLite3Adapter::SQLite3Integer 40 ActiveModel::Type::String 40 ActiveRecord::Type::DateTime 40 Object 40 Range allocated objects by class ----------------------------------- 250052 String 110000 ActiveModel::Attribute::Uninitialized 70001 Hash 70000 ActiveModel::Attribute::FromDatabase 10000 ActiveModel::AttributeSet 10000 ActiveModel::LazyAttributeHash 10000 Foo 2 Integer 1 ActiveModel::Type::String 1 ActiveRecord::ConnectionAdapters::SQLite3Adapter::SQLite3Integer 1 ActiveRecord::Type::DateTime 1 Object 1 Range ``` After: ``` it took 0.1660824950085953 seconds to unmarshal the objects Total allocated: 13883811 bytes (220090 objects) allocated memory by class ----------------------------------- 5743371 String 4940008 Hash 1200000 Foo 880000 ActiveModel::LazyAttributeHash 720000 Array 400000 ActiveModel::AttributeSet 80 ActiveModel::Attribute::FromDatabase 80 Integer 72 ActiveRecord::ConnectionAdapters::SQLite3Adapter::SQLite3Integer 40 ActiveModel::Type::String 40 ActiveModel::Type::Value 40 ActiveRecord::Type::DateTime 40 Object 40 Range allocated objects by class ----------------------------------- 130077 String 50004 Hash 10000 ActiveModel::AttributeSet 10000 ActiveModel::LazyAttributeHash 10000 Array 10000 Foo 2 Integer 1 ActiveModel::Attribute::FromDatabase 1 ActiveModel::Type::String 1 ActiveModel::Type::Value 1 ActiveRecord::ConnectionAdapters::SQLite3Adapter::SQLite3Integer 1 ActiveRecord::Type::DateTime 1 Object 1 Range ``` Fixes #30680. * Keep the `@delegate_hash` to avoid to lose any mutations that have been made to the record
* | | | Don't expose `attributes_with_uninitialized_key` utility methodRyuta Kamizono2018-01-301-5/+6
| | | | | | | | | | | | | | | | It is not a test case.
* | | | Use assert_empty and assert_not_emptyDaniel Colson2018-01-254-14/+14
| | | |
* | | | Use assert_predicate and assert_not_predicateDaniel Colson2018-01-2519-361/+361
| | | |
* | | | Change refute to assert_notDaniel Colson2018-01-251-3/+3
| | | |
* | | | Use respond_to test helpersDaniel Colson2018-01-253-9/+9
| | | |
* | | | Allow attributes with a proc default to be marshalledSean Griffin2018-01-231-0/+9
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | We don't implement much custom marshalling logic for these objects, but the proc default case needs to be handled separately. Unfortunately there's no way to just say "do what you would have done but with this value for one ivar", so we have to manually implement `marshal_load` as well. The test case is a little bit funky, but I'd really like an equality test in there, and there's no easy way to add one now that this is out of AR (since the `attributes` method isn't here) Fixes #31216
* | | | More exercise `ActiveModel::Dirty` testsRyuta Kamizono2018-01-201-3/+24
| | | |
* | | | Change test case name to FormatValidationTestPatrik Bóna2018-01-141-1/+1
| | | | | | | | | | | | | | | | I believe that this was caused by a copy/paste mistake.
* | | | Fix validation callbacks on multiple contextYoshiyuki Hirano2017-12-201-0/+43
| |_|/ |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | I found a bug that validation callbacks don't fire on multiple context. So I've fixed it. Example: ```ruby class Dog include ActiveModel::Validations include ActiveModel::Validations::Callbacks attr_accessor :history def initialize @history = [] end before_validation :set_before_validation_on_a, on: :a before_validation :set_before_validation_on_b, on: :b after_validation :set_after_validation_on_a, on: :a after_validation :set_after_validation_on_b, on: :b def set_before_validation_on_a; history << "before_validation on a"; end def set_before_validation_on_b; history << "before_validation on b"; end def set_after_validation_on_a; history << "after_validation on a" ; end def set_after_validation_on_b; history << "after_validation on b" ; end end ``` Before: ``` d = Dog.new d.valid?([:a, :b]) d.history # [] ``` After: ``` d = Dog.new d.valid?([:a, :b]) d.history # ["before_validation on a", "before_validation on b", "after_validation on a", "after_validation on b"] ```
* | | Suppress `warning: BigDecimal.new is deprecated` in Active ModelYasuo Honda2017-12-143-23/+23
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `BigDecimal.new` has been deprecated in BigDecimal 1.3.3 which will be a default for Ruby 2.5. Refer ruby/bigdecimal@5337373 * This commit has been made as follows: ```ruby $ cd activemodel/ $ git grep -l BigDecimal.new | grep \.rb | xargs sed -i -e "s/BigDecimal.new/BigDecimal/g" ``` * This commit has been tested with these Ruby versions: ``` ruby 2.5.0dev (2017-12-15 trunk 61262) [x86_64-linux] ruby 2.4.2p198 (2017-09-14 revision 59899) [x86_64-linux] ruby 2.3.5p376 (2017-09-14 revision 59905) [x86_64-linux] ruby 2.2.8p477 (2017-09-14 revision 59906) [x86_64-linux] ```
* | | Change how `AttributeSet::Builder` receives its defaultsSean Griffin2017-11-271-1/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | There are two concerns which are both being combined into one here, but both have the same goal. There are certain attributes which we want to always consider initialized. Previously, they were handled separately. The primary key (which is assumed to be backed by a database column) needs to be initialized, because there is a ton of code in Active Record that assumes `foo.id` will never raise. Additionally, we want attributes which aren't backed by a database column to always be initialized, since we would never receive a database value for them. Ultimately these two concerns can be combined into one. The old implementation hid a lot of inherent complexity, and is hard to optimize from the outside. We can simplify things significantly by just passing in a hash. This has slightly different semantics from the old behavior, in that `Foo.select(:bar).first.id` will return the default value for the primary key, rather than `nil` unconditionally -- however, the default value is always `nil` in practice.
* | | Merge pull request #31117 from renuo/fix_errors_addedRafael França2017-11-131-0/+7
|\ \ \ | | | | | | | | fix bug on added? method