nummy 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d9edb3b21dc12078ceec611949ebf6deb80ed4a69309aaba8a2b01c233025e66
4
- data.tar.gz: e066bb5910d68efdca902e242a1cd9269aecc48b9a77bbf9c246516dc995eb8d
3
+ metadata.gz: 1eec6bebfcfcfb1a55059d7a9b86bf2f2639a1db72ad9b69294ea3e26bb28d88
4
+ data.tar.gz: 17d3335c6b7bdfeb12233cf1bca4f95ac11ed608930e0a9fd46a0c92b63ca2fa
5
5
  SHA512:
6
- metadata.gz: 401f6427a1c27596f411cf11c6686a9164aabe06980c6db046887848424f01245921d45f15d01b4938d26a5ccb274e08003b51810073e1ec3cd7e71c0e2f284d
7
- data.tar.gz: 5e3c46a452c2967bc52c1ddf0df5993545af18801a3bbbaead6663fa91e0aa9d61fa87919b7c4c334791a0c7162867d023e4e346200c9d407029fb4e1497da53
6
+ metadata.gz: df883a0535f1b3e2ccf7015d7159d6fd9ba08f6b277324fda3ddf90222e95514f81e792f28fe6994bc1a59f1917bfe0e9cb40fa53b5ab5459172f5d080cd0a20
7
+ data.tar.gz: 105f1fbf20d88aa5168de81056c072498b7af2d994fbbc203b5317095fba49f6b9d86bc83e9254468c6b49dd4e7338aa0f0d104bbfb21237a3cb5f4af2c1c393
data/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.2.0] - 2024-01-04
4
+
5
+ - Add `Nummy::Enum.to_attribute`, which converts the enum to a hash that can be passed as the values of an `ActiveRecord::Enum`:
6
+
7
+ ```ruby
8
+ class Conversation < ActiveRecord::Base
9
+ class Status < Nummy::Enum
10
+ ACTIVE = auto
11
+ ARCHIVED = auto
12
+ end
13
+
14
+ enum :status, Status.to_attribute
15
+ end
16
+ ```
17
+
18
+ > [!IMPORTANT]
19
+ > The conversion requires that `ActiveRecord::Inflector` is defined, but `nummy` does not depend on `ActiveRecord` directly. If you are using `nummy` in a non-Rails environment, you will need to require `ActiveRecord::Inflector` yourself.
20
+
3
21
  ## [0.1.0] - 2024-01-04
4
22
 
5
23
  - Initial release
data/README.md CHANGED
@@ -14,13 +14,13 @@ constants in a module, and iterating over the members of data classes.
14
14
  Install the gem and add to the application's Gemfile by executing:
15
15
 
16
16
  ```console
17
- bundle add UPDATE_WITH_YOUR_GEM_NAME_IMMEDIATELY_AFTER_RELEASE_TO_RUBYGEMS_ORG
17
+ bundle add nummy
18
18
  ```
19
19
 
20
20
  If bundler is not being used to manage dependencies, install the gem by executing:
21
21
 
22
22
  ```console
23
- gem install UPDATE_WITH_YOUR_GEM_NAME_IMMEDIATELY_AFTER_RELEASE_TO_RUBYGEMS_ORG
23
+ gem install nummy
24
24
  ```
25
25
 
26
26
  ## Usage
@@ -146,6 +146,55 @@ end
146
146
  > [!TIP]
147
147
  > `Nummy::Enum` extends `Enumerable` and iterates over the _values_ of the enum, so you have access to things like `.include?(value)`, `.any?`, and `.find`.
148
148
 
149
+ #### Rails / ActiveRecord integration
150
+
151
+ > [!IMPORTANT]
152
+ > This integration requires `ActiveSupport::Inflector` to be defined.
153
+
154
+ To use nummy enums as ActiveRecord enums, you can use the `.to_attribute` method:
155
+
156
+ ```ruby
157
+ class Conversation < ActiveRecord::Base
158
+ class Status < Nummy::Enum
159
+ ACTIVE = auto
160
+ ARCHIVED = auto
161
+ end
162
+
163
+ enum :status, Status.to_attribute
164
+ end
165
+ ```
166
+
167
+ This allows you to use all of the Rails magic for enums, like scopes and boolean helpers, while also being able to refer to values in a safer way than hash lookups.
168
+
169
+ That is, these two are the same:
170
+
171
+ ```ruby
172
+ Conversation.statuses[:active] # => 0
173
+ Conversation::Status::ACTIVE # => 0
174
+ ```
175
+
176
+ But these are not:
177
+
178
+ ```ruby
179
+ Conversation.statuses[:acitve]
180
+ # => nil
181
+
182
+ Conversation::Status::ACITVE # => nil
183
+ # =>
184
+ # uninitialized constant Conversation::Status::ACITVE (NameError)
185
+ # Did you mean? Conversation::Status::ACTIVE
186
+ ```
187
+
188
+ You can get similar behavior using `#fetch`:
189
+
190
+ ```ruby
191
+ Conversation.statuses.fetch(:acitve)
192
+ # => key not found: :acitve (KeyError)
193
+ # Did you mean? :active
194
+ ```
195
+
196
+ But that still misses out on some of the DX benefits of using constants, like improved support for things like autocompletion, documentation, and navigation ("Go To Definition") in editors.
197
+
149
198
  ### `Nummy::MemberEnumerable`
150
199
 
151
200
  `Nummy::MemberEnumerable` is a module that includes `Enumerable` and makes it possible to iterate over any class or module that responds to `members`.
data/lib/nummy/enum.rb CHANGED
@@ -354,6 +354,32 @@ module Nummy
354
354
  # Alias to support splatting enums into keyword args.
355
355
  alias to_hash to_h
356
356
 
357
+ # Converts the enum to a +Hash+ with snake_case keys.
358
+ #
359
+ # This is intended to be used with +ActiveRecord::Enum+, but can be used
360
+ # with any library that supports defining enums using a +Hash+ and expects
361
+ # to have lowercase keys.
362
+ #
363
+ # @note
364
+ # This method _equires +ActiveSupport::Inflector+ to be defined.
365
+ #
366
+ # @return [Hash{Symbol => Integer}]
367
+ #
368
+ # @example
369
+ # class Conversation < ActiveRecord::Base
370
+ # class Status < Nummy::Enum
371
+ # ACTIVE = auto
372
+ # ARCHIVED = auto
373
+ # end
374
+ #
375
+ # enum :status, Status.to_attribute
376
+ # end
377
+ def to_attribute
378
+ to_h.transform_keys! do |key|
379
+ ::ActiveSupport::Inflector.underscore(key).to_sym
380
+ end
381
+ end
382
+
357
383
  # Returns a string representation of +self+.
358
384
  #
359
385
  # The string will contain the name-value pairs of the constants in +self+.
data/lib/nummy/version.rb CHANGED
@@ -2,5 +2,5 @@
2
2
 
3
3
  module Nummy
4
4
  # The current version of the gem.
5
- VERSION = "0.1.0"
5
+ VERSION = "0.2.0"
6
6
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nummy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Benjamin Chauvette