philiprehberger-enum 0.1.5 → 0.2.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 +16 -0
- data/README.md +37 -1
- data/lib/philiprehberger/enum/version.rb +1 -1
- data/lib/philiprehberger/enum.rb +40 -2
- metadata +4 -4
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 870e3019e2981514154a2d9e9ea3c21398fbd009fe99e9511ecebcfc5162e6ef
|
|
4
|
+
data.tar.gz: fd6725e19f0dc48131ec4ee3143cf97c5db29b63bf30dbea8ed0edbc26fa1d15
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 4ac450c34e480d9036875c23c0e91f691d8b08695c7fab01f326ca5d5af53663d125786ffc05503bd37c4b98122cdb1d25e1c4305cf2d3507323df3692cd2b47
|
|
7
|
+
data.tar.gz: c63863fc33b8c4d25fd09c038ad25c9e782649077bae2bb4d9fca096453ab68d84f621c807f46af57fbba8225115a0c60e3a8fde7ccbcb6946ec9831c6d34ca9
|
data/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,22 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.2.0] - 2026-04-03
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- Include `Enumerable` at the class level with `each` yielding each member (`map`, `select`, `to_a`, etc.)
|
|
14
|
+
- `Enum.to_h` returns `{ name_symbol => value }` hash of all members
|
|
15
|
+
- `Enum.members_by_value` returns `{ value => member }` reverse lookup hash
|
|
16
|
+
- `Enum.size` / `Enum.count` returns the number of defined members
|
|
17
|
+
|
|
18
|
+
### Changed
|
|
19
|
+
- `Enum.from_name` now falls back to case-insensitive matching when exact match fails
|
|
20
|
+
|
|
21
|
+
## [0.1.6] - 2026-03-31
|
|
22
|
+
|
|
23
|
+
### Added
|
|
24
|
+
- Add GitHub issue templates, dependabot config, and PR template
|
|
25
|
+
|
|
10
26
|
## [0.1.5] - 2026-03-31
|
|
11
27
|
|
|
12
28
|
### Changed
|
data/README.md
CHANGED
|
@@ -62,6 +62,38 @@ Status.valid?(:draft) # => true
|
|
|
62
62
|
Status.valid?(:unknown) # => false
|
|
63
63
|
```
|
|
64
64
|
|
|
65
|
+
### Enumerable
|
|
66
|
+
|
|
67
|
+
Enum classes include `Enumerable`, so you can iterate, map, select, etc.:
|
|
68
|
+
|
|
69
|
+
```ruby
|
|
70
|
+
Status.each { |member| puts member.name }
|
|
71
|
+
Status.map(&:name) # => [:draft, :published, :archived]
|
|
72
|
+
Status.select { |m| m.ordinal > 0 } # => [PUBLISHED, ARCHIVED]
|
|
73
|
+
Status.to_a # => [DRAFT, PUBLISHED, ARCHIVED]
|
|
74
|
+
Status.min # => DRAFT
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### Collection Methods
|
|
78
|
+
|
|
79
|
+
```ruby
|
|
80
|
+
Status.to_h # => { draft: nil, published: nil, archived: nil }
|
|
81
|
+
HttpCode.to_h # => { ok: 200, not_found: 404, server_error: 500 }
|
|
82
|
+
HttpCode.members_by_value # => { 200 => OK, 404 => NOT_FOUND, 500 => SERVER_ERROR }
|
|
83
|
+
Status.size # => 3
|
|
84
|
+
Status.count # => 3
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### Case-Insensitive Lookup
|
|
88
|
+
|
|
89
|
+
`from_name` tries an exact match first, then falls back to case-insensitive:
|
|
90
|
+
|
|
91
|
+
```ruby
|
|
92
|
+
Status.from_name(:draft) # => Status::DRAFT (exact match)
|
|
93
|
+
Status.from_name("DRAFT") # => Status::DRAFT (case-insensitive)
|
|
94
|
+
Status.from_name("Draft") # => Status::DRAFT (case-insensitive)
|
|
95
|
+
```
|
|
96
|
+
|
|
65
97
|
### Comparison
|
|
66
98
|
|
|
67
99
|
Members are comparable by ordinal:
|
|
@@ -97,7 +129,11 @@ Status::DRAFT.to_json # => '{"name":"draft","ordinal":0,"value":null}'
|
|
|
97
129
|
|--------|-------------|
|
|
98
130
|
| `.member(name, value: nil)` | Define a new enum member with optional custom value |
|
|
99
131
|
| `.members` | Return all members in declaration order |
|
|
100
|
-
| `.
|
|
132
|
+
| `.each` | Yield each member (includes `Enumerable`) |
|
|
133
|
+
| `.to_h` | Return `{ name_symbol => value }` hash |
|
|
134
|
+
| `.members_by_value` | Return `{ value => member }` reverse lookup hash |
|
|
135
|
+
| `.size` / `.count` | Return the number of defined members |
|
|
136
|
+
| `.from_name(name)` | Look up by name (case-insensitive fallback) |
|
|
101
137
|
| `.from_string(string)` | Look up a member by string name |
|
|
102
138
|
| `.from_value(val)` | Look up a member by custom value |
|
|
103
139
|
| `.valid?(name)` | Check if a name is a valid member |
|
data/lib/philiprehberger/enum.rb
CHANGED
|
@@ -75,6 +75,17 @@ module Philiprehberger
|
|
|
75
75
|
end
|
|
76
76
|
|
|
77
77
|
class << self
|
|
78
|
+
include Enumerable
|
|
79
|
+
|
|
80
|
+
# Yield each member in declaration order
|
|
81
|
+
#
|
|
82
|
+
# @yield [Enum] each member
|
|
83
|
+
# @return [Enumerator] if no block given
|
|
84
|
+
def each(&)
|
|
85
|
+
freeze_members!
|
|
86
|
+
member_registry.values.each(&)
|
|
87
|
+
end
|
|
88
|
+
|
|
78
89
|
# Define a new member on this enum class
|
|
79
90
|
#
|
|
80
91
|
# @param name [Symbol] the member name
|
|
@@ -104,13 +115,40 @@ module Philiprehberger
|
|
|
104
115
|
member_registry.values.freeze
|
|
105
116
|
end
|
|
106
117
|
|
|
107
|
-
#
|
|
118
|
+
# Return a hash of name symbols to values
|
|
119
|
+
#
|
|
120
|
+
# @return [Hash{Symbol => Object}] name => value pairs
|
|
121
|
+
def to_h
|
|
122
|
+
freeze_members!
|
|
123
|
+
member_registry.transform_values(&:value)
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
# Return a reverse lookup hash of values to members
|
|
127
|
+
#
|
|
128
|
+
# @return [Hash{Object => Enum}] value => member pairs
|
|
129
|
+
def members_by_value
|
|
130
|
+
freeze_members!
|
|
131
|
+
member_registry.each_value.to_h { |m| [m.value, m] }
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
# Return the number of defined members
|
|
135
|
+
#
|
|
136
|
+
# @return [Integer] the member count
|
|
137
|
+
def size
|
|
138
|
+
freeze_members!
|
|
139
|
+
member_registry.size
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
alias count size
|
|
143
|
+
|
|
144
|
+
# Look up a member by its name, with case-insensitive fallback
|
|
108
145
|
#
|
|
109
146
|
# @param name [Symbol, String] the member name
|
|
110
147
|
# @return [Enum, nil] the member, or nil if not found
|
|
111
148
|
def from_name(name)
|
|
112
149
|
freeze_members!
|
|
113
|
-
|
|
150
|
+
key = name.to_sym
|
|
151
|
+
member_registry[key] || member_registry.values.find { |m| m.name.to_s.downcase == key.to_s.downcase }
|
|
114
152
|
end
|
|
115
153
|
|
|
116
154
|
# Look up a member by its string representation
|
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.2.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-
|
|
11
|
+
date: 2026-04-04 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
|
|
@@ -24,11 +24,11 @@ files:
|
|
|
24
24
|
- README.md
|
|
25
25
|
- lib/philiprehberger/enum.rb
|
|
26
26
|
- lib/philiprehberger/enum/version.rb
|
|
27
|
-
homepage: https://
|
|
27
|
+
homepage: https://philiprehberger.com/open-source-packages/ruby/philiprehberger-enum
|
|
28
28
|
licenses:
|
|
29
29
|
- MIT
|
|
30
30
|
metadata:
|
|
31
|
-
homepage_uri: https://
|
|
31
|
+
homepage_uri: https://philiprehberger.com/open-source-packages/ruby/philiprehberger-enum
|
|
32
32
|
source_code_uri: https://github.com/philiprehberger/rb-enum
|
|
33
33
|
changelog_uri: https://github.com/philiprehberger/rb-enum/blob/main/CHANGELOG.md
|
|
34
34
|
bug_tracker_uri: https://github.com/philiprehberger/rb-enum/issues
|