enumbler 0.5.1 → 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: 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