rspec-sorbet 1.0.0 → 1.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 +4 -4
- data/CHANGELOG.md +4 -0
- data/README.md +5 -3
- data/lib/rspec/sorbet/instance_doubles.rb +61 -11
- data/lib/rspec/sorbet/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5658116844f34d4b596c0f46bbdcefa667a82d3186905f0acf0961d3654ec660
|
4
|
+
data.tar.gz: 38d680e034afe8cd469882f210efec1e7fb23c3ef4f3b3ec40f027069864451d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2377abcbc26c8d5925a868bb6ff2ca4f675769bc5a3522f253eb001f3e5d4f5e85cca4d669da2adde281eca7487a7405a2ea5b344c221ad154f8d62d62f24e26
|
7
|
+
data.tar.gz: d3ba0390f07496a8b1e9d06f344f701f66e1dcb4c3b47d378c8420d0e9e36b748c9e020e03836a08aaeda6053f811b626de0784f4dec98a41f25ee2097d3de48
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+

|
2
|
+
|
3
|
+
# RSpec Sorbet [](https://badge.fury.io/rb/rspec-sorbet)
|
2
4
|
|
3
5
|
A small gem consisting of helpers for using Sorbet & RSpec together.
|
4
6
|
|
@@ -15,7 +17,7 @@ require 'rspec/sorbet'
|
|
15
17
|
|
16
18
|
### Allowing Instance Doubles
|
17
19
|
|
18
|
-
Out of the box if
|
20
|
+
Out of the box if you're using `instance_double`'s in your tests you'll encounter errors such as the following:
|
19
21
|
|
20
22
|
```
|
21
23
|
TypeError:
|
@@ -23,7 +25,7 @@ Out of the box if your using `instance_double`'s in your tests you'll encounter
|
|
23
25
|
Caller: /Users/samuelgiles/Documents/Projects/Clients/Bellroy/bellroy/spec/lib/checkout/use_cases/my_use_case.rb:9
|
24
26
|
```
|
25
27
|
|
26
|
-
Drop the following into your `spec_helper.rb` to allow
|
28
|
+
Drop the following into your `spec_helper.rb` to allow `instance_double` to be used without breaking type checking:
|
27
29
|
|
28
30
|
```ruby
|
29
31
|
RSpec::Sorbet.allow_instance_doubles!
|
@@ -5,11 +5,6 @@ require 'sorbet-runtime'
|
|
5
5
|
module RSpec
|
6
6
|
module Sorbet
|
7
7
|
module InstanceDoubles
|
8
|
-
WHITELISTED_ERROR_MESSAGES = [
|
9
|
-
'RSpec::Mocks::InstanceVerifyingDouble',
|
10
|
-
'InstanceDouble'
|
11
|
-
].freeze
|
12
|
-
|
13
8
|
def allow_instance_doubles!
|
14
9
|
T::Configuration.inline_type_error_handler = proc do |error|
|
15
10
|
inline_type_error_handler(error)
|
@@ -22,18 +17,73 @@ module RSpec
|
|
22
17
|
|
23
18
|
private
|
24
19
|
|
20
|
+
INLINE_INSTANCE_DOUBLE_REGEX =
|
21
|
+
/T.let: Expected type (T.any\()?(?<expected_classes>[a-zA-Z:: ,]*)(\))?, got type (.*) with value #<InstanceDouble\((?<doubled_module>[a-zA-Z:: ,]*)\)/.freeze
|
22
|
+
|
25
23
|
def inline_type_error_handler(error)
|
26
|
-
|
24
|
+
case error
|
25
|
+
when TypeError
|
26
|
+
message = error.message
|
27
|
+
return if instance_double_message_with_ellipsis?(message) || typed_array_message?(message)
|
28
|
+
|
29
|
+
_, expected_types_string, doubled_module_string = (message.match(INLINE_INSTANCE_DOUBLE_REGEX) || [])[0..2]
|
30
|
+
raise error unless expected_types_string && doubled_module_string
|
31
|
+
|
32
|
+
expected_types = expected_types_string.split(',').map do |expected_type_string|
|
33
|
+
Object.const_get(expected_type_string.strip)
|
34
|
+
end
|
35
|
+
doubled_module = Object.const_get(doubled_module_string)
|
36
|
+
|
37
|
+
valid = expected_types.any? do |expected_type|
|
38
|
+
doubled_module.ancestors.include?(expected_type)
|
39
|
+
end
|
40
|
+
|
41
|
+
raise error unless valid
|
42
|
+
else
|
43
|
+
raise error
|
44
|
+
end
|
27
45
|
end
|
28
46
|
|
29
|
-
|
30
|
-
|
47
|
+
INSTANCE_VERIFYING_DOUBLE_OR_INSTANCE_DOUBLE =
|
48
|
+
/(RSpec::Mocks::InstanceVerifyingDouble|InstanceDouble)/.freeze
|
49
|
+
|
50
|
+
def instance_double_message_with_ellipsis?(message)
|
51
|
+
message.include?('...') && message.match?(INSTANCE_VERIFYING_DOUBLE_OR_INSTANCE_DOUBLE)
|
31
52
|
end
|
32
53
|
|
33
|
-
|
34
|
-
|
35
|
-
|
54
|
+
TYPED_ARRAY_MESSAGE = /got T::Array/.freeze
|
55
|
+
|
56
|
+
def typed_array_message?(message)
|
57
|
+
message.match?(TYPED_ARRAY_MESSAGE)
|
58
|
+
end
|
59
|
+
|
60
|
+
def call_validation_error_handler(_signature, opts)
|
61
|
+
should_raise = true
|
62
|
+
|
63
|
+
if opts[:pretty_message].match?(INSTANCE_VERIFYING_DOUBLE_OR_INSTANCE_DOUBLE)
|
64
|
+
typing = opts[:type]
|
65
|
+
value = opts[:value].is_a?(Array) ? opts[:value].first : opts[:value]
|
66
|
+
target = value.instance_variable_get(:@doubled_module).target
|
67
|
+
|
68
|
+
case typing
|
69
|
+
when T::Types::TypedArray
|
70
|
+
typing = typing.type
|
71
|
+
end
|
72
|
+
|
73
|
+
case typing
|
74
|
+
when T::Types::Simple
|
75
|
+
should_raise = !target.ancestors.include?(typing.raw_type)
|
76
|
+
when T::Types::Union
|
77
|
+
valid = typing.types.map(&:raw_type).any? do |type|
|
78
|
+
target.ancestors.include?(type)
|
79
|
+
end
|
80
|
+
should_raise = !valid
|
81
|
+
else
|
82
|
+
should_raise = !target.ancestors.include?(typing)
|
83
|
+
end
|
36
84
|
end
|
85
|
+
|
86
|
+
raise TypeError, opts[:pretty_message] if should_raise
|
37
87
|
end
|
38
88
|
end
|
39
89
|
end
|
data/lib/rspec/sorbet/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rspec-sorbet
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Samuel Giles
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-08-
|
11
|
+
date: 2019-08-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sorbet
|