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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bc607b206f6498ca75d71fc583206138080cf768b849ddbe690789281a21921e
4
- data.tar.gz: da78b379dd988c85daa54c5f29f9562ee03cf86a143eb360f22ccae14547d8a7
3
+ metadata.gz: d9d8952fea1c21107106addd2a2dc5f7d02348d2c0c3d99210d892c08e5b9b5b
4
+ data.tar.gz: 48ce6bb0b1b97a0fba166605469c0247143ea0f217ed2e5348c1757d124719d2
5
5
  SHA512:
6
- metadata.gz: e0494cb5c0d8d4afc5ed527fd5c69fd67c1074f631ddaac73896efd7a7553c02f01e6069300356b7a7fc62f960c56e44d8860563ef0847d1bca6588834b423c2
7
- data.tar.gz: 2b9fef8b1ee2af4fd06a2c6fd36c86655fd694502b291968c836452473c61b3ee33f23849a43e4404b87578c4f87451a4081d369ae0cfe7cedf9c8a70b9fa248
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
- 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.0"
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.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