enummify 0.1.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 +7 -0
- data/lib/enummify/enum.rb +105 -0
- data/lib/enummify/version.rb +6 -0
- data/lib/enummify.rb +5 -0
- data/rbi/enummify.rbi +45 -0
- metadata +86 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: 16f397e8462e592ee835ac563f64ed9b5f5ae9166b051effe5c397b908ecfdcf
|
|
4
|
+
data.tar.gz: d71a579357f34609457fb66c55535aa096a785e78d8361f1b14d96c891330b6d
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: a6529db8dfa09dee22f886333559ba379da3ca7d9940210e117ad8cb5edf69a830915be4b923aea00cc9bfa38723a6c4a0c340e94a412cbdd7246873df652e0a
|
|
7
|
+
data.tar.gz: 012263c4cf3610fde962d10315ef6ea487bd00edfcab29fa264e992ac681ae9cfcd54d1cf2169979edfdf4d8aa59451a16a9ce31553c6449bff95eb3e81a1844
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# typed: strict
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
module Enummify
|
|
5
|
+
# A typed set of immutable, named instances with string serialization.
|
|
6
|
+
class Enum
|
|
7
|
+
@serialized_to_value = {} #: Hash[String, Enum]
|
|
8
|
+
@values = nil #: Array[Enum]?
|
|
9
|
+
|
|
10
|
+
# Register direct constants so only named members belong to the enum.
|
|
11
|
+
#: (Symbol) -> void
|
|
12
|
+
def self.const_added(constant)
|
|
13
|
+
super
|
|
14
|
+
|
|
15
|
+
member = const_get(constant, false) #: as Enum
|
|
16
|
+
serialized = member.send(:finalize, constant)
|
|
17
|
+
if @serialized_to_value.key?(serialized)
|
|
18
|
+
raise ArgumentError, "Duplicate serialized value for #{name}: #{serialized.inspect} is already used"
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
@serialized_to_value[serialized] = member
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Look up a member by its exact serialized string.
|
|
25
|
+
#: (String) -> instance
|
|
26
|
+
def self.deserialize(serialized)
|
|
27
|
+
@serialized_to_value[serialized] || raise(ArgumentError, "Unknown #{name} value: #{serialized.inspect}") #: as instance
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
class << self
|
|
31
|
+
# Restore the canonical member when loading a Marshal stream.
|
|
32
|
+
alias _load deserialize
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Look up a member, returning nil for an unknown string.
|
|
36
|
+
#: (String) -> instance?
|
|
37
|
+
def self.try_deserialize(serialized)
|
|
38
|
+
@serialized_to_value[serialized] #: as instance?
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Return the members.
|
|
42
|
+
#: () -> Array[instance]
|
|
43
|
+
def self.values
|
|
44
|
+
(@values ||= @serialized_to_value.values.freeze) #: as Array[instance]
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Give each enum class its own registry.
|
|
48
|
+
#: (singleton(Enummify::Enum)) -> void
|
|
49
|
+
def self.inherited(subclass)
|
|
50
|
+
super
|
|
51
|
+
subclass.instance_variable_set(:@serialized_to_value, {})
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
private_class_method :const_added, :inherited
|
|
55
|
+
|
|
56
|
+
# Store only the serialized string so Marshal loading uses the registered member.
|
|
57
|
+
#: (Integer) -> String
|
|
58
|
+
def _dump(_depth)
|
|
59
|
+
serialize
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# Enum members are immutable singletons, including copies requested as unfrozen.
|
|
63
|
+
# rubocop:disable Lint/UnusedMethodArgument
|
|
64
|
+
#: (?freeze: bool?) -> self
|
|
65
|
+
def clone(freeze: true)
|
|
66
|
+
self
|
|
67
|
+
end
|
|
68
|
+
# rubocop:enable Lint/UnusedMethodArgument
|
|
69
|
+
|
|
70
|
+
#: () -> self
|
|
71
|
+
def dup
|
|
72
|
+
self
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
#: () -> String
|
|
76
|
+
def inspect
|
|
77
|
+
"#<#{self.class.name}: #{serialize.inspect}>"
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
#: () -> String
|
|
81
|
+
def serialize
|
|
82
|
+
@serialized || raise(ArgumentError, 'Enum members must be assigned to a constant before serialization')
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
#: () -> String
|
|
86
|
+
def to_s
|
|
87
|
+
serialize
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
private
|
|
91
|
+
|
|
92
|
+
# The constant name is only available after construction has returned.
|
|
93
|
+
#: (Symbol) -> String
|
|
94
|
+
def finalize(constant)
|
|
95
|
+
@serialized ||= constant.name
|
|
96
|
+
freeze
|
|
97
|
+
@serialized
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
#: (?String?) -> void
|
|
101
|
+
def initialize(serialized = nil)
|
|
102
|
+
@serialized = serialized&.dup&.freeze #: String?
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
end
|
data/lib/enummify.rb
ADDED
data/rbi/enummify.rbi
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# typed: strict
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
module Enummify
|
|
5
|
+
# A typed set of immutable, named instances with string serialization.
|
|
6
|
+
class Enum
|
|
7
|
+
extend T::Sig
|
|
8
|
+
|
|
9
|
+
sig { params(serialized: String).returns(T.attached_class) }
|
|
10
|
+
def self.deserialize(serialized); end
|
|
11
|
+
|
|
12
|
+
class << self
|
|
13
|
+
alias _load deserialize
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
sig { params(serialized: String).returns(T.nilable(T.attached_class)) }
|
|
17
|
+
def self.try_deserialize(serialized); end
|
|
18
|
+
|
|
19
|
+
sig { returns(T::Array[T.attached_class]) }
|
|
20
|
+
def self.values; end
|
|
21
|
+
|
|
22
|
+
sig { params(_depth: Integer).returns(String) }
|
|
23
|
+
def _dump(_depth); end
|
|
24
|
+
|
|
25
|
+
sig { params(freeze: T.nilable(T::Boolean)).returns(T.self_type) }
|
|
26
|
+
def clone(freeze: true); end
|
|
27
|
+
|
|
28
|
+
sig { returns(T.self_type) }
|
|
29
|
+
def dup; end
|
|
30
|
+
|
|
31
|
+
sig { returns(String) }
|
|
32
|
+
def inspect; end
|
|
33
|
+
|
|
34
|
+
sig { returns(String) }
|
|
35
|
+
def serialize; end
|
|
36
|
+
|
|
37
|
+
sig { returns(String) }
|
|
38
|
+
def to_s; end
|
|
39
|
+
|
|
40
|
+
private
|
|
41
|
+
|
|
42
|
+
sig { params(serialized: T.nilable(String)).void }
|
|
43
|
+
def initialize(serialized = nil); end
|
|
44
|
+
end
|
|
45
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: enummify
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.1.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Justin D. Harris
|
|
8
|
+
bindir: bin
|
|
9
|
+
cert_chain: []
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
11
|
+
dependencies:
|
|
12
|
+
- !ruby/object:Gem::Dependency
|
|
13
|
+
name: rake
|
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
|
15
|
+
requirements:
|
|
16
|
+
- - "~>"
|
|
17
|
+
- !ruby/object:Gem::Version
|
|
18
|
+
version: '13.2'
|
|
19
|
+
type: :development
|
|
20
|
+
prerelease: false
|
|
21
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
22
|
+
requirements:
|
|
23
|
+
- - "~>"
|
|
24
|
+
- !ruby/object:Gem::Version
|
|
25
|
+
version: '13.2'
|
|
26
|
+
- !ruby/object:Gem::Dependency
|
|
27
|
+
name: sorbet
|
|
28
|
+
requirement: !ruby/object:Gem::Requirement
|
|
29
|
+
requirements:
|
|
30
|
+
- - "~>"
|
|
31
|
+
- !ruby/object:Gem::Version
|
|
32
|
+
version: 0.6.13426
|
|
33
|
+
type: :development
|
|
34
|
+
prerelease: false
|
|
35
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
36
|
+
requirements:
|
|
37
|
+
- - "~>"
|
|
38
|
+
- !ruby/object:Gem::Version
|
|
39
|
+
version: 0.6.13426
|
|
40
|
+
- !ruby/object:Gem::Dependency
|
|
41
|
+
name: test-unit
|
|
42
|
+
requirement: !ruby/object:Gem::Requirement
|
|
43
|
+
requirements:
|
|
44
|
+
- - "~>"
|
|
45
|
+
- !ruby/object:Gem::Version
|
|
46
|
+
version: 3.6.8
|
|
47
|
+
type: :development
|
|
48
|
+
prerelease: false
|
|
49
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
50
|
+
requirements:
|
|
51
|
+
- - "~>"
|
|
52
|
+
- !ruby/object:Gem::Version
|
|
53
|
+
version: 3.6.8
|
|
54
|
+
description: Immutable, typed Ruby enums with RBS comments and no runtime dependencies.
|
|
55
|
+
executables: []
|
|
56
|
+
extensions: []
|
|
57
|
+
extra_rdoc_files: []
|
|
58
|
+
files:
|
|
59
|
+
- lib/enummify.rb
|
|
60
|
+
- lib/enummify/enum.rb
|
|
61
|
+
- lib/enummify/version.rb
|
|
62
|
+
- rbi/enummify.rbi
|
|
63
|
+
homepage: https://github.com/juharris/enummify
|
|
64
|
+
licenses:
|
|
65
|
+
- MIT
|
|
66
|
+
metadata:
|
|
67
|
+
bug_tracker_uri: https://github.com/juharris/enummify/issues
|
|
68
|
+
source_code_uri: https://github.com/juharris/enummify
|
|
69
|
+
rdoc_options: []
|
|
70
|
+
require_paths:
|
|
71
|
+
- lib
|
|
72
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
73
|
+
requirements:
|
|
74
|
+
- - ">="
|
|
75
|
+
- !ruby/object:Gem::Version
|
|
76
|
+
version: '3.2'
|
|
77
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
78
|
+
requirements:
|
|
79
|
+
- - ">="
|
|
80
|
+
- !ruby/object:Gem::Version
|
|
81
|
+
version: '0'
|
|
82
|
+
requirements: []
|
|
83
|
+
rubygems_version: 4.0.16
|
|
84
|
+
specification_version: 4
|
|
85
|
+
summary: Typed Ruby enums using RBS.
|
|
86
|
+
test_files: []
|