sorbet-coerce 0.2.7 → 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: 017a474302bad34d6523e0140f0a221419874ddb6488f5cde3075458c54a245e
4
- data.tar.gz: '0822f50c595a31bd377ff359d7e05f42ef60a2c4a9dd46915527dcf47c344081'
3
+ metadata.gz: 459ea1a3f906360f8a0e0d33969f49110476a1aa8d1772a1adc4dc1fc704140c
4
+ data.tar.gz: 7e2bf805fcb1d89de859312576d7e9e4eb782d03e4e7ff5929205c0fb676e377
5
5
  SHA512:
6
- metadata.gz: e105f8b039d77562b9a03ed58cc55cebb2e55a526917d1965c2fce7e410869d8bb9ea1d94e50f8086d298bf818eb63b5fb6293326e073621f6dc66450d6632c8
7
- data.tar.gz: 2c0be667253b77c2e84930cf1fa526b01ed79c3cb603b708e2256958d3def7679adb275cbeccee3f5e7e6649408445c43d3bb6892281fe42efaa511464963fbc
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
@@ -100,6 +100,10 @@ class TypeCoerce::Converter
100
100
 
101
101
  args = _build_args(value, type, raise_coercion_error)
102
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)
103
107
  else
104
108
  return value if value.is_a?(type)
105
109
 
@@ -107,6 +111,16 @@ class TypeCoerce::Converter
107
111
  end
108
112
  end
109
113
 
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
123
+
110
124
  def _convert_simple(value, type, raise_coercion_error)
111
125
  return nil if _nil_like?(value, type)
112
126
 
@@ -116,6 +130,8 @@ class TypeCoerce::Converter
116
130
  safe_type_rule = SafeType::Boolean.strict
117
131
  elsif value.is_a?(type)
118
132
  return value
133
+ elsif type == BigDecimal
134
+ return BigDecimal(value)
119
135
  elsif PRIMITIVE_TYPES.include?(type)
120
136
  safe_type_rule = SafeType.const_get(type.name).strict
121
137
  else
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,6 +110,7 @@ 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]
@@ -102,6 +118,7 @@ describe TypeCoerce do
102
118
  expect(TypeCoerce[Param].new.from(param)).to eq(param)
103
119
 
104
120
  expect(param2.id).to eql 2
121
+ expect(param2.price).to eql BigDecimal('98.76')
105
122
  expect(param2.info.name).to eql 'honeydew'
106
123
  expect(param2.info.lvl).to eql 5
107
124
  expect(param2.info.skill_ids).to eql []
@@ -254,6 +271,24 @@ describe TypeCoerce do
254
271
  end
255
272
  end
256
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
+
257
292
  it 'works with T.untyped' do
258
293
  expect(TypeCoerce[T.untyped].new.from(1)).to eql 1
259
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.7
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:
@@ -146,8 +146,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
146
146
  - !ruby/object:Gem::Version
147
147
  version: '0'
148
148
  requirements: []
149
- rubyforge_project:
150
- rubygems_version: 2.7.6.2
149
+ rubygems_version: 3.0.8
151
150
  signing_key:
152
151
  specification_version: 4
153
152
  summary: A type coercion lib works with Sorbet's static type checker and type definitions;