enumbler 0.4.0 → 0.6.0

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: c41d00aedb09317c1c7d21627484d57e9d1d8f4f60e51370d56af7481e806fde
4
- data.tar.gz: 5187426aefcb06364f1941bbf62932817800de1748646fb658c901afa58d1d6a
3
+ metadata.gz: 2943ee8d89898bb8164e0eccc955f51de0c0ba3d95c814f0a928f967bc82486b
4
+ data.tar.gz: bda8b04d4dd0c9f17a9cd0f0f05e700b4fde8b24d6bad394ac8c5ab5662064da
5
5
  SHA512:
6
- metadata.gz: 64131fd59a8bd70b1897e554b266af9308378036e4d93817b50b95b0cb76bcc0d59c29153a7ccc42d5df1d556c4b3f4538a7499bb81b73c9f45e26823d1e5a30
7
- data.tar.gz: 36789800d5e024417b10c872aadae7facaeb03691b289de8da0b5439ecc4c57153db5b4625255e855d39d402e0a086ac3b5d8585134d675684c768a697a93e16
6
+ metadata.gz: 5340c39fd43f724d13eb648349be08d2115d9fd0964adda1c39403fdb992620b5209e45435ccb222589f9891048630763ec340c1866141e204b633cc4e58da09
7
+ data.tar.gz: e2f243201a8621571bdf000d82ca3fa8a9c12070c9a8a11ae8ab1796f8742f75baee7aa4abcad102c3b35cd39473b806d8f9af0c94bd9657a30462ce11b0fcf3
@@ -1,27 +1,27 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- enumbler (0.4.0)
5
- activerecord (~> 6.0.2)
6
- activesupport (~> 6.0.2)
4
+ enumbler (0.6.0)
5
+ activerecord (>= 5.2.3, < 6.1)
6
+ activesupport (>= 5.2.3, < 6.1)
7
7
 
8
8
  GEM
9
9
  remote: https://rubygems.org/
10
10
  specs:
11
- activemodel (6.0.2.2)
12
- activesupport (= 6.0.2.2)
13
- activerecord (6.0.2.2)
14
- activemodel (= 6.0.2.2)
15
- activesupport (= 6.0.2.2)
16
- activesupport (6.0.2.2)
11
+ activemodel (6.0.3.1)
12
+ activesupport (= 6.0.3.1)
13
+ activerecord (6.0.3.1)
14
+ activemodel (= 6.0.3.1)
15
+ activesupport (= 6.0.3.1)
16
+ activesupport (6.0.3.1)
17
17
  concurrent-ruby (~> 1.0, >= 1.0.2)
18
18
  i18n (>= 0.7, < 2)
19
19
  minitest (~> 5.1)
20
20
  tzinfo (~> 1.1)
21
- zeitwerk (~> 2.2)
21
+ zeitwerk (~> 2.2, >= 2.2.2)
22
22
  ast (2.4.0)
23
23
  concurrent-ruby (1.1.6)
24
- database_cleaner (1.8.4)
24
+ database_cleaner (1.8.5)
25
25
  database_cleaner-active_record (1.8.0)
26
26
  activerecord
27
27
  database_cleaner (~> 1.8.0)
@@ -32,9 +32,9 @@ GEM
32
32
  i18n (1.8.2)
33
33
  concurrent-ruby (~> 1.0)
34
34
  jaro_winkler (1.5.4)
35
- minitest (5.14.0)
35
+ minitest (5.14.1)
36
36
  parallel (1.19.1)
37
- parser (2.7.1.0)
37
+ parser (2.7.1.3)
38
38
  ast (~> 2.4.0)
39
39
  rainbow (3.0.0)
40
40
  rake (12.3.3)
@@ -43,15 +43,15 @@ GEM
43
43
  rspec-core (~> 3.9.0)
44
44
  rspec-expectations (~> 3.9.0)
45
45
  rspec-mocks (~> 3.9.0)
46
- rspec-core (3.9.1)
47
- rspec-support (~> 3.9.1)
48
- rspec-expectations (3.9.1)
46
+ rspec-core (3.9.2)
47
+ rspec-support (~> 3.9.3)
48
+ rspec-expectations (3.9.2)
49
49
  diff-lcs (>= 1.2.0, < 2.0)
50
50
  rspec-support (~> 3.9.0)
51
51
  rspec-mocks (3.9.1)
52
52
  diff-lcs (>= 1.2.0, < 2.0)
53
53
  rspec-support (~> 3.9.0)
54
- rspec-support (3.9.2)
54
+ rspec-support (3.9.3)
55
55
  rubocop (0.81.0)
56
56
  jaro_winkler (~> 1.5.1)
57
57
  parallel (~> 1.10)
data/README.md CHANGED
@@ -54,17 +54,45 @@ class House < ApplicationRecord
54
54
  end
55
55
 
56
56
  # This gives you some power:
57
- Color::BLACK # => 1
58
- Color.black # => equivalent to Color.find(1)
59
- Color.black.black? # => true
60
- Color.black.is_black # => true
61
- Color.white.not_black? # => true
57
+ Color::BLACK # => 1
58
+ Color.black # => equivalent to Color.find(1)
59
+ Color.black.black? # => true
60
+ Color.black.is_black # => true
61
+ Color.white.not_black? # => true
62
+
63
+ # Get attributes without hitting the database
64
+ Color.black(:id) # => 1
65
+ Color.black(:enum) # => :black
66
+ Color.black(:label) # => 'black'
67
+ Color.black(:graphql_enum) # => 'BLACK'
68
+
69
+ # Get an Enumble object from an id, label, enum, or ActiveRecord model
70
+ Color.find_enumbles(:black, 'white') # => [Enumbler::Enumble<:black>, Enumbler::Enumble<:white>]
71
+ Color.find_enumbles(:black, 'does-not-exist') # => [Enumbler::Enumble<:black>, nil]
72
+
73
+ Color.find_enumble(:black) # => Enumbler::Enumble<:black>
74
+
75
+ # raises errors if none found
76
+ Color.find_enumbles!!(:black, 'does-no-exist') # => raises Enumbler::Error
77
+ Color.find_enumble!(:does_not_exist) # => raises Enumbler::Error
78
+
79
+ # Get ids flexibly, without raising an error if none found
80
+ Color.ids_from_enumbler(:black, 'white') # => [1, 2]
81
+ Color.ids_from_enumbler(:black, 'does-no-exist') # => [1, nil]
82
+
83
+ # Raise an error if none found
84
+ Color.ids_from_enumbler!(:black, 'does-no-exist') # => raises Enumbler::Error
85
+ Color.id_from_enumbler!(:does_not_exist) # => raises Enumbler::Error
86
+
87
+ # Get enumble object by id
62
88
 
63
89
  house = House.create!(color: Color.black)
64
90
  house.black?
65
91
  house.not_black?
66
92
 
67
- House.color(:black) # => [house]
93
+ house2 = House.create!(color: Color.white)
94
+ House.color(:black, :white) # => ActiveRecord::Relation<house, house2>
95
+ House.color(Color.black, :white) # => ActiveRecord::Relation<house, house2>
68
96
  ```
69
97
 
70
98
  ### Use a column other than `label`
@@ -98,7 +126,8 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
98
126
 
99
127
  ## Roadmap
100
128
 
101
- Ideally, we could make this work more like a traditional `enum`; for example, overriding the `.where` method by allowing something like: `House.where(color: :blue)` instead of `House.where_color(:blue)`. But right now am in a rush and not sure how to go about doing that properly.
129
+ * We need to add in support for additional attributes/columns in the enumbled table. For example, following the `Color` concept, we may want to have a column which is `hex` and stores the colors `hex` value (e.g., `FFFFFF`). This should be supported.
130
+ * Ideally, we could make this work more like a traditional `enum`; for example, overriding the `.where` method by allowing something like: `House.where(color: :blue)` instead of `House.where_color(:blue)`. But right now am in a rush and not sure how to go about doing that properly.
102
131
 
103
132
  ## Contributing
104
133
 
@@ -29,8 +29,8 @@ Gem::Specification.new do |spec|
29
29
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
30
30
  spec.require_paths = ['lib']
31
31
 
32
- spec.add_dependency 'activerecord', '~> 6.0.2'
33
- spec.add_dependency 'activesupport', '~> 6.0.2'
32
+ spec.add_dependency 'activerecord', ['>= 5.2.3', '< 6.1']
33
+ spec.add_dependency 'activesupport', ['>= 5.2.3', '< 6.1']
34
34
 
35
35
  spec.add_development_dependency 'database_cleaner-active_record', '~> 1.8.0'
36
36
  spec.add_development_dependency 'fuubar', '~> 2.5'
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'enumbler/collection'
3
4
  require 'enumbler/enumble'
4
5
  require 'enumbler/enabler'
5
6
  require 'enumbler/version'
@@ -85,6 +86,10 @@ module Enumbler
85
86
  where(column_name => enumbled_model.ids_from_enumbler(args))
86
87
  end
87
88
 
89
+ define_singleton_method("#{cmethod}!") do |*args|
90
+ where(column_name => enumbled_model.ids_from_enumbler!(args))
91
+ end
92
+
88
93
  enumbled_model.enumbles.each do |enumble|
89
94
  method_name = prefix ? "#{model_name}_#{enumble.enum}?" : "#{enumble.enum}?"
90
95
  not_method_name = prefix ? "#{model_name}_not_#{enumble.enum}?" : "not_#{enumble.enum}?"
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Enumbler
4
+ # Not sure if this will be needed but was leaning toward a custom wrapper for
5
+ # our array holding the `enumbles` for our model. As it is, allows you to
6
+ # query them based on the enum:
7
+ #
8
+ # ```
9
+ # Color.enumbles.black # => [Enumbler::Enumble]
10
+ # ```
11
+ class Collection < Array
12
+ def method_missing(method_name, *args, &block)
13
+ enumble = find { |e| e.enum == method_name }
14
+ return enumble if enumble.present?
15
+
16
+ super
17
+ end
18
+
19
+ def respond_to_missing?(method_name, include_private = false)
20
+ enumble = find { |e| e.enum == method_name }
21
+ enumble.present? || super
22
+ end
23
+ end
24
+ end
@@ -58,7 +58,7 @@ module Enumbler
58
58
  # @param **options [Hash] optional: additional attributes and values that
59
59
  # will be saved to the database for this enumble record
60
60
  def enumble(enum, id, label: nil, **options)
61
- @enumbles ||= []
61
+ @enumbles ||= Enumbler::Collection.new
62
62
  @enumbled_model = self
63
63
  @enumbler_label_column_name ||= :label
64
64
 
@@ -68,7 +68,7 @@ module Enumbler
68
68
  raise Error, "You cannot add the same Enumble twice! Attempted to add: #{enum}, #{id}."
69
69
  end
70
70
 
71
- define_dynamic_methods_and_constants_for_enumbled_model(enum, id)
71
+ define_dynamic_methods_and_constants_for_enumbled_model(enumble)
72
72
 
73
73
  @enumbles << enumble
74
74
  end
@@ -97,6 +97,93 @@ module Enumbler
97
97
  @enumbler_label_column_name = label_column_name
98
98
  end
99
99
 
100
+ # See {.find_enumbles}. Simply returns the first object. Use when you
101
+ # want one argument to be found and not returned in an array.
102
+ # @raise [Error] when there is no [Enumbler::Enumble] to be found and
103
+ # `raise_error: true`
104
+ # @param args [Integer, String, Symbol]
105
+ # @param case_sensitive [Boolean] should a String search be case sensitive
106
+ # (default: false)
107
+ # @param raise_error [Boolean] raise an error if not found (default:
108
+ # false)
109
+ # @return [Enumbler::Enumble]
110
+ def find_enumble(arg, case_sensitive: false, raise_error: false)
111
+ find_enumbles(arg, case_sensitive: case_sensitive, raise_error: raise_error).first
112
+ end
113
+
114
+ # See {.find_enumbles}. Simply returns the first object. Use when you
115
+ # want one argument to be found and not returned in an array. Raises error
116
+ # if none found.
117
+ # @raise [Error] when there is no [Enumbler::Enumble] to be found and
118
+ # `raise_error: true`
119
+ # @param args [Integer, String, Symbol]
120
+ # @param case_sensitive [Boolean] should a String search be case sensitive
121
+ # (default: false)
122
+ # @return [Enumbler::Enumble]
123
+ def find_enumble!(arg, case_sensitive: false)
124
+ find_enumbles(arg, case_sensitive: case_sensitive, raise_error: true).first
125
+ end
126
+
127
+ # Finds an array of {Enumbler::Enumble} objects matching the given
128
+ # argument. Accepts an Integer, String, Symbol, or ActiveRecord instance.
129
+ #
130
+ # This method is designed to let you get information about the record
131
+ # without having to hit the database. Returns `nil` when none found
132
+ # unless `raise_error` is `true`.
133
+ #
134
+ # Color.find_enumbles(:black, 'white', 'not-found')
135
+ # #=> [Enumbler::Enumble<:black>, Enumbler::Enumble<:white>, nil]
136
+ #
137
+ # @raise [Error] when there is no [Enumbler::Enumble] to be found and
138
+ # `raise_error: true`
139
+ # @param args [Integer, String, Symbol]
140
+ # @param case_sensitive [Boolean] should a String search be case sensitive
141
+ # (default: false)
142
+ # @param raise_error [Boolean] raise an error if not found (default:
143
+ # false)
144
+ # @return [Array<Enumbler::Enumble>]
145
+ def find_enumbles(*args, case_sensitive: false, raise_error: false)
146
+ args.flatten.compact.uniq.map do |arg|
147
+ err = "Unable to find a #{@enumbled_model}#enumble with #{arg}"
148
+
149
+ begin
150
+ arg = Integer(arg) # raises Type error if not a real integer
151
+ enumble = @enumbled_model.enumbles.find { |e| e.id == arg }
152
+ rescue TypeError, ArgumentError
153
+ enumble =
154
+ if arg.is_a?(Symbol)
155
+ @enumbled_model.enumbles.find { |e| e.enum == arg }
156
+ elsif arg.is_a?(String)
157
+ @enumbled_model.enumbles.find do |e|
158
+ case_sensitive ? e.label == arg : arg.casecmp?(e.label)
159
+ end
160
+ elsif arg.instance_of?(@enumbled_model)
161
+ arg.enumble
162
+ end
163
+ end
164
+
165
+ if enumble.present?
166
+ enumble
167
+ else
168
+ raise Error if raise_error
169
+
170
+ nil
171
+ end
172
+ rescue Error
173
+ raise Error, err
174
+ end
175
+ end
176
+
177
+ # See {.find_enumbles}. Same method, only raises error when none found.
178
+ # @raise [Error] when there is no [Enumbler::Enumble] to be found
179
+ # @param args [Integer, String, Symbol]
180
+ # @param case_sensitive [Boolean] should a String search be case sensitive
181
+ # (default: false)
182
+ # @return [Array<Enumbler::Enumble>]
183
+ def find_enumbles!(*args, case_sensitive: false)
184
+ find_enumbles(*args, case_sensitive: case_sensitive, raise_error: true)
185
+ end
186
+
100
187
  # Return the record id for a given argument. Can accept an Integer, a
101
188
  # Symbol, or an instance of Enumbled model. This lookup is a database-free
102
189
  # lookup.
@@ -107,9 +194,25 @@ module Enumbler
107
194
  #
108
195
  # @raise [Error] when there is no enumble to be found
109
196
  # @param arg [Integer, Symbol, Class]
197
+ # @param case_sensitive [Boolean] should a string search be performed with
198
+ # case sensitivity (default: false)
199
+ # @param raise_error [Boolean] raise an error if not found (default:
200
+ # false)
201
+ # @return [Integer]
202
+ def id_from_enumbler(arg, case_sensitive: false, raise_error: false)
203
+ ids_from_enumbler(arg, case_sensitive: case_sensitive, raise_error: raise_error).first
204
+ end
205
+
206
+ # See {.ids_from_enumbler}. Raises error if none found.
207
+ # @raise [Error] when there is no enumble to be found
208
+ # @param arg [Integer, Symbol, Class]
209
+ # @param case_sensitive [Boolean] should a string search be performed with
210
+ # case sensitivity (default: false)
211
+ # @param raise_error [Boolean] raise an error if not found (default:
212
+ # false)
110
213
  # @return [Integer]
111
- def id_from_enumbler(arg)
112
- ids_from_enumbler(arg).first
214
+ def id_from_enumbler!(arg, case_sensitive: false)
215
+ ids_from_enumbler(arg, case_sensitive: case_sensitive, raise_error: true).first
113
216
  end
114
217
 
115
218
  # Return the record id(s) based on different argument types. Can accept
@@ -118,44 +221,54 @@ module Enumbler
118
221
  #
119
222
  # Color.ids_from_enumbler(1, 2) # => [1, 2]
120
223
  # Color.ids_from_enumbler(:black, :white) # => [1, 2]
224
+ # Color.ids_from_enumbler('black', :white) # => [1, 2]
121
225
  # Color.ids_from_enumbler(Color.black, Color.white) # => [1, 2]
122
226
  #
123
227
  # @raise [Error] when there is no enumble to be found
124
228
  # @param *args [Integer, Symbol, Class]
229
+ # @param case_sensitive [Boolean] should a string search be performed with
230
+ # case sensitivity (default: false)
231
+ # @param raise_error [Boolean] raise an error if not found (default:
232
+ # false)
125
233
  # @return [Array<Integer>]
126
- def ids_from_enumbler(*args)
127
- args.flatten.compact.uniq.map do |arg|
128
- err = "Unable to find a #{@enumbled_model}#enumble with #{arg}"
129
-
130
- begin
131
- arg = Integer(arg) # raises Type error if not a real integer
132
- enumble = @enumbled_model.enumbles.find { |e| e.id == arg }
133
- rescue TypeError
134
- enumble = if arg.is_a?(Symbol)
135
- @enumbled_model.enumbles.find { |e| e.enum == arg }
136
- elsif arg.instance_of?(@enumbled_model)
137
- arg.enumble
138
- end
139
- end
234
+ def ids_from_enumbler(*args, case_sensitive: false, raise_error: false)
235
+ enumbles = find_enumbles(*args, case_sensitive: case_sensitive, raise_error: raise_error)
236
+ enumbles.map { |e| e&.id }
237
+ end
140
238
 
141
- enumble&.id || raise(Error, err)
142
- rescue Error
143
- raise Error, err
144
- end
239
+ # See {.ids_from_enumbler}. Raises error when none found.
240
+ # @raise [Error] when there is no enumble to be found
241
+ # @param *args [Integer, Symbol, Class]
242
+ # @param case_sensitive [Boolean] should a string search be performed with
243
+ # case sensitivity (default: false)
244
+ # @return [Array<Integer>]
245
+ def ids_from_enumbler!(*args, case_sensitive: false)
246
+ enumbles = find_enumbles!(*args, case_sensitive: case_sensitive)
247
+ enumbles.map(&:id)
145
248
  end
146
249
 
147
- # Seeds the database with the Enumble data.
250
+ # Seeds the database with the Enumbler data.
148
251
  # @param delete_missing_records [Boolean] remove any records that are no
149
252
  # longer defined (default: false)
150
- def seed_the_enumbler(delete_missing_records: false)
253
+ # @param validate [Boolean] validate on save?
254
+ def seed_the_enumbler(delete_missing_records: false, validate: true)
151
255
  max_database_id = all.order('id desc').take&.id || 0
152
- max_enumble_id = enumbles.map(&:id).max
256
+ max_enumble_id = @enumbles.map(&:id).max
153
257
 
154
- max_id = max_enumble_id > max_database_id ? max_enumble_id : max_database_id
258
+ # If we are not deleting records, we just need to update each listed
259
+ # enumble and skip anything else in the database. If we are deleting
260
+ # records, we need to know the max database id.
261
+ iterator = if !delete_missing_records
262
+ @enumbles.map(&:id)
263
+ elsif max_enumble_id > max_database_id
264
+ (1..max_enumble_id)
265
+ else
266
+ (1..max_database_id)
267
+ end
155
268
 
156
269
  discarded_ids = []
157
270
 
158
- (1..max_id).each do |id|
271
+ iterator.each do |id|
159
272
  enumble = @enumbles.find { |e| e.id == id }
160
273
 
161
274
  if enumble.nil?
@@ -165,7 +278,7 @@ module Enumbler
165
278
 
166
279
  record = find_or_initialize_by(id: id)
167
280
  record.attributes = enumble.attributes
168
- record.save!
281
+ record.save!(validate: validate)
169
282
  end
170
283
 
171
284
  where(id: discarded_ids).delete_all if delete_missing_records
@@ -173,22 +286,29 @@ module Enumbler
173
286
 
174
287
  # Seeds the database with the Enumble data, removing any records that are no
175
288
  # longer defined.
176
- def seed_the_enumbler!
177
- seed_the_enumbler(delete_missing_records: true)
289
+ # @param validate [Boolean] validate on save?
290
+ def seed_the_enumbler!(validate: true)
291
+ seed_the_enumbler(delete_missing_records: true, validate: validate)
178
292
  end
179
293
 
180
294
  private
181
295
 
182
- def define_dynamic_methods_and_constants_for_enumbled_model(enum, id)
183
- method_name = "#{enum}?"
184
- not_method_name = "not_#{enum}?"
185
- alias_method_name = "is_#{enum}"
296
+ def define_dynamic_methods_and_constants_for_enumbled_model(enumble)
297
+ method_name = "#{enumble.enum}?"
298
+ not_method_name = "not_#{enumble.enum}?"
299
+ alias_method_name = "is_#{enumble.enum}"
186
300
 
187
- const_set(enum.to_s.upcase, id)
188
- define_method(method_name) { self.id == id }
189
- define_method(not_method_name) { self.id != id }
301
+ const_set(enumble.enum.to_s.upcase, enumble.id)
302
+ define_method(method_name) { id == enumble.id }
303
+ define_method(not_method_name) { id != enumble.id }
190
304
  alias_method alias_method_name, method_name
191
- define_singleton_method(enum) { find(id) }
305
+ define_singleton_method(enumble.enum) do |attr = nil|
306
+ return find(enumble.id) if attr.nil?
307
+
308
+ enumble.send(attr)
309
+ rescue NoMethodError
310
+ raise Enumbler::Error, "The attribute #{attr} is not supported on this Enumble."
311
+ end
192
312
  end
193
313
  end
194
314
  end
@@ -2,6 +2,9 @@
2
2
 
3
3
  module Enumbler
4
4
  # Class that holds each row of Enumble data.
5
+ #
6
+ # @todo We need to support additional options/attributes beyond the id/label
7
+ # pairs. Is on the backburner for a moment.
5
8
  class Enumble
6
9
  attr_reader :id, :enum, :label, :label_column_name, :options
7
10
 
@@ -25,9 +28,30 @@ module Enumbler
25
28
  }
26
29
  end
27
30
 
31
+ # Used to return itself from a class method.
32
+ #
33
+ # ```
34
+ # Color.black(:enumble) #=> <Enumble:0x00007fb4396a78c8>
35
+ # ```
36
+ # @return [Enumbler::Enumble]
37
+ def enumble
38
+ self
39
+ end
40
+
28
41
  def eql?(other)
29
42
  other.class == self.class &&
30
43
  (other.id == id || other.enum == enum || other.label == label)
31
44
  end
45
+
46
+ # Standardizing the enum for a GraphQL schema with an uppercase string
47
+ # value.
48
+ # @return [String]
49
+ def graphql_enum
50
+ enum.to_s.upcase
51
+ end
52
+
53
+ def to_s
54
+ enum
55
+ end
32
56
  end
33
57
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Enumbler
4
- VERSION = '0.4.0'
4
+ VERSION = '0.6.0'
5
5
  end
metadata CHANGED
@@ -1,43 +1,55 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: enumbler
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Damon Timm
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-05-21 00:00:00.000000000 Z
11
+ date: 2020-07-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 5.2.3
20
+ - - "<"
18
21
  - !ruby/object:Gem::Version
19
- version: 6.0.2
22
+ version: '6.1'
20
23
  type: :runtime
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
23
26
  requirements:
24
- - - "~>"
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: 5.2.3
30
+ - - "<"
25
31
  - !ruby/object:Gem::Version
26
- version: 6.0.2
32
+ version: '6.1'
27
33
  - !ruby/object:Gem::Dependency
28
34
  name: activesupport
29
35
  requirement: !ruby/object:Gem::Requirement
30
36
  requirements:
31
- - - "~>"
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: 5.2.3
40
+ - - "<"
32
41
  - !ruby/object:Gem::Version
33
- version: 6.0.2
42
+ version: '6.1'
34
43
  type: :runtime
35
44
  prerelease: false
36
45
  version_requirements: !ruby/object:Gem::Requirement
37
46
  requirements:
38
- - - "~>"
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: 5.2.3
50
+ - - "<"
39
51
  - !ruby/object:Gem::Version
40
- version: 6.0.2
52
+ version: '6.1'
41
53
  - !ruby/object:Gem::Dependency
42
54
  name: database_cleaner-active_record
43
55
  requirement: !ruby/object:Gem::Requirement
@@ -144,6 +156,7 @@ files:
144
156
  - bin/setup
145
157
  - enumbler.gemspec
146
158
  - lib/enumbler.rb
159
+ - lib/enumbler/collection.rb
147
160
  - lib/enumbler/enabler.rb
148
161
  - lib/enumbler/enumble.rb
149
162
  - lib/enumbler/version.rb