philiprehberger-enum 0.3.0 → 0.4.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: 2b55ad3be49fe204aa1e0588dca8f25995f0589f49c3c0aa6c77e670e03fa7b0
4
+ data.tar.gz: dd879b2ed6f61c12c3805b6b6a86cc4aac4391e383251a3188a60925989685ab
5
5
  SHA512:
6
- metadata.gz: fc946c8e5d96461a2774036a34c569351a7fdda7514bf6389e97d928e0b393fd2c21b1ff4b53adae561242886dc1a028d3a5d4c01b305d202e9ee4780d7ae62b
7
- data.tar.gz: 78d1dda7a94396755c7ff710d572b1f96710f9007af4bc8b66e55920e4e5e55e1ef8edd651c185f117d473807d7ef25b7f451fb53c6560f9317fcbcc3cc93f96
6
+ metadata.gz: c29b4d8bb1a41e1a045363596d673febbaf7c6c984d99754ca1caafbbc7535ffdf92cbd3693464af201924f1d1cd2961b135f7c3fd97c4d66f5f34875f93e389
7
+ data.tar.gz: 50e33959a328aa0781d2a863df411e76b580ce6788a7b5bbf667078c74dfcb539eaa1b82c92612b2e34e7086dcb32e33de589a43edcc0b6107520c7c72e38e21
data/CHANGELOG.md CHANGED
@@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.4.0] - 2026-04-16
11
+
12
+ ### Added
13
+ - `Enum.slice(*names)` returns an array of members matching the given symbol names, silently skipping unknown names
14
+ - `Enum.sample(n = nil)` returns a random member when called without argument, or an array of n random members when called with an integer
15
+
10
16
  ## [0.3.0] - 2026-04-09
11
17
 
12
18
  ### 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,8 @@ 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
+ | `.slice(*names)` | Return members matching the given symbol names, skipping unknowns |
184
+ | `.sample(n = nil)` | Return a random member, or array of n random members |
164
185
  | `.valid?(name)` | Check if a name is a valid member |
165
186
  | `#name` | Return the member name as a symbol |
166
187
  | `#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.4.0'
6
6
  end
7
7
  end
@@ -227,6 +227,24 @@ module Philiprehberger
227
227
  member_registry.key?(name.to_sym)
228
228
  end
229
229
 
230
+ # Return members matching the given symbol names, silently skipping unknown names
231
+ #
232
+ # @param names [Array<Symbol>] the member names to look up
233
+ # @return [Array<Enum>] array of matching members in the given order
234
+ def slice(*names)
235
+ freeze_members!
236
+ names.filter_map { |n| member_registry[n.to_sym] }
237
+ end
238
+
239
+ # Return a random member or array of random members
240
+ #
241
+ # @param n [Integer, nil] number of members to return; nil returns a single member
242
+ # @return [Enum, Array<Enum>] single member if n is nil, array of n members otherwise
243
+ def sample(n = nil)
244
+ freeze_members!
245
+ n.nil? ? member_registry.values.sample : member_registry.values.sample(n)
246
+ end
247
+
230
248
  private
231
249
 
232
250
  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.4.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-17 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