put 0.2.0 → 0.3.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: 535145ee17f2f25a68d80ed7afa1e58cb2edd1d261c2b0f976cd9706c4304049
4
- data.tar.gz: 4551a7ac241dc9d0b6fc7b975ae0a7d10c87b1dadf35c3832128ecaf563b1b2d
3
+ metadata.gz: ed8c542e17e5ecbc293a508843be66ab105238b761ed40e585980a2402ec6124
4
+ data.tar.gz: f7fef7196819fe61112639c965a4f5eca999dc0c72c94f6360574f02c94242f1
5
5
  SHA512:
6
- metadata.gz: 7cd640fd7da59ca4ad28472284addf6df5db063dba76a1e98f9de4c44e6a243818f8366f1b79ebc345010e0cfc454c5a03c7030449710967f945f9504419937c
7
- data.tar.gz: e8217fdfbe3fb805bd31bc5632c227c2b9265fc176004a94b41943c33a8b24b06399868026fdb8e8098e4c32162db4a4ff03006a9db7668675af8ac04615bde5
6
+ metadata.gz: 1b19851583cc9248409052e468a9bd913731eb04fe93ba16358965634740bbba5260626478fc6f7b5c7f4e2180c46e9fd6bdebbb6b6b19722a67209bfa020d23
7
+ data.tar.gz: 8c6216e264c6abe21db898b59c880f5aaa7276032a2f9b5c0db623f2496268f632b81e041b9e9fff2cd970c3158104f3b36881ae432de79088fb2c5f4ccbbffb
data/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ ## [0.3.0] - 2026-09-22
2
+
3
+ - Add Put.enum [#2](https://github.com/testdouble/put/issues/2)
4
+
1
5
  ## [0.2.0] - 2026-09-22
2
6
 
3
7
  - **[Breaking]** Drop support for Ruby 2.6; require Ruby >= 3.1
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- put (0.2.0)
4
+ put (0.3.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/README.md CHANGED
@@ -205,6 +205,31 @@ As you might be able to guess, `Put.nils_last` puts the nils last:
205
205
  } # => [:every, :counts, nil]
206
206
  ```
207
207
 
208
+ ### Put.enum(value, order:, nils_first: false)
209
+
210
+ When you're sorting by a discrete attribute — a role, a status, a tier — that
211
+ doesn't have a natural order of its own, `Put.enum` sorts a value by its
212
+ position in a list you provide, instead of you writing a `case`/`when`
213
+ translation table by hand:
214
+
215
+ ```ruby
216
+ [:director, :staff, :manager].sort_by { |role|
217
+ [Put.enum(role, order: [:staff, :manager, :director])]
218
+ } # => [:staff, :manager, :director]
219
+ ```
220
+
221
+ A value that isn't in `order` sorts after every value that is, rather than
222
+ raising:
223
+
224
+ ```ruby
225
+ [:manager, :contractor, :staff].sort_by { |role|
226
+ [Put.enum(role, order: [:staff, :manager, :director])]
227
+ } # => [:staff, :manager, :contractor]
228
+ ```
229
+
230
+ Like `Put.asc` and `Put.desc`, `Put.enum` also takes a `nils_first` keyword
231
+ argument (defaulting to `false`) for where `nil` values should sort.
232
+
208
233
  ### Put.debug(sorting_arrays)
209
234
 
210
235
  If you see "comparison of Array with Array failed" and you don't have any idea
@@ -0,0 +1,10 @@
1
+ module Put
2
+ class PutsThing
3
+ class Enum < InOrder
4
+ def initialize(value, order:, nils_first: false)
5
+ rank = value.nil? ? nil : (order.index(value) || Float::INFINITY)
6
+ super(rank, nils_first: nils_first)
7
+ end
8
+ end
9
+ end
10
+ end
data/lib/put/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Put
2
- VERSION = "0.2.0"
2
+ VERSION = "0.3.0"
3
3
  end
data/lib/put.rb CHANGED
@@ -6,6 +6,7 @@ require_relative "put/puts_thing/anywhere"
6
6
  require_relative "put/puts_thing/first"
7
7
  require_relative "put/puts_thing/last"
8
8
  require_relative "put/puts_thing/in_order"
9
+ require_relative "put/puts_thing/enum"
9
10
  require_relative "put/puts_thing/ascending"
10
11
  require_relative "put/puts_thing/descending"
11
12
  require_relative "put/puts_thing/nil_order"
@@ -29,6 +30,10 @@ module Put
29
30
  PutsThing::Ascending.new(value, nils_first: nils_first)
30
31
  end
31
32
 
33
+ def self.enum(value, order:, nils_first: false)
34
+ PutsThing::Enum.new(value, order: order, nils_first: nils_first)
35
+ end
36
+
32
37
  def self.nils_first(value)
33
38
  PutsThing::NilsFirst.new(value)
34
39
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: put
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Justin Searls
@@ -29,6 +29,7 @@ files:
29
29
  - lib/put/puts_thing/anywhere.rb
30
30
  - lib/put/puts_thing/ascending.rb
31
31
  - lib/put/puts_thing/descending.rb
32
+ - lib/put/puts_thing/enum.rb
32
33
  - lib/put/puts_thing/first.rb
33
34
  - lib/put/puts_thing/in_order.rb
34
35
  - lib/put/puts_thing/last.rb