swifter_enum 0.9.1 → 0.9.2

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: 9b72cb72dc43be470b8170fd34843f2f2e7ddb4d64a2856c7094b63c0ba091e2
4
- data.tar.gz: 791abe5497d7c623e9b5e5ef9554a00f2c242b74b4f0668e018d7cc7be2d0752
3
+ metadata.gz: 4147b58f08c0633761d7721503972bf4478d7b6295a634186810ebe146416bf8
4
+ data.tar.gz: 9fa17a88143342a5637866c8ac599a5bc9adb6e7ff3f28293aefac6957ef3767
5
5
  SHA512:
6
- metadata.gz: b4f5bf8eab4588d23098bf11bab794205369820c0b6900b7dfa9f2d51cc85d489af4a9007a807d65c392b313cfb1201249a12650e4674cc77ed682cbb52f305e
7
- data.tar.gz: 0a6226463dd0041d3c4999813b483ca274af966d82665cb0b10c7385ea682012775d835196edd231f2400a542c63f14148da2abfab61c0fda825e2af9ab9e8f9
6
+ metadata.gz: c322303bcf61cd899f66b0e444de08a4d4826cc787d2ef5fa53bda9f81b15130d4da4b6d63455c1215f5ef14b3cb523ac6112b8d62d4f61da069336e3d69c5e0
7
+ data.tar.gz: 7e53b29f10e6908f3f9bf3f282c98d6e40f9a5c6bd5103d1beee337870c2ac53430cc3c0d0818c021731178c19e236d261573aa65fe6ce9b0d1a1b9624563e8a
data/README.md CHANGED
@@ -36,9 +36,7 @@ logic encapsluated within the enum class
36
36
 
37
37
  #app/models/swifter_enum/camera_enum.rb
38
38
  class CameraEnum < SwifterEnum::Base
39
- def self.values
40
- { videographer: 0, handcam: 1 }.freeze
41
- end
39
+ set_values ({ videographer: 0, handcam: 1 })
42
40
 
43
41
  def icon
44
42
  ...
@@ -76,9 +74,7 @@ We have a Video ActiveModel with an enum defined by
76
74
  CameraEnum is a class like the following
77
75
 
78
76
  class CameraEnum < SwifterEnum::Base
79
- def self.values
80
- { videographer: 0, handcam: 1 }.freeze
81
- end
77
+ set_values ({ videographer: 0, handcam: 1 })
82
78
 
83
79
  def icon
84
80
  case @value
@@ -125,9 +121,7 @@ Models are by convention stored in `/models/swifter_enum/your_model_enum.rb`
125
121
  Example:
126
122
 
127
123
  class CameraEnum < SwifterEnum::Base
128
- def self.values
129
- { videographer: 0, handcam: 1 }.freeze
130
- end
124
+ set_values ({ videographer: 0, handcam: 1 })
131
125
 
132
126
  def icon
133
127
  case @value
@@ -168,18 +162,16 @@ run the generator to create an appropriate enum class
168
162
  Insert the values of your enum into `models/swifter_enum_album_status_enum.rb`
169
163
 
170
164
  class AlbumStatusEnum < SwifterEnum::Base
171
- def self.values
172
- {
173
- waiting_for_footage: 0,
174
- waiting_for_upload: 10,
175
- uploading: 20,
176
- processing_preview: 24,
177
- delivered_preview: 26,
178
- processing_paid: 30,
179
- delivered_paid: 50,
180
- processing_failed: 60
181
- }.freeze
182
- end
165
+ set_values ({
166
+ waiting_for_footage: 0,
167
+ waiting_for_upload: 10,
168
+ uploading: 20,
169
+ processing_preview: 24,
170
+ delivered_preview: 26,
171
+ processing_paid: 30,
172
+ delivered_paid: 50,
173
+ processing_failed: 60
174
+ })
183
175
  end
184
176
 
185
177
  Now replace the definition in your model file with
@@ -240,10 +232,7 @@ For example, to create a `CameraEnum`, run:
240
232
  This command will generate a file `app/models/swifter_enum/camera_enum.rb` with the following structure:
241
233
 
242
234
  class CameraEnum < SwifterEnum::Base
243
- def self.values
244
- # Insert your values here. e.g. { foo: 1, bar: 2 }.freeze
245
- { }.freeze
246
- end
235
+ set_values <<Your Values Here>>
247
236
  end
248
237
 
249
238
  After generating your enum, you can add your specific enum values and use it in your ActiveRecord models.
@@ -264,6 +253,23 @@ Locale file example (`config/locales/en.yml`):
264
253
  #example usage
265
254
  v.camera.t => "Videographer"
266
255
 
256
+ ### Using string values to store Enum
257
+
258
+ DHH has described using integer values for enums as a mistake he regrets.
259
+
260
+ He has shown code like
261
+
262
+ enum direction: %w[ up down left right ].index_by(&:itself)
263
+
264
+ which uses string values in the db by generating the hash `{"up"=>"up", "down"=>"down", "left"=>"left", "right"=>"right"}`
265
+
266
+ Swifter enum allows the same - but lets you simply set your values using an array of strings or symbols
267
+
268
+ set_values %w[ up down left right]
269
+ #or
270
+ set_values [:up,:down,:left,:right]
271
+
272
+
267
273
  ### Raw Value Escape Hatch
268
274
 
269
275
  SwifterEnum is built on top of the normal Rails enum functionality.
data/Rakefile CHANGED
@@ -12,7 +12,6 @@ Rake::TestTask.new do |t|
12
12
  t.verbose = true
13
13
  end
14
14
 
15
-
16
15
  # publish with rake release:publish
17
16
  namespace :release do
18
17
  desc "Read version, build gem, tag and push release"
@@ -42,5 +41,4 @@ namespace :release do
42
41
  end
43
42
  end
44
43
 
45
-
46
44
  task default: [:standard, :test]
@@ -1,11 +1,31 @@
1
1
  module SwifterEnum
2
2
  class Base
3
- attr_reader :value
3
+ class << self
4
+ attr_accessor :values
5
+
6
+ def set_values(input)
7
+ case input
8
+ when Hash
9
+ @values = input
10
+ when Array
11
+ validate_array_elements!(input)
12
+ @values = input.map { |item| [item.to_sym, item.to_s] }.to_h
13
+ else
14
+ raise ArgumentError, "Input must be a Hash or an Array of symbols or strings"
15
+ end
16
+ end
17
+
18
+ private
4
19
 
5
- def self.values
6
- {}
20
+ def validate_array_elements!(array)
21
+ unless array.all? { |item| item.is_a?(Symbol) || item.is_a?(String) }
22
+ raise ArgumentError, "Array elements must all be symbols or strings"
23
+ end
24
+ end
7
25
  end
8
26
 
27
+ attr_reader :value
28
+
9
29
  def initialize(value)
10
30
  @value = value&.to_sym
11
31
  end
@@ -3,12 +3,14 @@
3
3
 
4
4
  class <%= class_name %>Enum < SwifterEnum::Base
5
5
 
6
- def self.values
7
- # Insert your values here as you would for a normal enum
8
- # { foo: 1, bar: 2 }.freeze
6
+ #set your values using a hash, or array of symbols
7
+ #if you're using a hash with symbol:integer, then your database column should be of integer type
8
+ # e.g. set_values ({active: 10, inactive: 20})
9
+ # or set_values active: 10, inactive: 20
10
+ #if you're using an array of symbols (or strings), then your database column should be of string type
11
+ # e.g. set_values [:active,:passive]
9
12
 
10
- { }.freeze
11
- end
13
+ set_values <<Your Values Here>>
12
14
 
13
15
  # you can now define methods on the enum
14
16
  # this would allow you to access YourModel.<%= file_name %>.squared
@@ -5,7 +5,6 @@ module SwifterEnum
5
5
 
6
6
  class_methods do
7
7
  def swifter_enum(enum_name, enum_klass, enum_options = {})
8
-
9
8
  # Define the enum using values from the enum class
10
9
  enum(enum_name, enum_klass.values, **enum_options)
11
10
 
@@ -3,13 +3,18 @@ require "active_model"
3
3
  module SwifterEnum
4
4
  class SwifterEnumValidator < ActiveModel::EachValidator
5
5
  def validate_each(record, attribute, a_value)
6
- return if options[:allow_nil] && a_value.nil?
7
-
8
6
  if !a_value.is_a?(SwifterEnum::Base) || a_value.instance_of?(SwifterEnum::Base)
9
7
  record.errors.add(attribute, "#{a_value.value} is not a valid subclass of SwifterEnum")
10
8
  end
11
9
 
10
+ if a_value.value.nil?
11
+ return if options[:allow_nil]
12
+
13
+ record.errors.add(attribute, "nil value for #{attribute} is not allowed")
14
+ end
15
+
12
16
  unless a_value.class.values.key?(a_value.value)
17
+ # binding.b
13
18
  record.errors.add(attribute, "#{a_value.value} is not a valid #{attribute} type")
14
19
  end
15
20
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SwifterEnum
4
- VERSION = "0.9.1"
4
+ VERSION = "0.9.2"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: swifter_enum
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.1
4
+ version: 0.9.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rob Jonson
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-03-10 00:00:00.000000000 Z
11
+ date: 2024-03-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord