activeentity 0.0.1.beta15 → 6.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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: []