enum_fields 0.1.2 → 0.2.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 +4 -4
- data/README.md +108 -0
- 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 +2 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: d9d8952fea1c21107106addd2a2dc5f7d02348d2c0c3d99210d892c08e5b9b5b
|
|
4
|
+
data.tar.gz: 48ce6bb0b1b97a0fba166605469c0247143ea0f217ed2e5348c1757d124719d2
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: cb50aeafc28d33cc7cb09a69ec946581b0bd9a6560c29f08511846dc88050ddbb69bcc12a0fc0841881d2b46c6ff2afd04cd4962ccb00dabf303eafe78ebdf74
|
|
7
|
+
data.tar.gz: cea3d418bbc42e7789c025f2400c67a6587898282360b8673aefa716e6d2331b0d224e8dffbdb91b385bda5165828804704525d0bc56ffb7ca326dca39714060
|
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:
|
|
@@ -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.
|
|
4
|
+
version: 0.2.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Kinnell Shah
|
|
@@ -68,6 +68,7 @@ files:
|
|
|
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
|