activemodel 5.2.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +114 -0
  3. data/MIT-LICENSE +21 -0
  4. data/README.rdoc +264 -0
  5. data/lib/active_model.rb +77 -0
  6. data/lib/active_model/attribute.rb +248 -0
  7. data/lib/active_model/attribute/user_provided_default.rb +52 -0
  8. data/lib/active_model/attribute_assignment.rb +57 -0
  9. data/lib/active_model/attribute_methods.rb +478 -0
  10. data/lib/active_model/attribute_mutation_tracker.rb +124 -0
  11. data/lib/active_model/attribute_set.rb +114 -0
  12. data/lib/active_model/attribute_set/builder.rb +126 -0
  13. data/lib/active_model/attribute_set/yaml_encoder.rb +41 -0
  14. data/lib/active_model/attributes.rb +111 -0
  15. data/lib/active_model/callbacks.rb +153 -0
  16. data/lib/active_model/conversion.rb +111 -0
  17. data/lib/active_model/dirty.rb +343 -0
  18. data/lib/active_model/errors.rb +517 -0
  19. data/lib/active_model/forbidden_attributes_protection.rb +31 -0
  20. data/lib/active_model/gem_version.rb +17 -0
  21. data/lib/active_model/lint.rb +118 -0
  22. data/lib/active_model/locale/en.yml +36 -0
  23. data/lib/active_model/model.rb +99 -0
  24. data/lib/active_model/naming.rb +318 -0
  25. data/lib/active_model/railtie.rb +14 -0
  26. data/lib/active_model/secure_password.rb +129 -0
  27. data/lib/active_model/serialization.rb +192 -0
  28. data/lib/active_model/serializers/json.rb +146 -0
  29. data/lib/active_model/translation.rb +70 -0
  30. data/lib/active_model/type.rb +53 -0
  31. data/lib/active_model/type/big_integer.rb +15 -0
  32. data/lib/active_model/type/binary.rb +52 -0
  33. data/lib/active_model/type/boolean.rb +38 -0
  34. data/lib/active_model/type/date.rb +57 -0
  35. data/lib/active_model/type/date_time.rb +51 -0
  36. data/lib/active_model/type/decimal.rb +70 -0
  37. data/lib/active_model/type/float.rb +36 -0
  38. data/lib/active_model/type/helpers.rb +7 -0
  39. data/lib/active_model/type/helpers/accepts_multiparameter_time.rb +41 -0
  40. data/lib/active_model/type/helpers/mutable.rb +20 -0
  41. data/lib/active_model/type/helpers/numeric.rb +37 -0
  42. data/lib/active_model/type/helpers/time_value.rb +68 -0
  43. data/lib/active_model/type/helpers/timezone.rb +19 -0
  44. data/lib/active_model/type/immutable_string.rb +32 -0
  45. data/lib/active_model/type/integer.rb +70 -0
  46. data/lib/active_model/type/registry.rb +70 -0
  47. data/lib/active_model/type/string.rb +26 -0
  48. data/lib/active_model/type/time.rb +51 -0
  49. data/lib/active_model/type/value.rb +126 -0
  50. data/lib/active_model/validations.rb +439 -0
  51. data/lib/active_model/validations/absence.rb +33 -0
  52. data/lib/active_model/validations/acceptance.rb +106 -0
  53. data/lib/active_model/validations/callbacks.rb +122 -0
  54. data/lib/active_model/validations/clusivity.rb +54 -0
  55. data/lib/active_model/validations/confirmation.rb +80 -0
  56. data/lib/active_model/validations/exclusion.rb +49 -0
  57. data/lib/active_model/validations/format.rb +114 -0
  58. data/lib/active_model/validations/helper_methods.rb +15 -0
  59. data/lib/active_model/validations/inclusion.rb +47 -0
  60. data/lib/active_model/validations/length.rb +129 -0
  61. data/lib/active_model/validations/numericality.rb +189 -0
  62. data/lib/active_model/validations/presence.rb +39 -0
  63. data/lib/active_model/validations/validates.rb +174 -0
  64. data/lib/active_model/validations/with.rb +147 -0
  65. data/lib/active_model/validator.rb +183 -0
  66. data/lib/active_model/version.rb +10 -0
  67. metadata +125 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 8b7a48a8632cd04a47cb21f650b4fff342c211176eec7e4e6fcc2baa0afd05a5
4
+ data.tar.gz: 170909099c8c1cd1fb72bbb9763dbba6356079c19b2a13511891f092b1045a4b
5
+ SHA512:
6
+ metadata.gz: d27c5bc840d55391b7e7388372a75216aeb3de80f896c35db3fdb681f231755be985d1c8504c5fb5dd5a08d465bf36ecef3318da5c796e1736217117498cd808
7
+ data.tar.gz: e6315cbe00493bf2d109f307dc86df73f157e4cc1c0869443409c3d428736033d0ee40722dd95750035969bafcc63cb4ea609785538afa99bbd5af7ad8cd96ad
@@ -0,0 +1,114 @@
1
+ ## Rails 5.2.3 (March 27, 2019) ##
2
+
3
+ * Fix date value when casting a multiparameter date hash to not convert
4
+ from Gregorian date to Julian date.
5
+
6
+ Before:
7
+
8
+ Day.new({"day(1i)"=>"1", "day(2i)"=>"1", "day(3i)"=>"1"})
9
+ => #<Day id: nil, day: "0001-01-03", created_at: nil, updated_at: nil>
10
+
11
+ After:
12
+
13
+ Day.new({"day(1i)"=>"1", "day(2i)"=>"1", "day(3i)"=>"1"})
14
+ => #<Day id: nil, day: "0001-01-01", created_at: nil, updated_at: nil>
15
+
16
+ Fixes #28521.
17
+
18
+ *Sayan Chakraborty*
19
+
20
+ * Fix numericality equality validation of `BigDecimal` and `Float`
21
+ by casting to `BigDecimal` on both ends of the validation.
22
+
23
+ *Gannon McGibbon*
24
+
25
+
26
+ ## Rails 5.2.2.1 (March 11, 2019) ##
27
+
28
+ * No changes.
29
+
30
+
31
+ ## Rails 5.2.2 (December 04, 2018) ##
32
+
33
+ * Fix numericality validator to still use value before type cast except Active Record.
34
+
35
+ Fixes #33651, #33686.
36
+
37
+ *Ryuta Kamizono*
38
+
39
+
40
+ ## Rails 5.2.1.1 (November 27, 2018) ##
41
+
42
+ * No changes.
43
+
44
+
45
+ ## Rails 5.2.1 (August 07, 2018) ##
46
+
47
+ * No changes.
48
+
49
+
50
+ ## Rails 5.2.0 (April 09, 2018) ##
51
+
52
+ * Do not lose all multiple `:includes` with options in serialization.
53
+
54
+ *Mike Mangino*
55
+
56
+ * Models using the attributes API with a proc default can now be marshalled.
57
+
58
+ Fixes #31216.
59
+
60
+ *Sean Griffin*
61
+
62
+ * Fix to working before/after validation callbacks on multiple contexts.
63
+
64
+ *Yoshiyuki Hirano*
65
+
66
+ * Execute `ConfirmationValidator` validation when `_confirmation`'s value is `false`.
67
+
68
+ *bogdanvlviv*
69
+
70
+ * Allow passing a Proc or Symbol to length validator options.
71
+
72
+ *Matt Rohrer*
73
+
74
+ * Add method `#merge!` for `ActiveModel::Errors`.
75
+
76
+ *Jahfer Husain*
77
+
78
+ * Fix regression in numericality validator when comparing Decimal and Float input
79
+ values with more scale than the schema.
80
+
81
+ *Bradley Priest*
82
+
83
+ * Fix methods `#keys`, `#values` in `ActiveModel::Errors`.
84
+
85
+ Change `#keys` to only return the keys that don't have empty messages.
86
+
87
+ Change `#values` to only return the not empty values.
88
+
89
+ Example:
90
+
91
+ # Before
92
+ person = Person.new
93
+ person.errors.keys # => []
94
+ person.errors.values # => []
95
+ person.errors.messages # => {}
96
+ person.errors[:name] # => []
97
+ person.errors.messages # => {:name => []}
98
+ person.errors.keys # => [:name]
99
+ person.errors.values # => [[]]
100
+
101
+ # After
102
+ person = Person.new
103
+ person.errors.keys # => []
104
+ person.errors.values # => []
105
+ person.errors.messages # => {}
106
+ person.errors[:name] # => []
107
+ person.errors.messages # => {:name => []}
108
+ person.errors.keys # => []
109
+ person.errors.values # => []
110
+
111
+ *bogdanvlviv*
112
+
113
+
114
+ Please check [5-1-stable](https://github.com/rails/rails/blob/5-1-stable/activemodel/CHANGELOG.md) for previous changes.
@@ -0,0 +1,21 @@
1
+ Copyright (c) 2004-2018 David Heinemeier Hansson
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
+
@@ -0,0 +1,264 @@
1
+ = Active Model -- model interfaces for Rails
2
+
3
+ Active Model provides a known set of interfaces for usage in model classes.
4
+ They allow for Action Pack helpers to interact with non-Active Record models,
5
+ for example. Active Model also helps with building custom ORMs for use outside of
6
+ the Rails framework.
7
+
8
+ Prior to Rails 3.0, if a plugin or gem developer wanted to have an object
9
+ interact with Action Pack helpers, it was required to either copy chunks of
10
+ code from Rails, or monkey patch entire helpers to make them handle objects
11
+ that did not exactly conform to the Active Record interface. This would result
12
+ in code duplication and fragile applications that broke on upgrades. Active
13
+ Model solves this by defining an explicit API. You can read more about the
14
+ API in <tt>ActiveModel::Lint::Tests</tt>.
15
+
16
+ Active Model provides a default module that implements the basic API required
17
+ to integrate with Action Pack out of the box: <tt>ActiveModel::Model</tt>.
18
+
19
+ class Person
20
+ include ActiveModel::Model
21
+
22
+ attr_accessor :name, :age
23
+ validates_presence_of :name
24
+ end
25
+
26
+ person = Person.new(name: 'bob', age: '18')
27
+ person.name # => 'bob'
28
+ person.age # => '18'
29
+ person.valid? # => true
30
+
31
+ It includes model name introspections, conversions, translations and
32
+ validations, resulting in a class suitable to be used with Action Pack.
33
+ See <tt>ActiveModel::Model</tt> for more examples.
34
+
35
+ Active Model also provides the following functionality to have ORM-like
36
+ behavior out of the box:
37
+
38
+ * Add attribute magic to objects
39
+
40
+ class Person
41
+ include ActiveModel::AttributeMethods
42
+
43
+ attribute_method_prefix 'clear_'
44
+ define_attribute_methods :name, :age
45
+
46
+ attr_accessor :name, :age
47
+
48
+ def clear_attribute(attr)
49
+ send("#{attr}=", nil)
50
+ end
51
+ end
52
+
53
+ person = Person.new
54
+ person.clear_name
55
+ person.clear_age
56
+
57
+ {Learn more}[link:classes/ActiveModel/AttributeMethods.html]
58
+
59
+ * Callbacks for certain operations
60
+
61
+ class Person
62
+ extend ActiveModel::Callbacks
63
+ define_model_callbacks :create
64
+
65
+ def create
66
+ run_callbacks :create do
67
+ # Your create action methods here
68
+ end
69
+ end
70
+ end
71
+
72
+ This generates +before_create+, +around_create+ and +after_create+
73
+ class methods that wrap your create method.
74
+
75
+ {Learn more}[link:classes/ActiveModel/Callbacks.html]
76
+
77
+ * Tracking value changes
78
+
79
+ class Person
80
+ include ActiveModel::Dirty
81
+
82
+ define_attribute_methods :name
83
+
84
+ def name
85
+ @name
86
+ end
87
+
88
+ def name=(val)
89
+ name_will_change! unless val == @name
90
+ @name = val
91
+ end
92
+
93
+ def save
94
+ # do persistence work
95
+ changes_applied
96
+ end
97
+ end
98
+
99
+ person = Person.new
100
+ person.name # => nil
101
+ person.changed? # => false
102
+ person.name = 'bob'
103
+ person.changed? # => true
104
+ person.changed # => ['name']
105
+ person.changes # => { 'name' => [nil, 'bob'] }
106
+ person.save
107
+ person.name = 'robert'
108
+ person.save
109
+ person.previous_changes # => {'name' => ['bob, 'robert']}
110
+
111
+ {Learn more}[link:classes/ActiveModel/Dirty.html]
112
+
113
+ * Adding +errors+ interface to objects
114
+
115
+ Exposing error messages allows objects to interact with Action Pack
116
+ helpers seamlessly.
117
+
118
+ class Person
119
+
120
+ def initialize
121
+ @errors = ActiveModel::Errors.new(self)
122
+ end
123
+
124
+ attr_accessor :name
125
+ attr_reader :errors
126
+
127
+ def validate!
128
+ errors.add(:name, "cannot be nil") if name.nil?
129
+ end
130
+
131
+ def self.human_attribute_name(attr, options = {})
132
+ "Name"
133
+ end
134
+ end
135
+
136
+ person = Person.new
137
+ person.name = nil
138
+ person.validate!
139
+ person.errors.full_messages
140
+ # => ["Name cannot be nil"]
141
+
142
+ {Learn more}[link:classes/ActiveModel/Errors.html]
143
+
144
+ * Model name introspection
145
+
146
+ class NamedPerson
147
+ extend ActiveModel::Naming
148
+ end
149
+
150
+ NamedPerson.model_name.name # => "NamedPerson"
151
+ NamedPerson.model_name.human # => "Named person"
152
+
153
+ {Learn more}[link:classes/ActiveModel/Naming.html]
154
+
155
+ * Making objects serializable
156
+
157
+ <tt>ActiveModel::Serialization</tt> provides a standard interface for your object
158
+ to provide +to_json+ serialization.
159
+
160
+ class SerialPerson
161
+ include ActiveModel::Serialization
162
+
163
+ attr_accessor :name
164
+
165
+ def attributes
166
+ {'name' => name}
167
+ end
168
+ end
169
+
170
+ s = SerialPerson.new
171
+ s.serializable_hash # => {"name"=>nil}
172
+
173
+ class SerialPerson
174
+ include ActiveModel::Serializers::JSON
175
+ end
176
+
177
+ s = SerialPerson.new
178
+ s.to_json # => "{\"name\":null}"
179
+
180
+ {Learn more}[link:classes/ActiveModel/Serialization.html]
181
+
182
+ * Internationalization (i18n) support
183
+
184
+ class Person
185
+ extend ActiveModel::Translation
186
+ end
187
+
188
+ Person.human_attribute_name('my_attribute')
189
+ # => "My attribute"
190
+
191
+ {Learn more}[link:classes/ActiveModel/Translation.html]
192
+
193
+ * Validation support
194
+
195
+ class Person
196
+ include ActiveModel::Validations
197
+
198
+ attr_accessor :first_name, :last_name
199
+
200
+ validates_each :first_name, :last_name do |record, attr, value|
201
+ record.errors.add attr, 'starts with z.' if value.to_s[0] == ?z
202
+ end
203
+ end
204
+
205
+ person = Person.new
206
+ person.first_name = 'zoolander'
207
+ person.valid? # => false
208
+
209
+ {Learn more}[link:classes/ActiveModel/Validations.html]
210
+
211
+ * Custom validators
212
+
213
+ class HasNameValidator < ActiveModel::Validator
214
+ def validate(record)
215
+ record.errors.add(:name, "must exist") if record.name.blank?
216
+ end
217
+ end
218
+
219
+ class ValidatorPerson
220
+ include ActiveModel::Validations
221
+ validates_with HasNameValidator
222
+ attr_accessor :name
223
+ end
224
+
225
+ p = ValidatorPerson.new
226
+ p.valid? # => false
227
+ p.errors.full_messages # => ["Name must exist"]
228
+ p.name = "Bob"
229
+ p.valid? # => true
230
+
231
+ {Learn more}[link:classes/ActiveModel/Validator.html]
232
+
233
+
234
+ == Download and installation
235
+
236
+ The latest version of Active Model can be installed with RubyGems:
237
+
238
+ $ gem install activemodel
239
+
240
+ Source code can be downloaded as part of the Rails project on GitHub
241
+
242
+ * https://github.com/rails/rails/tree/5-2-stable/activemodel
243
+
244
+
245
+ == License
246
+
247
+ Active Model is released under the MIT license:
248
+
249
+ * https://opensource.org/licenses/MIT
250
+
251
+
252
+ == Support
253
+
254
+ API documentation is at:
255
+
256
+ * http://api.rubyonrails.org
257
+
258
+ Bug reports for the Ruby on Rails project can be filed here:
259
+
260
+ * https://github.com/rails/rails/issues
261
+
262
+ Feature requests should be discussed on the rails-core mailing list here:
263
+
264
+ * https://groups.google.com/forum/?fromgroups#!forum/rubyonrails-core
@@ -0,0 +1,77 @@
1
+ # frozen_string_literal: true
2
+
3
+ #--
4
+ # Copyright (c) 2004-2018 David Heinemeier Hansson
5
+ #
6
+ # Permission is hereby granted, free of charge, to any person obtaining
7
+ # a copy of this software and associated documentation files (the
8
+ # "Software"), to deal in the Software without restriction, including
9
+ # without limitation the rights to use, copy, modify, merge, publish,
10
+ # distribute, sublicense, and/or sell copies of the Software, and to
11
+ # permit persons to whom the Software is furnished to do so, subject to
12
+ # the following conditions:
13
+ #
14
+ # The above copyright notice and this permission notice shall be
15
+ # included in all copies or substantial portions of the Software.
16
+ #
17
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
21
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
22
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
23
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24
+ #++
25
+
26
+ require "active_support"
27
+ require "active_support/rails"
28
+ require "active_model/version"
29
+
30
+ module ActiveModel
31
+ extend ActiveSupport::Autoload
32
+
33
+ autoload :Attribute
34
+ autoload :Attributes
35
+ autoload :AttributeAssignment
36
+ autoload :AttributeMethods
37
+ autoload :BlockValidator, "active_model/validator"
38
+ autoload :Callbacks
39
+ autoload :Conversion
40
+ autoload :Dirty
41
+ autoload :EachValidator, "active_model/validator"
42
+ autoload :ForbiddenAttributesProtection
43
+ autoload :Lint
44
+ autoload :Model
45
+ autoload :Name, "active_model/naming"
46
+ autoload :Naming
47
+ autoload :SecurePassword
48
+ autoload :Serialization
49
+ autoload :Translation
50
+ autoload :Type
51
+ autoload :Validations
52
+ autoload :Validator
53
+
54
+ eager_autoload do
55
+ autoload :Errors
56
+ autoload :RangeError, "active_model/errors"
57
+ autoload :StrictValidationFailed, "active_model/errors"
58
+ autoload :UnknownAttributeError, "active_model/errors"
59
+ end
60
+
61
+ module Serializers
62
+ extend ActiveSupport::Autoload
63
+
64
+ eager_autoload do
65
+ autoload :JSON
66
+ end
67
+ end
68
+
69
+ def self.eager_load!
70
+ super
71
+ ActiveModel::Serializers.eager_load!
72
+ end
73
+ end
74
+
75
+ ActiveSupport.on_load(:i18n) do
76
+ I18n.load_path << File.expand_path("active_model/locale/en.yml", __dir__)
77
+ end