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 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
@@ -0,0 +1,6 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ module Enummify
5
+ VERSION = '0.1.0'
6
+ end
data/lib/enummify.rb ADDED
@@ -0,0 +1,5 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ require_relative 'enummify/enum'
5
+ require_relative 'enummify/version'
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: []