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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 870e3019e2981514154a2d9e9ea3c21398fbd009fe99e9511ecebcfc5162e6ef
4
- data.tar.gz: fd6725e19f0dc48131ec4ee3143cf97c5db29b63bf30dbea8ed0edbc26fa1d15
3
+ metadata.gz: 3841094e2bc4093c7ee76058b058ffc2b99302c27b77c1c3e5b8724251a90f90
4
+ data.tar.gz: 769f7d79d66026f0f5aa6848e4845e36260d3fa5251085b453983410dc9ceadf
5
5
  SHA512:
6
- metadata.gz: 4ac450c34e480d9036875c23c0e91f691d8b08695c7fab01f326ca5d5af53663d125786ffc05503bd37c4b98122cdb1d25e1c4305cf2d3507323df3692cd2b47
7
- data.tar.gz: c63863fc33b8c4d25fd09c038ad25c9e782649077bae2bb4d9fca096453ab68d84f621c807f46af57fbba8225115a0c60e3a8fde7ccbcb6946ec9831c6d34ca9
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 |
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Philiprehberger
4
4
  class Enum
5
- VERSION = '0.2.0'
5
+ VERSION = '0.3.0'
6
6
  end
7
7
  end
@@ -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.2.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-04 00:00:00.000000000 Z
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