enumbler 0.5.1 → 0.6.0

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: da174585a626032f772439eea6f3a252ebaec0862f5fd47e151eac2db8403d15
4
- data.tar.gz: 4e4d0f45f98074d5ee58df06ff57d825ee479fb3bdc3853b1e115f752474203c
3
+ metadata.gz: 2943ee8d89898bb8164e0eccc955f51de0c0ba3d95c814f0a928f967bc82486b
4
+ data.tar.gz: bda8b04d4dd0c9f17a9cd0f0f05e700b4fde8b24d6bad394ac8c5ab5662064da
5
5
  SHA512:
6
- metadata.gz: a816d2d6b87a981167d55435031e1a1c5044385c76787d5fe9295e61c40041d5347f23c5710a6d6dcc2cbff78c543740438b30040818304e3b77ab68afca2cf5
7
- data.tar.gz: 597f0bf8a11264b2543e8ed9f7142c952a9a5595510823328c630ebc75937b07e4a6a09f37dfba4bbab2e8fa4c7f5358a61f4ea26a1dc08f06ab2c92f451e2ac
6
+ metadata.gz: 5340c39fd43f724d13eb648349be08d2115d9fd0964adda1c39403fdb992620b5209e45435ccb222589f9891048630763ec340c1866141e204b633cc4e58da09
7
+ data.tar.gz: e2f243201a8621571bdf000d82ca3fa8a9c12070c9a8a11ae8ab1796f8742f75baee7aa4abcad102c3b35cd39473b806d8f9af0c94bd9657a30462ce11b0fcf3
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- enumbler (0.5.1)
4
+ enumbler (0.6.0)
5
5
  activerecord (>= 5.2.3, < 6.1)
6
6
  activesupport (>= 5.2.3, < 6.1)
7
7
 
data/README.md CHANGED
@@ -60,17 +60,39 @@ Color.black.black? # => true
60
60
  Color.black.is_black # => true
61
61
  Color.white.not_black? # => true
62
62
 
63
+ # Get attributes without hitting the database
63
64
  Color.black(:id) # => 1
64
65
  Color.black(:enum) # => :black
65
66
  Color.black(:label) # => 'black'
66
67
  Color.black(:graphql_enum) # => 'BLACK'
67
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
88
+
68
89
  house = House.create!(color: Color.black)
69
90
  house.black?
70
91
  house.not_black?
71
92
 
72
93
  house2 = House.create!(color: Color.white)
73
- House.color(:black, :white) # => [house, house2]
94
+ House.color(:black, :white) # => ActiveRecord::Relation<house, house2>
95
+ House.color(Color.black, :white) # => ActiveRecord::Relation<house, house2>
74
96
  ```
75
97
 
76
98
  ### Use a column other than `label`
@@ -86,6 +86,10 @@ module Enumbler
86
86
  where(column_name => enumbled_model.ids_from_enumbler(args))
87
87
  end
88
88
 
89
+ define_singleton_method("#{cmethod}!") do |*args|
90
+ where(column_name => enumbled_model.ids_from_enumbler!(args))
91
+ end
92
+
89
93
  enumbled_model.enumbles.each do |enumble|
90
94
  method_name = prefix ? "#{model_name}_#{enumble.enum}?" : "#{enumble.enum}?"
91
95
  not_method_name = prefix ? "#{model_name}_not_#{enumble.enum}?" : "not_#{enumble.enum}?"
@@ -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)
110
201
  # @return [Integer]
111
- def id_from_enumbler(arg)
112
- ids_from_enumbler(arg).first
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)
213
+ # @return [Integer]
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,30 +221,30 @@ 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
250
  # Seeds the database with the Enumbler data.
@@ -150,7 +253,7 @@ module Enumbler
150
253
  # @param validate [Boolean] validate on save?
151
254
  def seed_the_enumbler(delete_missing_records: false, validate: true)
152
255
  max_database_id = all.order('id desc').take&.id || 0
153
- max_enumble_id = enumbles.map(&:id).max
256
+ max_enumble_id = @enumbles.map(&:id).max
154
257
 
155
258
  # If we are not deleting records, we just need to update each listed
156
259
  # enumble and skip anything else in the database. If we are deleting
@@ -28,6 +28,16 @@ module Enumbler
28
28
  }
29
29
  end
30
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
+
31
41
  def eql?(other)
32
42
  other.class == self.class &&
33
43
  (other.id == id || other.enum == enum || other.label == label)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Enumbler
4
- VERSION = '0.5.1'
4
+ VERSION = '0.6.0'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: enumbler
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.1
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-06-26 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