philiprehberger-enum 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 +9 -0
- data/README.md +25 -0
- data/lib/philiprehberger/enum/version.rb +1 -1
- data/lib/philiprehberger/enum.rb +50 -0
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 3841094e2bc4093c7ee76058b058ffc2b99302c27b77c1c3e5b8724251a90f90
|
|
4
|
+
data.tar.gz: 769f7d79d66026f0f5aa6848e4845e36260d3fa5251085b453983410dc9ceadf
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: fc946c8e5d96461a2774036a34c569351a7fdda7514bf6389e97d928e0b393fd2c21b1ff4b53adae561242886dc1a028d3a5d4c01b305d202e9ee4780d7ae62b
|
|
7
|
+
data.tar.gz: 78d1dda7a94396755c7ff710d572b1f96710f9007af4bc8b66e55920e4e5e55e1ef8edd651c185f117d473807d7ef25b7f451fb53c6560f9317fcbcc3cc93f96
|
data/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.3.0] - 2026-04-09
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- `Enum.fetch(name)` strict lookup that raises `Error` if the name is not a member (case-insensitive fallback)
|
|
14
|
+
- `Enum.fetch_by_value(val)` strict value lookup that raises `Error` if no member has the given value
|
|
15
|
+
- `Enum.names` returns a frozen array of all member name symbols in declaration order
|
|
16
|
+
- `Enum.values` returns a frozen array of all member values in declaration order
|
|
17
|
+
- `Enum.first` / `Enum.last` return the first and last declared members
|
|
18
|
+
|
|
10
19
|
## [0.2.0] - 2026-04-03
|
|
11
20
|
|
|
12
21
|
### Added
|
data/README.md
CHANGED
|
@@ -84,6 +84,26 @@ Status.size # => 3
|
|
|
84
84
|
Status.count # => 3
|
|
85
85
|
```
|
|
86
86
|
|
|
87
|
+
### Strict Lookup
|
|
88
|
+
|
|
89
|
+
`fetch` and `fetch_by_value` raise an error instead of returning `nil`:
|
|
90
|
+
|
|
91
|
+
```ruby
|
|
92
|
+
Status.fetch(:draft) # => Status::DRAFT
|
|
93
|
+
Status.fetch(:unknown) # raises Philiprehberger::Enum::Error
|
|
94
|
+
HttpCode.fetch_by_value(200) # => HttpCode::OK
|
|
95
|
+
HttpCode.fetch_by_value(999) # raises Philiprehberger::Enum::Error
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### Names, Values, First & Last
|
|
99
|
+
|
|
100
|
+
```ruby
|
|
101
|
+
HttpCode.names # => [:ok, :not_found, :server_error]
|
|
102
|
+
HttpCode.values # => [200, 404, 500]
|
|
103
|
+
Status.first # => Status::DRAFT
|
|
104
|
+
Status.last # => Status::ARCHIVED
|
|
105
|
+
```
|
|
106
|
+
|
|
87
107
|
### Case-Insensitive Lookup
|
|
88
108
|
|
|
89
109
|
`from_name` tries an exact match first, then falls back to case-insensitive:
|
|
@@ -133,6 +153,11 @@ Status::DRAFT.to_json # => '{"name":"draft","ordinal":0,"value":null}'
|
|
|
133
153
|
| `.to_h` | Return `{ name_symbol => value }` hash |
|
|
134
154
|
| `.members_by_value` | Return `{ value => member }` reverse lookup hash |
|
|
135
155
|
| `.size` / `.count` | Return the number of defined members |
|
|
156
|
+
| `.names` | Return a frozen array of member name symbols |
|
|
157
|
+
| `.values` | Return a frozen array of member values |
|
|
158
|
+
| `.first` / `.last` | Return the first or last declared member |
|
|
159
|
+
| `.fetch(name)` | Strict lookup by name; raises `Error` if not found |
|
|
160
|
+
| `.fetch_by_value(val)` | Strict lookup by value; raises `Error` if not found |
|
|
136
161
|
| `.from_name(name)` | Look up by name (case-insensitive fallback) |
|
|
137
162
|
| `.from_string(string)` | Look up a member by string name |
|
|
138
163
|
| `.from_value(val)` | Look up a member by custom value |
|
data/lib/philiprehberger/enum.rb
CHANGED
|
@@ -168,6 +168,56 @@ module Philiprehberger
|
|
|
168
168
|
member_registry.values.find { |m| m.value == val }
|
|
169
169
|
end
|
|
170
170
|
|
|
171
|
+
# Look up a member by name, raising if not found
|
|
172
|
+
#
|
|
173
|
+
# @param name [Symbol, String] the member name
|
|
174
|
+
# @return [Enum] the member
|
|
175
|
+
# @raise [Error] if the name is not a valid member
|
|
176
|
+
def fetch(name)
|
|
177
|
+
from_name(name) || raise(Error, "no member #{name.inspect} on #{self}")
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
# Look up a member by value, raising if not found
|
|
181
|
+
#
|
|
182
|
+
# @param val [Object] the value to search for
|
|
183
|
+
# @return [Enum] the member
|
|
184
|
+
# @raise [Error] if the value is not found
|
|
185
|
+
def fetch_by_value(val)
|
|
186
|
+
from_value(val) || raise(Error, "no member with value #{val.inspect} on #{self}")
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
# Return all member names in declaration order
|
|
190
|
+
#
|
|
191
|
+
# @return [Array<Symbol>] frozen array of member names
|
|
192
|
+
def names
|
|
193
|
+
freeze_members!
|
|
194
|
+
member_registry.keys.freeze
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
# Return all member values in declaration order
|
|
198
|
+
#
|
|
199
|
+
# @return [Array<Object>] frozen array of member values
|
|
200
|
+
def values
|
|
201
|
+
freeze_members!
|
|
202
|
+
member_registry.values.map(&:value).freeze
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
# Return the first declared member
|
|
206
|
+
#
|
|
207
|
+
# @return [Enum, nil] the first member, or nil if empty
|
|
208
|
+
def first
|
|
209
|
+
freeze_members!
|
|
210
|
+
member_registry.values.first
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
# Return the last declared member
|
|
214
|
+
#
|
|
215
|
+
# @return [Enum, nil] the last member, or nil if empty
|
|
216
|
+
def last
|
|
217
|
+
freeze_members!
|
|
218
|
+
member_registry.values.last
|
|
219
|
+
end
|
|
220
|
+
|
|
171
221
|
# Check if a name is a valid member
|
|
172
222
|
#
|
|
173
223
|
# @param name [Symbol, String] the member name
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: philiprehberger-enum
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.3.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Philip Rehberger
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2026-04-
|
|
11
|
+
date: 2026-04-09 00:00:00.000000000 Z
|
|
12
12
|
dependencies: []
|
|
13
13
|
description: Define type-safe enums in Ruby with automatic ordinals, custom values,
|
|
14
14
|
lookup methods, and Ruby 3.x pattern matching support. A cleaner alternative to
|