rubocop-minitest 0.15.0 → 0.17.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -19,6 +19,18 @@ module RuboCop
19
19
  extend MinitestCopRule
20
20
 
21
21
  define_rule :refute, target_method: :empty?
22
+
23
+ remove_method :on_send
24
+ def on_send(node)
25
+ return unless node.method?(:refute)
26
+ return unless (arguments = peel_redundant_parentheses_from(node.arguments))
27
+ return unless arguments.first.respond_to?(:method?) && arguments.first.method?(:empty?)
28
+ return unless arguments.first.arguments.empty?
29
+
30
+ add_offense(node, message: offense_message(arguments)) do |corrector|
31
+ autocorrect(corrector, node, arguments)
32
+ end
33
+ end
22
34
  end
23
35
  end
24
36
  end
@@ -0,0 +1,183 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Laziness copied from rubocop source code
4
+ require 'rubocop/rspec/expect_offense'
5
+ require 'rubocop/cop/legacy/corrector'
6
+
7
+ module RuboCop
8
+ module Minitest
9
+ # Mixin for `assert_offense` and `assert_no_offenses`
10
+ #
11
+ # This mixin makes it easier to specify strict offense assertions
12
+ # in a declarative and visual fashion. Just type out the code that
13
+ # should generate a offense, annotate code by writing '^'s
14
+ # underneath each character that should be highlighted, and follow
15
+ # the carets with a string (separated by a space) that is the
16
+ # message of the offense. You can include multiple offenses in
17
+ # one code snippet.
18
+ #
19
+ # @example Usage
20
+ #
21
+ # assert_offense(<<~RUBY)
22
+ # class FooTest < Minitest::Test
23
+ # def test_do_something
24
+ # assert_equal(nil, somestuff)
25
+ # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Prefer using `assert_nil(somestuff)` over `assert_equal(nil, somestuff)`.
26
+ # end
27
+ # end
28
+ # RUBY
29
+ #
30
+ # Auto-correction can be tested using `assert_correction` after
31
+ # `assert_offense`.
32
+ #
33
+ # @example `assert_offense` and `assert_correction`
34
+ #
35
+ # assert_offense(<<~RUBY)
36
+ # class FooTest < Minitest::Test
37
+ # def test_do_something
38
+ # assert_equal(nil, somestuff)
39
+ # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Prefer using `assert_nil(somestuff)` over `assert_equal(nil, somestuff)`.
40
+ # end
41
+ # end
42
+ # RUBY
43
+ #
44
+ # assert_correction(<<~RUBY)
45
+ # class FooTest < Minitest::Test
46
+ # def test_do_something
47
+ # assert_nil(somestuff)
48
+ # end
49
+ # end
50
+ # RUBY
51
+ #
52
+ # If you do not want to specify an offense then use the
53
+ # companion method `assert_no_offenses`. This method is a much
54
+ # simpler assertion since it just inspects the source and checks
55
+ # that there were no offenses. The `assert_offense` method has
56
+ # to do more work by parsing out lines that contain carets.
57
+ #
58
+ # If the code produces an offense that could not be auto-corrected, you can
59
+ # use `assert_no_corrections` after `assert_offense`.
60
+ #
61
+ # @example `assert_offense` and `assert_no_corrections`
62
+ #
63
+ # assert_offense(<<~RUBY)
64
+ # class FooTest < Minitest::Test
65
+ # def test_do_something
66
+ # assert_equal(nil, somestuff)
67
+ # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Prefer using `assert_nil(somestuff)` over `assert_equal(nil, somestuff)`.
68
+ # end
69
+ # end
70
+ # RUBY
71
+ #
72
+ # assert_no_corrections
73
+ module AssertOffense
74
+ private
75
+
76
+ def setup
77
+ cop_name = self.class.to_s.delete_suffix('Test')
78
+
79
+ @cop = RuboCop::Cop::Minitest.const_get(cop_name).new
80
+ end
81
+
82
+ def assert_no_offenses(source, file = nil)
83
+ setup_assertion
84
+
85
+ offenses = inspect_source(source, @cop, file)
86
+
87
+ expected_annotations = RuboCop::RSpec::ExpectOffense::AnnotatedSource.parse(source)
88
+ actual_annotations = expected_annotations.with_offense_annotations(offenses)
89
+
90
+ assert_equal(source, actual_annotations.to_s)
91
+ end
92
+
93
+ def assert_offense(source, file = nil)
94
+ setup_assertion
95
+
96
+ @cop.instance_variable_get(:@options)[:auto_correct] = true
97
+
98
+ expected_annotations = RuboCop::RSpec::ExpectOffense::AnnotatedSource.parse(source)
99
+ if expected_annotations.plain_source == source
100
+ raise 'Use `assert_no_offenses` to assert that no offenses are found'
101
+ end
102
+
103
+ @processed_source = parse_source!(expected_annotations.plain_source, file)
104
+
105
+ offenses = _investigate(@cop, @processed_source)
106
+
107
+ actual_annotations = expected_annotations.with_offense_annotations(offenses)
108
+
109
+ assert_equal(expected_annotations.to_s, actual_annotations.to_s)
110
+ end
111
+
112
+ def _investigate(cop, processed_source)
113
+ team = RuboCop::Cop::Team.new([cop], nil, raise_error: true)
114
+ report = team.investigate(processed_source)
115
+ @last_corrector = report.correctors.first || RuboCop::Cop::Corrector.new(processed_source)
116
+ report.offenses
117
+ end
118
+
119
+ def assert_correction(correction, loop: true)
120
+ raise '`assert_correction` must follow `assert_offense`' unless @processed_source
121
+
122
+ iteration = 0
123
+ new_source = loop do
124
+ iteration += 1
125
+
126
+ corrected_source = @last_corrector.rewrite
127
+
128
+ break corrected_source unless loop
129
+ break corrected_source if @last_corrector.empty? || corrected_source == @processed_source.buffer.source
130
+
131
+ if iteration > RuboCop::Runner::MAX_ITERATIONS
132
+ raise RuboCop::Runner::InfiniteCorrectionLoop.new(@processed_source.path, [])
133
+ end
134
+
135
+ # Prepare for next loop
136
+ @processed_source = parse_source!(corrected_source, @processed_source.path)
137
+
138
+ _investigate(@cop, @processed_source)
139
+ end
140
+
141
+ assert_equal(correction, new_source)
142
+ end
143
+
144
+ def setup_assertion
145
+ RuboCop::Formatter::DisabledConfigFormatter.config_to_allow_offenses = {}
146
+ RuboCop::Formatter::DisabledConfigFormatter.detected_styles = {}
147
+ end
148
+
149
+ def inspect_source(source, cop, file = nil)
150
+ processed_source = parse_source!(source, file)
151
+ raise 'Error parsing example code' unless processed_source.valid_syntax?
152
+
153
+ _investigate(cop, processed_source)
154
+ end
155
+
156
+ def investigate(cop, processed_source)
157
+ needed = Hash.new { |h, k| h[k] = [] }
158
+ Array(cop.class.joining_forces).each { |force| needed[force] << cop }
159
+ forces = needed.map do |force_class, joining_cops|
160
+ force_class.new(joining_cops)
161
+ end
162
+
163
+ commissioner = RuboCop::Cop::Commissioner.new([cop], forces, raise_error: true)
164
+ commissioner.investigate(processed_source)
165
+ commissioner
166
+ end
167
+
168
+ def parse_source!(source, file = nil)
169
+ if file.respond_to?(:write)
170
+ file.write(source)
171
+ file.rewind
172
+ file = file.path
173
+ end
174
+
175
+ RuboCop::ProcessedSource.new(source, ruby_version, file)
176
+ end
177
+
178
+ def ruby_version
179
+ 2.5
180
+ end
181
+ end
182
+ end
183
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Require this file to load code that supports testing using Minitest.
4
+
5
+ require 'rubocop'
6
+ require 'minitest/autorun'
7
+ require 'minitest/pride'
8
+ require_relative 'assert_offense'
9
+
10
+ Minitest::Test.include RuboCop::Minitest::AssertOffense
@@ -4,7 +4,7 @@ module RuboCop
4
4
  module Minitest
5
5
  # This module holds the RuboCop Minitest version information.
6
6
  module Version
7
- STRING = '0.15.0'
7
+ STRING = '0.17.0'
8
8
 
9
9
  def self.document_version
10
10
  STRING.match('\d+\.\d+').to_s
@@ -0,0 +1,5 @@
1
+ ### Bug fixes
2
+
3
+ * [#143](https://github.com/rubocop/rubocop-minitest/issues/143): Fix an error for `Minitest/LiteralAsActualArgumentTest` when expected and actual arguments are literals. ([@koic][])
4
+
5
+ [@koic]: https://github.com/koic
@@ -0,0 +1,5 @@
1
+ ### Bug fixes
2
+
3
+ * [#145](https://github.com/rubocop/rubocop-minitest/pull/145): Mark `Minitest/AssertEmptyLiteral` as safe auto-correction. ([@koic][])
4
+
5
+ [@koic]: https://github.com/koic
@@ -0,0 +1,11 @@
1
+ ### New features
2
+
3
+ * [#147](https://github.com/rubocop/rubocop-minitest/issues/147): Add `EnforcedStyle` config parameter for `Minitest/GlobalExpectations`. ([@gi][])
4
+
5
+ ### Bug fixes
6
+
7
+ * [#142](https://github.com/rubocop/rubocop-minitest/issues/142): Fix `Minitest/GlobalExpectations` autocorrect when receiver is lambda. ([@gi][])
8
+ * [#150](https://github.com/rubocop/rubocop-minitest/issues/150): Fix a false positive for `Minitest/AssertEmpty` and `RefuteEmpty` cops when using `empty` method with any arguments. ([@koic][])
9
+
10
+ [@gi]: https://github.com/gi
11
+ [@koic]: https://github.com/koic
@@ -0,0 +1,5 @@
1
+ ### New features
2
+
3
+ * [#155](https://github.com/rubocop/rubocop-minitest/issues/155): Provide `assert_offense`, `assert_correction`, and `assert_no_offenses` testing APIs for custom Minitest cop development. ([@koic][])
4
+
5
+ [@koic]: https://github.com/koic
@@ -22,7 +22,8 @@ Gem::Specification.new do |spec|
22
22
  'changelog_uri' => 'https://github.com/rubocop/rubocop-minitest/blob/master/CHANGELOG.md',
23
23
  'source_code_uri' => 'https://github.com/rubocop/rubocop-minitest',
24
24
  'documentation_uri' => "https://docs.rubocop.org/rubocop-minitest/#{RuboCop::Minitest::Version.document_version}",
25
- 'bug_tracker_uri' => 'https://github.com/rubocop/rubocop-minitest/issues'
25
+ 'bug_tracker_uri' => 'https://github.com/rubocop/rubocop-minitest/issues',
26
+ 'rubygems_mfa_required' => 'true'
26
27
  }
27
28
 
28
29
  # Specify which files should be added to the gem when it is released.
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ autoload :Changelog, "#{__dir__}/changelog"
4
+
5
+ namespace :changelog do
6
+ %i[new fix change].each do |type|
7
+ desc "Create a Changelog entry (#{type})"
8
+ task type, [:id] do |_task, args|
9
+ ref_type = :pull if args[:id]
10
+ path = Changelog::Entry.new(type: type, ref_id: args[:id], ref_type: ref_type).write
11
+ cmd = "git add #{path}"
12
+ system cmd
13
+ puts "Entry '#{path}' created and added to git index"
14
+ end
15
+ end
16
+
17
+ desc 'Merge entries and delete them'
18
+ task :merge do
19
+ raise 'No entries!' unless Changelog.pending?
20
+
21
+ Changelog.new.merge!.and_delete!
22
+ cmd = "git commit -a -m 'Update Changelog'"
23
+ puts cmd
24
+ system cmd
25
+ end
26
+
27
+ task :check_clean do
28
+ next unless Changelog.pending?
29
+
30
+ puts '*** Pending changelog entries!'
31
+ puts 'Do `bundle exec rake changelog:merge`'
32
+ exit(1)
33
+ end
34
+ end
@@ -0,0 +1,166 @@
1
+ # frozen_string_literal: true
2
+
3
+ if RUBY_VERSION < '2.6'
4
+ puts 'Changelog utilities available only for Ruby 2.6+'
5
+ exit(1)
6
+ end
7
+
8
+ # Changelog utility
9
+ class Changelog
10
+ ENTRIES_PATH = 'changelog/'
11
+ FIRST_HEADER = /#{Regexp.escape("## master (unreleased)\n")}/m.freeze
12
+ ENTRIES_PATH_TEMPLATE = "#{ENTRIES_PATH}%<type>s_%<name>s.md"
13
+ TYPE_REGEXP = /#{Regexp.escape(ENTRIES_PATH)}([a-z]+)_/.freeze
14
+ TYPE_TO_HEADER = { new: 'New features', fix: 'Bug fixes', change: 'Changes' }.freeze
15
+ HEADER = /### (.*)/.freeze
16
+ PATH = 'CHANGELOG.md'
17
+ REF_URL = 'https://github.com/rubocop/rubocop-minitest'
18
+ MAX_LENGTH = 40
19
+ CONTRIBUTOR = '[@%<user>s]: https://github.com/%<user>s'
20
+ SIGNATURE = Regexp.new(format(Regexp.escape('[@%<user>s][]'), user: '([\w-]+)'))
21
+ EOF = "\n"
22
+
23
+ # New entry
24
+ Entry = Struct.new(:type, :body, :ref_type, :ref_id, :user, keyword_init: true) do
25
+ def initialize(type:, body: last_commit_title, ref_type: nil, ref_id: nil, user: github_user)
26
+ id, body = extract_id(body)
27
+ ref_id ||= id || 'x'
28
+ ref_type ||= id ? :issues : :pull
29
+ super
30
+ end
31
+
32
+ def write
33
+ Dir.mkdir(ENTRIES_PATH) unless Dir.exist?(ENTRIES_PATH)
34
+ File.write(path, content)
35
+ path
36
+ end
37
+
38
+ def path
39
+ format(ENTRIES_PATH_TEMPLATE, type: type, name: str_to_filename(body))
40
+ end
41
+
42
+ def content
43
+ period = '.' unless body.end_with? '.'
44
+ "* #{ref}: #{body}#{period} ([@#{user}][])\n"
45
+ end
46
+
47
+ def ref
48
+ "[##{ref_id}](#{REF_URL}/#{ref_type}/#{ref_id})"
49
+ end
50
+
51
+ def last_commit_title
52
+ `git log -1 --pretty=%B`.lines.first.chomp
53
+ end
54
+
55
+ def extract_id(body)
56
+ /^\[Fix(?:es)? #(\d+)\] (.*)/.match(body)&.captures || [nil, body]
57
+ end
58
+
59
+ def str_to_filename(str)
60
+ str
61
+ .downcase
62
+ .split
63
+ .each { |s| s.gsub!(/\W/, '') }
64
+ .reject(&:empty?)
65
+ .inject do |result, word|
66
+ s = "#{result}_#{word}"
67
+ return result if s.length > MAX_LENGTH
68
+
69
+ s
70
+ end
71
+ end
72
+
73
+ def github_user
74
+ user = `git config --global credential.username`.chomp
75
+ warn 'Set your username with `git config --global credential.username "myusernamehere"`' if user.empty?
76
+
77
+ user
78
+ end
79
+ end
80
+ attr_reader :header, :rest
81
+
82
+ def initialize(content: File.read(PATH), entries: Changelog.read_entries)
83
+ require 'strscan'
84
+
85
+ parse(content)
86
+ @entries = entries
87
+ end
88
+
89
+ def and_delete!
90
+ @entries.each_key { |path| File.delete(path) }
91
+ end
92
+
93
+ def merge!
94
+ File.write(PATH, merge_content)
95
+ self
96
+ end
97
+
98
+ def unreleased_content
99
+ entry_map = parse_entries(@entries)
100
+ merged_map = merge_entries(entry_map)
101
+ merged_map.flat_map { |header, things| ["### #{header}\n", *things, ''] }.join("\n")
102
+ end
103
+
104
+ def merge_content
105
+ merged_content = [@header, unreleased_content, @rest.chomp, *new_contributor_lines].join("\n")
106
+
107
+ merged_content << EOF
108
+ end
109
+
110
+ def self.pending?
111
+ entry_paths.any?
112
+ end
113
+
114
+ def self.entry_paths
115
+ Dir["#{ENTRIES_PATH}*"]
116
+ end
117
+
118
+ def self.read_entries
119
+ entry_paths.to_h { |path| [path, File.read(path)] }
120
+ end
121
+
122
+ def new_contributor_lines
123
+ contributors
124
+ .map { |user| format(CONTRIBUTOR, user: user) }
125
+ .reject { |line| @rest.include?(line) }
126
+ end
127
+
128
+ def contributors
129
+ contributors = @entries.values.flat_map do |entry|
130
+ entry.match(/\. \((?<contributors>.+)\)\n/)[:contributors].split(',')
131
+ end
132
+
133
+ contributors.join.scan(SIGNATURE).flatten
134
+ end
135
+
136
+ private
137
+
138
+ def merge_entries(entry_map)
139
+ all = @unreleased.merge(entry_map) { |_k, v1, v2| v1.concat(v2) }
140
+ canonical = TYPE_TO_HEADER.values.to_h { |v| [v, nil] }
141
+ canonical.merge(all).compact
142
+ end
143
+
144
+ def parse(content)
145
+ ss = StringScanner.new(content)
146
+ @header = ss.scan_until(FIRST_HEADER)
147
+ @unreleased = parse_release(ss.scan_until(/\n(?=## )/m))
148
+ @rest = ss.rest
149
+ end
150
+
151
+ # @return [Hash<type, Array<String>]]
152
+ def parse_release(unreleased)
153
+ unreleased.lines.map(&:chomp).reject(&:empty?).slice_before(HEADER).to_h do |header, *entries|
154
+ [HEADER.match(header)[1], entries]
155
+ end
156
+ end
157
+
158
+ def parse_entries(path_content_map)
159
+ changes = Hash.new { |h, k| h[k] = [] }
160
+ path_content_map.each do |path, content|
161
+ header = TYPE_TO_HEADER.fetch(TYPE_REGEXP.match(path)[1].to_sym)
162
+ changes[header].concat(content.lines.map(&:chomp))
163
+ end
164
+ changes
165
+ end
166
+ end
@@ -10,24 +10,14 @@ YARD::Rake::YardocTask.new(:yard_for_generate_documentation) do |task|
10
10
  task.options = ['--no-output']
11
11
  end
12
12
 
13
- desc 'Generate docs of all cops departments'
14
- task generate_cops_documentation: :yard_for_generate_documentation do
13
+ task update_cops_documentation: :yard_for_generate_documentation do
15
14
  deps = ['Minitest']
16
15
  CopsDocumentationGenerator.new(departments: deps).call
17
16
  end
18
17
 
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
24
-
25
- # Output diff before raising error
26
- sh('GIT_PAGER=cat git diff docs')
27
-
28
- warn 'The docs directory is out of sync. Run `rake generate_cops_documentation` and commit the results.'
29
- exit!
30
- end
18
+ desc 'Generate docs of all cops departments (obsolete)'
19
+ task :generate_cops_documentation do
20
+ puts 'Updating the documentation is now done automatically!'
31
21
  end
32
22
 
33
23
  desc 'Syntax check for the documentation comments'
@@ -4,9 +4,8 @@ require 'bump'
4
4
 
5
5
  namespace :cut_release do
6
6
  %w[major minor patch pre].each do |release_type|
7
- desc "Cut a new #{release_type} release, create release notes " \
8
- 'and update documents.'
9
- task release_type do
7
+ desc "Cut a new #{release_type} release, create release notes and update documents."
8
+ task release_type => 'changelog:check_clean' do
10
9
  run(release_type)
11
10
  end
12
11
  end
@@ -50,12 +49,25 @@ namespace :cut_release do
50
49
  version.split('.').take(2).join('.')
51
50
  end
52
51
 
52
+ # Replace `<<next>>` (and variations) with version being cut.
53
+ def update_cop_versions(_old_version, new_version)
54
+ update_file('config/default.yml') do |default|
55
+ default.gsub(/['"]?<<\s*next\s*>>['"]?/i,
56
+ "'#{version_sans_patch(new_version)}'")
57
+ end
58
+ end
59
+
53
60
  def new_version_changes
54
61
  changelog = File.read('CHANGELOG.md')
55
62
  _, _, new_changes, _older_changes = changelog.split(/^## .*$/, 4)
56
63
  new_changes
57
64
  end
58
65
 
66
+ def update_file(path)
67
+ content = File.read(path)
68
+ File.write(path, yield(content))
69
+ end
70
+
59
71
  def user_links(text)
60
72
  names = text.scan(/\[@(\S+)\]\[\]/).map(&:first).uniq
61
73
  names.map { |name| "[@#{name}]: https://github.com/#{name}" }
@@ -67,6 +79,9 @@ namespace :cut_release do
67
79
  Bump::Bump.run(release_type, commit: false, bundle: false, tag: false)
68
80
  new_version = Bump::Bump.current
69
81
 
82
+ update_cop_versions(old_version, new_version)
83
+ Rake::Task['update_cops_documentation'].invoke
84
+
70
85
  add_header_to_changelog(new_version)
71
86
  create_release_notes(new_version)
72
87
  update_antora_yml(new_version)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubocop-minitest
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.15.0
4
+ version: 0.17.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bozhidar Batsov
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: exe
12
12
  cert_chain: []
13
- date: 2021-08-09 00:00:00.000000000 Z
13
+ date: 2021-11-22 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rubocop
@@ -60,9 +60,11 @@ files:
60
60
  - ".github/ISSUE_TEMPLATE/bug_report.md"
61
61
  - ".github/ISSUE_TEMPLATE/feature_request.md"
62
62
  - ".github/PULL_REQUEST_TEMPLATE.md"
63
+ - ".github/workflows/spell_checking.yml"
63
64
  - ".gitignore"
64
65
  - ".rubocop.yml"
65
66
  - ".rubocop_todo.yml"
67
+ - ".yardopts"
66
68
  - CHANGELOG.md
67
69
  - CONTRIBUTING.md
68
70
  - Gemfile
@@ -71,6 +73,7 @@ files:
71
73
  - Rakefile
72
74
  - bin/console
73
75
  - bin/setup
76
+ - codespell.txt
74
77
  - config/default.yml
75
78
  - docs/antora.yml
76
79
  - docs/modules/ROOT/nav.adoc
@@ -127,7 +130,9 @@ files:
127
130
  - lib/rubocop/cop/mixin/minitest_exploration_helpers.rb
128
131
  - lib/rubocop/cop/mixin/nil_assertion_handleable.rb
129
132
  - lib/rubocop/minitest.rb
133
+ - lib/rubocop/minitest/assert_offense.rb
130
134
  - lib/rubocop/minitest/inject.rb
135
+ - lib/rubocop/minitest/support.rb
131
136
  - lib/rubocop/minitest/version.rb
132
137
  - mkdocs.yml
133
138
  - readthedocs.yml
@@ -143,6 +148,10 @@ files:
143
148
  - relnotes/v0.13.0.md
144
149
  - relnotes/v0.14.0.md
145
150
  - relnotes/v0.15.0.md
151
+ - relnotes/v0.15.1.md
152
+ - relnotes/v0.15.2.md
153
+ - relnotes/v0.16.0.md
154
+ - relnotes/v0.17.0.md
146
155
  - relnotes/v0.2.0.md
147
156
  - relnotes/v0.2.1.md
148
157
  - relnotes/v0.3.0.md
@@ -158,6 +167,8 @@ files:
158
167
  - relnotes/v0.8.1.md
159
168
  - relnotes/v0.9.0.md
160
169
  - rubocop-minitest.gemspec
170
+ - tasks/changelog.rake
171
+ - tasks/changelog.rb
161
172
  - tasks/cops_documentation.rake
162
173
  - tasks/cut_release.rake
163
174
  homepage:
@@ -167,8 +178,9 @@ metadata:
167
178
  homepage_uri: https://docs.rubocop.org/rubocop-minitest/
168
179
  changelog_uri: https://github.com/rubocop/rubocop-minitest/blob/master/CHANGELOG.md
169
180
  source_code_uri: https://github.com/rubocop/rubocop-minitest
170
- documentation_uri: https://docs.rubocop.org/rubocop-minitest/0.15
181
+ documentation_uri: https://docs.rubocop.org/rubocop-minitest/0.17
171
182
  bug_tracker_uri: https://github.com/rubocop/rubocop-minitest/issues
183
+ rubygems_mfa_required: 'true'
172
184
  post_install_message:
173
185
  rdoc_options: []
174
186
  require_paths:
@@ -184,7 +196,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
184
196
  - !ruby/object:Gem::Version
185
197
  version: '0'
186
198
  requirements: []
187
- rubygems_version: 3.2.18
199
+ rubygems_version: 3.3.0.dev
188
200
  signing_key:
189
201
  specification_version: 4
190
202
  summary: Automatic Minitest code style checking tool.