rubocop-minitest 0.10.0 → 0.11.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +18 -0
  3. data/.github/ISSUE_TEMPLATE/bug_report.md +5 -1
  4. data/.rubocop.yml +4 -0
  5. data/.rubocop_todo.yml +8 -7
  6. data/CHANGELOG.md +90 -49
  7. data/CONTRIBUTING.md +3 -3
  8. data/Gemfile +2 -2
  9. data/LICENSE.txt +1 -1
  10. data/README.md +18 -2
  11. data/Rakefile +1 -1
  12. data/bin/console +2 -0
  13. data/config/default.yml +10 -4
  14. data/docs/antora.yml +1 -1
  15. data/docs/modules/ROOT/pages/cops.adoc +13 -1
  16. data/docs/modules/ROOT/pages/cops_minitest.adoc +47 -8
  17. data/docs/modules/ROOT/pages/index.adoc +1 -1
  18. data/legacy-docs/cops_minitest.md +16 -16
  19. data/legacy-docs/index.md +1 -1
  20. data/lib/rubocop/cop/minitest/assert_empty_literal.rb +9 -8
  21. data/lib/rubocop/cop/minitest/assert_in_delta.rb +2 -0
  22. data/lib/rubocop/cop/minitest/assert_nil.rb +1 -0
  23. data/lib/rubocop/cop/minitest/assert_path_exists.rb +1 -0
  24. data/lib/rubocop/cop/minitest/assert_truthy.rb +1 -0
  25. data/lib/rubocop/cop/minitest/assert_with_expected_argument.rb +41 -0
  26. data/lib/rubocop/cop/minitest/global_expectations.rb +2 -0
  27. data/lib/rubocop/cop/minitest/literal_as_actual_argument.rb +1 -0
  28. data/lib/rubocop/cop/minitest/refute_equal.rb +2 -1
  29. data/lib/rubocop/cop/minitest/refute_false.rb +1 -0
  30. data/lib/rubocop/cop/minitest/refute_in_delta.rb +2 -0
  31. data/lib/rubocop/cop/minitest/refute_nil.rb +1 -0
  32. data/lib/rubocop/cop/minitest/refute_path_exists.rb +1 -0
  33. data/lib/rubocop/cop/minitest/test_method_name.rb +10 -1
  34. data/lib/rubocop/cop/minitest_cops.rb +1 -0
  35. data/lib/rubocop/cop/mixin/minitest_cop_rule.rb +2 -1
  36. data/lib/rubocop/cop/mixin/minitest_exploration_helpers.rb +14 -1
  37. data/lib/rubocop/minitest/version.rb +8 -1
  38. data/mkdocs.yml +2 -2
  39. data/relnotes/v0.1.0.md +1 -1
  40. data/relnotes/v0.10.0.md +12 -12
  41. data/relnotes/v0.10.1.md +5 -0
  42. data/relnotes/v0.10.2.md +5 -0
  43. data/relnotes/v0.10.3.md +5 -0
  44. data/relnotes/v0.11.0.md +16 -0
  45. data/relnotes/v0.11.1.md +5 -0
  46. data/relnotes/v0.2.0.md +4 -4
  47. data/relnotes/v0.2.1.md +1 -1
  48. data/relnotes/v0.3.0.md +6 -6
  49. data/relnotes/v0.4.0.md +5 -5
  50. data/relnotes/v0.4.1.md +1 -1
  51. data/relnotes/v0.5.0.md +1 -1
  52. data/relnotes/v0.5.1.md +1 -1
  53. data/relnotes/v0.6.0.md +1 -1
  54. data/relnotes/v0.6.1.md +2 -2
  55. data/relnotes/v0.6.2.md +1 -1
  56. data/relnotes/v0.7.0.md +5 -5
  57. data/relnotes/v0.8.0.md +4 -4
  58. data/relnotes/v0.8.1.md +1 -1
  59. data/relnotes/v0.9.0.md +3 -3
  60. data/rubocop-minitest.gemspec +6 -6
  61. data/tasks/cops_documentation.rake +15 -295
  62. data/tasks/cut_release.rake +1 -1
  63. metadata +26 -14
@@ -3,6 +3,7 @@
3
3
  require 'yard'
4
4
  require 'rubocop'
5
5
  require 'rubocop-minitest'
6
+ require 'rubocop/cops_documentation_generator'
6
7
 
7
8
  YARD::Rake::YardocTask.new(:yard_for_generate_documentation) do |task|
8
9
  task.files = ['lib/rubocop/cop/**/*.rb']
@@ -11,304 +12,23 @@ end
11
12
 
12
13
  desc 'Generate docs of all cops departments'
13
14
  task generate_cops_documentation: :yard_for_generate_documentation do
14
- def cops_of_department(cops, department)
15
- cops.with_department(department).sort!
16
- end
17
-
18
- def cops_body(config, cop, description, examples_objects, pars)
19
- content = h2(cop.cop_name)
20
- content << required_ruby_version(cop)
21
- content << properties(cop.new(config))
22
- content << "#{description}\n"
23
- content << examples(examples_objects) if examples_objects.count.positive?
24
- content << configurations(pars)
25
- content << references(config, cop)
26
- content
27
- end
28
-
29
- def examples(examples_object)
30
- examples_object.each_with_object(h3('Examples').dup) do |example, content|
31
- content << "\n" unless content.end_with?("\n\n")
32
- content << h4(example.name) unless example.name == ''
33
- content << code_example(example)
34
- end
35
- end
36
-
37
- def required_ruby_version(cop)
38
- return '' unless cop.respond_to?(:required_minimum_ruby_version)
39
-
40
- "NOTE: Required Ruby version: #{cop.required_minimum_ruby_version}\n\n"
41
- end
42
-
43
- # rubocop:disable Metrics/MethodLength
44
- def properties(cop_instance)
45
- header = [
46
- 'Enabled by default', 'Safe', 'Supports autocorrection', 'VersionAdded',
47
- 'VersionChanged'
48
- ]
49
- autocorrect = if cop_instance.support_autocorrect?
50
- "Yes#{' (Unsafe)' unless cop_instance.safe_autocorrect?}"
51
- else
52
- 'No'
53
- end
54
- cop_config = cop_instance.cop_config
55
- content = [[
56
- cop_status(cop_config.fetch('Enabled')),
57
- cop_config.fetch('Safe', true) ? 'Yes' : 'No',
58
- autocorrect,
59
- cop_config.fetch('VersionAdded', '-'),
60
- cop_config.fetch('VersionChanged', '-')
61
- ]]
62
- to_table(header, content) + "\n"
63
- end
64
- # rubocop:enable Metrics/MethodLength
65
-
66
- def h2(title)
67
- content = +"\n"
68
- content << "== #{title}\n"
69
- content << "\n"
70
- content
71
- end
72
-
73
- def h3(title)
74
- content = +"\n"
75
- content << "=== #{title}\n"
76
- content << "\n"
77
- content
78
- end
79
-
80
- def h4(title)
81
- content = +"==== #{title}\n"
82
- content << "\n"
83
- content
84
- end
85
-
86
- def code_example(ruby_code)
87
- content = +"[source,ruby]\n----\n"
88
- content << ruby_code.text.gsub('@good', '# good')
89
- .gsub('@bad', '# bad').strip
90
- content << "\n----\n"
91
- content
92
- end
93
-
94
- def configurations(pars)
95
- return '' if pars.empty?
96
-
97
- header = ['Name', 'Default value', 'Configurable values']
98
- configs = pars
99
- .each_key
100
- .reject { |key| key.start_with?('Supported') }
101
- .reject { |key| key.start_with?('AllowMultipleStyles') }
102
- content = configs.map do |name|
103
- configurable = configurable_values(pars, name)
104
- default = format_table_value(pars[name])
105
- [name, default, configurable]
106
- end
107
-
108
- h3('Configurable attributes') + to_table(header, content)
109
- end
110
-
111
- # rubocop:disable Metrics/CyclomaticComplexity,Metrics/MethodLength
112
- def configurable_values(pars, name)
113
- case name
114
- when /^Enforced/
115
- supported_style_name = RuboCop::Cop::Util.to_supported_styles(name)
116
- format_table_value(pars[supported_style_name])
117
- when 'IndentationWidth'
118
- 'Integer'
119
- else
120
- case pars[name]
121
- when String
122
- 'String'
123
- when Integer
124
- 'Integer'
125
- when Float
126
- 'Float'
127
- when true, false
128
- 'Boolean'
129
- when Array
130
- 'Array'
131
- else
132
- ''
133
- end
134
- end
135
- end
136
- # rubocop:enable Metrics/CyclomaticComplexity,Metrics/MethodLength
137
-
138
- def to_table(header, content)
139
- table = [
140
- '|===',
141
- "| #{header.join(' | ')}\n\n"
142
- ].join("\n")
143
- marked_contents = content.map do |plain_content|
144
- plain_content.map { |c| "| #{c}" }.join("\n")
145
- end
146
- table << marked_contents.join("\n\n")
147
- table << "\n|===\n"
148
- end
149
-
150
- def format_table_value(val)
151
- value =
152
- case val
153
- when Array
154
- if val.empty?
155
- '`[]`'
156
- else
157
- val.map { |config| format_table_value(config) }.join(', ')
158
- end
159
- else
160
- wrap_backtick(val.nil? ? '<none>' : val)
161
- end
162
- value.gsub("#{Dir.pwd}/", '').rstrip
163
- end
164
-
165
- def wrap_backtick(value)
166
- if value.is_a?(String)
167
- # Use `+` to prevent text like `**/*.gemspec` from being bold.
168
- value.start_with?('*') ? "`+#{value}+`" : "`#{value}`"
169
- else
170
- "`#{value}`"
171
- end
172
- end
173
-
174
- def references(config, cop)
175
- cop_config = config.for_cop(cop)
176
- urls = RuboCop::Cop::MessageAnnotator.new(
177
- config, cop.name, cop_config, {}
178
- ).urls
179
- return '' if urls.empty?
180
-
181
- content = h3('References')
182
- content << urls.map { |url| "* #{url}" }.join("\n")
183
- content << "\n"
184
- content
185
- end
186
-
187
- # rubocop:disable Metrics/AbcSize
188
- def print_cops_of_department(cops, department, config)
189
- selected_cops = cops_of_department(cops, department).select do |cop|
190
- cop.to_s.start_with?('RuboCop::Cop::Minitest')
191
- end
192
- return if selected_cops.empty?
193
-
194
- selected_cops = cops_of_department(cops, department)
195
- content = +"= #{department}\n"
196
- selected_cops.each do |cop|
197
- content << print_cop_with_doc(cop, config)
198
- end
199
- file_name = "#{Dir.pwd}/docs/modules/ROOT/pages/cops_#{department.downcase}.adoc"
200
- File.open(file_name, 'w') do |file|
201
- puts "* generated #{file_name}"
202
- file.write(content.strip + "\n")
203
- end
204
- end
205
- # rubocop:enable Metrics/AbcSize
206
-
207
- def print_cop_with_doc(cop, config)
208
- t = config.for_cop(cop)
209
- non_display_keys = %w[
210
- Description Enabled StyleGuide Reference Safe SafeAutoCorrect VersionAdded
211
- VersionChanged
212
- ]
213
- pars = t.reject { |k| non_display_keys.include? k }
214
- description = 'No documentation'
215
- examples_object = []
216
- cop_code(cop) do |code_object|
217
- description = code_object.docstring unless code_object.docstring.blank?
218
- examples_object = code_object.tags('example')
219
- end
220
- cops_body(config, cop, description, examples_object, pars)
221
- end
222
-
223
- def cop_code(cop)
224
- YARD::Registry.all(:class).detect do |code_object|
225
- next unless RuboCop::Cop::Badge.for(code_object.to_s) == cop.badge
226
-
227
- yield code_object
228
- end
229
- end
230
-
231
- # rubocop:disable Metrics/AbcSize
232
- def table_of_content_for_department(cops, department)
233
- selected_cops = cops_of_department(cops, department.to_sym).select do |cop|
234
- cop.to_s.start_with?('RuboCop::Cop::Minitest')
235
- end
236
- return if selected_cops.empty?
237
-
238
- type_title = department[0].upcase + department[1..-1]
239
- filename = "cops_#{department.downcase}.adoc"
240
- content = +"= Department xref:#{filename}[#{type_title}]\n\n"
241
- cops_of_department(cops, department.to_sym).each do |cop|
242
- anchor = cop.cop_name.sub('/', '').downcase
243
- content << "* xref:#{filename}##{anchor}[#{cop.cop_name}]\n"
244
- end
245
-
246
- content
247
- end
248
- # rubocop:enable Metrics/AbcSize
249
-
250
- def print_table_of_contents(cops)
251
- path = "#{Dir.pwd}/docs/modules/ROOT/pages/cops.adoc"
252
- original = File.read(path)
253
- content = +"// START_COP_LIST\n\n"
254
-
255
- content << table_contents(cops)
256
-
257
- content << "\n// END_COP_LIST"
258
-
259
- content = original.sub(
260
- %r{// START_COP_LIST.+// END_COP_LIST}m, content
261
- )
262
- File.write(path, content)
263
- end
264
-
265
- def table_contents(cops)
266
- cops
267
- .departments
268
- .map(&:to_s)
269
- .sort
270
- .map { |department| table_of_content_for_department(cops, department) }
271
- .compact
272
- .join("\n")
273
- end
274
-
275
- def cop_status(status)
276
- return 'Disabled' unless status
277
-
278
- status == 'pending' ? 'Pending' : 'Enabled'
279
- end
280
-
281
- def assert_docs_synchronized
282
- # Do not print diff and yield whether exit code was zero
283
- sh('git diff --quiet docs') do |outcome, _|
284
- return if outcome
285
-
286
- # Output diff before raising error
287
- sh('GIT_PAGER=cat git diff docs')
288
-
289
- warn 'The docs directory is out of sync. ' \
290
- 'Run `rake generate_cops_documentation` and commit the results.'
291
- exit!
292
- end
293
- end
294
-
295
- def main
296
- cops = RuboCop::Cop::Cop.registry
297
- config = RuboCop::ConfigLoader.load_file('config/default.yml')
15
+ deps = ['Minitest']
16
+ CopsDocumentationGenerator.new(departments: deps).call
17
+ end
298
18
 
299
- YARD::Registry.load!
300
- cops.departments.sort!.each do |department|
301
- print_cops_of_department(cops, department, config)
302
- end
19
+ desc 'Verify that documentation is up to date'
20
+ task verify_cops_documentation: :generate_cops_documentation do
21
+ # Do not print diff and yield whether exit code was zero
22
+ sh('git diff --quiet docs') do |outcome, _|
23
+ exit if outcome
303
24
 
304
- print_table_of_contents(cops)
25
+ # Output diff before raising error
26
+ sh('GIT_PAGER=cat git diff docs')
305
27
 
306
- assert_docs_synchronized if ENV['CI'] == 'true'
307
- ensure
308
- RuboCop::ConfigLoader.default_configuration = nil
28
+ warn 'The docs directory is out of sync. ' \
29
+ 'Run `rake generate_cops_documentation` and commit the results.'
30
+ exit!
309
31
  end
310
-
311
- main
312
32
  end
313
33
 
314
34
  desc 'Syntax check for the documentation comments'
@@ -317,7 +37,7 @@ task documentation_syntax_check: :yard_for_generate_documentation do
317
37
 
318
38
  ok = true
319
39
  YARD::Registry.load!
320
- cops = RuboCop::Cop::Cop.registry
40
+ cops = RuboCop::Cop::Registry.global
321
41
  cops.each do |cop|
322
42
  examples = YARD::Registry.all(:class).find do |code_object|
323
43
  next unless RuboCop::Cop::Badge.for(code_object.to_s) == cop.badge
@@ -41,7 +41,7 @@ namespace :cut_release do
41
41
  File.open('docs/antora.yml', 'w') do |f|
42
42
  f << antora_metadata.sub(
43
43
  'version: master',
44
- "version: #{version_sans_patch(new_version)}"
44
+ "version: '#{version_sans_patch(new_version)}'"
45
45
  )
46
46
  end
47
47
  end
metadata CHANGED
@@ -1,16 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubocop-minitest
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.0
4
+ version: 0.11.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bozhidar Batsov
8
8
  - Jonas Arvidsson
9
9
  - Koichi ITO
10
- autorequire:
10
+ autorequire:
11
11
  bindir: exe
12
12
  cert_chain: []
13
- date: 2020-07-12 00:00:00.000000000 Z
13
+ date: 2021-03-30 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rubocop
@@ -18,14 +18,20 @@ dependencies:
18
18
  requirements:
19
19
  - - ">="
20
20
  - !ruby/object:Gem::Version
21
- version: '0.87'
21
+ version: '0.90'
22
+ - - "<"
23
+ - !ruby/object:Gem::Version
24
+ version: '2.0'
22
25
  type: :runtime
23
26
  prerelease: false
24
27
  version_requirements: !ruby/object:Gem::Requirement
25
28
  requirements:
26
29
  - - ">="
27
30
  - !ruby/object:Gem::Version
28
- version: '0.87'
31
+ version: '0.90'
32
+ - - "<"
33
+ - !ruby/object:Gem::Version
34
+ version: '2.0'
29
35
  - !ruby/object:Gem::Dependency
30
36
  name: minitest
31
37
  requirement: !ruby/object:Gem::Requirement
@@ -43,7 +49,7 @@ dependencies:
43
49
  description: |
44
50
  Automatic Minitest code style checking tool.
45
51
  A RuboCop extension focused on enforcing Minitest best practices and coding conventions.
46
- email:
52
+ email:
47
53
  executables: []
48
54
  extensions: []
49
55
  extra_rdoc_files: []
@@ -94,6 +100,7 @@ files:
94
100
  - lib/rubocop/cop/minitest/assert_respond_to.rb
95
101
  - lib/rubocop/cop/minitest/assert_silent.rb
96
102
  - lib/rubocop/cop/minitest/assert_truthy.rb
103
+ - lib/rubocop/cop/minitest/assert_with_expected_argument.rb
97
104
  - lib/rubocop/cop/minitest/assertion_in_lifecycle_hook.rb
98
105
  - lib/rubocop/cop/minitest/global_expectations.rb
99
106
  - lib/rubocop/cop/minitest/literal_as_actual_argument.rb
@@ -123,6 +130,11 @@ files:
123
130
  - readthedocs.yml
124
131
  - relnotes/v0.1.0.md
125
132
  - relnotes/v0.10.0.md
133
+ - relnotes/v0.10.1.md
134
+ - relnotes/v0.10.2.md
135
+ - relnotes/v0.10.3.md
136
+ - relnotes/v0.11.0.md
137
+ - relnotes/v0.11.1.md
126
138
  - relnotes/v0.2.0.md
127
139
  - relnotes/v0.2.1.md
128
140
  - relnotes/v0.3.0.md
@@ -140,16 +152,16 @@ files:
140
152
  - rubocop-minitest.gemspec
141
153
  - tasks/cops_documentation.rake
142
154
  - tasks/cut_release.rake
143
- homepage:
155
+ homepage:
144
156
  licenses:
145
157
  - MIT
146
158
  metadata:
147
159
  homepage_uri: https://docs.rubocop.org/rubocop-minitest/
148
- changelog_uri: https://github.com/rubocop-hq/rubocop-minitest/blob/master/CHANGELOG.md
149
- source_code_uri: https://github.com/rubocop-hq/rubocop-minitest
150
- documentation_uri: https://docs.rubocop.org/rubocop-minitest/
151
- bug_tracker_uri: https://github.com/rubocop-hq/rubocop-minitest/issues
152
- post_install_message:
160
+ changelog_uri: https://github.com/rubocop/rubocop-minitest/blob/master/CHANGELOG.md
161
+ source_code_uri: https://github.com/rubocop/rubocop-minitest
162
+ documentation_uri: https://docs.rubocop.org/rubocop-minitest/0.11
163
+ bug_tracker_uri: https://github.com/rubocop/rubocop-minitest/issues
164
+ post_install_message:
153
165
  rdoc_options: []
154
166
  require_paths:
155
167
  - lib
@@ -164,8 +176,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
164
176
  - !ruby/object:Gem::Version
165
177
  version: '0'
166
178
  requirements: []
167
- rubygems_version: 3.1.2
168
- signing_key:
179
+ rubygems_version: 3.2.13
180
+ signing_key:
169
181
  specification_version: 4
170
182
  summary: Automatic Minitest code style checking tool.
171
183
  test_files: []