rubocop-minitest 0.10.1 → 0.12.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.circleci/config.yml +18 -3
- data/.github/ISSUE_TEMPLATE/bug_report.md +5 -1
- data/.rubocop.yml +5 -1
- data/.rubocop_todo.yml +8 -7
- data/CHANGELOG.md +95 -50
- data/CONTRIBUTING.md +3 -3
- data/Gemfile +2 -2
- data/LICENSE.txt +1 -1
- data/README.md +18 -2
- data/Rakefile +1 -1
- data/bin/console +2 -0
- data/config/default.yml +15 -4
- data/docs/antora.yml +1 -1
- data/docs/modules/ROOT/pages/cops.adoc +14 -1
- data/docs/modules/ROOT/pages/cops_minitest.adoc +79 -8
- data/docs/modules/ROOT/pages/index.adoc +1 -1
- data/legacy-docs/cops_minitest.md +16 -16
- data/legacy-docs/index.md +1 -1
- data/lib/rubocop/cop/minitest/assert_empty.rb +1 -1
- data/lib/rubocop/cop/minitest/assert_empty_literal.rb +12 -16
- data/lib/rubocop/cop/minitest/assert_equal.rb +1 -1
- data/lib/rubocop/cop/minitest/assert_in_delta.rb +4 -1
- data/lib/rubocop/cop/minitest/assert_includes.rb +1 -1
- data/lib/rubocop/cop/minitest/assert_instance_of.rb +1 -1
- data/lib/rubocop/cop/minitest/assert_kind_of.rb +1 -1
- data/lib/rubocop/cop/minitest/assert_match.rb +1 -1
- data/lib/rubocop/cop/minitest/assert_nil.rb +5 -11
- data/lib/rubocop/cop/minitest/assert_output.rb +1 -1
- data/lib/rubocop/cop/minitest/assert_path_exists.rb +6 -12
- data/lib/rubocop/cop/minitest/assert_respond_to.rb +1 -1
- data/lib/rubocop/cop/minitest/assert_silent.rb +8 -6
- data/lib/rubocop/cop/minitest/assert_truthy.rb +5 -11
- data/lib/rubocop/cop/minitest/assert_with_expected_argument.rb +41 -0
- data/lib/rubocop/cop/minitest/assertion_in_lifecycle_hook.rb +1 -1
- data/lib/rubocop/cop/minitest/global_expectations.rb +6 -7
- data/lib/rubocop/cop/minitest/literal_as_actual_argument.rb +15 -14
- data/lib/rubocop/cop/minitest/multiple_assertions.rb +2 -2
- data/lib/rubocop/cop/minitest/no_assertions.rb +48 -0
- data/lib/rubocop/cop/minitest/refute_empty.rb +1 -1
- data/lib/rubocop/cop/minitest/refute_equal.rb +7 -8
- data/lib/rubocop/cop/minitest/refute_false.rb +15 -22
- data/lib/rubocop/cop/minitest/refute_in_delta.rb +4 -1
- data/lib/rubocop/cop/minitest/refute_includes.rb +1 -1
- data/lib/rubocop/cop/minitest/refute_instance_of.rb +1 -1
- data/lib/rubocop/cop/minitest/refute_kind_of.rb +1 -1
- data/lib/rubocop/cop/minitest/refute_match.rb +1 -1
- data/lib/rubocop/cop/minitest/refute_nil.rb +4 -8
- data/lib/rubocop/cop/minitest/refute_path_exists.rb +6 -12
- data/lib/rubocop/cop/minitest/refute_respond_to.rb +1 -1
- data/lib/rubocop/cop/minitest/test_method_name.rb +18 -8
- data/lib/rubocop/cop/minitest/unspecified_exception.rb +1 -1
- data/lib/rubocop/cop/minitest_cops.rb +2 -0
- data/lib/rubocop/cop/mixin/in_delta_mixin.rb +5 -15
- data/lib/rubocop/cop/mixin/minitest_cop_rule.rb +13 -13
- data/lib/rubocop/cop/mixin/minitest_exploration_helpers.rb +27 -3
- data/lib/rubocop/minitest/version.rb +8 -1
- data/mkdocs.yml +2 -2
- data/relnotes/v0.1.0.md +1 -1
- data/relnotes/v0.10.0.md +12 -12
- data/relnotes/v0.10.1.md +1 -1
- data/relnotes/v0.10.2.md +5 -0
- data/relnotes/v0.10.3.md +5 -0
- data/relnotes/v0.11.0.md +16 -0
- data/relnotes/v0.11.1.md +5 -0
- data/relnotes/v0.12.0.md +10 -0
- data/relnotes/v0.2.0.md +4 -4
- data/relnotes/v0.2.1.md +1 -1
- data/relnotes/v0.3.0.md +6 -6
- data/relnotes/v0.4.0.md +5 -5
- data/relnotes/v0.4.1.md +1 -1
- data/relnotes/v0.5.0.md +1 -1
- data/relnotes/v0.5.1.md +1 -1
- data/relnotes/v0.6.0.md +1 -1
- data/relnotes/v0.6.1.md +2 -2
- data/relnotes/v0.6.2.md +1 -1
- data/relnotes/v0.7.0.md +5 -5
- data/relnotes/v0.8.0.md +4 -4
- data/relnotes/v0.8.1.md +1 -1
- data/relnotes/v0.9.0.md +3 -3
- data/rubocop-minitest.gemspec +7 -7
- data/tasks/cops_documentation.rake +24 -304
- metadata +28 -15
@@ -18,13 +18,15 @@ module RuboCop
|
|
18
18
|
# refute(actual)
|
19
19
|
# refute(actual, 'message')
|
20
20
|
#
|
21
|
-
class RefuteFalse <
|
21
|
+
class RefuteFalse < Base
|
22
22
|
include ArgumentRangeHelper
|
23
|
+
extend AutoCorrector
|
23
24
|
|
24
25
|
MSG_FOR_ASSERT_EQUAL = 'Prefer using `refute(%<arguments>s)` over ' \
|
25
26
|
'`assert_equal(false, %<arguments>s)`.'
|
26
27
|
MSG_FOR_ASSERT = 'Prefer using `refute(%<arguments>s)` over ' \
|
27
28
|
'`assert(!%<arguments>s)`.'
|
29
|
+
RESTRICT_ON_SEND = %i[assert_equal assert].freeze
|
28
30
|
|
29
31
|
def_node_matcher :assert_equal_with_false, <<~PATTERN
|
30
32
|
(send nil? :assert_equal false $_ $...)
|
@@ -35,38 +37,29 @@ module RuboCop
|
|
35
37
|
PATTERN
|
36
38
|
|
37
39
|
def on_send(node)
|
38
|
-
actual, rest_receiver_arg = assert_equal_with_false(node) ||
|
39
|
-
assert_with_bang_argument(node)
|
40
|
+
actual, rest_receiver_arg = assert_equal_with_false(node) || assert_with_bang_argument(node)
|
40
41
|
return unless actual
|
41
42
|
|
42
43
|
message_argument = rest_receiver_arg.first
|
43
44
|
|
44
45
|
arguments = [actual.source, message_argument&.source].compact.join(', ')
|
45
46
|
|
46
|
-
message =
|
47
|
-
MSG_FOR_ASSERT_EQUAL
|
48
|
-
else
|
49
|
-
MSG_FOR_ASSERT
|
50
|
-
end
|
47
|
+
message = node.method?(:assert_equal) ? MSG_FOR_ASSERT_EQUAL : MSG_FOR_ASSERT
|
51
48
|
|
52
|
-
add_offense(node, message: format(message, arguments: arguments))
|
49
|
+
add_offense(node, message: format(message, arguments: arguments)) do |corrector|
|
50
|
+
autocorrect(corrector, node, actual)
|
51
|
+
end
|
53
52
|
end
|
54
53
|
|
55
|
-
|
56
|
-
lambda do |corrector|
|
57
|
-
corrector.replace(node.loc.selector, 'refute')
|
54
|
+
private
|
58
55
|
|
59
|
-
|
60
|
-
|
61
|
-
first_and_second_arguments_range(node), actual.source
|
62
|
-
)
|
63
|
-
end
|
56
|
+
def autocorrect(corrector, node, actual)
|
57
|
+
corrector.replace(node.loc.selector, 'refute')
|
64
58
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
end
|
59
|
+
if node.method?(:assert_equal)
|
60
|
+
corrector.replace(first_and_second_arguments_range(node), actual.source)
|
61
|
+
else
|
62
|
+
corrector.replace(first_argument_range(node), actual.source)
|
70
63
|
end
|
71
64
|
end
|
72
65
|
end
|
@@ -15,8 +15,11 @@ module RuboCop
|
|
15
15
|
# refute_in_delta(0.2, actual)
|
16
16
|
# refute_in_delta(0.2, actual, 0.001, 'message')
|
17
17
|
#
|
18
|
-
class RefuteInDelta <
|
18
|
+
class RefuteInDelta < Base
|
19
19
|
include InDeltaMixin
|
20
|
+
extend AutoCorrector
|
21
|
+
|
22
|
+
RESTRICT_ON_SEND = %i[refute_equal].freeze
|
20
23
|
|
21
24
|
def_node_matcher :equal_floats_call, <<~PATTERN
|
22
25
|
(send nil? :refute_equal $_ $_ $...)
|
@@ -15,7 +15,7 @@ module RuboCop
|
|
15
15
|
# refute_includes(collection, object)
|
16
16
|
# refute_includes(collection, object, 'message')
|
17
17
|
#
|
18
|
-
class RefuteIncludes <
|
18
|
+
class RefuteIncludes < Base
|
19
19
|
extend MinitestCopRule
|
20
20
|
|
21
21
|
define_rule :refute, target_method: :include?, preferred_method: :refute_includes
|
@@ -15,7 +15,7 @@ module RuboCop
|
|
15
15
|
# refute_instance_of(Class, object)
|
16
16
|
# refute_instance_of(Class, object, 'message')
|
17
17
|
#
|
18
|
-
class RefuteInstanceOf <
|
18
|
+
class RefuteInstanceOf < Base
|
19
19
|
extend MinitestCopRule
|
20
20
|
|
21
21
|
define_rule :refute, target_method: :instance_of?, inverse: true
|
@@ -15,11 +15,13 @@ module RuboCop
|
|
15
15
|
# refute_nil(actual)
|
16
16
|
# refute_nil(actual, 'message')
|
17
17
|
#
|
18
|
-
class RefuteNil <
|
18
|
+
class RefuteNil < Base
|
19
19
|
include ArgumentRangeHelper
|
20
|
+
extend AutoCorrector
|
20
21
|
|
21
22
|
MSG = 'Prefer using `refute_nil(%<arguments>s)` over ' \
|
22
23
|
'`refute_equal(nil, %<arguments>s)`.'
|
24
|
+
RESTRICT_ON_SEND = %i[refute_equal].freeze
|
23
25
|
|
24
26
|
def_node_matcher :refute_equal_with_nil, <<~PATTERN
|
25
27
|
(send nil? :refute_equal nil $_ $...)
|
@@ -31,13 +33,7 @@ module RuboCop
|
|
31
33
|
|
32
34
|
arguments = [actual.source, message&.source].compact.join(', ')
|
33
35
|
|
34
|
-
add_offense(node, message: format(MSG, arguments: arguments))
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
def autocorrect(node)
|
39
|
-
lambda do |corrector|
|
40
|
-
refute_equal_with_nil(node) do |actual|
|
36
|
+
add_offense(node, message: format(MSG, arguments: arguments)) do |corrector|
|
41
37
|
corrector.replace(node.loc.selector, 'refute_nil')
|
42
38
|
corrector.replace(
|
43
39
|
first_and_second_arguments_range(node), actual.source
|
@@ -15,8 +15,11 @@ module RuboCop
|
|
15
15
|
# refute_path_exists(path)
|
16
16
|
# refute_path_exists(path, 'message')
|
17
17
|
#
|
18
|
-
class RefutePathExists <
|
18
|
+
class RefutePathExists < Base
|
19
|
+
extend AutoCorrector
|
20
|
+
|
19
21
|
MSG = 'Prefer using `%<good_method>s` over `%<bad_method>s`.'
|
22
|
+
RESTRICT_ON_SEND = %i[refute].freeze
|
20
23
|
|
21
24
|
def_node_matcher :refute_file_exists, <<~PATTERN
|
22
25
|
(send nil? :refute
|
@@ -31,17 +34,8 @@ module RuboCop
|
|
31
34
|
good_method = build_good_method(path, failure_message)
|
32
35
|
message = format(MSG, good_method: good_method, bad_method: node.source)
|
33
36
|
|
34
|
-
add_offense(node, message: message)
|
35
|
-
|
36
|
-
end
|
37
|
-
|
38
|
-
def autocorrect(node)
|
39
|
-
refute_file_exists(node) do |path, failure_message|
|
40
|
-
failure_message = failure_message.first
|
41
|
-
|
42
|
-
lambda do |corrector|
|
43
|
-
replacement = build_good_method(path, failure_message)
|
44
|
-
corrector.replace(node, replacement)
|
37
|
+
add_offense(node, message: message) do |corrector|
|
38
|
+
corrector.replace(node, good_method)
|
45
39
|
end
|
46
40
|
end
|
47
41
|
end
|
@@ -17,7 +17,7 @@ module RuboCop
|
|
17
17
|
# refute_respond_to(object, :do_something, 'message')
|
18
18
|
# refute_respond_to(self, :do_something)
|
19
19
|
#
|
20
|
-
class RefuteRespondTo <
|
20
|
+
class RefuteRespondTo < Base
|
21
21
|
extend MinitestCopRule
|
22
22
|
|
23
23
|
define_rule :refute, target_method: :respond_to?
|
@@ -4,6 +4,7 @@ module RuboCop
|
|
4
4
|
module Cop
|
5
5
|
module Minitest
|
6
6
|
# This cop enforces that test method names start with `test_` prefix.
|
7
|
+
# It aims to prevent tests that aren't executed by forgetting to start test method name with `test_`.
|
7
8
|
#
|
8
9
|
# @example
|
9
10
|
# # bad
|
@@ -20,9 +21,16 @@ module RuboCop
|
|
20
21
|
# end
|
21
22
|
# end
|
22
23
|
#
|
23
|
-
|
24
|
+
# # good
|
25
|
+
# class FooTest < Minitest::Test
|
26
|
+
# def helper_method(argument)
|
27
|
+
# end
|
28
|
+
# end
|
29
|
+
#
|
30
|
+
class TestMethodName < Base
|
24
31
|
include MinitestExplorationHelpers
|
25
32
|
include DefNode
|
33
|
+
extend AutoCorrector
|
26
34
|
|
27
35
|
MSG = 'Test method name should start with `test_` prefix.'
|
28
36
|
|
@@ -30,13 +38,13 @@ module RuboCop
|
|
30
38
|
return unless test_class?(class_node)
|
31
39
|
|
32
40
|
class_elements(class_node).each do |node|
|
33
|
-
|
34
|
-
end
|
35
|
-
end
|
41
|
+
next unless offense?(node)
|
36
42
|
|
37
|
-
|
38
|
-
|
39
|
-
|
43
|
+
test_method_name = node.loc.name
|
44
|
+
|
45
|
+
add_offense(test_method_name) do |corrector|
|
46
|
+
corrector.replace(test_method_name, "test_#{node.method_name}")
|
47
|
+
end
|
40
48
|
end
|
41
49
|
end
|
42
50
|
|
@@ -54,7 +62,9 @@ module RuboCop
|
|
54
62
|
end
|
55
63
|
|
56
64
|
def offense?(node)
|
57
|
-
|
65
|
+
return false if assertions(node).none?
|
66
|
+
|
67
|
+
public?(node) && node.arguments.empty? && !test_method_name?(node) && !lifecycle_hook_method?(node)
|
58
68
|
end
|
59
69
|
|
60
70
|
def public?(node)
|
@@ -14,7 +14,7 @@ module RuboCop
|
|
14
14
|
# assert_raises(FooException) { raise FooException }
|
15
15
|
# assert_raises(FooException, 'This should have raised') { raise FooException }
|
16
16
|
#
|
17
|
-
class UnspecifiedException <
|
17
|
+
class UnspecifiedException < Base
|
18
18
|
MSG = 'Specify the exception being captured.'
|
19
19
|
|
20
20
|
def on_block(block_node)
|
@@ -8,6 +8,7 @@ require_relative 'minitest/assert_empty'
|
|
8
8
|
require_relative 'minitest/assert_empty_literal'
|
9
9
|
require_relative 'minitest/assert_equal'
|
10
10
|
require_relative 'minitest/assert_in_delta'
|
11
|
+
require_relative 'minitest/assert_with_expected_argument'
|
11
12
|
require_relative 'minitest/assertion_in_lifecycle_hook'
|
12
13
|
require_relative 'minitest/assert_kind_of'
|
13
14
|
require_relative 'minitest/assert_nil'
|
@@ -22,6 +23,7 @@ require_relative 'minitest/assert_truthy'
|
|
22
23
|
require_relative 'minitest/global_expectations'
|
23
24
|
require_relative 'minitest/literal_as_actual_argument'
|
24
25
|
require_relative 'minitest/multiple_assertions'
|
26
|
+
require_relative 'minitest/no_assertions'
|
25
27
|
require_relative 'minitest/refute_empty'
|
26
28
|
require_relative 'minitest/refute_false'
|
27
29
|
require_relative 'minitest/refute_equal'
|
@@ -9,24 +9,14 @@ module RuboCop
|
|
9
9
|
def on_send(node)
|
10
10
|
equal_floats_call(node) do |expected, actual, message|
|
11
11
|
message = message.first
|
12
|
+
good_method = build_good_method(expected, actual, message)
|
12
13
|
|
13
14
|
if expected.float_type? || actual.float_type?
|
14
|
-
message = format(MSG,
|
15
|
-
good_method: build_good_method(expected, actual, message),
|
16
|
-
bad_method: node.source)
|
15
|
+
message = format(MSG, good_method: good_method, bad_method: node.source)
|
17
16
|
|
18
|
-
add_offense(node, message: message)
|
19
|
-
|
20
|
-
|
21
|
-
end
|
22
|
-
|
23
|
-
def autocorrect(node)
|
24
|
-
equal_floats_call(node) do |expected, actual, message|
|
25
|
-
message = message.first
|
26
|
-
replacement = build_good_method(expected, actual, message)
|
27
|
-
|
28
|
-
lambda do |corrector|
|
29
|
-
corrector.replace(node, replacement)
|
17
|
+
add_offense(node, message: message) do |corrector|
|
18
|
+
corrector.replace(node, good_method)
|
19
|
+
end
|
30
20
|
end
|
31
21
|
end
|
32
22
|
end
|
@@ -26,38 +26,38 @@ module RuboCop
|
|
26
26
|
|
27
27
|
class_eval(<<~RUBY, __FILE__, __LINE__ + 1)
|
28
28
|
include ArgumentRangeHelper
|
29
|
+
extend AutoCorrector
|
29
30
|
|
30
31
|
MSG = 'Prefer using `#{preferred_method}(%<new_arguments>s)` over ' \
|
31
32
|
'`#{assertion_method}(%<original_arguments>s)`.'
|
33
|
+
RESTRICT_ON_SEND = %i[#{assertion_method}].freeze
|
32
34
|
|
33
35
|
def on_send(node)
|
34
36
|
return unless node.method?(:#{assertion_method})
|
35
37
|
return unless (arguments = peel_redundant_parentheses_from(node.arguments))
|
36
38
|
return unless arguments.first.respond_to?(:method?) && arguments.first.method?(:#{target_method})
|
37
39
|
|
38
|
-
add_offense(node, message: offense_message(arguments))
|
40
|
+
add_offense(node, message: offense_message(arguments)) do |corrector|
|
41
|
+
autocorrect(corrector, node, arguments)
|
42
|
+
end
|
39
43
|
end
|
40
44
|
|
41
|
-
def autocorrect(node)
|
42
|
-
|
43
|
-
corrector.replace(node.loc.selector, '#{preferred_method}')
|
44
|
-
|
45
|
-
arguments = peel_redundant_parentheses_from(node.arguments)
|
45
|
+
def autocorrect(corrector, node, arguments)
|
46
|
+
corrector.replace(node.loc.selector, '#{preferred_method}')
|
46
47
|
|
47
|
-
|
48
|
+
new_arguments = new_arguments(arguments).join(', ')
|
48
49
|
|
49
|
-
|
50
|
-
|
51
|
-
end
|
52
|
-
|
53
|
-
corrector.replace(first_argument_range(node), new_arguments)
|
50
|
+
if enclosed_in_redundant_parentheses?(node)
|
51
|
+
new_arguments = '(' + new_arguments + ')'
|
54
52
|
end
|
53
|
+
|
54
|
+
corrector.replace(first_argument_range(node), new_arguments)
|
55
55
|
end
|
56
56
|
|
57
57
|
private
|
58
58
|
|
59
59
|
def peel_redundant_parentheses_from(arguments)
|
60
|
-
return arguments unless arguments.first
|
60
|
+
return arguments unless arguments.first&.begin_type?
|
61
61
|
|
62
62
|
peel_redundant_parentheses_from(arguments.first.children)
|
63
63
|
end
|
@@ -10,6 +10,17 @@ module RuboCop
|
|
10
10
|
|
11
11
|
ASSERTION_PREFIXES = %w[assert refute].freeze
|
12
12
|
|
13
|
+
ASSERTION_METHODS = %i[
|
14
|
+
assert assert_empty assert_equal assert_in_delta assert_in_epsilon assert_includes assert_instance_of
|
15
|
+
assert_kind_of assert_match assert_nil assert_operator assert_output assert_path_exists assert_predicate
|
16
|
+
assert_raises assert_respond_to assert_same assert_send assert_silent assert_throws
|
17
|
+
refute refute_empty refute_equal refute_in_delta refute_in_epsilon refute_includes refute_instance_of
|
18
|
+
refute_kind_of refute_match refute_nil refute_operator refute_path_exists refute_predicate
|
19
|
+
refute_respond_to refute_same
|
20
|
+
].freeze
|
21
|
+
|
22
|
+
FLUNK = 'flunk'
|
23
|
+
|
13
24
|
LIFECYCLE_HOOK_METHODS = %i[
|
14
25
|
before_setup
|
15
26
|
setup
|
@@ -33,8 +44,8 @@ module RuboCop
|
|
33
44
|
end
|
34
45
|
|
35
46
|
def test_cases(class_node)
|
36
|
-
class_def_nodes(class_node)
|
37
|
-
|
47
|
+
(class_def_nodes(class_node).select { |def_node| test_case_name?(def_node.method_name) }) +
|
48
|
+
test_method_calls(class_node)
|
38
49
|
end
|
39
50
|
|
40
51
|
def lifecycle_hooks(class_node)
|
@@ -53,6 +64,12 @@ module RuboCop
|
|
53
64
|
end
|
54
65
|
end
|
55
66
|
|
67
|
+
# support https://api.rubyonrails.org/classes/ActiveSupport/Testing/Declarative.html
|
68
|
+
def test_method_calls(class_node)
|
69
|
+
block_nodes = class_node.each_descendant(:block)
|
70
|
+
block_nodes.select { |block_node| block_node.method?(:test) }
|
71
|
+
end
|
72
|
+
|
56
73
|
def test_case_name?(name)
|
57
74
|
name.to_s.start_with?('test_')
|
58
75
|
end
|
@@ -73,7 +90,14 @@ module RuboCop
|
|
73
90
|
|
74
91
|
def assertion?(node)
|
75
92
|
node.send_type? &&
|
76
|
-
ASSERTION_PREFIXES.any?
|
93
|
+
ASSERTION_PREFIXES.any? do |prefix|
|
94
|
+
method_name = node.method_name.to_s
|
95
|
+
method_name == FLUNK || method_name.start_with?(prefix)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def assertion_method?(method_name)
|
100
|
+
method_name == FLUNK || ASSERTION_METHODS.include?(method_name)
|
77
101
|
end
|
78
102
|
|
79
103
|
def lifecycle_hook_method?(node)
|
data/mkdocs.yml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
site_name: "A RuboCop extension focused on enforcing Minitest best practices and coding conventions."
|
2
|
-
repo_url: https://github.com/rubocop
|
2
|
+
repo_url: https://github.com/rubocop/rubocop-minitest
|
3
3
|
edit_uri: edit/master/legacy-docs/
|
4
|
-
copyright: "Copyright ©
|
4
|
+
copyright: "Copyright © 2021 Bozhidar Batsov, Jonas Arvidsson, Koichi ITO, and RuboCop contributors"
|
5
5
|
docs_dir: legacy-docs
|
6
6
|
pages:
|
7
7
|
- Home: index.md
|