activeentity 0.0.1.beta15 → 6.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7f4a4f6e30f287b1ae750d510743b3cbb3c3ac40f00bcb56e9c5c634de23ce64
4
- data.tar.gz: 91a3be9d2223600c26ff56e025ddd37ec3d520951cc033587d196599a8b10e72
3
+ metadata.gz: a48deda3be4192f640dfdf3feebc0152f65cd41eb7483e9c0d082a1565071227
4
+ data.tar.gz: 79b7877eee5cf2c3f9ae976533f15a0651b2cc0257174b2f7ea8a93034123212
5
5
  SHA512:
6
- metadata.gz: 924b81ffdd2d8835492f7566dc70d11486932ff913a3bea4569294545a9f3037b009e147e6bf77c222686a82596bda207620dd2cb07ec8334af9937ab03b7df6
7
- data.tar.gz: da1b359c2ae9d9e0a1033bce6934c5fde0a18c96a78a8b63eaab4d5a83f71f75b241a59c5867cecaaff8033113d4c0bc0bdd094d04b3d0f057d113ad7a94c4b5
6
+ metadata.gz: 718bced85e2be2eb42ad37daca8ba3a9d1a1c63f3e91f6fedcea297c57abce9c596ab2bad681ecaad2d13b001edb7d695872021ebab5a57a954a9b63a409ebb5
7
+ data.tar.gz: 37eafc74002e3a8b5e4af2c017f070ba782c6b347dd40d92dcf25f867cf9be79b72fd4dba6e378766422741325e9e9df9c09dad43a35deb5e9ab1e496cdfb1f3
data/README.md CHANGED
@@ -65,7 +65,7 @@ Supported Active Record validations:
65
65
 
66
66
  #### `subset` validation
67
67
 
68
- Because Active Entity supports array attribute, for some reason, we may want to test values of an array attribute are all included in a given set.
68
+ Because Active Entity supports array attribute, for some reason, you may want to test values of an array attribute are all included in a given set.
69
69
 
70
70
  Active Entity provides `subset` validation to achieve that, it usage similar to `inclusion` or `exclusion`
71
71
 
@@ -76,9 +76,9 @@ class Steak < ActiveEntity::Base
76
76
  end
77
77
  ```
78
78
 
79
- #### `uniqueness_in_embedding` validation
79
+ #### `uniqueness_in_embeds` validation
80
80
 
81
- Active Entity provides `uniqueness_in_embedding` validation to test duplicate nesting virtual record.
81
+ Active Entity provides `uniqueness_in_embeds` validation to test duplicate nesting virtual record.
82
82
 
83
83
  Argument `key` is attribute name of nested model, it also supports multiple attributes by given an array.
84
84
 
@@ -101,6 +101,23 @@ class Book < ActiveEntity::Base
101
101
  end
102
102
  ```
103
103
 
104
+ #### `uniqueness_in_active_record` validation
105
+
106
+ Active Entity provides `uniqueness_in_active_record` validation to test given `scope` doesn't present in ActiveRecord model.
107
+
108
+ The usage same as [uniqueness](https://guides.rubyonrails.org/active_record_validations.html#uniqueness) in addition you must give a AR model `class_name`
109
+
110
+ ```ruby
111
+ class Candidate < ActiveEntity::Base
112
+ attribute :name, :string
113
+
114
+ validates :name,
115
+ uniqueness_on_active_record: {
116
+ class_name: "Staff"
117
+ }
118
+ end
119
+ ```
120
+
104
121
  ### Others
105
122
 
106
123
  These Active Record feature also available in Active Entity
data/lib/active_entity.rb CHANGED
@@ -38,6 +38,7 @@ module ActiveEntity
38
38
  extend ActiveSupport::Autoload
39
39
 
40
40
  autoload :Base
41
+ autoload :Callbacks
41
42
  autoload :Core
42
43
  autoload :Enum
43
44
  autoload :Inheritance
@@ -6,29 +6,25 @@ module ActiveEntity
6
6
  module AttributeAssignment
7
7
  include ActiveModel::AttributeAssignment
8
8
 
9
- def assign_attributes(attributes)
10
- super(attributes.dup)
11
- end
12
-
13
9
  private
14
10
 
15
11
  def _assign_attributes(attributes)
16
- multi_parameter_attributes = {}
17
- nested_parameter_attributes = {}
12
+ multi_parameter_attributes = nested_parameter_attributes = nil
18
13
 
19
14
  attributes.each do |k, v|
20
15
  key = k.to_s
21
16
 
22
17
  if key.include?("(")
23
- multi_parameter_attributes[key] = attributes.delete(k)
18
+ (multi_parameter_attributes ||= {})[key] = v
24
19
  elsif v.is_a?(Hash)
25
- nested_parameter_attributes[key] = attributes.delete(k)
20
+ (nested_parameter_attributes ||= {})[key] = v
21
+ else
22
+ _assign_attribute(key, v)
26
23
  end
27
24
  end
28
- super(attributes)
29
25
 
30
- assign_nested_parameter_attributes(nested_parameter_attributes) unless nested_parameter_attributes.empty?
31
- assign_multiparameter_attributes(multi_parameter_attributes) unless multi_parameter_attributes.empty?
26
+ assign_nested_parameter_attributes(nested_parameter_attributes) if nested_parameter_attributes
27
+ assign_multiparameter_attributes(multi_parameter_attributes) if multi_parameter_attributes
32
28
  end
33
29
 
34
30
  # Assign any deferred nested attributes after the base attributes have been set.
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "mutex_m"
4
+ require "active_support/core_ext/enumerable"
4
5
 
5
6
  module ActiveEntity
6
7
  # = Active Entity Attribute Methods
@@ -26,6 +27,17 @@ module ActiveEntity
26
27
  include Mutex_m
27
28
  end
28
29
 
30
+ class << self
31
+ def dangerous_attribute_methods # :nodoc:
32
+ @dangerous_attribute_methods ||= (
33
+ Base.instance_methods +
34
+ Base.private_instance_methods -
35
+ Base.superclass.instance_methods -
36
+ Base.superclass.private_instance_methods
37
+ ).map { |m| -m.to_s }.to_set.freeze
38
+ end
39
+ end
40
+
29
41
  module ClassMethods
30
42
  def inherited(child_class) #:nodoc:
31
43
  child_class.initialize_generated_modules
@@ -95,7 +107,7 @@ module ActiveEntity
95
107
  # A method name is 'dangerous' if it is already (re)defined by Active Entity, but
96
108
  # not by any ancestors. (So 'puts' is not dangerous but 'save' is.)
97
109
  def dangerous_attribute_method?(name) # :nodoc:
98
- method_defined_within?(name, Base)
110
+ ::ActiveEntity::AttributeMethods.dangerous_attribute_methods.include?(name.to_s)
99
111
  end
100
112
 
101
113
  def method_defined_within?(name, klass, superklass = klass.superclass) # :nodoc:
@@ -147,25 +159,40 @@ module ActiveEntity
147
159
  # class Person < ActiveEntity::Base
148
160
  # end
149
161
  #
150
- # Person.has_attribute?('name') # => true
151
- # Person.has_attribute?(:age) # => true
152
- # Person.has_attribute?(:nothing) # => false
162
+ # Person.has_attribute?('name') # => true
163
+ # Person.has_attribute?('new_name') # => true
164
+ # Person.has_attribute?(:age) # => true
165
+ # Person.has_attribute?(:nothing) # => false
153
166
  def has_attribute?(attr_name)
154
- attribute_types.key?(attr_name.to_s)
167
+ attr_name = attr_name.to_s
168
+ attr_name = attribute_aliases[attr_name] || attr_name
169
+ attribute_types.key?(attr_name)
170
+ end
171
+
172
+ def _has_attribute?(attr_name) # :nodoc:
173
+ attribute_types.key?(attr_name)
155
174
  end
156
175
  end
157
176
 
158
177
  # Returns +true+ if the given attribute is in the attributes hash, otherwise +false+.
159
178
  #
160
179
  # class Person < ActiveEntity::Base
180
+ # alias_attribute :new_name, :name
161
181
  # end
162
182
  #
163
183
  # person = Person.new
164
- # person.has_attribute?(:name) # => true
165
- # person.has_attribute?('age') # => true
166
- # person.has_attribute?(:nothing) # => false
184
+ # person.has_attribute?(:name) # => true
185
+ # person.has_attribute?(:new_name) # => true
186
+ # person.has_attribute?('age') # => true
187
+ # person.has_attribute?(:nothing) # => false
167
188
  def has_attribute?(attr_name)
168
- @attributes.key?(attr_name.to_s)
189
+ attr_name = attr_name.to_s
190
+ attr_name = self.class.attribute_aliases[attr_name] || attr_name
191
+ @attributes.key?(attr_name)
192
+ end
193
+
194
+ def _has_attribute?(attr_name) # :nodoc:
195
+ @attributes.key?(attr_name)
169
196
  end
170
197
 
171
198
  # Returns an array of names for the attributes available on this object.
@@ -209,6 +236,7 @@ module ActiveEntity
209
236
  # person.attribute_for_inspect(:tag_ids)
210
237
  # # => "[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]"
211
238
  def attribute_for_inspect(attr_name)
239
+ attr_name = attr_name.to_s
212
240
  value = _read_attribute(attr_name)
213
241
  format_for_inspect(value)
214
242
  end
@@ -228,8 +256,9 @@ module ActiveEntity
228
256
  # task.is_done = true
229
257
  # task.attribute_present?(:title) # => true
230
258
  # task.attribute_present?(:is_done) # => true
231
- def attribute_present?(attribute)
232
- value = _read_attribute(attribute)
259
+ def attribute_present?(attr_name)
260
+ attr_name = attr_name.to_s
261
+ value = _read_attribute(attr_name)
233
262
  !value.nil? && !(value.respond_to?(:empty?) && value.empty?)
234
263
  end
235
264
 
@@ -268,39 +297,6 @@ module ActiveEntity
268
297
  write_attribute(attr_name, value)
269
298
  end
270
299
 
271
- # Returns the name of all database fields which have been read from this
272
- # model. This can be useful in development mode to determine which fields
273
- # need to be selected. For performance critical pages, selecting only the
274
- # required fields can be an easy performance win (assuming you aren't using
275
- # all of the fields on the model).
276
- #
277
- # For example:
278
- #
279
- # class PostsController < ActionController::Base
280
- # after_action :print_accessed_fields, only: :index
281
- #
282
- # def index
283
- # @posts = Post.all
284
- # end
285
- #
286
- # private
287
- #
288
- # def print_accessed_fields
289
- # p @posts.first.accessed_fields
290
- # end
291
- # end
292
- #
293
- # Which allows you to quickly change your code to:
294
- #
295
- # class PostsController < ActionController::Base
296
- # def index
297
- # @posts = Post.select(:id, :title, :author_id, :updated_at)
298
- # end
299
- # end
300
- def accessed_fields
301
- @attributes.accessed
302
- end
303
-
304
300
  private
305
301
 
306
302
  def attribute_method?(attr_name)
@@ -308,12 +304,6 @@ module ActiveEntity
308
304
  defined?(@attributes) && @attributes.key?(attr_name)
309
305
  end
310
306
 
311
- def attributes_with_values(attribute_names)
312
- attribute_names.each_with_object({}) do |name, attrs|
313
- attrs[name] = _read_attribute(name)
314
- end
315
- end
316
-
317
307
  def format_for_inspect(value)
318
308
  if value.is_a?(String) && value.length > 50
319
309
  "#{value[0, 50]}...".inspect
@@ -46,7 +46,7 @@ module ActiveEntity
46
46
  # task.read_attribute_before_type_cast('completed_on') # => "2012-10-21"
47
47
  # task.read_attribute_before_type_cast(:completed_on) # => "2012-10-21"
48
48
  def read_attribute_before_type_cast(attr_name)
49
- @attributes[attr_name.to_s].value_before_type_cast
49
+ attribute_before_type_cast(attr_name.to_s)
50
50
  end
51
51
 
52
52
  # Returns a hash of attributes before typecasting and deserialization.
@@ -66,12 +66,12 @@ module ActiveEntity
66
66
  private
67
67
 
68
68
  # Dispatch target for <tt>*_before_type_cast</tt> attribute methods.
69
- def attribute_before_type_cast(attribute_name)
70
- read_attribute_before_type_cast(attribute_name)
69
+ def attribute_before_type_cast(attr_name)
70
+ @attributes[attr_name].value_before_type_cast
71
71
  end
72
72
 
73
- def attribute_came_from_user?(attribute_name)
74
- @attributes[attribute_name].came_from_user?
73
+ def attribute_came_from_user?(attr_name)
74
+ @attributes[attr_name].came_from_user?
75
75
  end
76
76
  end
77
77
  end
@@ -16,29 +16,27 @@ module ActiveEntity
16
16
 
17
17
  # Returns the primary key column's value.
18
18
  def id
19
- primary_key = self.class.primary_key
20
- _read_attribute(primary_key) if primary_key
19
+ _read_attribute(@primary_key)
21
20
  end
22
21
 
23
22
  # Sets the primary key column's value.
24
23
  def id=(value)
25
- primary_key = self.class.primary_key
26
- _write_attribute(primary_key, value) if primary_key
24
+ _write_attribute(@primary_key, value)
27
25
  end
28
26
 
29
27
  # Queries the primary key column's value.
30
28
  def id?
31
- query_attribute(self.class.primary_key)
29
+ query_attribute(@primary_key)
32
30
  end
33
31
 
34
32
  # Returns the primary key column's value before type cast.
35
33
  def id_before_type_cast
36
- read_attribute_before_type_cast(self.class.primary_key)
34
+ read_attribute_before_type_cast(@primary_key)
37
35
  end
38
36
 
39
37
  # Returns the primary key column's previous value.
40
38
  def id_was
41
- attribute_was(self.class.primary_key)
39
+ attribute_was(@primary_key)
42
40
  end
43
41
 
44
42
  private
@@ -48,7 +46,7 @@ module ActiveEntity
48
46
  end
49
47
 
50
48
  module ClassMethods
51
- ID_ATTRIBUTE_METHODS = %w(id id= id? id_before_type_cast id_was id_in_database).to_set
49
+ ID_ATTRIBUTE_METHODS = %w(id id= id? id_before_type_cast id_was).to_set
52
50
 
53
51
  def instance_method_already_implemented?(method_name)
54
52
  super || primary_key && ID_ATTRIBUTE_METHODS.include?(method_name)
@@ -31,12 +31,8 @@ module ActiveEntity
31
31
  end
32
32
  end
33
33
 
34
- private
35
-
36
- # Dispatch target for <tt>*?</tt> attribute methods.
37
- def attribute?(attribute_name)
38
- query_attribute(attribute_name)
39
- end
34
+ alias :attribute? :query_attribute
35
+ private :attribute?
40
36
  end
41
37
  end
42
38
  end
@@ -8,16 +8,14 @@ module ActiveEntity
8
8
  module ClassMethods # :nodoc:
9
9
  private
10
10
 
11
- def define_method_attribute(name)
11
+ def define_method_attribute(name, owner:)
12
12
  ActiveModel::AttributeMethods::AttrNames.define_attribute_accessor_method(
13
- generated_attribute_methods, name
13
+ owner, name
14
14
  ) do |temp_method_name, attr_name_expr|
15
- generated_attribute_methods.module_eval <<-RUBY, __FILE__, __LINE__ + 1
16
- def #{temp_method_name}
17
- name = #{attr_name_expr}
18
- _read_attribute(name) { |n| missing_attribute(n, caller) }
19
- end
20
- RUBY
15
+ owner <<
16
+ "def #{temp_method_name}" <<
17
+ " _read_attribute(#{attr_name_expr}) { |n| missing_attribute(n, caller) }" <<
18
+ "end"
21
19
  end
22
20
  end
23
21
  end
@@ -29,13 +27,14 @@ module ActiveEntity
29
27
  name = attr_name.to_s
30
28
  name = self.class.attribute_aliases[name] || name
31
29
 
32
- _read_attribute(name, &block)
30
+ name = @primary_key if name == "id" && @primary_key
31
+ @attributes.fetch_value(name, &block)
33
32
  end
34
33
 
35
34
  # This method exists to avoid the expensive primary_key check internally, without
36
35
  # breaking compatibility with the read_attribute API
37
36
  def _read_attribute(attr_name, &block) # :nodoc
38
- @attributes.fetch_value(attr_name.to_s, &block)
37
+ @attributes.fetch_value(attr_name, &block)
39
38
  end
40
39
 
41
40
  alias :attribute :_read_attribute
@@ -12,16 +12,14 @@ module ActiveEntity
12
12
  module ClassMethods # :nodoc:
13
13
  private
14
14
 
15
- def define_method_attribute=(name)
15
+ def define_method_attribute=(name, owner:)
16
16
  ActiveModel::AttributeMethods::AttrNames.define_attribute_accessor_method(
17
- generated_attribute_methods, name, writer: true,
18
- ) do |temp_method_name, attr_name_expr|
19
- generated_attribute_methods.module_eval <<-RUBY, __FILE__, __LINE__ + 1
20
- def #{temp_method_name}(value)
21
- name = #{attr_name_expr}
22
- _write_attribute(name, value)
23
- end
24
- RUBY
17
+ owner, name, writer: true,
18
+ ) do |temp_method_name, attr_name_expr|
19
+ owner <<
20
+ "def #{temp_method_name}(value)" <<
21
+ " _write_attribute(#{attr_name_expr}, value)" <<
22
+ "end"
25
23
  end
26
24
  end
27
25
  end
@@ -33,28 +31,23 @@ module ActiveEntity
33
31
  name = attr_name.to_s
34
32
  name = self.class.attribute_aliases[name] || name
35
33
 
36
- _write_attribute(name, value)
34
+ name = @primary_key if name == "id" && @primary_key
35
+ @attributes.write_from_user(name, value)
37
36
  end
38
37
 
39
38
  # This method exists to avoid the expensive primary_key check internally, without
40
39
  # breaking compatibility with the write_attribute API
41
40
  def _write_attribute(attr_name, value) # :nodoc:
42
- return if readonly_attribute?(attr_name) && attr_readonly_enabled?
43
-
44
- @attributes.write_from_user(attr_name.to_s, value)
45
- value
41
+ @attributes.write_from_user(attr_name, value)
46
42
  end
47
43
 
44
+ alias :attribute= :_write_attribute
45
+ private :attribute=
46
+
48
47
  private
49
48
 
50
49
  def write_attribute_without_type_cast(attr_name, value)
51
- @attributes.write_cast_value(attr_name.to_s, value)
52
- value
53
- end
54
-
55
- # Dispatch target for <tt>*=</tt> attribute methods.
56
- def attribute=(attribute_name, value)
57
- _write_attribute(attribute_name, value)
50
+ @attributes.write_cast_value(attr_name, value)
58
51
  end
59
52
  end
60
53
  end
@@ -6,7 +6,6 @@ require "active_support/descendants_tracker"
6
6
  require "active_support/time"
7
7
  require "active_support/core_ext/class/subclasses"
8
8
  require "active_entity/attribute_decorators"
9
- require "active_entity/define_callbacks"
10
9
  require "active_entity/attributes"
11
10
 
12
11
  module ActiveEntity #:nodoc:
@@ -280,7 +279,6 @@ module ActiveEntity #:nodoc:
280
279
  include Validations
281
280
  include Attributes
282
281
  include AttributeDecorators
283
- include DefineCallbacks
284
282
  include AttributeMethods
285
283
  include Callbacks
286
284
  include Associations
@@ -1,13 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ActiveEntity
4
- # This module exists because ActiveEntity::AttributeMethods::Dirty needs to
5
- # define callbacks, but continue to have its version of +save+ be the super
6
- # method of ActiveEntity::Callbacks. This will be removed when the removal
7
- # of deprecated code removes this need.
8
- module DefineCallbacks
4
+ module Callbacks
9
5
  extend ActiveSupport::Concern
10
6
 
7
+ CALLBACKS = [
8
+ :after_initialize, :before_validation, :after_validation
9
+ ]
10
+
11
11
  module ClassMethods # :nodoc:
12
12
  include ActiveModel::Callbacks
13
13
  end
@@ -317,6 +317,7 @@ module ActiveEntity
317
317
  end
318
318
 
319
319
  def init_internals
320
+ @primary_key = self.class.primary_key
320
321
  @readonly = false
321
322
  @marked_for_destruction = false
322
323
 
@@ -7,10 +7,10 @@ module ActiveEntity
7
7
  end
8
8
 
9
9
  module VERSION
10
- MAJOR = 0
11
- MINOR = 0
10
+ MAJOR = 6
11
+ MINOR = 1
12
12
  TINY = 1
13
- PRE = "beta15"
13
+ PRE = nil
14
14
 
15
15
  STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".")
16
16
  end
@@ -27,7 +27,7 @@ module ActiveEntity
27
27
  raise ArgumentError, "Must provide one of option :class_name or :class."
28
28
  end
29
29
  unless @klass < ActiveRecord::Base
30
- raise ArgumentError, "Class must be an Active Entity model, but got #{@finder_class}."
30
+ raise ArgumentError, "Class must be an Active Entity model, but got #{@klass}."
31
31
  end
32
32
  if @klass.abstract_class?
33
33
  raise ArgumentError, "Class can't be an abstract class."
@@ -39,13 +39,6 @@ module ActiveEntity
39
39
  value = map_enum_attribute(finder_class, attribute, value)
40
40
 
41
41
  relation = build_relation(finder_class, attribute, value)
42
- if record.persisted?
43
- if finder_class.primary_key
44
- relation = relation.where.not(finder_class.primary_key => record.id_in_database)
45
- else
46
- raise UnknownPrimaryKey.new(finder_class, "Cannot validate uniqueness for persisted record without primary key.")
47
- end
48
- end
49
42
  relation = scope_relation(record, relation)
50
43
  relation = relation.merge(options[:conditions]) if options[:conditions]
51
44
 
@@ -94,11 +87,7 @@ module ActiveEntity
94
87
 
95
88
  def scope_relation(record, relation)
96
89
  Array(options[:scope]).each do |scope_item|
97
- scope_value = if record.class._reflect_on_association(scope_item)
98
- record.association(scope_item).reader
99
- else
100
- record._read_attribute(scope_item)
101
- end
90
+ scope_value = record._read_attribute(scope_item)
102
91
  relation = relation.where(scope_item => scope_value)
103
92
  end
104
93
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activeentity
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1.beta15
4
+ version: 6.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - jasl
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-02-14 00:00:00.000000000 Z
11
+ date: 2021-04-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -89,10 +89,10 @@ files:
89
89
  - lib/active_entity/attribute_methods/write.rb
90
90
  - lib/active_entity/attributes.rb
91
91
  - lib/active_entity/base.rb
92
+ - lib/active_entity/callbacks.rb
92
93
  - lib/active_entity/coders/json.rb
93
94
  - lib/active_entity/coders/yaml_column.rb
94
95
  - lib/active_entity/core.rb
95
- - lib/active_entity/define_callbacks.rb
96
96
  - lib/active_entity/enum.rb
97
97
  - lib/active_entity/errors.rb
98
98
  - lib/active_entity/gem_version.rb
@@ -135,7 +135,7 @@ homepage: https://github.com/jasl/activeentity
135
135
  licenses:
136
136
  - MIT
137
137
  metadata: {}
138
- post_install_message:
138
+ post_install_message:
139
139
  rdoc_options: []
140
140
  require_paths:
141
141
  - lib
@@ -146,12 +146,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
146
146
  version: 2.5.0
147
147
  required_rubygems_version: !ruby/object:Gem::Requirement
148
148
  requirements:
149
- - - ">"
149
+ - - ">="
150
150
  - !ruby/object:Gem::Version
151
- version: 1.3.1
151
+ version: '0'
152
152
  requirements: []
153
- rubygems_version: 3.1.2
154
- signing_key:
153
+ rubygems_version: 3.1.4
154
+ signing_key:
155
155
  specification_version: 4
156
156
  summary: Rails virtual model solution based on ActiveModel.
157
157
  test_files: []