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 +4 -4
- data/README.md +108 -0
- data/___release.md +9 -0
- data/lib/enum_fields/definition.rb +27 -4
- data/lib/enum_fields/enum_field.rb +4 -4
- data/lib/enum_fields/namespace.rb +17 -0
- data/lib/enum_fields/registry.rb +13 -4
- data/lib/enum_fields/version.rb +1 -1
- data/lib/enum_fields.rb +9 -0
- metadata +4 -3
- data/CHANGELOG.md +0 -21
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 52a056fc46a1cb6934d9dc11ab2717f4babb8b32ee2ccf6a85ab97b147517152
|
|
4
|
+
data.tar.gz: b1d671075bbebd910032795752b42da8a94123c7f245f8c7f4cfb99a874eae1c
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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
|
@@ -37,23 +37,46 @@ module EnumFields
|
|
|
37
37
|
when Hash
|
|
38
38
|
input.with_indifferent_access
|
|
39
39
|
when Array
|
|
40
|
-
input
|
|
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
|
-
|
|
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
|
data/lib/enum_fields/registry.rb
CHANGED
|
@@ -7,10 +7,19 @@ module EnumFields
|
|
|
7
7
|
super(@store)
|
|
8
8
|
end
|
|
9
9
|
|
|
10
|
-
def register(
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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
|
data/lib/enum_fields/version.rb
CHANGED
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
|
|
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.
|
|
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
|