philiprehberger-enum 0.3.0 → 0.5.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 +12 -0
- data/README.md +23 -0
- data/lib/philiprehberger/enum/version.rb +1 -1
- data/lib/philiprehberger/enum.rb +36 -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: 7c70a844631a7b0fb70639905f38d7f4b5d645d46f48a5273c28b0ddf722e0fa
|
|
4
|
+
data.tar.gz: 5870b1e94fcf12b36ec5fd913188bf82aae252f9b3bdaa0e3a23af722dd942df
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 1a4d7013cd32642633f2ee97358885cdabe1d166956277f575bc1151656d338a3945a9244ca2d83a1bf128900dacdae78397dbefa53beef0939fd1eb719d6716
|
|
7
|
+
data.tar.gz: 532cee4c349ff698536b9f05b96ec132465c1d8aec1b8b60948a8e0f3485e38a07248bbe553215f065b0af0c41e25804eba53a070d841bbaffc98a53f32e426a
|
data/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.5.0] - 2026-04-22
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- `Enum.from_ordinal(ord)` — look up a member by its ordinal position, returning nil if out of range.
|
|
14
|
+
- `Enum.fetch_by_ordinal(ord)` — same lookup that raises `Error` if the ordinal is out of range.
|
|
15
|
+
|
|
16
|
+
## [0.4.0] - 2026-04-16
|
|
17
|
+
|
|
18
|
+
### Added
|
|
19
|
+
- `Enum.slice(*names)` returns an array of members matching the given symbol names, silently skipping unknown names
|
|
20
|
+
- `Enum.sample(n = nil)` returns a random member when called without argument, or an array of n random members when called with an integer
|
|
21
|
+
|
|
10
22
|
## [0.3.0] - 2026-04-09
|
|
11
23
|
|
|
12
24
|
### Added
|
data/README.md
CHANGED
|
@@ -104,6 +104,25 @@ Status.first # => Status::DRAFT
|
|
|
104
104
|
Status.last # => Status::ARCHIVED
|
|
105
105
|
```
|
|
106
106
|
|
|
107
|
+
### Slice
|
|
108
|
+
|
|
109
|
+
`slice` returns members matching the given names, silently skipping any that are unknown:
|
|
110
|
+
|
|
111
|
+
```ruby
|
|
112
|
+
Status.slice(:draft, :archived) # => [Status::DRAFT, Status::ARCHIVED]
|
|
113
|
+
Status.slice(:draft, :nonexistent) # => [Status::DRAFT]
|
|
114
|
+
Status.slice(:archived, :draft) # => [Status::ARCHIVED, Status::DRAFT]
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### Sample
|
|
118
|
+
|
|
119
|
+
`sample` returns a random member. Pass an integer to get an array:
|
|
120
|
+
|
|
121
|
+
```ruby
|
|
122
|
+
Status.sample # => Status::DRAFT (random)
|
|
123
|
+
Status.sample(2) # => [Status::PUBLISHED, Status::ARCHIVED] (random)
|
|
124
|
+
```
|
|
125
|
+
|
|
107
126
|
### Case-Insensitive Lookup
|
|
108
127
|
|
|
109
128
|
`from_name` tries an exact match first, then falls back to case-insensitive:
|
|
@@ -161,6 +180,10 @@ Status::DRAFT.to_json # => '{"name":"draft","ordinal":0,"value":null}'
|
|
|
161
180
|
| `.from_name(name)` | Look up by name (case-insensitive fallback) |
|
|
162
181
|
| `.from_string(string)` | Look up a member by string name |
|
|
163
182
|
| `.from_value(val)` | Look up a member by custom value |
|
|
183
|
+
| `.from_ordinal(ord)` | Look up a member by ordinal position (returns nil if out of range) |
|
|
184
|
+
| `.fetch_by_ordinal(ord)` | Same as from_ordinal but raises Error if not found |
|
|
185
|
+
| `.slice(*names)` | Return members matching the given symbol names, skipping unknowns |
|
|
186
|
+
| `.sample(n = nil)` | Return a random member, or array of n random members |
|
|
164
187
|
| `.valid?(name)` | Check if a name is a valid member |
|
|
165
188
|
| `#name` | Return the member name as a symbol |
|
|
166
189
|
| `#ordinal` | Return the ordinal position |
|
data/lib/philiprehberger/enum.rb
CHANGED
|
@@ -186,6 +186,24 @@ module Philiprehberger
|
|
|
186
186
|
from_value(val) || raise(Error, "no member with value #{val.inspect} on #{self}")
|
|
187
187
|
end
|
|
188
188
|
|
|
189
|
+
# Look up a member by its ordinal position
|
|
190
|
+
#
|
|
191
|
+
# @param ord [Integer] the ordinal position (0-indexed)
|
|
192
|
+
# @return [Enum, nil] the member, or nil if the ordinal is out of range
|
|
193
|
+
def from_ordinal(ord)
|
|
194
|
+
freeze_members!
|
|
195
|
+
member_registry.values[ord] if ord.is_a?(Integer) && ord >= 0
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
# Look up a member by ordinal, raising if not found
|
|
199
|
+
#
|
|
200
|
+
# @param ord [Integer] the ordinal position
|
|
201
|
+
# @return [Enum] the member
|
|
202
|
+
# @raise [Error] if the ordinal is not a valid member
|
|
203
|
+
def fetch_by_ordinal(ord)
|
|
204
|
+
from_ordinal(ord) || raise(Error, "no member at ordinal #{ord.inspect} on #{self}")
|
|
205
|
+
end
|
|
206
|
+
|
|
189
207
|
# Return all member names in declaration order
|
|
190
208
|
#
|
|
191
209
|
# @return [Array<Symbol>] frozen array of member names
|
|
@@ -227,6 +245,24 @@ module Philiprehberger
|
|
|
227
245
|
member_registry.key?(name.to_sym)
|
|
228
246
|
end
|
|
229
247
|
|
|
248
|
+
# Return members matching the given symbol names, silently skipping unknown names
|
|
249
|
+
#
|
|
250
|
+
# @param names [Array<Symbol>] the member names to look up
|
|
251
|
+
# @return [Array<Enum>] array of matching members in the given order
|
|
252
|
+
def slice(*names)
|
|
253
|
+
freeze_members!
|
|
254
|
+
names.filter_map { |n| member_registry[n.to_sym] }
|
|
255
|
+
end
|
|
256
|
+
|
|
257
|
+
# Return a random member or array of random members
|
|
258
|
+
#
|
|
259
|
+
# @param n [Integer, nil] number of members to return; nil returns a single member
|
|
260
|
+
# @return [Enum, Array<Enum>] single member if n is nil, array of n members otherwise
|
|
261
|
+
def sample(n = nil)
|
|
262
|
+
freeze_members!
|
|
263
|
+
n.nil? ? member_registry.values.sample : member_registry.values.sample(n)
|
|
264
|
+
end
|
|
265
|
+
|
|
230
266
|
private
|
|
231
267
|
|
|
232
268
|
def inherited(subclass)
|
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.5.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-22 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
|