enum_fields 0.2.0 → 0.3.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: d9d8952fea1c21107106addd2a2dc5f7d02348d2c0c3d99210d892c08e5b9b5b
4
- data.tar.gz: 48ce6bb0b1b97a0fba166605469c0247143ea0f217ed2e5348c1757d124719d2
3
+ metadata.gz: 4aba8fff03dbdf4c90cbe1b6ab1237ae6c06173b90b121e4b8766d5d43999b2e
4
+ data.tar.gz: 949a56d075cca6f44244cd72e9e31da089f4752793eb905758cdff3c32a1cee7
5
5
  SHA512:
6
- metadata.gz: cb50aeafc28d33cc7cb09a69ec946581b0bd9a6560c29f08511846dc88050ddbb69bcc12a0fc0841881d2b46c6ff2afd04cd4962ccb00dabf303eafe78ebdf74
7
- data.tar.gz: cea3d418bbc42e7789c025f2400c67a6587898282360b8673aefa716e6d2331b0d224e8dffbdb91b385bda5165828804704525d0bc56ffb7ca326dca39714060
6
+ metadata.gz: 586be756530f00da32796e169e531b1d0ca0233d18b1993997f4d38686e797d1e51e8acb85daaa2ebafbad25cbdb7f604c2bd07b2592a99f203622d3591a9095
7
+ data.tar.gz: a6f73682ed1cf7f02cdec75ed3e8116c42f9c950428b029eb0b7a87542e2b5ad8309fec276853000e5f8bb055e6e0dbc63642748b0f3542ec5251821ead55255
data/README.md CHANGED
@@ -103,16 +103,6 @@ This automatically generates:
103
103
  }
104
104
  ```
105
105
 
106
- #### Custom Column Mapping
107
-
108
- If your accessor name differs from your column name:
109
-
110
- ```ruby
111
- class User < ApplicationRecord
112
- enum_field :role, definitions, column: :user_role
113
- end
114
- ```
115
-
116
106
  ### Generated Methods
117
107
 
118
108
  For an enum field defined as:
@@ -227,6 +217,82 @@ Campaign.completed_stage
227
217
 
228
218
  Automatically validates that the column value is included in the defined values (with `allow_nil: true`).
229
219
 
220
+ ### Options
221
+
222
+ #### `column`
223
+
224
+ Map the accessor to a different database column name:
225
+
226
+ ```ruby
227
+ enum_field :role, definitions, column: :user_role
228
+ ```
229
+
230
+ #### `scope`
231
+
232
+ Controls whether query scopes are generated. Defaults to `true`. Set to `false` to skip scope generation:
233
+
234
+ ```ruby
235
+ enum_field :speed, definitions, scope: false
236
+ ```
237
+
238
+ #### `validate`
239
+
240
+ Controls whether inclusion validation is added. Defaults to `true`. Set to `false` to skip validation:
241
+
242
+ ```ruby
243
+ enum_field :speed, definitions, validate: false
244
+ ```
245
+
246
+ ### Virtual Attributes
247
+
248
+ `enum_field` works with computed/virtual attributes that aren't backed by a database column. Define a method on the model and use `scope: false` and `validate: false` since those features require a real column:
249
+
250
+ ```ruby
251
+ class Segment < ApplicationRecord
252
+ enum_field :size_category, {
253
+ small: {
254
+ value: "small",
255
+ label: "Small (< 100)",
256
+ },
257
+ medium: {
258
+ value: "medium",
259
+ label: "Medium (< 1K)",
260
+ },
261
+ large: {
262
+ value: "large",
263
+ label: "Large (< 10K)",
264
+ },
265
+ }, scope: false, validate: false
266
+
267
+ def size_category
268
+ case profiles_count
269
+ when ...100
270
+ "small"
271
+ when 100...1_000
272
+ "medium"
273
+ else
274
+ "large"
275
+ end
276
+ end
277
+ end
278
+ ```
279
+
280
+ All instance methods work as expected:
281
+
282
+ ```ruby
283
+ segment.size_category # "small"
284
+ segment.size_category_label # "Small (< 100)"
285
+ segment.size_category_metadata # { value: "small", label: "Small (< 100)" }
286
+ segment.small_size_category? # true
287
+ ```
288
+
289
+ Class methods (options, values, counts) also work normally:
290
+
291
+ ```ruby
292
+ Segment.size_category_options # [["Small (< 100)", "small"], ["Medium (< 1K)", "medium"], ...]
293
+ Segment.size_category_values # ["small", "medium", "large"]
294
+ ```
295
+
230
296
  ### Custom Properties
231
297
 
232
298
  You can add any custom properties to your definitions, and the gem will automatically create accessor methods for them:
data/___release.md ADDED
@@ -0,0 +1,9 @@
1
+ Enum Fields
2
+
3
+ 1. Update version.rb
4
+ 2. Commit "Bump version to 0.0.X"
5
+ 3. `rake release`
6
+ Even if API error comes, just do:
7
+ 4. And then just `gem push pkg/enum_fields-0.2.1.gem`
8
+
9
+ gem push pkg/enum_fields-0.2.0.gem
@@ -37,23 +37,46 @@ module EnumFields
37
37
  when Hash
38
38
  input.with_indifferent_access
39
39
  when Array
40
- input.to_h do |value|
41
- [value, { value: value }]
42
- end.with_indifferent_access
40
+ build_from_array(input)
43
41
  else
44
42
  raise InvalidDefinitionsError, "Invalid definitions format: #{input.class}"
45
43
  end
46
44
  end
47
45
 
48
46
  output.transform_values do |metadata|
47
+ metadata = metadata.with_indifferent_access
48
+
49
49
  if metadata.key?(:label)
50
50
  metadata
51
51
  else
52
- metadata.merge(label: metadata[:value])
52
+ metadata.merge(label: metadata[:value].to_s)
53
53
  end
54
54
  end
55
55
  end
56
56
 
57
+ def build_from_array(input)
58
+ input.to_h do |element|
59
+ metadata = normalize_item(element)
60
+
61
+ [normalize_key(metadata[:value]), metadata]
62
+ end.with_indifferent_access
63
+ end
64
+
65
+ def normalize_item(item)
66
+ if item.is_a?(Hash)
67
+ item.with_indifferent_access
68
+ else
69
+ {
70
+ value: item,
71
+ label: item.to_s,
72
+ }
73
+ end
74
+ end
75
+
76
+ def normalize_key(value)
77
+ value.to_s.to_sym
78
+ end
79
+
57
80
  def valid_hash?(data)
58
81
  return false unless data.is_a?(HashWithIndifferentAccess)
59
82
  return false unless data.values.all? { |metadata| metadata.key?(:value) }
@@ -104,7 +104,7 @@ module EnumFields
104
104
  column_name = @column_name
105
105
 
106
106
  @model_class.define_method("#{accessor}_metadata") do
107
- column_value = attributes[column_name.to_s]
107
+ column_value = public_send(column_name)
108
108
  return nil if column_value.nil?
109
109
 
110
110
  definitions = self.class.enum_field_for(accessor)
@@ -120,7 +120,7 @@ module EnumFields
120
120
 
121
121
  @definition.properties.each do |property|
122
122
  @model_class.define_method("#{accessor}_#{property}") do
123
- column_value = attributes[column_name.to_s]
123
+ column_value = public_send(column_name)
124
124
  return nil if column_value.nil?
125
125
 
126
126
  definitions = self.class.enum_field_for(accessor)
@@ -145,6 +145,8 @@ module EnumFields
145
145
  end
146
146
 
147
147
  def define_scopes!
148
+ return unless column_scopeable?
149
+
148
150
  column_name = @column_name
149
151
 
150
152
  @definition.each do |key, metadata|
@@ -192,10 +194,6 @@ module EnumFields
192
194
  end
193
195
  end
194
196
 
195
- def column_validatable?
196
- @definition.present? && @options.fetch(:validate, true)
197
- end
198
-
199
197
  def column_polymorphic_association_name
200
198
  return nil unless @model_class.respond_to?(:reflect_on_all_associations)
201
199
 
@@ -205,5 +203,13 @@ module EnumFields
205
203
 
206
204
  reflection&.name
207
205
  end
206
+
207
+ def column_scopeable?
208
+ @definition.present? && @options.fetch(:scope, true)
209
+ end
210
+
211
+ def column_validatable?
212
+ @definition.present? && @options.fetch(:validate, true)
213
+ end
208
214
  end
209
215
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module EnumFields
4
- VERSION = "0.2.0"
4
+ VERSION = "0.3.0"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: enum_fields
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kinnell Shah
@@ -60,9 +60,9 @@ executables: []
60
60
  extensions: []
61
61
  extra_rdoc_files: []
62
62
  files:
63
- - CHANGELOG.md
64
63
  - LICENSE
65
64
  - README.md
65
+ - ___release.md
66
66
  - lib/enum_fields.rb
67
67
  - lib/enum_fields/base.rb
68
68
  - lib/enum_fields/definition.rb
@@ -95,7 +95,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
95
95
  - !ruby/object:Gem::Version
96
96
  version: '2.0'
97
97
  requirements: []
98
- rubygems_version: 4.0.3
98
+ rubygems_version: 4.0.7
99
99
  specification_version: 4
100
100
  summary: Enhanced enum-like fields for ActiveRecord models with metadata support
101
101
  test_files: []
data/CHANGELOG.md DELETED
@@ -1,21 +0,0 @@
1
- # Changelog
2
-
3
- ## [0.0.1] - 2025-11-17
4
-
5
- ### Added
6
-
7
- - Initial release of EnumFields gem
8
- - Support for enum-like fields with metadata properties
9
- - Array and Hash definition formats
10
- - Automatic generation of:
11
- - Class methods (`<accessor>s`, `<accessor>s_count`, `<accessor>_values`, `<accessor>_options`)
12
- - Instance getter/setter methods (when accessor differs from column)
13
- - Metadata accessor methods (`<accessor>_metadata`)
14
- - Property accessor methods for all defined properties (`<accessor>_<property>`)
15
- - Inquiry methods (`<key>_<accessor>?`)
16
- - Scopes (`<key>_<accessor>`)
17
- - Validations (inclusion with `allow_nil: true`)
18
- - Custom column mapping support via `column:` option
19
- - Dynamic property method generation for custom properties
20
-
21
- [0.0.1]: https://github.com/kinnell/enum_fields/releases/tag/v0.0.1