philiprehberger-enum 0.1.4 → 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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 586314a47506dc97137ae26aaf56d8902ab333f64c073a8ec0d5e74ed721eb0d
4
- data.tar.gz: cabf1a0a0e30e4188f976aaf3079dc7f8513f5b294c14b6428f98fedebf33a9d
3
+ metadata.gz: 870e3019e2981514154a2d9e9ea3c21398fbd009fe99e9511ecebcfc5162e6ef
4
+ data.tar.gz: fd6725e19f0dc48131ec4ee3143cf97c5db29b63bf30dbea8ed0edbc26fa1d15
5
5
  SHA512:
6
- metadata.gz: 46a4b7ca7f78905924df64f682a45873e001a22886378ff150aa75d376b28792615dccd9d89ea5d663ee346eebf08d6ef1d6166e6d9a5e12f5df928bca52aa95
7
- data.tar.gz: aa33d5acd8cfe41cdb3669cbf58b4bd9c87876f293f55eab4a81f7e71bebdd15e34226cf27a8ce229e6f7000b45932696a99d63fa29b5e394fb113788f33538f
6
+ metadata.gz: 4ac450c34e480d9036875c23c0e91f691d8b08695c7fab01f326ca5d5af53663d125786ffc05503bd37c4b98122cdb1d25e1c4305cf2d3507323df3692cd2b47
7
+ data.tar.gz: c63863fc33b8c4d25fd09c038ad25c9e782649077bae2bb4d9fca096453ab68d84f621c807f46af57fbba8225115a0c60e3a8fde7ccbcb6946ec9831c6d34ca9
data/CHANGELOG.md CHANGED
@@ -7,6 +7,27 @@ 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
+
26
+ ## [0.1.5] - 2026-03-31
27
+
28
+ ### Changed
29
+ - Standardize README badges, support section, and license format
30
+
10
31
  ## [0.1.4] - 2026-03-26
11
32
 
12
33
  ### Fixed
data/README.md CHANGED
@@ -2,8 +2,7 @@
2
2
 
3
3
  [![Tests](https://github.com/philiprehberger/rb-enum/actions/workflows/ci.yml/badge.svg)](https://github.com/philiprehberger/rb-enum/actions/workflows/ci.yml)
4
4
  [![Gem Version](https://badge.fury.io/rb/philiprehberger-enum.svg)](https://rubygems.org/gems/philiprehberger-enum)
5
- [![License](https://img.shields.io/github/license/philiprehberger/rb-enum)](LICENSE)
6
- [![Sponsor](https://img.shields.io/badge/sponsor-GitHub%20Sponsors-ec6cb9)](https://github.com/sponsors/philiprehberger)
5
+ [![Last updated](https://img.shields.io/github/last-commit/philiprehberger/rb-enum)](https://github.com/philiprehberger/rb-enum/commits/main)
7
6
 
8
7
  Type-safe enumerations with ordinals, custom values, and pattern matching
9
8
 
@@ -63,6 +62,38 @@ Status.valid?(:draft) # => true
63
62
  Status.valid?(:unknown) # => false
64
63
  ```
65
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
+
66
97
  ### Comparison
67
98
 
68
99
  Members are comparable by ordinal:
@@ -98,7 +129,11 @@ Status::DRAFT.to_json # => '{"name":"draft","ordinal":0,"value":null}'
98
129
  |--------|-------------|
99
130
  | `.member(name, value: nil)` | Define a new enum member with optional custom value |
100
131
  | `.members` | Return all members in declaration order |
101
- | `.from_name(name)` | Look up a member by symbol or string name |
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) |
102
137
  | `.from_string(string)` | Look up a member by string name |
103
138
  | `.from_value(val)` | Look up a member by custom value |
104
139
  | `.valid?(name)` | Check if a name is a valid member |
@@ -118,6 +153,24 @@ bundle exec rspec
118
153
  bundle exec rubocop
119
154
  ```
120
155
 
156
+ ## Support
157
+
158
+ If you find this project useful:
159
+
160
+ ⭐ [Star the repo](https://github.com/philiprehberger/rb-enum)
161
+
162
+ 🐛 [Report issues](https://github.com/philiprehberger/rb-enum/issues?q=is%3Aissue+is%3Aopen+label%3Abug)
163
+
164
+ 💡 [Suggest features](https://github.com/philiprehberger/rb-enum/issues?q=is%3Aissue+is%3Aopen+label%3Aenhancement)
165
+
166
+ ❤️ [Sponsor development](https://github.com/sponsors/philiprehberger)
167
+
168
+ 🌐 [All Open Source Projects](https://philiprehberger.com/open-source-packages)
169
+
170
+ 💻 [GitHub Profile](https://github.com/philiprehberger)
171
+
172
+ 🔗 [LinkedIn Profile](https://www.linkedin.com/in/philiprehberger)
173
+
121
174
  ## License
122
175
 
123
176
  [MIT](LICENSE)
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Philiprehberger
4
4
  class Enum
5
- VERSION = '0.1.4'
5
+ VERSION = '0.2.0'
6
6
  end
7
7
  end
@@ -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
- # Look up a member by its name
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
- member_registry[name.to_sym]
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.1.4
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-03-27 00:00:00.000000000 Z
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://github.com/philiprehberger/rb-enum
27
+ homepage: https://philiprehberger.com/open-source-packages/ruby/philiprehberger-enum
28
28
  licenses:
29
29
  - MIT
30
30
  metadata:
31
- homepage_uri: https://github.com/philiprehberger/rb-enum
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