optify-from_hash 0.2.2 → 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: 1f6e409cfccf83b515e84d3cc19713e1897ed53cf4340d66de2843433c355445
4
- data.tar.gz: 630ed4471403551570ba2f18d3ec687ba4790dec90332496d6f9d39100f353f5
3
+ metadata.gz: 323fea346213dffe7e7b35edf19d78d2fa2f8ad7febff0dcb43d6982c48e6732
4
+ data.tar.gz: c85f2f191f33306858d91855ae8a32ad0de373d565dca8227250f9c20d59e2fe
5
5
  SHA512:
6
- metadata.gz: b9414cd9843a25f5b1ed1ab7f1560d5e73c0f85b3900859daa786c03f02bfd04dbc4947120bf519c8ff5f80b3712947b3b53a20c778b1e8e354c259b7c266e19
7
- data.tar.gz: de4275bb6b2300dfa3e154dbc04ec49120d28ec3f20e17e537c51e1cde5a065772eaad10269abdeb8fa7a528043b376a49d2c2655d810b47373137f322a39fdc
6
+ metadata.gz: 274a651a061c8ac9840de8c75a46391e78ac599ba71135dbd9b748045567f7c957fe8e9ce87b3c43ddf969868d149aa6526327ed26f16204e3a0404413ff7a35
7
+ data.tar.gz: 7b8793ab933e2478b798a06557d812bca70fd9c031394076b06790672162187261cb2f0801bf6f27320ec55b434bf1c827414de65f6804085acc529d3900ca3c
@@ -2,6 +2,7 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require 'json'
5
+ require 'set'
5
6
  require 'sorbet-runtime'
6
7
  require 'tapioca'
7
8
 
@@ -39,6 +40,14 @@ module Optify
39
40
  instance.freeze
40
41
  end
41
42
 
43
+ #: (Array[untyped], untyped) -> (Array[untyped] | Set[untyped])
44
+ def self._convert_array(value, unwrapped_type)
45
+ inner_type = unwrapped_type.type
46
+ return value.map { |v| _convert_value(v, inner_type) }.freeze if unwrapped_type.is_a?(T::Types::TypedArray)
47
+
48
+ Set.new(value.map { |v| _convert_value(v, inner_type) }).freeze
49
+ end
50
+
42
51
  #: (untyped, T::Types::Base) -> untyped
43
52
  def self._convert_value(value, type)
44
53
  if type.is_a?(T::Types::Untyped)
@@ -51,9 +60,7 @@ module Optify
51
60
 
52
61
  case value
53
62
  when Array
54
- inner_type = unwrapped_type #: as untyped
55
- .type
56
- return value.map { |v| _convert_value(v, inner_type) }.freeze
63
+ return _convert_array(value, unwrapped_type)
57
64
  when Hash
58
65
  # Handle `T.nilable(T::Hash[...])` and `T.any(...)`.
59
66
  # We used to use `type = type.unwrap_nilable if type.respond_to?(:unwrap_nilable)`, but it's not needed now that we handle
@@ -112,7 +119,7 @@ module Optify
112
119
  end
113
120
  end
114
121
 
115
- private_class_method :_convert_hash, :_convert_value, :_unwrap_nilable
122
+ private_class_method :_convert_array, :_convert_hash, :_convert_value, :_unwrap_nilable
116
123
 
117
124
  # Compare this object with another object for equality.
118
125
  # @param other The object to compare.
@@ -127,6 +134,23 @@ module Optify
127
134
  end
128
135
  end
129
136
 
137
+ # Support equality by value so that instances can be used in Sets and as Hash keys.
138
+ #: (untyped) -> bool
139
+ def eql?(other)
140
+ return true if other.equal?(self)
141
+ return false if self.class != other.class
142
+
143
+ instance_variables.all? do |name|
144
+ instance_variable_get(name).eql?(other.instance_variable_get(name))
145
+ end
146
+ end
147
+
148
+ # @return [Integer] a hash value based on the object's class and instance variables.
149
+ #: () -> Integer
150
+ def hash
151
+ [self.class, *instance_variables.sort.map { |name| instance_variable_get(name) }].hash
152
+ end
153
+
130
154
  # Convert this object to a JSON string.
131
155
  #: (?JSON::State?) -> String
132
156
  def to_json(state = nil)
@@ -155,7 +179,8 @@ module Optify
155
179
  #: (untyped) -> untyped
156
180
  def self._convert_value_for_to_h(value)
157
181
  case value
158
- when Array
182
+ # Treat sets like arrays for JSON serialization.
183
+ when Array, Set
159
184
  value.map { |v| _convert_value_for_to_h(v) }
160
185
  when Hash
161
186
  value.transform_values { |v| _convert_value_for_to_h(v) }
@@ -5,6 +5,8 @@
5
5
  module Optify
6
6
  # A base class for classes that can be created from a hash.
7
7
  class FromHashable
8
+ extend T::Sig
9
+ extend T::Helpers
8
10
  abstract!
9
11
 
10
12
  # Create a new instance of the class from a hash.
@@ -31,5 +33,13 @@ module Optify
31
33
  # @return [Boolean] true if the objects are equal; otherwise, false.
32
34
  sig { params(other: T.untyped).returns(T::Boolean) }
33
35
  def ==(other); end
36
+
37
+ # Support equality by value so that instances can be used in Sets and as Hash keys.
38
+ sig { params(other: T.untyped).returns(T::Boolean) }
39
+ def eql?(other); end
40
+
41
+ # @return a hash value based on the object's class and instance variables.
42
+ sig { returns(Integer) }
43
+ def hash; end
34
44
  end
35
45
  end
@@ -4,6 +4,8 @@ end
4
4
 
5
5
  # A base class for classes that can be created from a hash.
6
6
  class Optify::FromHashable
7
+ extend T::Helpers
8
+
7
9
  # Create a new instance of the class from a hash.
8
10
  #
9
11
  # @param hash The hash to create the instance from.
@@ -24,4 +26,10 @@ class Optify::FromHashable
24
26
  # @param other The object to compare.
25
27
  # @return [Boolean] true if the objects are equal; otherwise, false.
26
28
  def ==: (untyped other) -> bool
29
+
30
+ # Support equality by value so that instances can be used in Sets and as Hash keys.
31
+ def eql?: (untyped other) -> bool
32
+
33
+ # @return a hash value based on the object's class and instance variables.
34
+ def hash: () -> Integer
27
35
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: optify-from_hash
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Justin D. Harris
@@ -49,14 +49,14 @@ dependencies:
49
49
  requirements:
50
50
  - - "~>"
51
51
  - !ruby/object:Gem::Version
52
- version: 4.0.0.dev.4
52
+ version: 4.0.3
53
53
  type: :development
54
54
  prerelease: false
55
55
  version_requirements: !ruby/object:Gem::Requirement
56
56
  requirements:
57
57
  - - "~>"
58
58
  - !ruby/object:Gem::Version
59
- version: 4.0.0.dev.4
59
+ version: 4.0.3
60
60
  - !ruby/object:Gem::Dependency
61
61
  name: sorbet
62
62
  requirement: !ruby/object:Gem::Requirement
@@ -83,14 +83,14 @@ dependencies:
83
83
  requirements:
84
84
  - - "~>"
85
85
  - !ruby/object:Gem::Version
86
- version: 0.17.7
86
+ version: 0.19.1
87
87
  type: :development
88
88
  prerelease: false
89
89
  version_requirements: !ruby/object:Gem::Requirement
90
90
  requirements:
91
91
  - - "~>"
92
92
  - !ruby/object:Gem::Version
93
- version: 0.17.7
93
+ version: 0.19.1
94
94
  - !ruby/object:Gem::Dependency
95
95
  name: test-unit
96
96
  requirement: !ruby/object:Gem::Requirement