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 +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +23 -1
- data/lib/enumbler.rb +4 -0
- data/lib/enumbler/enabler.rb +124 -21
- data/lib/enumbler/enumble.rb +10 -0
- data/lib/enumbler/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 2943ee8d89898bb8164e0eccc955f51de0c0ba3d95c814f0a928f967bc82486b
|
|
4
|
+
data.tar.gz: bda8b04d4dd0c9f17a9cd0f0f05e700b4fde8b24d6bad394ac8c5ab5662064da
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 5340c39fd43f724d13eb648349be08d2115d9fd0964adda1c39403fdb992620b5209e45435ccb222589f9891048630763ec340c1866141e204b633cc4e58da09
|
|
7
|
+
data.tar.gz: e2f243201a8621571bdf000d82ca3fa8a9c12070c9a8a11ae8ab1796f8742f75baee7aa4abcad102c3b35cd39473b806d8f9af0c94bd9657a30462ce11b0fcf3
|
data/Gemfile.lock
CHANGED
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)
|
|
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`
|
data/lib/enumbler.rb
CHANGED
|
@@ -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}?"
|
data/lib/enumbler/enabler.rb
CHANGED
|
@@ -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
|
|
128
|
-
|
|
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
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
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
|
data/lib/enumbler/enumble.rb
CHANGED
|
@@ -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)
|
data/lib/enumbler/version.rb
CHANGED
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.
|
|
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-
|
|
11
|
+
date: 2020-07-03 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: activerecord
|