nummy 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 +4 -4
- data/CHANGELOG.md +63 -1
- data/README.md +8 -5
- data/lib/nummy/enum.rb +62 -13
- data/lib/nummy/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 83fe6928d06ebd4ba649eaa37ad3278366e2322a99fe56a7efdfed228b971841
|
4
|
+
data.tar.gz: 7116e7d5febca95ae52544bcbc42a4fd99e895ca8e60ef9cd7e3444e6dae8719
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4d4bb886ad7d5187aca88391c1e9366a82b4bdb08e435cb5567951a5e2a5e5d230ef5f06cdae0bd5b104c8a62d00e41c437969cf9b9b4a4cf7d5eb41e73dd4ac
|
7
|
+
data.tar.gz: dc40fbde79187708d1006bd80475b114f98f8de238faaae8bd4a9b620f5557df06c3d960123e237267041370f59baee13d42e1f4389e97e3394e68fe6e383cfc
|
data/CHANGELOG.md
CHANGED
@@ -1,8 +1,70 @@
|
|
1
1
|
## [Unreleased]
|
2
2
|
|
3
|
+
## [0.3.0] - 2024-01-04
|
4
|
+
|
5
|
+
- **Adds additional flexibility to `Nummy::Enum.to_attribute` (#2)
|
6
|
+
|
7
|
+
This release teaches a few new tricks to `Nummy::Enum.to_attribute`:
|
8
|
+
|
9
|
+
- it allows passing a block to fully customize how keys are transformed
|
10
|
+
|
11
|
+
- it looks for `String#underscore` rather than calling into `ActiveSupport::Inflector.underscore` directly, which means that users can bring their own monkey patch if they want to.
|
12
|
+
|
13
|
+
- it falls back to `Symbol#downcase` if `String#underscore` is not available. If the constants are defined using `SCREAMING_SNAKE_CASE`, this will generally have the same result as calling `String#underscore`, but without requiring ActiveSupport.
|
14
|
+
|
15
|
+
```ruby
|
16
|
+
class ShippingStatus < Nummy::Enum
|
17
|
+
IN_TRANSIT = auto
|
18
|
+
OUT_FOR_DELIVERY = auto
|
19
|
+
DELIVERED = auto
|
20
|
+
end
|
21
|
+
```
|
22
|
+
|
23
|
+
```ruby
|
24
|
+
# Without ActiveSupport
|
25
|
+
|
26
|
+
ShippingStatus.to_attribute
|
27
|
+
# v0.2.0 (❌)
|
28
|
+
# => nummy/lib/nummy/enum.rb:379:in `block in to_attribute': uninitialized constant ActiveSupport (NameError)
|
29
|
+
#
|
30
|
+
# ::ActiveSupport::Inflector.underscore(key).to_sym
|
31
|
+
# ^^^^^^^^^^^^^^^
|
32
|
+
|
33
|
+
# v0.3.0 (✅)
|
34
|
+
# => {:in_transit=>0, :out_for_delivery=>1, :delivered=>2}
|
35
|
+
```
|
36
|
+
|
37
|
+
```ruby
|
38
|
+
# With ActiveSupport
|
39
|
+
require "active_support/core_ext/string/inflections"
|
40
|
+
|
41
|
+
ShippingStatus.to_attribute
|
42
|
+
# => {:in_transit=>0, :out_for_delivery=>1, :delivered=>2}
|
43
|
+
|
44
|
+
ShippingStatus.to_attribute { |key| key.to_s.underscore.camelize.to_sym }
|
45
|
+
# => {:InTransit=>0, :OutForDelivery=>1, :Delivered=>2}
|
46
|
+
```
|
47
|
+
|
48
|
+
- **Adds JSON serialization support (#3)**
|
49
|
+
|
50
|
+
This release adds two methods to `Nummy::Enum`: `.as_json` and `.to_json`. These methods allow you to serialize an enum to JSON.
|
51
|
+
|
52
|
+
```ruby
|
53
|
+
class Status < Nummy::Enum
|
54
|
+
ACTIVE = auto
|
55
|
+
ARCHIVED = auto
|
56
|
+
end
|
57
|
+
|
58
|
+
Status.as_json
|
59
|
+
# => {"ACTIVE" => 0, "ARCHIVED" => 1}
|
60
|
+
|
61
|
+
Status.to_json
|
62
|
+
# => "{\"ACTIVE\":0,\"ARCHIVED\":1}
|
63
|
+
```
|
64
|
+
|
3
65
|
## [0.2.0] - 2024-01-04
|
4
66
|
|
5
|
-
- Add `Nummy::Enum.to_attribute
|
67
|
+
- Add `Nummy::Enum.to_attribute` (#1), which converts the enum to a hash that can be passed as the values of an `ActiveRecord::Enum`:
|
6
68
|
|
7
69
|
```ruby
|
8
70
|
class Conversation < ActiveRecord::Base
|
data/README.md
CHANGED
@@ -148,10 +148,7 @@ end
|
|
148
148
|
|
149
149
|
#### Rails / ActiveRecord integration
|
150
150
|
|
151
|
-
|
152
|
-
> This integration requires `ActiveSupport::Inflector` to be defined.
|
153
|
-
|
154
|
-
To use nummy enums as ActiveRecord enums, you can use the `.to_attribute` method:
|
151
|
+
To use nummy enums as ActiveRecord enums, you can use the `.to_attribute` method, which converts the keys to `snake_case` by default:
|
155
152
|
|
156
153
|
```ruby
|
157
154
|
class Conversation < ActiveRecord::Base
|
@@ -164,7 +161,13 @@ class Conversation < ActiveRecord::Base
|
|
164
161
|
end
|
165
162
|
```
|
166
163
|
|
167
|
-
|
164
|
+
> [!NOTE]
|
165
|
+
> `to_attribute` will transform keys using `String#underscore` if it is defined, otherwise it will use `Symbol#downcase`.
|
166
|
+
|
167
|
+
> [!TIP]
|
168
|
+
> You can also do custom transformations by passing a block to `to_attribute`. See the documentation for more details.
|
169
|
+
|
170
|
+
Using `to_attribute` allows you to use all of the Rails magic for enums, like scopes and boolean helpers, while also being able to refer to values in a safer way than hash lookups.
|
168
171
|
|
169
172
|
That is, these two are the same:
|
170
173
|
|
data/lib/nummy/enum.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "json"
|
4
|
+
|
3
5
|
require "nummy/auto_sequenceable"
|
4
6
|
require "nummy/ordered_const_enumerable"
|
5
7
|
require "nummy/errors"
|
@@ -354,30 +356,77 @@ module Nummy
|
|
354
356
|
# Alias to support splatting enums into keyword args.
|
355
357
|
alias to_hash to_h
|
356
358
|
|
359
|
+
# Converts +self+ to a +Hash+ that can be converted to JSON.
|
360
|
+
#
|
361
|
+
# @return [Hash{String => Object}]
|
362
|
+
#
|
363
|
+
# @see .to_json
|
364
|
+
def as_json
|
365
|
+
to_h.transform_keys!(&:to_s)
|
366
|
+
end
|
367
|
+
|
368
|
+
# Converts +self+ to a +Hash+ and serializes it to a JSON string.
|
369
|
+
#
|
370
|
+
# Supports same options as +JSON#generate+.
|
371
|
+
#
|
372
|
+
# @return [String]
|
373
|
+
#
|
374
|
+
# @see .as_json
|
375
|
+
def to_json(*)
|
376
|
+
as_json.to_json(*)
|
377
|
+
end
|
378
|
+
|
357
379
|
# Converts the enum to a +Hash+ with snake_case keys.
|
358
380
|
#
|
359
381
|
# This is intended to be used with +ActiveRecord::Enum+, but can be used
|
360
382
|
# with any library that supports defining enums using a +Hash+ and expects
|
361
383
|
# to have lowercase keys.
|
362
384
|
#
|
363
|
-
# @
|
364
|
-
#
|
385
|
+
# @overload to_attribute
|
386
|
+
# If +String#underscore+ is defined, converts the keys to snake_case
|
387
|
+
# by calling +underscore+ on the stringified key.
|
388
|
+
#
|
389
|
+
# Otherwise, converts each key using +Symbol#downcase+.
|
390
|
+
#
|
391
|
+
# @return [Hash{Symbol => Object}]
|
365
392
|
#
|
366
|
-
#
|
393
|
+
# @example Using with +ActiveRecord::Enum+.
|
394
|
+
# class Conversation < ActiveRecord::Base
|
395
|
+
# class Status < Nummy::Enum
|
396
|
+
# ACTIVE = auto
|
397
|
+
# ARCHIVED = auto
|
398
|
+
# end
|
367
399
|
#
|
368
|
-
#
|
369
|
-
# class Conversation < ActiveRecord::Base
|
370
|
-
# class Status < Nummy::Enum
|
371
|
-
# ACTIVE = auto
|
372
|
-
# ARCHIVED = auto
|
400
|
+
# enum :status, Status.to_attribute
|
373
401
|
# end
|
374
402
|
#
|
375
|
-
#
|
376
|
-
#
|
377
|
-
|
378
|
-
|
379
|
-
|
403
|
+
# @overload to_attribute(&)
|
404
|
+
# Transforms the keys by calling the given block on each key.
|
405
|
+
#
|
406
|
+
# @yieldparam key [Symbol]
|
407
|
+
# @return [Hash{Symbol => Object}]
|
408
|
+
#
|
409
|
+
# @example Using custom key transformer.
|
410
|
+
# class ShippingStatus < Nummy::Enum
|
411
|
+
# IN_TRANSIT = auto
|
412
|
+
# OUT_FOR_DELIVERY = auto
|
413
|
+
# DELIVERED = auto
|
414
|
+
# end
|
415
|
+
#
|
416
|
+
# ShippingStatus.to_attribute { |key| key.to_s.underscore.camelize.to_sym }
|
417
|
+
# # => {:InTransit=>0, :OutForDelivery=>1, :Delivered=>2}
|
418
|
+
def to_attribute(&)
|
419
|
+
return to_h.transform_keys!(&) if block_given?
|
420
|
+
|
421
|
+
# Ignore coverage because it's executed in a forked process, which
|
422
|
+
# messes with the coverage collection.
|
423
|
+
# :nocov:
|
424
|
+
if String.method_defined?(:underscore)
|
425
|
+
return to_attribute { |key| key.to_s.underscore.to_sym }
|
380
426
|
end
|
427
|
+
# :nocov:
|
428
|
+
|
429
|
+
to_attribute(&:downcase)
|
381
430
|
end
|
382
431
|
|
383
432
|
# Returns a string representation of +self+.
|
data/lib/nummy/version.rb
CHANGED