type_toolkit 0.0.2 → 0.0.4

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/cop/type_toolkit/plugin.rb +33 -0
  8. data/lib/rubocop-type_toolkit.rb +5 -0
  9. data/lib/type_toolkit/ext/nil_assertions.rb +36 -0
  10. data/lib/type_toolkit/version.rb +2 -1
  11. data/lib/type_toolkit.rb +2 -2
  12. data/sorbet/config +7 -0
  13. data/sorbet/rbi/annotations/.gitattributes +1 -0
  14. data/sorbet/rbi/annotations/minitest.rbi +120 -0
  15. data/sorbet/rbi/annotations/rainbow.rbi +269 -0
  16. data/sorbet/rbi/gems/.gitattributes +1 -0
  17. data/sorbet/rbi/gems/ast@2.4.3.rbi +586 -0
  18. data/sorbet/rbi/gems/benchmark@0.5.0.rbi +637 -0
  19. data/sorbet/rbi/gems/date@3.5.1.rbi +403 -0
  20. data/sorbet/rbi/gems/erb@6.0.1.rbi +816 -0
  21. data/sorbet/rbi/gems/erubi@1.13.1.rbi +157 -0
  22. data/sorbet/rbi/gems/io-console@0.8.2.rbi +9 -0
  23. data/sorbet/rbi/gems/json@2.18.1.rbi +2340 -0
  24. data/sorbet/rbi/gems/language_server-protocol@3.17.0.5.rbi +9 -0
  25. data/sorbet/rbi/gems/lint_roller@1.1.0.rbi +323 -0
  26. data/sorbet/rbi/gems/logger@1.7.0.rbi +963 -0
  27. data/sorbet/rbi/gems/minitest@5.27.0.rbi +1549 -0
  28. data/sorbet/rbi/gems/netrc@0.11.0.rbi +177 -0
  29. data/sorbet/rbi/gems/parallel@1.27.0.rbi +291 -0
  30. data/sorbet/rbi/gems/parser@3.3.10.2.rbi +5537 -0
  31. data/sorbet/rbi/gems/pp@0.6.3.rbi +376 -0
  32. data/sorbet/rbi/gems/prettyprint@0.2.0.rbi +477 -0
  33. data/sorbet/rbi/gems/prism@1.9.0.rbi +43414 -0
  34. data/sorbet/rbi/gems/psych@5.3.1.rbi +2542 -0
  35. data/sorbet/rbi/gems/racc@1.8.1.rbi +168 -0
  36. data/sorbet/rbi/gems/rainbow@3.1.1.rbi +403 -0
  37. data/sorbet/rbi/gems/rake@13.3.1.rbi +3036 -0
  38. data/sorbet/rbi/gems/rbi@0.3.9.rbi +5238 -0
  39. data/sorbet/rbi/gems/rbs@4.0.0.dev.5.rbi +8393 -0
  40. data/sorbet/rbi/gems/rdoc@7.2.0.rbi +13378 -0
  41. data/sorbet/rbi/gems/regexp_parser@2.11.3.rbi +3883 -0
  42. data/sorbet/rbi/gems/reline@0.6.3.rbi +2995 -0
  43. data/sorbet/rbi/gems/require-hooks@0.2.2.rbi +110 -0
  44. data/sorbet/rbi/gems/rexml@3.4.4.rbi +5258 -0
  45. data/sorbet/rbi/gems/rubocop-ast@1.49.0.rbi +7456 -0
  46. data/sorbet/rbi/gems/rubocop-minitest@0.38.2.rbi +2649 -0
  47. data/sorbet/rbi/gems/rubocop-rake@0.7.1.rbi +328 -0
  48. data/sorbet/rbi/gems/rubocop-shopify@2.18.0.rbi +9 -0
  49. data/sorbet/rbi/gems/rubocop@1.84.2.rbi +64803 -0
  50. data/sorbet/rbi/gems/ruby-progressbar@1.13.0.rbi +1318 -0
  51. data/sorbet/rbi/gems/spoom@1.7.11.rbi +5878 -0
  52. data/sorbet/rbi/gems/stringio@3.2.0.rbi +9 -0
  53. data/sorbet/rbi/gems/tapioca@0.17.10.rbi +3513 -0
  54. data/sorbet/rbi/gems/thor@1.5.0.rbi +4476 -0
  55. data/sorbet/rbi/gems/tsort@0.2.0.rbi +393 -0
  56. data/sorbet/rbi/gems/unicode-display_width@3.2.0.rbi +132 -0
  57. data/sorbet/rbi/gems/unicode-emoji@4.2.0.rbi +254 -0
  58. data/sorbet/rbi/gems/yard-sorbet@0.9.0.rbi +430 -0
  59. data/sorbet/rbi/gems/yard@0.9.38.rbi +18425 -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 +95 -2
@@ -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,14 +1,42 @@
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.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexander Momchilov
8
8
  bindir: exe
9
9
  cert_chain: []
10
10
  date: 1980-01-02 00:00:00.000000000 Z
11
- dependencies: []
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: lint_roller
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '0'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: '0'
26
+ - !ruby/object:Gem::Dependency
27
+ name: rubocop
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 1.72.0
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: 1.72.0
12
40
  description: 'A minimal runtime library for implementing abstract classes, interfaces,
13
41
  and more.
14
42
 
@@ -19,19 +47,84 @@ executables: []
19
47
  extensions: []
20
48
  extra_rdoc_files: []
21
49
  files:
50
+ - ".github/workflows/ci.yml"
22
51
  - ".github/workflows/release.yml"
23
52
  - ".ruby-version"
24
53
  - README.md
25
54
  - Rakefile
55
+ - config/default.yml
56
+ - lib/rubocop-type_toolkit.rb
57
+ - lib/rubocop/cop/type_toolkit/dont_expect_unexpected_nil.rb
58
+ - lib/rubocop/cop/type_toolkit/plugin.rb
26
59
  - lib/type_toolkit.rb
60
+ - lib/type_toolkit/ext/nil_assertions.rb
27
61
  - lib/type_toolkit/version.rb
28
62
  - sig/type_toolkit.rbs
63
+ - sorbet/config
64
+ - sorbet/rbi/annotations/.gitattributes
65
+ - sorbet/rbi/annotations/minitest.rbi
66
+ - sorbet/rbi/annotations/rainbow.rbi
67
+ - sorbet/rbi/gems/.gitattributes
68
+ - sorbet/rbi/gems/ast@2.4.3.rbi
69
+ - sorbet/rbi/gems/benchmark@0.5.0.rbi
70
+ - sorbet/rbi/gems/date@3.5.1.rbi
71
+ - sorbet/rbi/gems/erb@6.0.1.rbi
72
+ - sorbet/rbi/gems/erubi@1.13.1.rbi
73
+ - sorbet/rbi/gems/io-console@0.8.2.rbi
74
+ - sorbet/rbi/gems/json@2.18.1.rbi
75
+ - sorbet/rbi/gems/language_server-protocol@3.17.0.5.rbi
76
+ - sorbet/rbi/gems/lint_roller@1.1.0.rbi
77
+ - sorbet/rbi/gems/logger@1.7.0.rbi
78
+ - sorbet/rbi/gems/minitest@5.27.0.rbi
79
+ - sorbet/rbi/gems/netrc@0.11.0.rbi
80
+ - sorbet/rbi/gems/parallel@1.27.0.rbi
81
+ - sorbet/rbi/gems/parser@3.3.10.2.rbi
82
+ - sorbet/rbi/gems/pp@0.6.3.rbi
83
+ - sorbet/rbi/gems/prettyprint@0.2.0.rbi
84
+ - sorbet/rbi/gems/prism@1.9.0.rbi
85
+ - sorbet/rbi/gems/psych@5.3.1.rbi
86
+ - sorbet/rbi/gems/racc@1.8.1.rbi
87
+ - sorbet/rbi/gems/rainbow@3.1.1.rbi
88
+ - sorbet/rbi/gems/rake@13.3.1.rbi
89
+ - sorbet/rbi/gems/rbi@0.3.9.rbi
90
+ - sorbet/rbi/gems/rbs@4.0.0.dev.5.rbi
91
+ - sorbet/rbi/gems/rdoc@7.2.0.rbi
92
+ - sorbet/rbi/gems/regexp_parser@2.11.3.rbi
93
+ - sorbet/rbi/gems/reline@0.6.3.rbi
94
+ - sorbet/rbi/gems/require-hooks@0.2.2.rbi
95
+ - sorbet/rbi/gems/rexml@3.4.4.rbi
96
+ - sorbet/rbi/gems/rubocop-ast@1.49.0.rbi
97
+ - sorbet/rbi/gems/rubocop-minitest@0.38.2.rbi
98
+ - sorbet/rbi/gems/rubocop-rake@0.7.1.rbi
99
+ - sorbet/rbi/gems/rubocop-shopify@2.18.0.rbi
100
+ - sorbet/rbi/gems/rubocop@1.84.2.rbi
101
+ - sorbet/rbi/gems/ruby-progressbar@1.13.0.rbi
102
+ - sorbet/rbi/gems/spoom@1.7.11.rbi
103
+ - sorbet/rbi/gems/stringio@3.2.0.rbi
104
+ - sorbet/rbi/gems/tapioca@0.17.10.rbi
105
+ - sorbet/rbi/gems/thor@1.5.0.rbi
106
+ - sorbet/rbi/gems/tsort@0.2.0.rbi
107
+ - sorbet/rbi/gems/unicode-display_width@3.2.0.rbi
108
+ - sorbet/rbi/gems/unicode-emoji@4.2.0.rbi
109
+ - sorbet/rbi/gems/yard-sorbet@0.9.0.rbi
110
+ - sorbet/rbi/gems/yard@0.9.38.rbi
111
+ - sorbet/rbi/shims/minitest.rbi
112
+ - sorbet/rbi/shims/rubocop_minitest.rbi
113
+ - sorbet/rbi/todo.rbi
114
+ - sorbet/tapioca/config.yml
115
+ - sorbet/tapioca/require.rb
116
+ - spec/.rubocop.yml
117
+ - spec/nil_assertions_spec.rb
118
+ - spec/rubocop/cop/type_toolkit/dont_expect_unexpected_nil_spec.rb
119
+ - spec/spec_helper.rb
120
+ - spec/type_toolkit_spec.rb
29
121
  homepage: https://github.com/Shopify/type_kit
30
122
  licenses: []
31
123
  metadata:
32
124
  allowed_push_host: https://rubygems.org
33
125
  homepage_uri: https://github.com/Shopify/type_kit
34
126
  source_code_uri: https://github.com/Shopify/type_kit
127
+ default_lint_roller_plugin: RuboCop::Cop::TypeToolkit::Plugin
35
128
  rdoc_options: []
36
129
  require_paths:
37
130
  - lib