aboutsummaryrefslogtreecommitdiffstats
path: root/activemodel
Commit message (Collapse)AuthorAgeFilesLines
...
| * | | | add strict argument checking to ActiveRecord callbacksSean Linsley2018-07-221-7/+9
|/ / / / | | | | | | | | | | | | This ends up adding it to all save-related callbacks defined in `ActiveRecord::DefineCallbacks`, including e.g. `after_create`. Which should be fine: they didn't support `:on` in the first place.
* | | | Ensure attribute is a symbol in the added? methodJeremy Baker2018-07-142-1/+7
| | | |
* | | | has_secure_password: use `recovery_password` instead of `activation_token`bogdanvlviv2018-07-084-15/+15
| | | | | | | | | | | | | | | | | | | | | | | | 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`.
* | | | Shorter code: remove unnecessary conditionclaudiob2018-07-051-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | See https://github.com/rails/rails/commit/136fc65c9b8b66e1fb56f3a17f0d1fddff9b4bd0#r28897107 I _think_ that this method can now be rewritten from: ```ruby def attribute_previous_change(attr) previous_changes[attr] if attribute_previously_changed?(attr) end ``` to: ```ruby def attribute_previous_change(attr) previous_changes[attr] end ``` without losing performance. --- Calling ```ruby previous_changes[attr] if attribute_previously_changed?(attr) ``` is equivalent to calling ```ruby previous_changes[attr] if previous_changes.include?(attr) ``` When this commit 136fc65c9b was made, Active Record had its own `previous_changes` method, added here below. However, that method has been recently removed from the codebase, so `previous_changes` is now only the method defined in Active Model as: ```ruby def previous_changes @previously_changed ||= ActiveSupport::HashWithIndifferentAccess.new @previously_changed.merge(mutations_before_last_save.changes) end ``` Since we are dealing with a memoized Hash, there is probably no need to check `if .include?(attr_name)` before trying to fetch `[attr]` for it. Does that make sense? Did I miss anything? Thanks!
* | | | 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-284-56/+72
|\ \ \ \ | | | | | | | | | | | | | | | Allow configurable attribute name on `#has_secure_password`
| * | | | Remove method for regenerating a token, and update `#authenticate`.Unathi Chonco2016-10-123-61/+25
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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-124-41/+93
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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.
* | | | | Add changelog for #32956 [ci skip]bogdanvlviv2018-06-121-0/+6
| | | | | | | | | | | | | | | | | | | | Add mention about default value of `config.active_model.i18n_full_message`.
* | | | | Fix active_model/errors docs [ci skip]bogdanvlviv2018-06-121-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | - Fix indentation. - Add a missing dot to the end of the sentence. Related to #32956
* | | | | Merge pull request #32956 from Shopify/i18n_activemodel_errors_full_messageRafael França2018-06-114-2/+131
|\ \ \ \ \ | | | | | | | | | | | | Allow to override the full_message error format
| * | | | | Add global config for config.active_model.i18n_full_messageMartin Larochelle2018-06-054-1/+55
| | | | | |
| * | | | | Allow to override the full_message error formatMartin Larochelle2018-05-222-2/+77
| | | | | |
* | | | | | PERF: avoid allocating column names where possibleSam2018-06-061-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | When requesting columns names from database adapters AR:Result would dup/freeze column names, this prefers using fstrings which cuts down on repeat allocations Attributes that are retained keep these fstrings around for the long term Note, this has the highest impact on "short" result sets, eg: Topic.first where you can void allocating the number of columns * String.
* | | | | | Ensure casting by boolean attribute when queryingRyuta Kamizono2018-05-291-0/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `QueryAttribute#value_for_database` calls only `type.serialize`, and `Boolean#serialize` is a no-op unlike other attribute types. It caused the issue #32624. Whether or not `serialize` will invoke `cast` is undefined in our test cases, but it actually does not work properly unless it does so for now. Fixes #32624.
* | | | | | Parse raw value only when a value came from user in numericality validatorRyuta Kamizono2018-05-281-2/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Since `parse_raw_value_as_a_number` may not always parse raw value from database as a number without type casting (e.g. "$150.55" as money format). Fixes #32531.
* | | | | | Make force equality checking more strictly not to allow serialized attributeRyuta Kamizono2018-05-251-0/+4
| |_|_|_|/ |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Since #26074, introduced force equality checking to build a predicate consistently for both `find` and `create` (fixes #27313). But the assumption that only array/range attribute have subtype was wrong. We need to make force equality checking more strictly not to allow serialized attribute. Fixes #32761.
* | | | | Fix user_input_in_time_zone to coerce non valid string into nilAnnie-Claude Côté2018-05-162-0/+17
| | | | | | | | | | | | | | | | | | | | Before it was coercing an invalid string into "2000-01-01 00:00:00".
* | | | | Add missing require for string to timezone conversionAnnie-Claude Côté2018-05-161-0/+1
| | | | | | | | | | | | | | | | | | | | Inside user_input_in_time_zone we call in_time_zone on the value and value can be a String.
* | | | | 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.
* | | | Update validates_inclusion_of exampleCassidy Kobewka2018-04-171-1/+1
|/ / /
* | | Use string-based fields. [ci skip]Cassidy Kobewka2018-04-161-1/+1
| | |
* | | Inclusive Language in Documentation Examples [ci skip]Cassidy Kobewka2018-04-151-1/+1
| | |
* | | Merge pull request #32498 from eugeneius/mutation_tracker_merge_changesRyuta Kamizono2018-04-101-1/+1
|\ \ \ | | | | | | | | Prevent changes_to_save from mutating attributes
| * | | Prevent changes_to_save from mutating attributesEugene Kenny2018-04-081-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | When an array of hashes is added to a `HashWithIndifferentAccess`, the hashes are replaced with HWIAs by mutating the array in place. If an attribute's value is an array of hashes, `changes_to_save` will convert it to an array of HWIAs as a side-effect of adding it to the changes hash. Using `merge!` instead of `[]=` fixes the problem, as `merge!` copies any array values in the provided hash instead of mutating them.
* | | | Avoid generating full changes hash on every saveEugene Kenny2018-04-081-0/+8
|/ / / | | | | | | | | | | | | | | | | | | | | | | | | | | | `changed_attribute_names_to_save` is called in `keys_for_partial_write`, which is called on every save when partial writes are enabled. We can avoid generating the full changes hash by asking the mutation tracker for just the names of the changed attributes. At minimum this saves one array allocation per attribute, but will also avoid calling `Attribute#original_value` which is expensive for serialized attributes.
* | | Merge pull request #32220 from rails/fix-time-columns-on-sqlite3Andrew White2018-03-151-6/+2
|\ \ \ | | | | | | | | Time column improvements
| * | | Normalize date component when writing to time columnsAndrew White2018-03-111-5/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | For legacy reasons Rails stores time columns on sqlite as full timestamp strings. However because the date component wasn't being normalized this meant that when they were read back they were being prefixed with 2001-01-01 by ActiveModel::Type::Time. This had a twofold result - first it meant that the fast code path wasn't being used because the string was invalid and second it was corrupting the second fractional component being read by the Date._parse code path. Fix this by a combination of normalizing the timestamps on writing and also changing Active Model to be more lenient when detecting whether a string starts with a date component before creating the dummy time value for parsing.
| * | | Apply time column precision on assignmentAndrew White2018-03-111-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | In #20317, datetime columns had their precision applied on assignment but that behaviour wasn't applied to time columns - this commit fixes that. Fixes #30301.
* | | | Remove changelog header for unreleased versionRafael Mendonça França2018-03-131-2/+0
|/ / / | | | | | | | | | | | | | | | We only add the header when releasing to avoid some conflicts. [ci skip]
* | | Don't call changes in `changes_applied` unless requiredSean Griffin2018-03-061-1/+3
| | | | | | | | | | | | | | | | | | This is an alternate implementation of #31698. That PR makes assumptions that I do not want in the code base. We can fix the performance regression with a much simpler patch.
* | | Revert "PERF: Recover `changes_applied` performance (#31698)"Sean Griffin2018-03-062-43/+70
| | | | | | | | | | | | This reverts commit a19e91f0fab13cca61acdb1f33e27be2323b9786.
* | | Ruby 2.4: take advantage of String#unpack1Jeremy Daer2018-03-012-2/+2
| | | | | | | | | | | | | | | https://bugs.ruby-lang.org/issues/12752 https://ruby-doc.org/core-2.4.0/String.html#method-i-unpack1
* | | Remove CHANGELOG entries which were backported to 5-2-stableRyuta Kamizono2018-02-281-4/+0
| | |
* | | Alias `assign_attributes` to `attributes=` for `AttributeAssignment`Ryuta Kamizono2018-02-282-0/+10
| | | | | | | | | | | | There is no reason `attributes=` doesn't take `assign_attributes`.
* | | Merge pull request #31926 from composerinteralia/am-attributesRafael França2018-02-282-0/+24
|\ \ \ | | | | | | | | Add ActiveModel::Attributes#attributes
| * | | Add ActiveModel::Attributes#attributesDaniel Colson2018-02-072-0/+24
| | | | | | | | | | | | | | | | | | | | | | | | 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-273-1/+12
|\ \ \ \ | | | | | | | | | | | | | | | Don't accidentally lose includes in serialization
| * | | | Fix styleMike Mangino2017-03-031-1/+1
| | | | |
| * | | | Don't accidentally lose includes in serializationMike Mangino2017-03-033-4/+13
| | | | |
* | | | | Active Model: Use private attr_readerRyuta Kamizono2018-02-264-11/+6
| | | | | | | | | | | | | | | | | | | | Follow up of 6d63b5e49a399fe246afcebad45c3c962de268fa.
* | | | | PostgreSQL: Allow BC dates like datetime consistentlyRyuta Kamizono2018-02-231-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | BC dates are supported by both date and datetime types. https://www.postgresql.org/docs/current/static/datatype-datetime.html Since #1097, new datetime allows year zero as 1 BC, but new date does not. It should be allowed even in new date consistently.
* | | | | Rails 6 requires Ruby 2.4.1+Jeremy Daer2018-02-172-1/+6
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Skipping over 2.4.0 to sidestep the `"symbol_from_string".to_sym.dup` bug. References #32028
* | | | | Rails 6 requires Ruby 2.3+Jeremy Daer2018-02-176-33/+7
| | | | |
* | | | | 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.
* | | | | Remove support to Ruby 2.2Rafael Mendonça França2018-02-161-1/+1
| |/ / / |/| | | | | | | | | | | Rails 6 will only support Ruby >= 2.3.
* | | | PERF: Recover marshaling dump/load performance (#31827)Ryuta Kamizono2018-02-022-9/+27
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * 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
* | | | Start Rails 6.0 development!!!Rafael Mendonça França2018-01-302-68/+4
| | | | | | | | | | | | | | | | :tada::tada::tada: