enumbler 0.4.2 → 0.6.2

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: d6cb3204d93f558b4286bd533ca6ac0cd4e70170f3678d28848777526e44732d
4
- data.tar.gz: e21fbf9da2af04a6133df3559307892f259324fbad8fe0077facbf4024b63185
3
+ metadata.gz: 95d8b5d35cb1f59fe24b30b944e5a834ce43c26f17e951b7cc164106cd0b9c7e
4
+ data.tar.gz: cb4f46ece4d9bd70f7c6f1e06bb515c1fbbc8601bdb6785458a838f242a5f5c6
5
5
  SHA512:
6
- metadata.gz: e6dcafa85a85b9e304810e8554b81435c0414ed984bde78063e8aeceb397d3bfcb77534d4da2f04153dccd99cc7f2403e61156722f9743fe485fc242d8e26ba6
7
- data.tar.gz: 07fc687fa545b3bf402622d57fd3f0c95d961dede6b6358131cf39524c7fcd7ed6036a24baade2448f01599ecde2e91354ed43803e7657d40b1d0b9dbded6265
6
+ metadata.gz: a1c7cd257da559c741b9932dd160e757a83e080c26f7d0fc88df0e2996b155222ad5c517c675a7ad1694a09433fca864c34328f63f1c5c41b99ebc7df27eec03
7
+ data.tar.gz: 361d082e5872d0fc5c8a03a1d5002ba622ef963ac9ce0add18a1238ea15241cc7e509d8e9f4bbac8644eb11fc741ad9cf6fd649d3103028b336f91928763333d
@@ -1,27 +1,27 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- enumbler (0.4.2)
5
- activerecord (~> 6.0.2)
6
- activesupport (~> 6.0.2)
4
+ enumbler (0.6.2)
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
@@ -26,6 +26,7 @@ Suppose you have a `House` and you want to add some `colors` to the house. You
26
26
  ActiveRecord::Schema.define do
27
27
  create_table :colors|t|
28
28
  t.string :label, null: false, index: { unique: true }
29
+ t.string :hex, null: true
29
30
  end
30
31
 
31
32
  create_table :houses|t|
@@ -42,8 +43,8 @@ end
42
43
  class Color < ApplicationRecord
43
44
  include Enumbler::Enabler
44
45
 
45
- enumble :black, 1
46
- enumble :white, 2
46
+ enumble :black, 1, hex: '000000'
47
+ enumble :white, 2, hex: 'ffffff'
47
48
  enumble :dark_brown, 3
48
49
  enumble :infinity, 4, label: 'Infinity - and beyond!'
49
50
  end
@@ -54,17 +55,45 @@ class House < ApplicationRecord
54
55
  end
55
56
 
56
57
  # 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
58
+ Color::BLACK # => 1
59
+ Color.black # => equivalent to Color.find(1)
60
+ Color.black.black? # => true
61
+ Color.black.is_black # => true
62
+ Color.white.not_black? # => true
63
+
64
+ # Get attributes without hitting the database
65
+ Color.black(:id) # => 1
66
+ Color.black(:enum) # => :black
67
+ Color.black(:label) # => 'black'
68
+ Color.black(:graphql_enum) # => 'BLACK'
69
+
70
+ # Get an Enumble object from an id, label, enum, or ActiveRecord model
71
+ Color.find_enumbles(:black, 'white') # => [Enumbler::Enumble<:black>, Enumbler::Enumble<:white>]
72
+ Color.find_enumbles(:black, 'does-not-exist') # => [Enumbler::Enumble<:black>, nil]
73
+
74
+ Color.find_enumble(:black) # => Enumbler::Enumble<:black>
75
+
76
+ # raises errors if none found
77
+ Color.find_enumbles!!(:black, 'does-no-exist') # => raises Enumbler::Error
78
+ Color.find_enumble!(:does_not_exist) # => raises Enumbler::Error
79
+
80
+ # Get ids flexibly, without raising an error if none found
81
+ Color.ids_from_enumbler(:black, 'white') # => [1, 2]
82
+ Color.ids_from_enumbler(:black, 'does-no-exist') # => [1, nil]
83
+
84
+ # Raise an error if none found
85
+ Color.ids_from_enumbler!(:black, 'does-no-exist') # => raises Enumbler::Error
86
+ Color.id_from_enumbler!(:does_not_exist) # => raises Enumbler::Error
87
+
88
+ # Get enumble object by id
62
89
 
63
90
  house = House.create!(color: Color.black)
64
91
  house.black?
65
92
  house.not_black?
66
93
 
67
- House.color(:black) # => [house]
94
+ house2 = House.create!(color: Color.white)
95
+ House.color(:black, :white) # => ActiveRecord::Relation<house, house2>
96
+ House.color(Color.black, :white) # => ActiveRecord::Relation<house, house2>
68
97
  ```
69
98
 
70
99
  ### Use a column other than `label`
@@ -98,7 +127,8 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
98
127
 
99
128
  ## Roadmap
100
129
 
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.
130
+ * 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.
131
+ * 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
132
 
103
133
  ## Contributing
104
134
 
@@ -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
@@ -40,8 +40,8 @@ module Enumbler
40
40
  # class Color < ApplicationRecord
41
41
  # include Enumbler::Enabler
42
42
  #
43
- # enumble :black, 1
44
- # enumble :white, 2
43
+ # enumble :black, 1, hex: '000000'
44
+ # enumble :white, 2, hex: 'ffffff'
45
45
  # enumble :dark_brown, 3, # label: 'dark-brown'
46
46
  # enumble :black_hole, 3, label: 'Oh my! It is a black hole!'
47
47
  # end
@@ -55,20 +55,22 @@ module Enumbler
55
55
  # @param enum [Symbol] the enum representation
56
56
  # @param id [Integer] the primary key value
57
57
  # @param label [String] optional: label for humans
58
- # @param **options [Hash] optional: additional attributes and values that
58
+ # @param **attributes [Hash] optional: additional attributes and values that
59
59
  # will be saved to the database for this enumble record
60
- def enumble(enum, id, label: nil, **options)
61
- @enumbles ||= []
60
+ def enumble(enum, id, label: nil, **attributes)
61
+ @enumbles ||= Enumbler::Collection.new
62
62
  @enumbled_model = self
63
63
  @enumbler_label_column_name ||= :label
64
64
 
65
- enumble = Enumble.new(enum, id, label: label, label_column_name: @enumbler_label_column_name, **options)
65
+ raise_error_if_model_does_not_support_attributes(attributes)
66
+
67
+ enumble = Enumble.new(enum, id, label: label, label_column_name: @enumbler_label_column_name, **attributes)
66
68
 
67
69
  if @enumbles.include?(enumble)
68
70
  raise Error, "You cannot add the same Enumble twice! Attempted to add: #{enum}, #{id}."
69
71
  end
70
72
 
71
- define_dynamic_methods_and_constants_for_enumbled_model(enum, id)
73
+ define_dynamic_methods_and_constants_for_enumbled_model(enumble)
72
74
 
73
75
  @enumbles << enumble
74
76
  end
@@ -97,6 +99,93 @@ module Enumbler
97
99
  @enumbler_label_column_name = label_column_name
98
100
  end
99
101
 
102
+ # See {.find_enumbles}. Simply returns the first object. Use when you
103
+ # want one argument to be found and not returned in an array.
104
+ # @raise [Error] when there is no [Enumbler::Enumble] to be found and
105
+ # `raise_error: true`
106
+ # @param args [Integer, String, Symbol]
107
+ # @param case_sensitive [Boolean] should a String search be case sensitive
108
+ # (default: false)
109
+ # @param raise_error [Boolean] raise an error if not found (default:
110
+ # false)
111
+ # @return [Enumbler::Enumble]
112
+ def find_enumble(arg, case_sensitive: false, raise_error: false)
113
+ find_enumbles(arg, case_sensitive: case_sensitive, raise_error: raise_error).first
114
+ end
115
+
116
+ # See {.find_enumbles}. Simply returns the first object. Use when you
117
+ # want one argument to be found and not returned in an array. Raises error
118
+ # if none found.
119
+ # @raise [Error] when there is no [Enumbler::Enumble] to be found and
120
+ # `raise_error: true`
121
+ # @param args [Integer, String, Symbol]
122
+ # @param case_sensitive [Boolean] should a String search be case sensitive
123
+ # (default: false)
124
+ # @return [Enumbler::Enumble]
125
+ def find_enumble!(arg, case_sensitive: false)
126
+ find_enumbles(arg, case_sensitive: case_sensitive, raise_error: true).first
127
+ end
128
+
129
+ # Finds an array of {Enumbler::Enumble} objects matching the given
130
+ # argument. Accepts an Integer, String, Symbol, or ActiveRecord instance.
131
+ #
132
+ # This method is designed to let you get information about the record
133
+ # without having to hit the database. Returns `nil` when none found
134
+ # unless `raise_error` is `true`.
135
+ #
136
+ # Color.find_enumbles(:black, 'white', 'not-found')
137
+ # #=> [Enumbler::Enumble<:black>, Enumbler::Enumble<:white>, nil]
138
+ #
139
+ # @raise [Error] when there is no [Enumbler::Enumble] to be found and
140
+ # `raise_error: true`
141
+ # @param args [Integer, String, Symbol]
142
+ # @param case_sensitive [Boolean] should a String search be case sensitive
143
+ # (default: false)
144
+ # @param raise_error [Boolean] raise an error if not found (default:
145
+ # false)
146
+ # @return [Array<Enumbler::Enumble>]
147
+ def find_enumbles(*args, case_sensitive: false, raise_error: false)
148
+ args.flatten.compact.uniq.map do |arg|
149
+ err = "Unable to find a #{@enumbled_model}#enumble with #{arg}"
150
+
151
+ begin
152
+ arg = Integer(arg) # raises Type error if not a real integer
153
+ enumble = @enumbled_model.enumbles.find { |e| e.id == arg }
154
+ rescue TypeError, ArgumentError
155
+ enumble =
156
+ if arg.is_a?(Symbol)
157
+ @enumbled_model.enumbles.find { |e| e.enum == arg }
158
+ elsif arg.is_a?(String)
159
+ @enumbled_model.enumbles.find do |e|
160
+ case_sensitive ? e.label == arg : arg.casecmp?(e.label)
161
+ end
162
+ elsif arg.instance_of?(@enumbled_model)
163
+ arg.enumble
164
+ end
165
+ end
166
+
167
+ if enumble.present?
168
+ enumble
169
+ else
170
+ raise Error if raise_error
171
+
172
+ nil
173
+ end
174
+ rescue Error
175
+ raise Error, err
176
+ end
177
+ end
178
+
179
+ # See {.find_enumbles}. Same method, only raises error when none found.
180
+ # @raise [Error] when there is no [Enumbler::Enumble] to be found
181
+ # @param args [Integer, String, Symbol]
182
+ # @param case_sensitive [Boolean] should a String search be case sensitive
183
+ # (default: false)
184
+ # @return [Array<Enumbler::Enumble>]
185
+ def find_enumbles!(*args, case_sensitive: false)
186
+ find_enumbles(*args, case_sensitive: case_sensitive, raise_error: true)
187
+ end
188
+
100
189
  # Return the record id for a given argument. Can accept an Integer, a
101
190
  # Symbol, or an instance of Enumbled model. This lookup is a database-free
102
191
  # lookup.
@@ -107,9 +196,25 @@ module Enumbler
107
196
  #
108
197
  # @raise [Error] when there is no enumble to be found
109
198
  # @param arg [Integer, Symbol, Class]
199
+ # @param case_sensitive [Boolean] should a string search be performed with
200
+ # case sensitivity (default: false)
201
+ # @param raise_error [Boolean] raise an error if not found (default:
202
+ # false)
110
203
  # @return [Integer]
111
- def id_from_enumbler(arg)
112
- ids_from_enumbler(arg).first
204
+ def id_from_enumbler(arg, case_sensitive: false, raise_error: false)
205
+ ids_from_enumbler(arg, case_sensitive: case_sensitive, raise_error: raise_error).first
206
+ end
207
+
208
+ # See {.ids_from_enumbler}. Raises error if none found.
209
+ # @raise [Error] when there is no enumble to be found
210
+ # @param arg [Integer, Symbol, Class]
211
+ # @param case_sensitive [Boolean] should a string search be performed with
212
+ # case sensitivity (default: false)
213
+ # @param raise_error [Boolean] raise an error if not found (default:
214
+ # false)
215
+ # @return [Integer]
216
+ def id_from_enumbler!(arg, case_sensitive: false)
217
+ ids_from_enumbler(arg, case_sensitive: case_sensitive, raise_error: true).first
113
218
  end
114
219
 
115
220
  # Return the record id(s) based on different argument types. Can accept
@@ -118,30 +223,30 @@ module Enumbler
118
223
  #
119
224
  # Color.ids_from_enumbler(1, 2) # => [1, 2]
120
225
  # Color.ids_from_enumbler(:black, :white) # => [1, 2]
226
+ # Color.ids_from_enumbler('black', :white) # => [1, 2]
121
227
  # Color.ids_from_enumbler(Color.black, Color.white) # => [1, 2]
122
228
  #
123
229
  # @raise [Error] when there is no enumble to be found
124
230
  # @param *args [Integer, Symbol, Class]
231
+ # @param case_sensitive [Boolean] should a string search be performed with
232
+ # case sensitivity (default: false)
233
+ # @param raise_error [Boolean] raise an error if not found (default:
234
+ # false)
125
235
  # @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
236
+ def ids_from_enumbler(*args, case_sensitive: false, raise_error: false)
237
+ enumbles = find_enumbles(*args, case_sensitive: case_sensitive, raise_error: raise_error)
238
+ enumbles.map { |e| e&.id }
239
+ end
140
240
 
141
- enumble&.id || raise(Error, err)
142
- rescue Error
143
- raise Error, err
144
- end
241
+ # See {.ids_from_enumbler}. Raises error when none found.
242
+ # @raise [Error] when there is no enumble to be found
243
+ # @param *args [Integer, Symbol, Class]
244
+ # @param case_sensitive [Boolean] should a string search be performed with
245
+ # case sensitivity (default: false)
246
+ # @return [Array<Integer>]
247
+ def ids_from_enumbler!(*args, case_sensitive: false)
248
+ enumbles = find_enumbles!(*args, case_sensitive: case_sensitive)
249
+ enumbles.map(&:id)
145
250
  end
146
251
 
147
252
  # Seeds the database with the Enumbler data.
@@ -150,7 +255,7 @@ module Enumbler
150
255
  # @param validate [Boolean] validate on save?
151
256
  def seed_the_enumbler(delete_missing_records: false, validate: true)
152
257
  max_database_id = all.order('id desc').take&.id || 0
153
- max_enumble_id = enumbles.map(&:id).max
258
+ max_enumble_id = @enumbles.map(&:id).max
154
259
 
155
260
  # If we are not deleting records, we just need to update each listed
156
261
  # enumble and skip anything else in the database. If we are deleting
@@ -190,16 +295,36 @@ module Enumbler
190
295
 
191
296
  private
192
297
 
193
- def define_dynamic_methods_and_constants_for_enumbled_model(enum, id)
194
- method_name = "#{enum}?"
195
- not_method_name = "not_#{enum}?"
196
- alias_method_name = "is_#{enum}"
298
+ def define_dynamic_methods_and_constants_for_enumbled_model(enumble)
299
+ method_name = "#{enumble.enum}?"
300
+ not_method_name = "not_#{enumble.enum}?"
301
+ alias_method_name = "is_#{enumble.enum}"
197
302
 
198
- const_set(enum.to_s.upcase, id)
199
- define_method(method_name) { self.id == id }
200
- define_method(not_method_name) { self.id != id }
303
+ const_set(enumble.enum.to_s.upcase, enumble.id)
304
+ define_method(method_name) { id == enumble.id }
305
+ define_method(not_method_name) { id != enumble.id }
201
306
  alias_method alias_method_name, method_name
202
- define_singleton_method(enum) { find(id) }
307
+ define_singleton_method(enumble.enum) do |attr = nil|
308
+ return find(enumble.id) if attr.nil?
309
+
310
+ enumble.send(attr)
311
+ rescue NoMethodError
312
+ raise Enumbler::Error, "The attribute #{attr} is not supported on this Enumble."
313
+ end
314
+ end
315
+
316
+ def raise_error_if_model_does_not_support_attributes(attributes)
317
+ return if attributes.blank?
318
+
319
+ unsupported_attrs = attributes.reject { |key, _value| has_attribute?(key) }
320
+
321
+ return if unsupported_attrs.blank?
322
+
323
+ raise Enumbler::Error,
324
+ "The model #{self} does not support the attribute(s): #{unsupported_attrs.keys.map(&:to_s).to_sentence}"
325
+ rescue ActiveRecord::StatementInvalid
326
+ warn "[Enumbler Warning] => Unable to find a table for #{self}."\
327
+ 'This is to be expected if there is a pending migration; however, if there is not then something is amiss.'
203
328
  end
204
329
  end
205
330
  end
@@ -3,14 +3,14 @@
3
3
  module Enumbler
4
4
  # Class that holds each row of Enumble data.
5
5
  class Enumble
6
- attr_reader :id, :enum, :label, :label_column_name, :options
6
+ attr_reader :id, :enum, :label, :label_column_name
7
7
 
8
- def initialize(enum, id, label: nil, label_column_name: :label, **options)
8
+ def initialize(enum, id, label: nil, label_column_name: :label, **attributes)
9
9
  @id = id
10
10
  @enum = enum
11
11
  @label = label || enum.to_s.dasherize
12
12
  @label_column_name = label_column_name
13
- @options = options
13
+ @additional_attributes = attributes || {}
14
14
  end
15
15
 
16
16
  def ==(other)
@@ -19,15 +19,36 @@ module Enumbler
19
19
  end
20
20
 
21
21
  def attributes
22
- {
22
+ @additional_attributes.merge({
23
23
  id: id,
24
24
  label_column_name => label,
25
- }
25
+ })
26
+ end
27
+
28
+ # Used to return itself from a class method.
29
+ #
30
+ # ```
31
+ # Color.black(:enumble) #=> <Enumble:0x00007fb4396a78c8>
32
+ # ```
33
+ # @return [Enumbler::Enumble]
34
+ def enumble
35
+ self
26
36
  end
27
37
 
28
38
  def eql?(other)
29
39
  other.class == self.class &&
30
40
  (other.id == id || other.enum == enum || other.label == label)
31
41
  end
42
+
43
+ # Standardizing the enum for a GraphQL schema with an uppercase string
44
+ # value.
45
+ # @return [String]
46
+ def graphql_enum
47
+ enum.to_s.upcase
48
+ end
49
+
50
+ def to_s
51
+ enum
52
+ end
32
53
  end
33
54
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Enumbler
4
- VERSION = '0.4.2'
4
+ VERSION = '0.6.2'
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.2
4
+ version: 0.6.2
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-22 00:00:00.000000000 Z
11
+ date: 2020-07-04 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