sorbet-coerce 0.2.5 → 0.5.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: 1a6067fb52161543309158003029c02c354f0c88d6dada780973141b4c7f3ca5
4
- data.tar.gz: 15e371a34bdbb450ffa5a24f6f235d4f67f7b6964c1819a81286d60f687f2d66
3
+ metadata.gz: 459ea1a3f906360f8a0e0d33969f49110476a1aa8d1772a1adc4dc1fc704140c
4
+ data.tar.gz: 7e2bf805fcb1d89de859312576d7e9e4eb782d03e4e7ff5929205c0fb676e377
5
5
  SHA512:
6
- metadata.gz: f0000b0124391cb0432486aaa4193442bb5adfd3ff67552bb6671a38ea4709f9c81b850355b838e00f6dda72f5d207f117b694dee1f78eb9f4d2805af7cad55d
7
- data.tar.gz: 1ac80f3aad685c57123d4acd67178385a0068190676c4446d4bc6c99945e8313ea67b09e2a40958fc7e08778d8811a969e0467b46ed5071fc80d5aafa429de75
6
+ metadata.gz: c75dfa39c75773bd161fc67f2ee145192bc6431f58db621a39eadd2c02948d39a117f3d1a5c8ad277338cf1ab0342a6f4153f20326bd379e28e8a734ca1d190c
7
+ data.tar.gz: d9c87f91c2586aac705089fe519d6c58e28854fe8cf87019468f46ad4421e8166d5f042c6f512c983d25b120e4b31f699f755706694a47a29c91b2d38c1a5a78
@@ -1,4 +1,4 @@
1
- # typed: true
1
+ # typed: false
2
2
  module SafeType
3
3
  class CoercionError < StandardError; end
4
4
  end
data/lib/sorbet-coerce.rb CHANGED
@@ -1,23 +1,8 @@
1
- # typed: strict
2
- require 'sorbet-coerce/configuration'
1
+ # typed: ignore
3
2
  require 'sorbet-coerce/converter'
4
- require 'safe_type'
5
3
 
6
4
  module TypeCoerce
7
- class CoercionError < SafeType::CoercionError; end
8
- class ShapeError < SafeType::CoercionError; end
9
-
10
- define_singleton_method(:[]) do |type|
11
- Class.new(TypeCoerce::Private::Converter) do
12
- define_method(:to_s) { "#{name}#[#{type.to_s}]" }
13
-
14
- define_method(:from) do |args, raise_coercion_error: nil|
15
- if raise_coercion_error.nil?
16
- raise_coercion_error = TypeCoerce::Configuration.raise_coercion_error
17
- end
18
-
19
- T.send('let', send('_convert', args, type, raise_coercion_error), type)
20
- end
21
- end
5
+ def self.[](type)
6
+ TypeCoerce::Converter.new(type)
22
7
  end
23
8
  end
@@ -1,149 +1,185 @@
1
- # typed: strict
1
+ # typed: ignore
2
+ require 'polyfill'
2
3
  require 'safe_type'
3
4
  require 'set'
4
5
  require 'sorbet-runtime'
5
- require 'polyfill'
6
+ require 'sorbet-coerce/configuration'
6
7
 
7
8
  using Polyfill(Hash: %w[#slice])
8
9
 
9
- module TypeCoerce; end
10
-
11
- module TypeCoerce::Private
12
- class Converter
13
- extend T::Sig
14
-
15
- PRIMITIVE_TYPES = T.let(::Set[
16
- Date,
17
- DateTime,
18
- Float,
19
- Integer,
20
- String,
21
- Symbol,
22
- Time,
23
- ], T.untyped)
24
-
25
- protected
26
- sig { params(value: T.untyped, type: T.untyped, raise_coercion_error: T::Boolean).returns(T.untyped) }
27
- def _convert(value, type, raise_coercion_error)
28
- if type.is_a?(T::Types::Untyped)
29
- value
30
- elsif type.is_a?(T::Types::TypedArray)
31
- _convert_to_a(value, type.type, raise_coercion_error)
32
- elsif type.is_a?(T::Types::TypedSet)
33
- Set.new(_convert_to_a(value, type.type, raise_coercion_error))
34
- elsif type.is_a?(T::Types::Simple)
35
- _convert(value, type.raw_type, raise_coercion_error)
36
- elsif type.is_a?(T::Types::Union)
37
- true_idx = T.let(nil, T.nilable(Integer))
38
- false_idx = T.let(nil, T.nilable(Integer))
39
- nil_idx = T.let(nil, T.nilable(Integer))
40
-
41
- type.types.each_with_index do |t, i|
42
- nil_idx = i if t.is_a?(T::Types::Simple) && t.raw_type == NilClass
43
- true_idx = i if t.is_a?(T::Types::Simple) && t.raw_type == TrueClass
44
- false_idx = i if t.is_a?(T::Types::Simple) && t.raw_type == FalseClass
45
- end
46
-
47
- raise ArgumentError.new(
48
- 'the only supported union types are T.nilable and T::Boolean',
49
- ) unless (
50
- (!true_idx.nil? && !false_idx.nil? && !nil_idx.nil?) || # T.nilable(T::Boolean)
51
- (type.types.length == 2 && (
52
- !nil_idx.nil? || (!true_idx.nil? && !false_idx.nil?) # T.nilable || T::Boolean
53
- ))
54
- )
55
-
56
- if !true_idx.nil? && !false_idx.nil?
57
- _convert_simple(value, T::Boolean, raise_coercion_error)
58
- else
59
- _convert(value, type.types[nil_idx == 0 ? 1 : 0], raise_coercion_error)
60
- end
61
- elsif type.is_a?(T::Types::TypedHash)
62
- return {} if _nil_like?(value, type)
63
-
64
- unless value.respond_to?(:map)
65
- raise TypeCoerce::ShapeError.new(value, type)
66
- end
67
-
68
- value.map do |k, v|
69
- [
70
- _convert(k, type.keys, raise_coercion_error),
71
- _convert(v, type.values, raise_coercion_error),
72
- ]
73
- end.to_h
74
- elsif Object.const_defined?('T::Private::Types::TypeAlias') &&
75
- type.is_a?(T::Private::Types::TypeAlias)
76
- _convert(value, type.aliased_type, raise_coercion_error)
77
- elsif type.respond_to?(:<) && type < T::Struct
78
- args = _build_args(value, type, raise_coercion_error)
79
- type.new(args)
80
- else
81
- _convert_simple(value, type, raise_coercion_error)
82
- end
83
- end
10
+ module TypeCoerce
11
+ class CoercionError < SafeType::CoercionError; end
12
+ class ShapeError < SafeType::CoercionError; end
13
+ end
84
14
 
85
- sig { params(value: T.untyped, type: T.untyped, raise_coercion_error: T::Boolean).returns(T.untyped) }
86
- def _convert_simple(value, type, raise_coercion_error)
87
- return nil if _nil_like?(value, type)
15
+ class TypeCoerce::Converter
16
+ def initialize(type)
17
+ @type = type
18
+ end
88
19
 
89
- safe_type_rule = T.let(nil, T.untyped)
20
+ def new
21
+ self
22
+ end
90
23
 
91
- if type == T::Boolean
92
- safe_type_rule = SafeType::Boolean.strict
93
- elsif value.is_a?(type)
94
- return value
95
- elsif PRIMITIVE_TYPES.include?(type)
96
- safe_type_rule = SafeType.const_get(type.name).strict
97
- else
98
- safe_type_rule = type
24
+ def to_s
25
+ "#{name}#[#{@type.to_s}]"
26
+ end
27
+
28
+ def from(args, raise_coercion_error: nil)
29
+ if raise_coercion_error.nil?
30
+ raise_coercion_error = TypeCoerce::Configuration.raise_coercion_error
31
+ end
32
+
33
+ T.let(_convert(args, @type, raise_coercion_error), @type)
34
+ end
35
+
36
+ private
37
+
38
+ PRIMITIVE_TYPES = T.let(::Set[
39
+ Date,
40
+ DateTime,
41
+ Float,
42
+ Integer,
43
+ String,
44
+ Symbol,
45
+ Time,
46
+ ], T.untyped)
47
+
48
+ def _convert(value, type, raise_coercion_error)
49
+ if type.is_a?(T::Types::Untyped)
50
+ value
51
+ elsif type.is_a?(T::Types::TypedArray)
52
+ _convert_to_a(value, type.type, raise_coercion_error)
53
+ elsif type.is_a?(T::Types::TypedSet)
54
+ Set.new(_convert_to_a(value, type.type, raise_coercion_error))
55
+ elsif type.is_a?(T::Types::Simple)
56
+ _convert(value, type.raw_type, raise_coercion_error)
57
+ elsif type.is_a?(T::Types::Union)
58
+ true_idx = T.let(nil, T.nilable(Integer))
59
+ false_idx = T.let(nil, T.nilable(Integer))
60
+ nil_idx = T.let(nil, T.nilable(Integer))
61
+
62
+ type.types.each_with_index do |t, i|
63
+ nil_idx = i if t.is_a?(T::Types::Simple) && t.raw_type == NilClass
64
+ true_idx = i if t.is_a?(T::Types::Simple) && t.raw_type == TrueClass
65
+ false_idx = i if t.is_a?(T::Types::Simple) && t.raw_type == FalseClass
99
66
  end
100
67
 
101
- if safe_type_rule.is_a?(SafeType::Rule)
102
- SafeType::coerce(value, safe_type_rule)
68
+ raise ArgumentError.new(
69
+ 'the only supported union types are T.nilable and T::Boolean',
70
+ ) unless (
71
+ (!true_idx.nil? && !false_idx.nil? && !nil_idx.nil?) || # T.nilable(T::Boolean)
72
+ (type.types.length == 2 && (
73
+ !nil_idx.nil? || (!true_idx.nil? && !false_idx.nil?) # T.nilable || T::Boolean
74
+ ))
75
+ )
76
+
77
+ if !true_idx.nil? && !false_idx.nil?
78
+ _convert_simple(value, T::Boolean, raise_coercion_error)
103
79
  else
104
- type.new(value)
80
+ _convert(value, type.types[nil_idx == 0 ? 1 : 0], raise_coercion_error)
105
81
  end
106
- rescue SafeType::EmptyValueError, SafeType::CoercionError
107
- if raise_coercion_error
108
- raise TypeCoerce::CoercionError.new(value, type)
109
- else
110
- nil
82
+ elsif type.is_a?(T::Types::TypedHash)
83
+ return {} if _nil_like?(value, type)
84
+
85
+ unless value.respond_to?(:map)
86
+ raise TypeCoerce::ShapeError.new(value, type)
111
87
  end
112
- end
113
88
 
114
- sig { params(ary: T.untyped, type: T.untyped, raise_coercion_error: T::Boolean).returns(T.untyped) }
115
- def _convert_to_a(ary, type, raise_coercion_error)
116
- return [] if _nil_like?(ary, type)
89
+ value.map do |k, v|
90
+ [
91
+ _convert(k, type.keys, raise_coercion_error),
92
+ _convert(v, type.values, raise_coercion_error),
93
+ ]
94
+ end.to_h
95
+ elsif Object.const_defined?('T::Private::Types::TypeAlias') &&
96
+ type.is_a?(T::Private::Types::TypeAlias)
97
+ _convert(value, type.aliased_type, raise_coercion_error)
98
+ elsif type.respond_to?(:<) && type < T::Struct
99
+ return value if value.is_a?(type)
100
+
101
+ args = _build_args(value, type, raise_coercion_error)
102
+ type.new(args)
103
+ elsif type.respond_to?(:<) && type < T::Enum
104
+ return value if value.is_a?(type)
105
+
106
+ _convert_enum(value, type, raise_coercion_error)
107
+ else
108
+ return value if value.is_a?(type)
109
+
110
+ _convert_simple(value, type, raise_coercion_error)
111
+ end
112
+ end
117
113
 
118
- unless ary.respond_to?(:map)
119
- raise TypeCoerce::ShapeError.new(ary, type)
120
- end
114
+ def _convert_enum(value, type, raise_coercion_error)
115
+ if raise_coercion_error
116
+ type.deserialize(value)
117
+ else
118
+ type.try_deserialize(value)
119
+ end
120
+ rescue KeyError
121
+ raise TypeCoerce::CoercionError.new(value, type)
122
+ end
121
123
 
122
- ary.map { |value| _convert(value, type, raise_coercion_error) }
124
+ def _convert_simple(value, type, raise_coercion_error)
125
+ return nil if _nil_like?(value, type)
126
+
127
+ safe_type_rule = T.let(nil, T.untyped)
128
+
129
+ if type == T::Boolean
130
+ safe_type_rule = SafeType::Boolean.strict
131
+ elsif value.is_a?(type)
132
+ return value
133
+ elsif type == BigDecimal
134
+ return BigDecimal(value)
135
+ elsif PRIMITIVE_TYPES.include?(type)
136
+ safe_type_rule = SafeType.const_get(type.name).strict
137
+ else
138
+ safe_type_rule = type
123
139
  end
124
140
 
125
- sig { params(args: T.untyped, type: T.untyped, raise_coercion_error: T::Boolean).returns(T.untyped) }
126
- def _build_args(args, type, raise_coercion_error)
127
- return {} if _nil_like?(args, Hash)
141
+ if safe_type_rule.is_a?(SafeType::Rule)
142
+ SafeType::coerce(value, safe_type_rule)
143
+ else
144
+ type.new(value)
145
+ end
146
+ rescue SafeType::EmptyValueError, SafeType::CoercionError
147
+ if raise_coercion_error
148
+ raise TypeCoerce::CoercionError.new(value, type)
149
+ else
150
+ nil
151
+ end
152
+ end
128
153
 
129
- unless args.respond_to?(:each_pair)
130
- raise TypeCoerce::ShapeError.new(args, type)
131
- end
154
+ def _convert_to_a(ary, type, raise_coercion_error)
155
+ return [] if _nil_like?(ary, type)
132
156
 
133
- props = type.props
134
- args.map { |name, value|
135
- key = name.to_sym
136
- [
137
- key,
138
- (!props.include?(key) || value.nil?) ?
139
- nil : _convert(value, props[key][:type], raise_coercion_error),
140
- ]
141
- }.to_h.slice(*props.keys)
157
+ unless ary.respond_to?(:map)
158
+ raise TypeCoerce::ShapeError.new(ary, type)
142
159
  end
143
160
 
144
- sig { params(value: T.untyped, type: T.untyped).returns(T::Boolean) }
145
- def _nil_like?(value, type)
146
- value.nil? || (value == '' && type != String)
161
+ ary.map { |value| _convert(value, type, raise_coercion_error) }
162
+ end
163
+
164
+ def _build_args(args, type, raise_coercion_error)
165
+ return {} if _nil_like?(args, Hash)
166
+
167
+ unless args.respond_to?(:each_pair)
168
+ raise TypeCoerce::ShapeError.new(args, type)
147
169
  end
170
+
171
+ props = type.props
172
+ args.map { |name, value|
173
+ key = name.to_sym
174
+ [
175
+ key,
176
+ (!props.include?(key) || value.nil?) ?
177
+ nil : _convert(value, props[key][:type], raise_coercion_error),
178
+ ]
179
+ }.to_h.slice(*props.keys)
180
+ end
181
+
182
+ def _nil_like?(value, type)
183
+ value.nil? || (value == '' && type != String)
148
184
  end
149
185
  end
data/spec/coerce_spec.rb CHANGED
@@ -19,6 +19,7 @@ describe TypeCoerce do
19
19
  class Param < T::Struct
20
20
  const :id, Integer
21
21
  const :role, String, default: 'wizard'
22
+ const :price, BigDecimal
22
23
  const :info, ParamInfo
23
24
  const :opt, T.nilable(ParamInfo2)
24
25
  end
@@ -35,6 +36,17 @@ describe TypeCoerce do
35
36
  const :myhash, T::Hash[String, Integer], default: Hash['a' => 1]
36
37
  end
37
38
 
39
+ class TestEnum < T::Enum
40
+ enums do
41
+ Test = new
42
+ Other = new
43
+ end
44
+ end
45
+
46
+ class WithEnum < T::Struct
47
+ const :myenum, TestEnum
48
+ end
49
+
38
50
  class CustomType
39
51
  attr_reader :a
40
52
 
@@ -54,6 +66,7 @@ describe TypeCoerce do
54
66
  let!(:param) {
55
67
  TypeCoerce[Param].new.from({
56
68
  id: 1,
69
+ price: BigDecimal('98.76'),
57
70
  info: {
58
71
  name: 'mango',
59
72
  lvl: 100,
@@ -70,6 +83,7 @@ describe TypeCoerce do
70
83
  let!(:param2) {
71
84
  TypeCoerce[Param].new.from({
72
85
  id: '2',
86
+ price: '98.76',
73
87
  info: {
74
88
  name: 'honeydew',
75
89
  lvl: '5',
@@ -86,6 +100,7 @@ describe TypeCoerce do
86
100
  it 'reveals the right type' do
87
101
  T.assert_type!(param, Param)
88
102
  T.assert_type!(param.id, Integer)
103
+ T.assert_type!(param.price, BigDecimal)
89
104
  T.assert_type!(param.info, ParamInfo)
90
105
  T.assert_type!(param.info.name,String)
91
106
  T.assert_type!(param.info.lvl, Integer)
@@ -95,12 +110,15 @@ describe TypeCoerce do
95
110
  it 'coerces correctly' do
96
111
  expect(param.id).to eql 1
97
112
  expect(param.role).to eql 'wizard'
113
+ expect(param.price).to eql BigDecimal('98.76')
98
114
  expect(param.info.lvl).to eql 100
99
115
  expect(param.info.name).to eql 'mango'
100
116
  expect(param.info.skill_ids).to eql [123, 456]
101
117
  expect(param.opt.notes).to eql []
118
+ expect(TypeCoerce[Param].new.from(param)).to eq(param)
102
119
 
103
120
  expect(param2.id).to eql 2
121
+ expect(param2.price).to eql BigDecimal('98.76')
104
122
  expect(param2.info.name).to eql 'honeydew'
105
123
  expect(param2.info.lvl).to eql 5
106
124
  expect(param2.info.skill_ids).to eql []
@@ -163,8 +181,10 @@ describe TypeCoerce do
163
181
 
164
182
  context 'when given custom types' do
165
183
  it 'coerces correctly' do
166
- T.assert_type!(TypeCoerce[CustomType].new.from(a: 1), CustomType)
167
- expect(TypeCoerce[CustomType].new.from(1).a).to be 1
184
+ obj = TypeCoerce[CustomType].new.from(1)
185
+ T.assert_type!(obj, CustomType)
186
+ expect(obj.a).to be 1
187
+ expect(TypeCoerce[CustomType].new.from(obj)).to be obj
168
188
 
169
189
  expect{TypeCoerce[UnsupportedCustomType].new.from(1)}.to raise_error(ArgumentError)
170
190
  # CustomType2.new(anything) returns Integer 1; 1.is_a?(CustomType2) == false
@@ -251,6 +271,24 @@ describe TypeCoerce do
251
271
  end
252
272
  end
253
273
 
274
+ context 'when dealing with enums' do
275
+ it 'coerces a serialized enum correctly' do
276
+ coerced = TypeCoerce[WithEnum].new.from(myenum: "test")
277
+ expect(coerced.myenum).to eq(TestEnum::Test)
278
+ end
279
+
280
+ it 'handles a real enum correctly' do
281
+ coerced = TypeCoerce[WithEnum].new.from(myenum: TestEnum::Test)
282
+ expect(coerced.myenum).to eq(TestEnum::Test)
283
+ end
284
+
285
+ it 'handles bad enum' do
286
+ expect {
287
+ TypeCoerce[WithEnum].new.from(myenum: "bad_key")
288
+ }.to raise_error(TypeCoerce::CoercionError)
289
+ end
290
+ end
291
+
254
292
  it 'works with T.untyped' do
255
293
  expect(TypeCoerce[T.untyped].new.from(1)).to eql 1
256
294
 
@@ -4,6 +4,12 @@ require 'sorbet-runtime'
4
4
 
5
5
  describe TypeCoerce do
6
6
  context 'when type errors are soft errors' do
7
+ class SoftErrorTestEnum < T::Enum
8
+ enums do
9
+ Other = new
10
+ end
11
+ end
12
+
7
13
  let(:ignore_error) { Proc.new {} }
8
14
 
9
15
  before(:each) do
@@ -48,6 +54,7 @@ describe TypeCoerce do
48
54
 
49
55
  it 'works as expected' do
50
56
  expect(TypeCoerce[Integer].new.from(invalid_arg)).to eql(nil)
57
+ expect(TypeCoerce[SoftErrorTestEnum].new.from('bad_key')).to eql(nil)
51
58
 
52
59
  expect{TypeCoerce[T::Array[Integer]].new.from(1)}.to raise_error(TypeCoerce::ShapeError)
53
60
  expect(TypeCoerce[T::Array[Integer]].new.from({a: 1})).to eql([nil])
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sorbet-coerce
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.5
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chan Zuckerberg Initiative
@@ -10,20 +10,6 @@ bindir: bin
10
10
  cert_chain: []
11
11
  date: 2019-10-04 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: sorbet
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: 0.4.4704
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - ">="
25
- - !ruby/object:Gem::Version
26
- version: 0.4.4704
27
13
  - !ruby/object:Gem::Dependency
28
14
  name: polyfill
29
15
  requirement: !ruby/object:Gem::Requirement
@@ -72,44 +58,58 @@ dependencies:
72
58
  - - ">="
73
59
  - !ruby/object:Gem::Version
74
60
  version: 0.4.4704
61
+ - !ruby/object:Gem::Dependency
62
+ name: sorbet
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: 0.4.4704
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: 0.4.4704
75
75
  - !ruby/object:Gem::Dependency
76
76
  name: rspec
77
77
  requirement: !ruby/object:Gem::Requirement
78
78
  requirements:
79
- - - "~>"
79
+ - - ">="
80
80
  - !ruby/object:Gem::Version
81
81
  version: '3.8'
82
- - - ">="
82
+ - - "~>"
83
83
  - !ruby/object:Gem::Version
84
84
  version: '3.8'
85
85
  type: :development
86
86
  prerelease: false
87
87
  version_requirements: !ruby/object:Gem::Requirement
88
88
  requirements:
89
- - - "~>"
89
+ - - ">="
90
90
  - !ruby/object:Gem::Version
91
91
  version: '3.8'
92
- - - ">="
92
+ - - "~>"
93
93
  - !ruby/object:Gem::Version
94
94
  version: '3.8'
95
95
  - !ruby/object:Gem::Dependency
96
96
  name: byebug
97
97
  requirement: !ruby/object:Gem::Requirement
98
98
  requirements:
99
- - - "~>"
99
+ - - ">="
100
100
  - !ruby/object:Gem::Version
101
101
  version: 11.0.1
102
- - - ">="
102
+ - - "~>"
103
103
  - !ruby/object:Gem::Version
104
104
  version: 11.0.1
105
105
  type: :development
106
106
  prerelease: false
107
107
  version_requirements: !ruby/object:Gem::Requirement
108
108
  requirements:
109
- - - "~>"
109
+ - - ">="
110
110
  - !ruby/object:Gem::Version
111
111
  version: 11.0.1
112
- - - ">="
112
+ - - "~>"
113
113
  - !ruby/object:Gem::Version
114
114
  version: 11.0.1
115
115
  description:
@@ -122,7 +122,6 @@ files:
122
122
  - lib/sorbet-coerce.rb
123
123
  - lib/sorbet-coerce/configuration.rb
124
124
  - lib/sorbet-coerce/converter.rb
125
- - lib/sorbet-coerce/coverter.rbi
126
125
  - spec/coerce_spec.rb
127
126
  - spec/nested_spec.rb
128
127
  - spec/soft_error_spec.rb
@@ -147,8 +146,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
147
146
  - !ruby/object:Gem::Version
148
147
  version: '0'
149
148
  requirements: []
150
- rubyforge_project:
151
- rubygems_version: 2.7.7
149
+ rubygems_version: 3.0.8
152
150
  signing_key:
153
151
  specification_version: 4
154
152
  summary: A type coercion lib works with Sorbet's static type checker and type definitions;
@@ -1,10 +0,0 @@
1
- # typed: true
2
- module T
3
- module Private
4
- module Types
5
- class TypeAlias
6
- def aliased_type; end
7
- end
8
- end
9
- end
10
- end