enum_fields 0.1.2 → 0.2.1

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: bc607b206f6498ca75d71fc583206138080cf768b849ddbe690789281a21921e
4
- data.tar.gz: da78b379dd988c85daa54c5f29f9562ee03cf86a143eb360f22ccae14547d8a7
3
+ metadata.gz: 52a056fc46a1cb6934d9dc11ab2717f4babb8b32ee2ccf6a85ab97b147517152
4
+ data.tar.gz: b1d671075bbebd910032795752b42da8a94123c7f245f8c7f4cfb99a874eae1c
5
5
  SHA512:
6
- metadata.gz: e0494cb5c0d8d4afc5ed527fd5c69fd67c1074f631ddaac73896efd7a7553c02f01e6069300356b7a7fc62f960c56e44d8860563ef0847d1bca6588834b423c2
7
- data.tar.gz: 2b9fef8b1ee2af4fd06a2c6fd36c86655fd694502b291968c836452473c61b3ee33f23849a43e4404b87578c4f87451a4081d369ae0cfe7cedf9c8a70b9fa248
6
+ metadata.gz: 76715e583a3cff76e5cd00da9c88060a0fe38d9d46e8899ba987014483a968ac8a678ac66f3847263021c7851d51e45e709a349fe6650fb369f5d347f8f2e0f6
7
+ data.tar.gz: 3ffce4b7a7830e2744cc1aed9f80c908646658733eea38ae312188262713b0ac9ef37fe868dd2d1cbc5f0572c1a096aab90d55b467457b0b16875d03d463f0f5
data/README.md CHANGED
@@ -258,6 +258,114 @@ ticket.priority_metadata[:sla_hours] # 72
258
258
  ticket.priority_metadata[:notify_manager] # false
259
259
  ```
260
260
 
261
+ ### Registry & Standalone Registration
262
+
263
+ When `enum_field` is used in a model, definitions are automatically registered under a namespace derived from the model class name (e.g., `Campaign` becomes `campaign`).
264
+
265
+ You can also register definitions directly, outside of models, using the `namespace` DSL:
266
+
267
+ ```ruby
268
+ # config/initializers/enum_fields.rb
269
+ EnumFields.namespace(:basic) do
270
+ enum_field :priority, {
271
+ low: {
272
+ value: "low",
273
+ label: "Low",
274
+ },
275
+ medium: {
276
+ value: "medium",
277
+ label: "Medium",
278
+ },
279
+ high: {
280
+ value: "high",
281
+ label: "High",
282
+ },
283
+ }
284
+
285
+ enum_field :status, {
286
+ active: {
287
+ value: "active",
288
+ label: "Active",
289
+ },
290
+ inactive: {
291
+ value: "inactive",
292
+ label: "Inactive",
293
+ },
294
+ }
295
+ end
296
+ ```
297
+
298
+ Access the raw registry:
299
+
300
+ ```ruby
301
+ EnumFields.registry
302
+ # => { "basic" => { "priority" => { ... }, "status" => { ... } }, "campaign" => { ... } }
303
+ ```
304
+
305
+ ### Catalog
306
+
307
+ `EnumFields.catalog` returns all registered definitions with namespaces sorted alphabetically, each field's entries as an array of metadata hashes (keys stripped):
308
+
309
+ ```ruby
310
+ EnumFields.catalog
311
+ # => {
312
+ # "basic" => {
313
+ # "priority" => [
314
+ # {
315
+ # "value" => "low",
316
+ # "label" => "Low",
317
+ # },
318
+ # {
319
+ # "value" => "medium",
320
+ # "label" => "Medium",
321
+ # },
322
+ # {
323
+ # "value" => "high",
324
+ # "label" => "High",
325
+ # },
326
+ # ],
327
+ # "status" => [
328
+ # {
329
+ # "value" => "active",
330
+ # "label" => "Active",
331
+ # },
332
+ # {
333
+ # "value" => "inactive",
334
+ # "label" => "Inactive",
335
+ # },
336
+ # ],
337
+ # },
338
+ # "campaign" => {
339
+ # "stage" => [
340
+ # {
341
+ # "value" => "pending",
342
+ # "label" => "Pending",
343
+ # "icon" => "clock",
344
+ # "color" => "yellow",
345
+ # },
346
+ # {
347
+ # "value" => "processing",
348
+ # "label" => "Processing",
349
+ # "icon" => "cog",
350
+ # "color" => "blue",
351
+ # },
352
+ # {
353
+ # "value" => "shipped",
354
+ # "label" => "Shipped",
355
+ # "icon" => "truck",
356
+ # "color" => "green",
357
+ # },
358
+ # {
359
+ # "value" => "delivered",
360
+ # "label" => "Delivered",
361
+ # "icon" => "check",
362
+ # "color" => "green",
363
+ # },
364
+ # ],
365
+ # },
366
+ # }
367
+ ```
368
+
261
369
  ## Development
262
370
 
263
371
  After checking out the repo, run:
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.0.5.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) }
@@ -31,11 +31,11 @@ module EnumFields
31
31
  private
32
32
 
33
33
  def register!
34
- EnumFields.register(
35
- model_class: @model_class,
34
+ EnumFields.register({
35
+ namespace: @model_class.name&.underscore || @model_class.object_id.to_s,
36
36
  accessor: @accessor,
37
- definition: @definition.data
38
- )
37
+ definition: @definition.data,
38
+ })
39
39
  end
40
40
 
41
41
  def store_definition!
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EnumFields
4
+ class Namespace
5
+ def initialize(namespace)
6
+ @namespace = namespace
7
+ end
8
+
9
+ def enum_field(accessor, definition = {})
10
+ EnumFields.register({
11
+ namespace: @namespace,
12
+ accessor: accessor,
13
+ definition: definition,
14
+ })
15
+ end
16
+ end
17
+ end
@@ -7,10 +7,19 @@ module EnumFields
7
7
  super(@store)
8
8
  end
9
9
 
10
- def register(model_class:, accessor:, definition:)
11
- key = model_class.name&.underscore || model_class.object_id.to_s
12
- @store[key] ||= {}.with_indifferent_access
13
- @store[key][accessor] = definition
10
+ def register(args = {})
11
+ namespace = args.fetch(:namespace) { raise ArgumentError, "namespace is required" }
12
+ accessor = args.fetch(:accessor) { raise ArgumentError, "accessor is required" }
13
+ definition = args.fetch(:definition, {})
14
+
15
+ @store[namespace] ||= {}.with_indifferent_access
16
+ @store[namespace][accessor] = definition
17
+ end
18
+
19
+ def catalog
20
+ sort_by { |key, _| key.to_s }.to_h.transform_values do |fields|
21
+ fields.transform_values(&:values)
22
+ end
14
23
  end
15
24
  end
16
25
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module EnumFields
4
- VERSION = "0.1.2"
4
+ VERSION = "0.2.1"
5
5
  end
data/lib/enum_fields.rb CHANGED
@@ -18,6 +18,7 @@ module EnumFields
18
18
 
19
19
  autoload :Definition
20
20
  autoload :EnumField
21
+ autoload :Namespace
21
22
  autoload :Registry
22
23
 
23
24
  def self.registry
@@ -28,6 +29,14 @@ module EnumFields
28
29
  registry.register(...)
29
30
  end
30
31
 
32
+ def self.namespace(name, &)
33
+ Namespace.new(name).instance_eval(&)
34
+ end
35
+
36
+ def self.catalog
37
+ registry.catalog
38
+ end
39
+
31
40
  def self.clear_registry!
32
41
  @registry = nil
33
42
  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.1.2
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kinnell Shah
@@ -60,14 +60,15 @@ 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
69
69
  - lib/enum_fields/enum_field.rb
70
70
  - lib/enum_fields/errors.rb
71
+ - lib/enum_fields/namespace.rb
71
72
  - lib/enum_fields/registry.rb
72
73
  - lib/enum_fields/version.rb
73
74
  homepage: https://github.com/kinnell/enum_fields
@@ -94,7 +95,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
94
95
  - !ruby/object:Gem::Version
95
96
  version: '2.0'
96
97
  requirements: []
97
- rubygems_version: 4.0.3
98
+ rubygems_version: 4.0.7
98
99
  specification_version: 4
99
100
  summary: Enhanced enum-like fields for ActiveRecord models with metadata support
100
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