type_toolkit 0.0.2 → 0.0.3

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.
Files changed (70) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +33 -0
  3. data/README.md +106 -15
  4. data/Rakefile +26 -2
  5. data/config/default.yml +4 -0
  6. data/lib/rubocop/cop/type_toolkit/dont_expect_unexpected_nil.rb +115 -0
  7. data/lib/rubocop-type_toolkit.rb +7 -0
  8. data/lib/type_toolkit/ext/nil_assertions.rb +36 -0
  9. data/lib/type_toolkit/version.rb +2 -1
  10. data/lib/type_toolkit.rb +2 -2
  11. data/sorbet/config +7 -0
  12. data/sorbet/rbi/annotations/.gitattributes +1 -0
  13. data/sorbet/rbi/annotations/minitest.rbi +120 -0
  14. data/sorbet/rbi/annotations/rainbow.rbi +269 -0
  15. data/sorbet/rbi/gems/.gitattributes +1 -0
  16. data/sorbet/rbi/gems/ast@2.4.3.rbi +586 -0
  17. data/sorbet/rbi/gems/benchmark@0.5.0.rbi +637 -0
  18. data/sorbet/rbi/gems/date@3.5.1.rbi +403 -0
  19. data/sorbet/rbi/gems/erb@6.0.1.rbi +816 -0
  20. data/sorbet/rbi/gems/erubi@1.13.1.rbi +157 -0
  21. data/sorbet/rbi/gems/io-console@0.8.2.rbi +9 -0
  22. data/sorbet/rbi/gems/json@2.18.1.rbi +2340 -0
  23. data/sorbet/rbi/gems/language_server-protocol@3.17.0.5.rbi +9 -0
  24. data/sorbet/rbi/gems/lint_roller@1.1.0.rbi +119 -0
  25. data/sorbet/rbi/gems/logger@1.7.0.rbi +963 -0
  26. data/sorbet/rbi/gems/minitest@5.27.0.rbi +1549 -0
  27. data/sorbet/rbi/gems/netrc@0.11.0.rbi +177 -0
  28. data/sorbet/rbi/gems/parallel@1.27.0.rbi +291 -0
  29. data/sorbet/rbi/gems/parser@3.3.10.2.rbi +5537 -0
  30. data/sorbet/rbi/gems/pp@0.6.3.rbi +376 -0
  31. data/sorbet/rbi/gems/prettyprint@0.2.0.rbi +477 -0
  32. data/sorbet/rbi/gems/prism@1.9.0.rbi +43414 -0
  33. data/sorbet/rbi/gems/psych@5.3.1.rbi +2542 -0
  34. data/sorbet/rbi/gems/racc@1.8.1.rbi +168 -0
  35. data/sorbet/rbi/gems/rainbow@3.1.1.rbi +403 -0
  36. data/sorbet/rbi/gems/rake@13.3.1.rbi +3036 -0
  37. data/sorbet/rbi/gems/rbi@0.3.9.rbi +5238 -0
  38. data/sorbet/rbi/gems/rbs@4.0.0.dev.5.rbi +8393 -0
  39. data/sorbet/rbi/gems/rdoc@7.2.0.rbi +13378 -0
  40. data/sorbet/rbi/gems/regexp_parser@2.11.3.rbi +3883 -0
  41. data/sorbet/rbi/gems/reline@0.6.3.rbi +2995 -0
  42. data/sorbet/rbi/gems/require-hooks@0.2.2.rbi +110 -0
  43. data/sorbet/rbi/gems/rexml@3.4.4.rbi +5258 -0
  44. data/sorbet/rbi/gems/rubocop-ast@1.49.0.rbi +7456 -0
  45. data/sorbet/rbi/gems/rubocop-minitest@0.38.2.rbi +2649 -0
  46. data/sorbet/rbi/gems/rubocop-rake@0.7.1.rbi +328 -0
  47. data/sorbet/rbi/gems/rubocop-shopify@2.18.0.rbi +9 -0
  48. data/sorbet/rbi/gems/rubocop@1.84.2.rbi +64803 -0
  49. data/sorbet/rbi/gems/ruby-progressbar@1.13.0.rbi +1318 -0
  50. data/sorbet/rbi/gems/spoom@1.7.11.rbi +5878 -0
  51. data/sorbet/rbi/gems/stringio@3.2.0.rbi +9 -0
  52. data/sorbet/rbi/gems/tapioca@0.17.10.rbi +3513 -0
  53. data/sorbet/rbi/gems/thor@1.5.0.rbi +4476 -0
  54. data/sorbet/rbi/gems/tsort@0.2.0.rbi +393 -0
  55. data/sorbet/rbi/gems/unicode-display_width@3.2.0.rbi +132 -0
  56. data/sorbet/rbi/gems/unicode-emoji@4.2.0.rbi +254 -0
  57. data/sorbet/rbi/gems/yard-sorbet@0.9.0.rbi +430 -0
  58. data/sorbet/rbi/gems/yard@0.9.38.rbi +18425 -0
  59. data/sorbet/rbi/shims/lint_roller.rbi +6 -0
  60. data/sorbet/rbi/shims/minitest.rbi +43 -0
  61. data/sorbet/rbi/shims/rubocop_minitest.rbi +17 -0
  62. data/sorbet/rbi/todo.rbi +5 -0
  63. data/sorbet/tapioca/config.yml +13 -0
  64. data/sorbet/tapioca/require.rb +5 -0
  65. data/spec/.rubocop.yml +13 -0
  66. data/spec/nil_assertions_spec.rb +19 -0
  67. data/spec/rubocop/cop/type_toolkit/dont_expect_unexpected_nil_spec.rb +194 -0
  68. data/spec/spec_helper.rb +8 -0
  69. data/spec/type_toolkit_spec.rb +11 -0
  70. metadata +65 -1
@@ -0,0 +1,6 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ module LintRoller
5
+ class Plugin; end
6
+ end
@@ -0,0 +1,43 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ module Minitest
5
+ class Spec < Minitest::Test
6
+ extend Minitest::Spec::DSL
7
+
8
+ include RuboCop::Minitest::AssertOffense
9
+
10
+ sig do
11
+ params(
12
+ desc: T.anything,
13
+ block: T.proc.bind(T.self_type).void,
14
+ ).void
15
+ end
16
+ def it(desc = T.unsafe(nil), &block); end
17
+
18
+ module DSL
19
+ has_attached_class!(:out)
20
+
21
+ sig do
22
+ params(
23
+ desc: T.anything,
24
+ block: T.proc.bind(T.attached_class).void,
25
+ ).void
26
+ end
27
+ def describe(desc, &block); end
28
+
29
+ sig do
30
+ params(
31
+ desc: T.anything,
32
+ block: T.proc.bind(T.attached_class).void,
33
+ ).void
34
+ end
35
+ def it(desc = T.unsafe(nil), &block); end
36
+
37
+ sig do
38
+ params(block: T.proc.bind(T.attached_class).void).void
39
+ end
40
+ def before(&block); end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,17 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module RuboCop
5
+ module Minitest
6
+ module AssertOffense
7
+ sig { params(source: String).void }
8
+ def assert_offense(source); end
9
+
10
+ sig { params(source: String).void }
11
+ def assert_no_offenses(source); end
12
+
13
+ sig { params(source: String).void }
14
+ def assert_correction(source); end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,5 @@
1
+ # DO NOT EDIT MANUALLY
2
+ # This is an autogenerated file for unresolved constants.
3
+ # Please instead update this file by running `bin/tapioca todo`.
4
+
5
+ # typed: false
@@ -0,0 +1,13 @@
1
+ gem:
2
+ # Add your `gem` command parameters here:
3
+ #
4
+ # exclude:
5
+ # - gem_name
6
+ # doc: true
7
+ # workers: 5
8
+ dsl:
9
+ # Add your `dsl` command parameters here:
10
+ #
11
+ # exclude:
12
+ # - SomeGeneratorName
13
+ # workers: 5
@@ -0,0 +1,5 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ require "minitest/autorun"
5
+ require "minitest/spec"
data/spec/.rubocop.yml ADDED
@@ -0,0 +1,13 @@
1
+ inherit_from: ../.rubocop.yml
2
+
3
+ Style/MethodCallWithArgsParentheses:
4
+ inherit_mode:
5
+ merge:
6
+ - AllowedPatterns
7
+ - AllowedMethods
8
+ AllowedMethods:
9
+ - assert
10
+ - refute
11
+ AllowedPatterns:
12
+ - "^assert_"
13
+ - "^refute_"
@@ -0,0 +1,19 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ require "spec_helper"
5
+
6
+ module TypeToolkit
7
+ class NilAssertionsTest < Minitest::Spec
8
+ describe "#not_nil!" do
9
+ it "returns self on non-nil values" do
10
+ x = "Hello, world!"
11
+ assert_same x, x.not_nil!
12
+ end
13
+
14
+ it "raises an error on nil values" do
15
+ assert_raises(UnexpectedNilError) { nil.not_nil! }
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,194 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ require "spec_helper"
5
+ require "rubocop"
6
+ require "rubocop/minitest/assert_offense"
7
+ require "rubocop-type_toolkit"
8
+
9
+ module RuboCop
10
+ module Cop
11
+ module TypeToolkit
12
+ class DontExpectUnexpectedNilSpec < ::Minitest::Spec
13
+ CONSTANT_NAMES = [
14
+ "UnexpectedNilError",
15
+ "::UnexpectedNilError",
16
+ "TypeToolkit::UnexpectedNilError",
17
+ "::TypeToolkit::UnexpectedNilError",
18
+ ].freeze
19
+
20
+ include RuboCop::Minitest::AssertOffense
21
+
22
+ before do
23
+ @cop = DontExpectUnexpectedNil.new
24
+ end
25
+
26
+ describe "assert_raises" do
27
+ CONSTANT_NAMES.each do |constant_name|
28
+ arrows_______ = "^" * constant_name.size
29
+
30
+ describe constant_name do
31
+ it "adds offense with a { } block" do
32
+ assert_offense(<<~RUBY)
33
+ assert_raises(#{constant_name}) { foo }
34
+ ^^^^^^^^^^^^^^#{arrows_______}^ #{assert_raises_message}
35
+ RUBY
36
+ end
37
+
38
+ it "adds offense with a do ... end block" do
39
+ assert_offense(<<~RUBY)
40
+ assert_raises(#{constant_name}) do
41
+ ^^^^^^^^^^^^^^#{arrows_______}^ #{assert_raises_message}
42
+ foo
43
+ end
44
+ RUBY
45
+ end
46
+
47
+ it "adds offense when passed among other arguments" do
48
+ assert_offense(<<~RUBY)
49
+ assert_raises(ArgumentError, #{constant_name}) { foo }
50
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#{arrows_______}^ #{assert_raises_message}
51
+ RUBY
52
+
53
+ assert_offense(<<~RUBY)
54
+ assert_raises(#{constant_name}, ArgumentError) { foo }
55
+ ^^^^^^^^^^^^^^#{arrows_______}^^^^^^^^^^^^^^^^ #{assert_raises_message}
56
+ RUBY
57
+ end
58
+ end
59
+ end
60
+
61
+ it "does not add offense when assert_raises is used with a different error" do
62
+ assert_no_offenses(<<~RUBY)
63
+ assert_raises(ArgumentError) { foo }
64
+ RUBY
65
+ end
66
+ end
67
+
68
+ describe "rescue" do
69
+ CONSTANT_NAMES.each do |constant_name|
70
+ arrows_______ = "^" * constant_name.size
71
+
72
+ describe constant_name do
73
+ it "adds offense" do
74
+ assert_offense(<<~RUBY)
75
+ begin
76
+ foo
77
+ rescue #{constant_name}
78
+ #{arrows_______} #{rescue_message}
79
+ bar
80
+ end
81
+ RUBY
82
+ end
83
+
84
+ it "adds offense when among other exceptions" do
85
+ assert_offense(<<~RUBY)
86
+ begin
87
+ foo
88
+ rescue #{constant_name}, ArgumentError
89
+ #{arrows_______} #{rescue_message}
90
+ bar
91
+ end
92
+ RUBY
93
+ end
94
+ end
95
+ end
96
+
97
+ it "does not add offense when rescuing other exceptions" do
98
+ assert_no_offenses(<<~RUBY)
99
+ begin
100
+ foo
101
+ rescue ArgumentError
102
+ bar
103
+ end
104
+ RUBY
105
+ end
106
+ end
107
+
108
+ describe "raise" do
109
+ CONSTANT_NAMES.each do |constant_name|
110
+ arrows_______ = "^" * constant_name.size
111
+
112
+ describe constant_name do
113
+ it "adds offense" do
114
+ assert_offense(<<~RUBY)
115
+ raise #{constant_name}
116
+ ^^^^^^#{arrows_______} #{raise_message}
117
+ RUBY
118
+ end
119
+
120
+ it "adds offense with a message" do
121
+ assert_offense(<<~RUBY)
122
+ raise #{constant_name}, "message"
123
+ ^^^^^^#{arrows_______}^^^^^^^^^^^ #{raise_message}
124
+ RUBY
125
+ end
126
+
127
+ it "adds offense with .new" do
128
+ assert_offense(<<~RUBY)
129
+ raise #{constant_name}.new
130
+ ^^^^^^#{arrows_______}^^^^ #{raise_message}
131
+ RUBY
132
+ end
133
+
134
+ it "adds offense with .new and a message" do
135
+ assert_offense(<<~RUBY)
136
+ raise #{constant_name}.new, "message"
137
+ ^^^^^^#{arrows_______}^^^^^^^^^^^^^^^ #{raise_message}
138
+ RUBY
139
+ end
140
+ end
141
+ end
142
+
143
+ it "does not add offense when raising other exceptions" do
144
+ assert_no_offenses(<<~RUBY)
145
+ raise ArgumentError
146
+ RUBY
147
+ end
148
+ end
149
+
150
+ describe "other usages of UnexpectedNilError" do
151
+ CONSTANT_NAMES.each do |constant_name|
152
+ arrows_______ = "^" * constant_name.size
153
+
154
+ it "adds offense when using #{constant_name}" do
155
+ assert_offense(<<~RUBY)
156
+ x = #{constant_name}
157
+ #{arrows_______} #{general_usage_message}
158
+ RUBY
159
+ end
160
+ end
161
+
162
+ it "does not add offense when using other constants" do
163
+ assert_no_offenses(<<~RUBY)
164
+ x = ArgumentError
165
+ x = ::ArgumentError
166
+ RUBY
167
+ end
168
+ end
169
+
170
+ private
171
+
172
+ def assert_raises_message
173
+ "TypeToolkit/DontExpectUnexpectedNil: It is always a mistake for `not_nil!` to be called on nil, " \
174
+ "so tests should not expect any code to raise `UnexpectedNilError`. " \
175
+ "Change your code to gracefully handle `nil` instead."
176
+ end
177
+
178
+ def rescue_message
179
+ "TypeToolkit/DontExpectUnexpectedNil: It is always a mistake for `not_nil!` to be called on nil, " \
180
+ "so you should never try to rescue `UnexpectedNilError` specifically. " \
181
+ "Change your code to gracefully handle `nil` instead."
182
+ end
183
+
184
+ def raise_message
185
+ "TypeToolkit/DontExpectUnexpectedNil: `UnexpectedNilError` should only ever be raised by `NilClass#not_nil!`."
186
+ end
187
+
188
+ def general_usage_message
189
+ "TypeToolkit/DontExpectUnexpectedNil: `UnexpectedNilError` should only ever be used by `#not_nil!`."
190
+ end
191
+ end
192
+ end
193
+ end
194
+ end
@@ -0,0 +1,8 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ $LOAD_PATH.unshift(File.expand_path("../lib", __dir__))
5
+ require "type_toolkit"
6
+
7
+ require "minitest/autorun"
8
+ require "minitest/spec"
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+
5
+ module TypeToolkit
6
+ class TypeToolkitSpec < Minitest::Spec
7
+ it "has a version number" do
8
+ refute_nil ::TypeToolkit::VERSION
9
+ end
10
+ end
11
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: type_toolkit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexander Momchilov
@@ -19,13 +19,77 @@ executables: []
19
19
  extensions: []
20
20
  extra_rdoc_files: []
21
21
  files:
22
+ - ".github/workflows/ci.yml"
22
23
  - ".github/workflows/release.yml"
23
24
  - ".ruby-version"
24
25
  - README.md
25
26
  - Rakefile
27
+ - config/default.yml
28
+ - lib/rubocop-type_toolkit.rb
29
+ - lib/rubocop/cop/type_toolkit/dont_expect_unexpected_nil.rb
26
30
  - lib/type_toolkit.rb
31
+ - lib/type_toolkit/ext/nil_assertions.rb
27
32
  - lib/type_toolkit/version.rb
28
33
  - sig/type_toolkit.rbs
34
+ - sorbet/config
35
+ - sorbet/rbi/annotations/.gitattributes
36
+ - sorbet/rbi/annotations/minitest.rbi
37
+ - sorbet/rbi/annotations/rainbow.rbi
38
+ - sorbet/rbi/gems/.gitattributes
39
+ - sorbet/rbi/gems/ast@2.4.3.rbi
40
+ - sorbet/rbi/gems/benchmark@0.5.0.rbi
41
+ - sorbet/rbi/gems/date@3.5.1.rbi
42
+ - sorbet/rbi/gems/erb@6.0.1.rbi
43
+ - sorbet/rbi/gems/erubi@1.13.1.rbi
44
+ - sorbet/rbi/gems/io-console@0.8.2.rbi
45
+ - sorbet/rbi/gems/json@2.18.1.rbi
46
+ - sorbet/rbi/gems/language_server-protocol@3.17.0.5.rbi
47
+ - sorbet/rbi/gems/lint_roller@1.1.0.rbi
48
+ - sorbet/rbi/gems/logger@1.7.0.rbi
49
+ - sorbet/rbi/gems/minitest@5.27.0.rbi
50
+ - sorbet/rbi/gems/netrc@0.11.0.rbi
51
+ - sorbet/rbi/gems/parallel@1.27.0.rbi
52
+ - sorbet/rbi/gems/parser@3.3.10.2.rbi
53
+ - sorbet/rbi/gems/pp@0.6.3.rbi
54
+ - sorbet/rbi/gems/prettyprint@0.2.0.rbi
55
+ - sorbet/rbi/gems/prism@1.9.0.rbi
56
+ - sorbet/rbi/gems/psych@5.3.1.rbi
57
+ - sorbet/rbi/gems/racc@1.8.1.rbi
58
+ - sorbet/rbi/gems/rainbow@3.1.1.rbi
59
+ - sorbet/rbi/gems/rake@13.3.1.rbi
60
+ - sorbet/rbi/gems/rbi@0.3.9.rbi
61
+ - sorbet/rbi/gems/rbs@4.0.0.dev.5.rbi
62
+ - sorbet/rbi/gems/rdoc@7.2.0.rbi
63
+ - sorbet/rbi/gems/regexp_parser@2.11.3.rbi
64
+ - sorbet/rbi/gems/reline@0.6.3.rbi
65
+ - sorbet/rbi/gems/require-hooks@0.2.2.rbi
66
+ - sorbet/rbi/gems/rexml@3.4.4.rbi
67
+ - sorbet/rbi/gems/rubocop-ast@1.49.0.rbi
68
+ - sorbet/rbi/gems/rubocop-minitest@0.38.2.rbi
69
+ - sorbet/rbi/gems/rubocop-rake@0.7.1.rbi
70
+ - sorbet/rbi/gems/rubocop-shopify@2.18.0.rbi
71
+ - sorbet/rbi/gems/rubocop@1.84.2.rbi
72
+ - sorbet/rbi/gems/ruby-progressbar@1.13.0.rbi
73
+ - sorbet/rbi/gems/spoom@1.7.11.rbi
74
+ - sorbet/rbi/gems/stringio@3.2.0.rbi
75
+ - sorbet/rbi/gems/tapioca@0.17.10.rbi
76
+ - sorbet/rbi/gems/thor@1.5.0.rbi
77
+ - sorbet/rbi/gems/tsort@0.2.0.rbi
78
+ - sorbet/rbi/gems/unicode-display_width@3.2.0.rbi
79
+ - sorbet/rbi/gems/unicode-emoji@4.2.0.rbi
80
+ - sorbet/rbi/gems/yard-sorbet@0.9.0.rbi
81
+ - sorbet/rbi/gems/yard@0.9.38.rbi
82
+ - sorbet/rbi/shims/lint_roller.rbi
83
+ - sorbet/rbi/shims/minitest.rbi
84
+ - sorbet/rbi/shims/rubocop_minitest.rbi
85
+ - sorbet/rbi/todo.rbi
86
+ - sorbet/tapioca/config.yml
87
+ - sorbet/tapioca/require.rb
88
+ - spec/.rubocop.yml
89
+ - spec/nil_assertions_spec.rb
90
+ - spec/rubocop/cop/type_toolkit/dont_expect_unexpected_nil_spec.rb
91
+ - spec/spec_helper.rb
92
+ - spec/type_toolkit_spec.rb
29
93
  homepage: https://github.com/Shopify/type_kit
30
94
  licenses: []
31
95
  metadata: