sabat-rubocop 0.9.0
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.
- data/.gitignore +50 -0
- data/.rspec +1 -0
- data/.rubocop.yml +7 -0
- data/.travis.yml +7 -0
- data/.yardopts +2 -0
- data/CHANGELOG.md +268 -0
- data/CONTRIBUTING.md +16 -0
- data/Gemfile +7 -0
- data/LICENSE.txt +20 -0
- data/README.md +324 -0
- data/Rakefile +29 -0
- data/bin/rubocop +22 -0
- data/config/default.yml +58 -0
- data/config/disabled.yml +5 -0
- data/config/enabled.yml +403 -0
- data/lib/rubocop.rb +116 -0
- data/lib/rubocop/cli.rb +407 -0
- data/lib/rubocop/config.rb +250 -0
- data/lib/rubocop/config_store.rb +39 -0
- data/lib/rubocop/cop/cop.rb +138 -0
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +54 -0
- data/lib/rubocop/cop/lint/end_alignment.rb +189 -0
- data/lib/rubocop/cop/lint/end_in_method.rb +30 -0
- data/lib/rubocop/cop/lint/ensure_return.rb +22 -0
- data/lib/rubocop/cop/lint/eval.rb +22 -0
- data/lib/rubocop/cop/lint/handle_exceptions.rb +20 -0
- data/lib/rubocop/cop/lint/literal_in_condition.rb +81 -0
- data/lib/rubocop/cop/lint/loop.rb +29 -0
- data/lib/rubocop/cop/lint/rescue_exception.rb +29 -0
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +34 -0
- data/lib/rubocop/cop/lint/unreachable_code.rb +35 -0
- data/lib/rubocop/cop/lint/unused_local_variable.rb +32 -0
- data/lib/rubocop/cop/lint/void.rb +58 -0
- data/lib/rubocop/cop/offence.rb +136 -0
- data/lib/rubocop/cop/rails/validation.rb +30 -0
- data/lib/rubocop/cop/style/access_control.rb +58 -0
- data/lib/rubocop/cop/style/alias.rb +28 -0
- data/lib/rubocop/cop/style/align_parameters.rb +39 -0
- data/lib/rubocop/cop/style/and_or.rb +45 -0
- data/lib/rubocop/cop/style/ascii_comments.rb +21 -0
- data/lib/rubocop/cop/style/ascii_identifiers.rb +22 -0
- data/lib/rubocop/cop/style/attr.rb +20 -0
- data/lib/rubocop/cop/style/avoid_class_vars.rb +20 -0
- data/lib/rubocop/cop/style/avoid_for.rb +18 -0
- data/lib/rubocop/cop/style/avoid_global_vars.rb +65 -0
- data/lib/rubocop/cop/style/avoid_perl_backrefs.rb +21 -0
- data/lib/rubocop/cop/style/avoid_perlisms.rb +50 -0
- data/lib/rubocop/cop/style/begin_block.rb +18 -0
- data/lib/rubocop/cop/style/block_comments.rb +20 -0
- data/lib/rubocop/cop/style/block_nesting.rb +47 -0
- data/lib/rubocop/cop/style/blocks.rb +27 -0
- data/lib/rubocop/cop/style/case_equality.rb +22 -0
- data/lib/rubocop/cop/style/case_indentation.rb +28 -0
- data/lib/rubocop/cop/style/character_literal.rb +37 -0
- data/lib/rubocop/cop/style/class_and_module_camel_case.rb +33 -0
- data/lib/rubocop/cop/style/class_methods.rb +22 -0
- data/lib/rubocop/cop/style/collection_methods.rb +56 -0
- data/lib/rubocop/cop/style/colon_method_call.rb +29 -0
- data/lib/rubocop/cop/style/constant_name.rb +31 -0
- data/lib/rubocop/cop/style/def_parentheses.rb +70 -0
- data/lib/rubocop/cop/style/documentation.rb +58 -0
- data/lib/rubocop/cop/style/dot_position.rb +25 -0
- data/lib/rubocop/cop/style/empty_line_between_defs.rb +26 -0
- data/lib/rubocop/cop/style/empty_lines.rb +40 -0
- data/lib/rubocop/cop/style/empty_literal.rb +53 -0
- data/lib/rubocop/cop/style/encoding.rb +29 -0
- data/lib/rubocop/cop/style/end_block.rb +18 -0
- data/lib/rubocop/cop/style/end_of_line.rb +23 -0
- data/lib/rubocop/cop/style/favor_join.rb +29 -0
- data/lib/rubocop/cop/style/favor_modifier.rb +118 -0
- data/lib/rubocop/cop/style/favor_sprintf.rb +28 -0
- data/lib/rubocop/cop/style/favor_unless_over_negated_if.rb +54 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +47 -0
- data/lib/rubocop/cop/style/if_then_else.rb +29 -0
- data/lib/rubocop/cop/style/if_with_semicolon.rb +20 -0
- data/lib/rubocop/cop/style/lambda.rb +47 -0
- data/lib/rubocop/cop/style/leading_comment_space.rb +25 -0
- data/lib/rubocop/cop/style/line_continuation.rb +26 -0
- data/lib/rubocop/cop/style/line_length.rb +30 -0
- data/lib/rubocop/cop/style/method_and_variable_snake_case.rb +61 -0
- data/lib/rubocop/cop/style/method_call_parentheses.rb +22 -0
- data/lib/rubocop/cop/style/method_length.rb +57 -0
- data/lib/rubocop/cop/style/multiline_if_then.rb +47 -0
- data/lib/rubocop/cop/style/not.rb +24 -0
- data/lib/rubocop/cop/style/numeric_literals.rb +25 -0
- data/lib/rubocop/cop/style/one_line_conditional.rb +20 -0
- data/lib/rubocop/cop/style/op_method.rb +29 -0
- data/lib/rubocop/cop/style/parameter_lists.rb +42 -0
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +42 -0
- data/lib/rubocop/cop/style/proc.rb +30 -0
- data/lib/rubocop/cop/style/reduce_arguments.rb +34 -0
- data/lib/rubocop/cop/style/regexp_literal.rb +39 -0
- data/lib/rubocop/cop/style/rescue_modifier.rb +55 -0
- data/lib/rubocop/cop/style/semicolon.rb +51 -0
- data/lib/rubocop/cop/style/single_line_methods.rb +48 -0
- data/lib/rubocop/cop/style/space_after_comma_etc.rb +69 -0
- data/lib/rubocop/cop/style/space_after_control_keyword.rb +32 -0
- data/lib/rubocop/cop/style/string_literals.rb +36 -0
- data/lib/rubocop/cop/style/surrounding_space.rb +314 -0
- data/lib/rubocop/cop/style/symbol_array.rb +31 -0
- data/lib/rubocop/cop/style/symbol_name.rb +27 -0
- data/lib/rubocop/cop/style/tab.rb +25 -0
- data/lib/rubocop/cop/style/ternary_operator.rb +49 -0
- data/lib/rubocop/cop/style/trailing_whitespace.rb +24 -0
- data/lib/rubocop/cop/style/trivial_accessors.rb +32 -0
- data/lib/rubocop/cop/style/unless_else.rb +26 -0
- data/lib/rubocop/cop/style/variable_interpolation.rb +32 -0
- data/lib/rubocop/cop/style/when_then.rb +25 -0
- data/lib/rubocop/cop/style/while_until_do.rb +45 -0
- data/lib/rubocop/cop/style/word_array.rb +44 -0
- data/lib/rubocop/cop/util.rb +27 -0
- data/lib/rubocop/cop/variable_inspector.rb +280 -0
- data/lib/rubocop/formatter/base_formatter.rb +119 -0
- data/lib/rubocop/formatter/clang_style_formatter.rb +21 -0
- data/lib/rubocop/formatter/emacs_style_formatter.rb +17 -0
- data/lib/rubocop/formatter/formatter_set.rb +77 -0
- data/lib/rubocop/formatter/json_formatter.rb +76 -0
- data/lib/rubocop/formatter/progress_formatter.rb +63 -0
- data/lib/rubocop/formatter/simple_text_formatter.rb +62 -0
- data/lib/rubocop/version.rb +21 -0
- data/rubocop.gemspec +36 -0
- data/spec/.rubocop.yml +5 -0
- data/spec/project_spec.rb +24 -0
- data/spec/rubocop/cli_spec.rb +906 -0
- data/spec/rubocop/config_spec.rb +470 -0
- data/spec/rubocop/config_store_spec.rb +66 -0
- data/spec/rubocop/cops/cop_spec.rb +38 -0
- data/spec/rubocop/cops/lint/assignment_in_condition_spec.rb +111 -0
- data/spec/rubocop/cops/lint/end_alignment_spec.rb +333 -0
- data/spec/rubocop/cops/lint/end_in_method_spec.rb +35 -0
- data/spec/rubocop/cops/lint/ensure_return_spec.rb +37 -0
- data/spec/rubocop/cops/lint/eval_spec.rb +41 -0
- data/spec/rubocop/cops/lint/handle_exceptions_spec.rb +36 -0
- data/spec/rubocop/cops/lint/literal_in_condition_spec.rb +42 -0
- data/spec/rubocop/cops/lint/loop_spec.rb +33 -0
- data/spec/rubocop/cops/lint/rescue_exception_spec.rb +127 -0
- data/spec/rubocop/cops/lint/shadowing_outer_local_variable_spec.rb +243 -0
- data/spec/rubocop/cops/lint/unreachable_code_spec.rb +69 -0
- data/spec/rubocop/cops/lint/unused_local_variable_spec.rb +497 -0
- data/spec/rubocop/cops/lint/void_spec.rb +63 -0
- data/spec/rubocop/cops/offence_spec.rb +133 -0
- data/spec/rubocop/cops/rails/validation_spec.rb +27 -0
- data/spec/rubocop/cops/style/access_control_spec.rb +142 -0
- data/spec/rubocop/cops/style/alias_spec.rb +47 -0
- data/spec/rubocop/cops/style/align_parameters_spec.rb +199 -0
- data/spec/rubocop/cops/style/and_or_spec.rb +39 -0
- data/spec/rubocop/cops/style/ascii_comments_spec.rb +28 -0
- data/spec/rubocop/cops/style/ascii_identifiers_spec.rb +28 -0
- data/spec/rubocop/cops/style/attr_spec.rb +20 -0
- data/spec/rubocop/cops/style/avoid_class_vars_spec.rb +27 -0
- data/spec/rubocop/cops/style/avoid_for_spec.rb +37 -0
- data/spec/rubocop/cops/style/avoid_global_vars_spec.rb +34 -0
- data/spec/rubocop/cops/style/avoid_perl_backrefs_spec.rb +20 -0
- data/spec/rubocop/cops/style/avoid_perlisms_spec.rb +47 -0
- data/spec/rubocop/cops/style/begin_block_spec.rb +19 -0
- data/spec/rubocop/cops/style/block_comments_spec.rb +27 -0
- data/spec/rubocop/cops/style/block_nesting_spec.rb +159 -0
- data/spec/rubocop/cops/style/blocks_spec.rb +35 -0
- data/spec/rubocop/cops/style/case_equality_spec.rb +18 -0
- data/spec/rubocop/cops/style/case_indentation_spec.rb +88 -0
- data/spec/rubocop/cops/style/character_literal_spec.rb +28 -0
- data/spec/rubocop/cops/style/class_and_module_camel_case_spec.rb +46 -0
- data/spec/rubocop/cops/style/class_methods_spec.rb +51 -0
- data/spec/rubocop/cops/style/collection_methods_spec.rb +41 -0
- data/spec/rubocop/cops/style/colon_method_call_spec.rb +55 -0
- data/spec/rubocop/cops/style/constant_name_spec.rb +56 -0
- data/spec/rubocop/cops/style/def_with_parentheses_spec.rb +40 -0
- data/spec/rubocop/cops/style/def_without_parentheses_spec.rb +34 -0
- data/spec/rubocop/cops/style/documentation_spec.rb +79 -0
- data/spec/rubocop/cops/style/dot_position_spec.rb +30 -0
- data/spec/rubocop/cops/style/empty_line_between_defs_spec.rb +85 -0
- data/spec/rubocop/cops/style/empty_lines_spec.rb +40 -0
- data/spec/rubocop/cops/style/empty_literal_spec.rb +91 -0
- data/spec/rubocop/cops/style/encoding_spec.rb +49 -0
- data/spec/rubocop/cops/style/end_block_spec.rb +19 -0
- data/spec/rubocop/cops/style/end_of_line_spec.rb +25 -0
- data/spec/rubocop/cops/style/favor_join_spec.rb +37 -0
- data/spec/rubocop/cops/style/favor_modifier_spec.rb +160 -0
- data/spec/rubocop/cops/style/favor_sprintf_spec.rb +53 -0
- data/spec/rubocop/cops/style/favor_unless_over_negated_if_spec.rb +64 -0
- data/spec/rubocop/cops/style/favor_until_over_negated_while_spec.rb +47 -0
- data/spec/rubocop/cops/style/hash_syntax_spec.rb +51 -0
- data/spec/rubocop/cops/style/if_with_semicolon_spec.rb +25 -0
- data/spec/rubocop/cops/style/lambda_spec.rb +45 -0
- data/spec/rubocop/cops/style/leading_comment_space_spec.rb +65 -0
- data/spec/rubocop/cops/style/line_continuation_spec.rb +26 -0
- data/spec/rubocop/cops/style/line_length_spec.rb +25 -0
- data/spec/rubocop/cops/style/method_and_variable_snake_case_spec.rb +95 -0
- data/spec/rubocop/cops/style/method_call_parentheses_spec.rb +25 -0
- data/spec/rubocop/cops/style/method_length_spec.rb +151 -0
- data/spec/rubocop/cops/style/multiline_if_then_spec.rb +97 -0
- data/spec/rubocop/cops/style/not_spec.rb +28 -0
- data/spec/rubocop/cops/style/numeric_literals_spec.rb +51 -0
- data/spec/rubocop/cops/style/one_line_conditional_spec.rb +18 -0
- data/spec/rubocop/cops/style/op_method_spec.rb +80 -0
- data/spec/rubocop/cops/style/parameter_lists_spec.rb +49 -0
- data/spec/rubocop/cops/style/parentheses_around_condition_spec.rb +59 -0
- data/spec/rubocop/cops/style/proc_spec.rb +28 -0
- data/spec/rubocop/cops/style/reduce_arguments_spec.rb +59 -0
- data/spec/rubocop/cops/style/regexp_literal_spec.rb +83 -0
- data/spec/rubocop/cops/style/rescue_modifier_spec.rb +122 -0
- data/spec/rubocop/cops/style/semicolon_spec.rb +95 -0
- data/spec/rubocop/cops/style/single_line_methods_spec.rb +54 -0
- data/spec/rubocop/cops/style/space_after_colon_spec.rb +29 -0
- data/spec/rubocop/cops/style/space_after_comma_spec.rb +31 -0
- data/spec/rubocop/cops/style/space_after_control_keyword_spec.rb +69 -0
- data/spec/rubocop/cops/style/space_after_semicolon_spec.rb +24 -0
- data/spec/rubocop/cops/style/space_around_braces_spec.rb +49 -0
- data/spec/rubocop/cops/style/space_around_equals_in_default_parameter_spec.rb +34 -0
- data/spec/rubocop/cops/style/space_around_operators_spec.rb +216 -0
- data/spec/rubocop/cops/style/space_inside_brackets_spec.rb +51 -0
- data/spec/rubocop/cops/style/space_inside_hash_literal_braces_spec.rb +99 -0
- data/spec/rubocop/cops/style/space_inside_parens_spec.rb +33 -0
- data/spec/rubocop/cops/style/string_literals_spec.rb +62 -0
- data/spec/rubocop/cops/style/symbol_array_spec.rb +45 -0
- data/spec/rubocop/cops/style/symbol_name_spec.rb +122 -0
- data/spec/rubocop/cops/style/tab_spec.rb +23 -0
- data/spec/rubocop/cops/style/ternary_operator_spec.rb +42 -0
- data/spec/rubocop/cops/style/trailing_whitespace_spec.rb +29 -0
- data/spec/rubocop/cops/style/trivial_accessors_spec.rb +338 -0
- data/spec/rubocop/cops/style/unless_else_spec.rb +31 -0
- data/spec/rubocop/cops/style/variable_interpolation_spec.rb +53 -0
- data/spec/rubocop/cops/style/when_then_spec.rb +40 -0
- data/spec/rubocop/cops/style/while_until_do_spec.rb +47 -0
- data/spec/rubocop/cops/style/word_array_spec.rb +61 -0
- data/spec/rubocop/cops/variable_inspector_spec.rb +374 -0
- data/spec/rubocop/formatter/base_formatter_spec.rb +190 -0
- data/spec/rubocop/formatter/clang_style_formatter_spec.rb +70 -0
- data/spec/rubocop/formatter/emacs_style_formatter_spec.rb +32 -0
- data/spec/rubocop/formatter/formatter_set_spec.rb +132 -0
- data/spec/rubocop/formatter/json_formatter_spec.rb +142 -0
- data/spec/rubocop/formatter/progress_formatter_spec.rb +196 -0
- data/spec/rubocop/formatter/simple_text_formatter_spec.rb +74 -0
- data/spec/spec_helper.rb +92 -0
- data/spec/support/file_helper.rb +21 -0
- data/spec/support/isolated_environment.rb +27 -0
- data/spec/support/mri_syntax_checker.rb +69 -0
- data/spec/support/shared_examples.rb +33 -0
- metadata +517 -0
@@ -0,0 +1,33 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Rubocop
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
# This cops checks for class and module names with
|
7
|
+
# an underscore in them.
|
8
|
+
class ClassAndModuleCamelCase < Cop
|
9
|
+
MSG = 'Use CamelCase for classes and modules.'
|
10
|
+
|
11
|
+
def on_class(node)
|
12
|
+
check_name(node)
|
13
|
+
|
14
|
+
super
|
15
|
+
end
|
16
|
+
|
17
|
+
def on_module(node)
|
18
|
+
check_name(node)
|
19
|
+
|
20
|
+
super
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def check_name(node)
|
26
|
+
name = node.loc.name.source
|
27
|
+
|
28
|
+
add_offence(:convention, node.loc.name, MSG) if name =~ /_/
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Rubocop
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
# This cop checks for uses of the class/module name instead of
|
7
|
+
# self, when defining class/module methods.
|
8
|
+
class ClassMethods < Cop
|
9
|
+
MSG = 'Prefer self over class/module for class/module methods.'
|
10
|
+
|
11
|
+
# TODO - check if we're in a class/module
|
12
|
+
def on_defs(node)
|
13
|
+
definee, _name, _args, _body = *node
|
14
|
+
|
15
|
+
if definee.type == :const
|
16
|
+
add_offence(:convention, definee.loc.name, MSG)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Rubocop
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
# This cop checks for uses of unidiomatic method names
|
7
|
+
# from the Enumerable module.
|
8
|
+
#
|
9
|
+
# The current definition of the check is flawed and should be
|
10
|
+
# enhanced by check for by blocks & procs as arguments of the
|
11
|
+
# methods.
|
12
|
+
class CollectionMethods < Cop
|
13
|
+
MSG = 'Prefer %s over %s.'
|
14
|
+
|
15
|
+
PREFERRED_METHODS = {
|
16
|
+
collect: 'map',
|
17
|
+
inject: 'reduce',
|
18
|
+
detect: 'find',
|
19
|
+
find_all: 'select'
|
20
|
+
}
|
21
|
+
|
22
|
+
def on_block(node)
|
23
|
+
method, _args, _body = *node
|
24
|
+
|
25
|
+
check_method_node(method)
|
26
|
+
|
27
|
+
super
|
28
|
+
end
|
29
|
+
|
30
|
+
def on_send(node)
|
31
|
+
_receiver, _method_name, *args = *node
|
32
|
+
|
33
|
+
if args.size == 1 && args.first.type == :block_pass
|
34
|
+
check_method_node(node)
|
35
|
+
end
|
36
|
+
|
37
|
+
super
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def check_method_node(node)
|
43
|
+
_receiver, method_name, *_args = *node
|
44
|
+
|
45
|
+
if PREFERRED_METHODS[method_name]
|
46
|
+
add_offence(
|
47
|
+
:convention,
|
48
|
+
node.loc.selector,
|
49
|
+
sprintf(MSG, PREFERRED_METHODS[method_name], method_name)
|
50
|
+
)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Rubocop
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
# This cop checks for methods invoked via the :: operator instead
|
7
|
+
# of the . operator (like FileUtils::rmdir instead of FileUtils.rmdir).
|
8
|
+
class ColonMethodCall < Cop
|
9
|
+
MSG = 'Do not use :: for method calls.'
|
10
|
+
|
11
|
+
def on_send(node)
|
12
|
+
receiver, _method_name, *_args = *node
|
13
|
+
|
14
|
+
# discard methods with nil receivers and op methods(like [])
|
15
|
+
if receiver && node.loc.dot && node.loc.dot.is?('::')
|
16
|
+
add_offence(:convention, node.loc.dot, MSG)
|
17
|
+
do_autocorrect(node)
|
18
|
+
end
|
19
|
+
|
20
|
+
super
|
21
|
+
end
|
22
|
+
|
23
|
+
def autocorrect_action(node)
|
24
|
+
replace(node.loc.dot, '.')
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Rubocop
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
# This cop checks whether constant names are written using
|
7
|
+
# SCREAMING_SNAKE_CASE.
|
8
|
+
#
|
9
|
+
# To avoid false positives, it ignores cases in which we cannot know
|
10
|
+
# for certain the type of value that would be assigned to a constant.
|
11
|
+
class ConstantName < Cop
|
12
|
+
MSG = 'Use SCREAMING_SNAKE_CASE for constants.'
|
13
|
+
SNAKE_CASE = /^[\dA-Z_]+$/
|
14
|
+
|
15
|
+
def on_casgn(node)
|
16
|
+
_scope, const_name, value = *node
|
17
|
+
|
18
|
+
# We cannot know the result of method calls line
|
19
|
+
# NewClass = something_that_returns_a_class
|
20
|
+
unless value && value.type == :send
|
21
|
+
if const_name !~ SNAKE_CASE
|
22
|
+
add_offence(:convention, node.loc.name, MSG)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
super
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Rubocop
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
# This cop checks for parentheses in the definition of a method,
|
7
|
+
# that does not take any arguments. Both instance and
|
8
|
+
# class/singleton methods are checked.
|
9
|
+
class DefWithParentheses < Cop
|
10
|
+
MSG = "Omit the parentheses in defs when the method doesn't accept " +
|
11
|
+
'any arguments.'
|
12
|
+
|
13
|
+
def on_def(node)
|
14
|
+
start_line = node.loc.keyword.line
|
15
|
+
end_line = node.loc.end.line
|
16
|
+
|
17
|
+
return if start_line == end_line
|
18
|
+
|
19
|
+
_, args = *node
|
20
|
+
if args.children == [] && args.loc.begin
|
21
|
+
add_offence(:convention, args.loc.begin, MSG)
|
22
|
+
end
|
23
|
+
|
24
|
+
super
|
25
|
+
end
|
26
|
+
|
27
|
+
def on_defs(node)
|
28
|
+
start_line = node.loc.keyword.line
|
29
|
+
end_line = node.loc.end.line
|
30
|
+
|
31
|
+
return if start_line == end_line
|
32
|
+
|
33
|
+
_, _, args = *node
|
34
|
+
if args.children == [] && args.loc.begin
|
35
|
+
add_offence(:convention, args.loc.begin, MSG)
|
36
|
+
end
|
37
|
+
|
38
|
+
super
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
# This cop checks for missing parentheses in the definition of a
|
43
|
+
# method, that takes arguments. Both instance and
|
44
|
+
# class/singleton methods are checked.
|
45
|
+
class DefWithoutParentheses < Cop
|
46
|
+
MSG = 'Use def with parentheses when there are arguments.'
|
47
|
+
|
48
|
+
def on_def(node)
|
49
|
+
_, args = *node
|
50
|
+
|
51
|
+
if args.children.size > 0 && args.loc.begin.nil?
|
52
|
+
add_offence(:convention, args.loc.expression, MSG)
|
53
|
+
end
|
54
|
+
|
55
|
+
super
|
56
|
+
end
|
57
|
+
|
58
|
+
def on_defs(node)
|
59
|
+
_, _, args = *node
|
60
|
+
|
61
|
+
if args.children.size > 0 && args.loc.begin.nil?
|
62
|
+
add_offence(:convention, args.loc.expression, MSG)
|
63
|
+
end
|
64
|
+
|
65
|
+
super
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Rubocop
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
# This cop checks for missing top-level documentation of
|
7
|
+
# classes and modules. Classes with no body are exempt from the
|
8
|
+
# check and so are namespace modules - modules that have nothing in
|
9
|
+
# their bodies except classes or other other modules.
|
10
|
+
class Documentation < Cop
|
11
|
+
MSG = 'Missing top-level %s documentation comment.'
|
12
|
+
|
13
|
+
def inspect(source_buffer, source, tokens, ast, comments)
|
14
|
+
return unless ast
|
15
|
+
|
16
|
+
ast_with_comments = Parser::Source::Comment.associate(ast, comments)
|
17
|
+
|
18
|
+
check_classes(ast, ast_with_comments)
|
19
|
+
check_modules(ast, ast_with_comments)
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def check_classes(ast, ast_with_comments)
|
25
|
+
on_node(:class, ast) do |node|
|
26
|
+
_name, _superclass, body = *node
|
27
|
+
|
28
|
+
if body != nil && ast_with_comments[node].empty?
|
29
|
+
add_offence(:convention, node.loc.keyword, format(MSG, 'class'))
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def check_modules(ast, ast_with_comments)
|
35
|
+
on_node(:module, ast) do |node|
|
36
|
+
_name, body = *node
|
37
|
+
|
38
|
+
if body.nil?
|
39
|
+
namespace = false
|
40
|
+
elsif body.type == :begin
|
41
|
+
namespace = body.children.all? do |n|
|
42
|
+
[:class, :module].include?(n.type)
|
43
|
+
end
|
44
|
+
elsif body.type == :class || body.type == :module
|
45
|
+
namespace = true
|
46
|
+
else
|
47
|
+
namespace = false
|
48
|
+
end
|
49
|
+
|
50
|
+
if !namespace && ast_with_comments[node].empty?
|
51
|
+
add_offence(:convention, node.loc.keyword, format(MSG, 'module'))
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Rubocop
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
# This cop checks the . position in multi-line method calls.
|
7
|
+
class DotPosition < Cop
|
8
|
+
MSG = 'Place the . on the next line, together with the method name.'
|
9
|
+
|
10
|
+
def on_send(node)
|
11
|
+
return unless node.loc.dot
|
12
|
+
|
13
|
+
dot_line = node.loc.dot.line
|
14
|
+
selector_line = node.loc.selector.line
|
15
|
+
|
16
|
+
if dot_line != selector_line
|
17
|
+
add_offence(:convention, node.loc.dot, MSG)
|
18
|
+
end
|
19
|
+
|
20
|
+
super
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Rubocop
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
# This cop checks whether method definitions are
|
7
|
+
# separated by empty lines.
|
8
|
+
class EmptyLineBetweenDefs < Cop
|
9
|
+
MSG = 'Use empty lines between defs.'
|
10
|
+
|
11
|
+
def on_def(node)
|
12
|
+
def_start = node.loc.keyword.line
|
13
|
+
def_end = node.loc.end.line
|
14
|
+
|
15
|
+
if @prev_def_end && (def_start - @prev_def_end) < 2
|
16
|
+
add_offence(:convention, node.loc.keyword, MSG)
|
17
|
+
end
|
18
|
+
|
19
|
+
@prev_def_end = def_end
|
20
|
+
|
21
|
+
super
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Rubocop
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
# This cops checks for two or more consecutive blank lines.
|
7
|
+
class EmptyLines < Cop
|
8
|
+
MSG = 'Extra blank line detected.'
|
9
|
+
LINE_OFFSET = 2
|
10
|
+
|
11
|
+
def inspect(source_buffer, source, tokens, ast, comments)
|
12
|
+
return if tokens.empty?
|
13
|
+
|
14
|
+
prev_line = 1
|
15
|
+
|
16
|
+
tokens.each do |token|
|
17
|
+
cur_line = token.pos.line
|
18
|
+
line_diff = cur_line - prev_line
|
19
|
+
|
20
|
+
if line_diff > LINE_OFFSET
|
21
|
+
# we need to be wary of comments since they
|
22
|
+
# don't show up in the tokens
|
23
|
+
((prev_line + 1)...cur_line).each do |line|
|
24
|
+
# we check if the prev and current lines are empty
|
25
|
+
if source[line - 2].empty? && source[line - 1].empty?
|
26
|
+
add_offence(:convention,
|
27
|
+
source_range(source_buffer,
|
28
|
+
source[0...(line - 1)], 0, 1),
|
29
|
+
MSG)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
prev_line = cur_line
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Rubocop
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
# This cop checks for the use of a method, the result of which
|
7
|
+
# would be a literal, like an empty array, hash or string.
|
8
|
+
class EmptyLiteral < Cop
|
9
|
+
ARR_MSG = 'Use array literal [] instead of Array.new.'
|
10
|
+
HASH_MSG = 'Use hash literal {} instead of Hash.new.'
|
11
|
+
STR_MSG = "Use string literal '' instead of String.new."
|
12
|
+
|
13
|
+
# Empty array node
|
14
|
+
#
|
15
|
+
# (send
|
16
|
+
# (const nil :Array) :new)
|
17
|
+
ARRAY_NODE = s(:send, s(:const, nil, :Array), :new)
|
18
|
+
|
19
|
+
# Empty hash node
|
20
|
+
#
|
21
|
+
# (send
|
22
|
+
# (const nil :Hash) :new)
|
23
|
+
HASH_NODE = s(:send, s(:const, nil, :Hash), :new)
|
24
|
+
|
25
|
+
# Empty string node
|
26
|
+
#
|
27
|
+
# (send
|
28
|
+
# (const nil :String) :new)
|
29
|
+
STR_NODE = s(:send, s(:const, nil, :String), :new)
|
30
|
+
|
31
|
+
def on_send(node)
|
32
|
+
case node
|
33
|
+
when ARRAY_NODE
|
34
|
+
add_offence(:convention,
|
35
|
+
node.loc.expression,
|
36
|
+
ARR_MSG)
|
37
|
+
when HASH_NODE
|
38
|
+
add_offence(:convention,
|
39
|
+
node.loc.expression,
|
40
|
+
HASH_MSG)
|
41
|
+
when STR_NODE
|
42
|
+
add_offence(:convention,
|
43
|
+
node.loc.expression,
|
44
|
+
STR_MSG)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
# TODO Check block contents as well
|
49
|
+
alias_method :on_block, :ignore_node
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|