aboutsummaryrefslogtreecommitdiffstats
path: root/activemodel
Commit message (Collapse)AuthorAgeFilesLines
* Add `Style/RedundantFreeze` to remove redudant `.freeze`Yasuo Honda2018-09-297-8/+8
| | | | | | | | | | | | | | | | | | | | | Since Rails 6.0 will support Ruby 2.4.1 or higher `# frozen_string_literal: true` magic comment is enough to make string object frozen. This magic comment is enabled by `Style/FrozenStringLiteralComment` cop. * Exclude these files not to auto correct false positive `Regexp#freeze` - 'actionpack/lib/action_dispatch/journey/router/utils.rb' - 'activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb' It has been fixed by https://github.com/rubocop-hq/rubocop/pull/6333 Once the newer version of RuboCop released and available at Code Climate these exclude entries should be removed. * Replace `String#freeze` with `String#-@` manually if explicit frozen string objects are required - 'actionpack/test/controller/test_case_test.rb' - 'activemodel/test/cases/type/string_test.rb' - 'activesupport/lib/active_support/core_ext/string/strip.rb' - 'activesupport/test/core_ext/string_ext_test.rb' - 'railties/test/generators/actions_test.rb'
* Merge pull request #30676 from artofhuman/import-assert-attrs-error-messageRafael França2018-09-262-2/+4
|\ | | | | Improve error message when assign wrong attributes to model
| * Improve error message when assign wrong attributes to modelSemyon Pupkov2018-04-282-2/+4
| |
* | 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-084-4/+14
|\ \ | | | | | | Fix non_numeric_string?
| * | Fix non_numeric_string?Yoshiyuki Kinjo2018-09-074-4/+14
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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-072-3/+63
|\ \ \ | | | | | | | | | | | | | | | | 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-162-2/+2
| | | |
| * | | `ActiveModel.full_message` interaction with `index_errors`Martin Larochelle2018-08-142-3/+63
| | | |
* | | | Formatting CHANGELOGs [ci skip]Ryuta Kamizono2018-09-071-12/+13
| |/ / |/| | | | | | | | Fixing code block rendering, indentation, backticks, etc.
* | | Faster time_value.rbschneems2018-08-291-1/+7
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The multiplication of the value takes a long time when we can instead mutate and use the string value directly. The `microsec` perf increases speed by 27% in the ideal case (which is the most common). ``` original_string = ".443959" require 'benchmark/ips' Benchmark.ips do |x| x.report("multiply") { string = original_string.dup (string.to_r * 1_000_000).to_i } x.report("new ") { string = original_string.dup if string && string.start_with?(".".freeze) && string.length == 7 string[0] = ''.freeze string.to_i end } x.compare! end # Warming up -------------------------------------- # multiply 125.783k i/100ms # new 146.543k i/100ms # Calculating ------------------------------------- # multiply 1.751M (± 3.3%) i/s - 8.805M in 5.033779s # new 2.225M (± 2.1%) i/s - 11.137M in 5.007110s # Comparison: # new : 2225289.7 i/s # multiply: 1751254.2 i/s - 1.27x slower ```
* | | Fix numericality validator to still use value before type cast except Active ↵Ryuta Kamizono2018-08-244-4/+41
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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 numericality validator not to be affected by custom getterRyuta Kamizono2018-08-131-0/+2
|/ / | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Since fe9547b6, numericality validator would parse raw value only when a value came from user to work type casting to a value from database. But that was caused a regression that the validator would work against getter value instead of parsed raw value, a getter is sometimes customized by people. #33550 There we never guarantees that the value before type cast was going to the used in this validation (actually here is only place that getter value might not be used), but we should not change the behavior unless there is some particular reason. The purpose of fe9547b6 is to work type casting to a value from database. We could achieve the purpose by using `read_attribute`, without using getter value. Fixes #33550.
* | Add changelog entry for #31503 [ci skip]bogdanvlviv2018-08-121-0/+16
| | | | | | | | Related to #31503
* | 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-112-9/+14
|\ \ | | | | | | Fix AM::Serializers::JSON#as_json method for timestamps
| * | Fix AM::Serializers::JSON#as_json method for timestampsBogdan Gusiev2017-12-212-9/+14
| | | | | | | | | | | | | | | According to doc the method should return non-json compatible types as strings.
* | | ActiveModel::Naming delegate match? in the same manner as =~ and != (#33466)Bart2018-07-291-1/+17
| | | | | | | | | The purpose of the module seems to quack like a string.
* | | 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
* | | Merge pull request #30919 from seanlinsley/17622-before_save_strict_argumentsRyuta Kamizono2018-07-231-7/+9
|\ \ \ | | | | | | | | | | | | Add strict argument checking to ActiveRecord callbacks
| * | | 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.