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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3841094e2bc4093c7ee76058b058ffc2b99302c27b77c1c3e5b8724251a90f90
4
- data.tar.gz: 769f7d79d66026f0f5aa6848e4845e36260d3fa5251085b453983410dc9ceadf
3
+ metadata.gz: 7c70a844631a7b0fb70639905f38d7f4b5d645d46f48a5273c28b0ddf722e0fa
4
+ data.tar.gz: 5870b1e94fcf12b36ec5fd913188bf82aae252f9b3bdaa0e3a23af722dd942df
5
5
  SHA512:
6
- metadata.gz: fc946c8e5d96461a2774036a34c569351a7fdda7514bf6389e97d928e0b393fd2c21b1ff4b53adae561242886dc1a028d3a5d4c01b305d202e9ee4780d7ae62b
7
- data.tar.gz: 78d1dda7a94396755c7ff710d572b1f96710f9007af4bc8b66e55920e4e5e55e1ef8edd651c185f117d473807d7ef25b7f451fb53c6560f9317fcbcc3cc93f96
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 |
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Philiprehberger
4
4
  class Enum
5
- VERSION = '0.3.0'
5
+ VERSION = '0.5.0'
6
6
  end
7
7
  end
@@ -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.3.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-09 00:00:00.000000000 Z
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