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,35 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Rubocop
|
4
|
+
module Cop
|
5
|
+
module Lint
|
6
|
+
# This cop checks for unreachable code.
|
7
|
+
# The check are based on the presence of flow of control
|
8
|
+
# statement in non-final position in *begin*(implicit) blocks.
|
9
|
+
class UnreachableCode < Cop
|
10
|
+
MSG = 'Unreachable code detected.'
|
11
|
+
|
12
|
+
NODE_TYPES = [:return, :next, :break, :retry, :redo]
|
13
|
+
FLOW_COMMANDS = [:throw, :raise, :fail]
|
14
|
+
|
15
|
+
def on_begin(node)
|
16
|
+
expressions = *node
|
17
|
+
|
18
|
+
expressions.each_cons(2) do |e1, e2|
|
19
|
+
if NODE_TYPES.include?(e1.type) || flow_command?(e1)
|
20
|
+
add_offence(:warning, e2.loc.expression, MSG)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
super
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def flow_command?(node)
|
30
|
+
FLOW_COMMANDS.any? { |c| command?(c, node) }
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Rubocop
|
4
|
+
module Cop
|
5
|
+
module Lint
|
6
|
+
# This cop looks for unused local variables in each scope.
|
7
|
+
# Actually this is a mimic of the warning
|
8
|
+
# "assigned but unused variable - foo" from `ruby -cw`.
|
9
|
+
class UnusedLocalVariable < Cop
|
10
|
+
include VariableInspector
|
11
|
+
|
12
|
+
MSG = 'Assigned but unused variable - %s'
|
13
|
+
TYPES_TO_ACCEPT_UNUSED =
|
14
|
+
(ARGUMENT_DECLARATION_TYPES - [:shadowarg]).freeze
|
15
|
+
|
16
|
+
def inspect(source_buffer, source, tokens, ast, comments)
|
17
|
+
inspect_variables(ast)
|
18
|
+
end
|
19
|
+
|
20
|
+
def after_leaving_scope(scope)
|
21
|
+
scope.variable_entries.each_value do |entry|
|
22
|
+
next if entry.used?
|
23
|
+
next if TYPES_TO_ACCEPT_UNUSED.include?(entry.node.type)
|
24
|
+
next if entry.name.to_s.start_with?('_')
|
25
|
+
message = sprintf(MSG, entry.name)
|
26
|
+
add_offence(:warning, entry.node.loc.expression, message)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Rubocop
|
4
|
+
module Cop
|
5
|
+
module Lint
|
6
|
+
# This cop checks for operators, variables and literals used
|
7
|
+
# in void context.
|
8
|
+
class Void < Cop
|
9
|
+
OP_MSG = 'Operator %s used in void context.'
|
10
|
+
VAR_MSG = 'Variable %s used in void context.'
|
11
|
+
LIT_MSG = 'Literal %s used in void context'
|
12
|
+
|
13
|
+
OPS = %w(* / % + - == === != < > <= >= <=>)
|
14
|
+
VARS = [:ivar, :lvar, :cvar, :const]
|
15
|
+
LITERALS = [:str, :dstr, :int, :float, :array,
|
16
|
+
:hash, :regexp, :nil, :true, :false]
|
17
|
+
|
18
|
+
def on_begin(node)
|
19
|
+
expressions = *node
|
20
|
+
|
21
|
+
expressions[0...-1].each do |expr|
|
22
|
+
check_for_void_op(expr)
|
23
|
+
check_for_literal(expr)
|
24
|
+
check_for_var(expr)
|
25
|
+
end
|
26
|
+
|
27
|
+
super
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def check_for_void_op(node)
|
33
|
+
return unless node.type == :send
|
34
|
+
|
35
|
+
op = node.loc.selector.source
|
36
|
+
|
37
|
+
if OPS.include?(op)
|
38
|
+
add_offence(:warning, node.loc.selector, sprintf(OP_MSG, op))
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def check_for_var(node)
|
43
|
+
if VARS.include?(node.type)
|
44
|
+
add_offence(:warning, node.loc.name,
|
45
|
+
sprintf(VAR_MSG, node.loc.name.source))
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def check_for_literal(node)
|
50
|
+
if LITERALS.include?(node.type)
|
51
|
+
add_offence(:warning, node.loc.expression,
|
52
|
+
sprintf(LIT_MSG, node.loc.expression.source))
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,136 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Rubocop
|
4
|
+
module Cop
|
5
|
+
# An Offence represents a style violation detected by RuboCop.
|
6
|
+
class Offence
|
7
|
+
include Comparable
|
8
|
+
|
9
|
+
# @api private
|
10
|
+
SEVERITIES = [:refactor, :convention, :warning, :error, :fatal]
|
11
|
+
|
12
|
+
# @api public
|
13
|
+
#
|
14
|
+
# @!attribute [r] severity
|
15
|
+
#
|
16
|
+
# @return [Symbol]
|
17
|
+
# severity.
|
18
|
+
# any of `:refactor`, `:convention`, `:warning`, `:error` or `:fatal`.
|
19
|
+
attr_reader :severity
|
20
|
+
|
21
|
+
# @api public
|
22
|
+
#
|
23
|
+
# @!attribute [r] location
|
24
|
+
#
|
25
|
+
# @return [Parser::Source::Range]
|
26
|
+
# the location where the violation is detected.
|
27
|
+
#
|
28
|
+
# @see http://rubydoc.info/github/whitequark/parser/Parser/Source/Range
|
29
|
+
# Parser::Source::Range
|
30
|
+
attr_reader :location
|
31
|
+
|
32
|
+
# @api public
|
33
|
+
#
|
34
|
+
# @!attribute [r] message
|
35
|
+
#
|
36
|
+
# @return [String]
|
37
|
+
# human-readable message
|
38
|
+
#
|
39
|
+
# @example
|
40
|
+
# 'Line is too long. [90/79]'
|
41
|
+
attr_reader :message
|
42
|
+
|
43
|
+
# @api public
|
44
|
+
#
|
45
|
+
# @!attribute [r] cop_name
|
46
|
+
#
|
47
|
+
# @return [String]
|
48
|
+
# a cop class name without namespace.
|
49
|
+
# i.e. type of the violation.
|
50
|
+
#
|
51
|
+
# @example
|
52
|
+
# 'LineLength'
|
53
|
+
attr_reader :cop_name
|
54
|
+
|
55
|
+
# @api private
|
56
|
+
attr_reader :line
|
57
|
+
|
58
|
+
# @api private
|
59
|
+
attr_reader :column
|
60
|
+
|
61
|
+
# @api private
|
62
|
+
def initialize(severity, location, message, cop_name)
|
63
|
+
unless SEVERITIES.include?(severity)
|
64
|
+
fail ArgumentError, "Unknown severity: #{severity}"
|
65
|
+
end
|
66
|
+
@severity = severity.freeze
|
67
|
+
@location = location.freeze
|
68
|
+
@line = location.line.freeze
|
69
|
+
@column = location.column.freeze
|
70
|
+
@message = message.freeze
|
71
|
+
@cop_name = cop_name.freeze
|
72
|
+
freeze
|
73
|
+
end
|
74
|
+
|
75
|
+
# @api private
|
76
|
+
def to_s
|
77
|
+
sprintf("#{encode_severity}:%3d:%3d: %s",
|
78
|
+
line, real_column, message)
|
79
|
+
end
|
80
|
+
|
81
|
+
# @api private
|
82
|
+
def encode_severity
|
83
|
+
@severity.to_s[0].upcase
|
84
|
+
end
|
85
|
+
|
86
|
+
# @api private
|
87
|
+
def clang_severity
|
88
|
+
case @severity
|
89
|
+
when :fatal then 'F'.color(:red)
|
90
|
+
when :error then 'E'.color(:red)
|
91
|
+
when :warning then 'W'.color(:magenta)
|
92
|
+
when :convention then 'C'.color(:yellow)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
# @api private
|
97
|
+
def severity_level
|
98
|
+
SEVERITIES.index(severity) + 1
|
99
|
+
end
|
100
|
+
|
101
|
+
# @api private
|
102
|
+
#
|
103
|
+
# Internally we use column number that start at 0, but when
|
104
|
+
# outputting column numbers, we want them to start at 1. One
|
105
|
+
# reason is that editors, such as Emacs, expect this.
|
106
|
+
def real_column
|
107
|
+
column + 1
|
108
|
+
end
|
109
|
+
|
110
|
+
# @api public
|
111
|
+
#
|
112
|
+
# @return [Boolean]
|
113
|
+
# returns `true` if two offences contain same attributes
|
114
|
+
def ==(other)
|
115
|
+
severity == other.severity && line == other.line &&
|
116
|
+
column == other.column && message == other.message &&
|
117
|
+
cop_name == other.cop_name
|
118
|
+
end
|
119
|
+
|
120
|
+
# @api public
|
121
|
+
#
|
122
|
+
# Returns `-1`, `0` or `+1`
|
123
|
+
# if this offence is less than, equal to, or greater than `other`.
|
124
|
+
#
|
125
|
+
# @return [Integer]
|
126
|
+
# comparison result
|
127
|
+
def <=>(other)
|
128
|
+
[:line, :column, :cop_name, :message].each do |attribute|
|
129
|
+
result = send(attribute) <=> other.send(attribute)
|
130
|
+
return result unless result == 0
|
131
|
+
end
|
132
|
+
0
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Rubocop
|
4
|
+
module Cop
|
5
|
+
module Rails
|
6
|
+
# This cop checks for the use of old-style attribute validation macros.
|
7
|
+
class Validation < Cop
|
8
|
+
MSG = 'Use the new "sexy" validations (validates ...).'
|
9
|
+
|
10
|
+
BLACKLIST = [:validates_acceptance_of,
|
11
|
+
:validates_confirmation_of,
|
12
|
+
:validates_exclusion_of,
|
13
|
+
:validates_format_of,
|
14
|
+
:validates_inclusion_of,
|
15
|
+
:validates_length_of,
|
16
|
+
:validates_numericality_of,
|
17
|
+
:validates_presence_of,
|
18
|
+
:validates_size_of]
|
19
|
+
|
20
|
+
def on_send(node)
|
21
|
+
receiver, method_name, *_args = *node
|
22
|
+
|
23
|
+
if receiver.nil? && BLACKLIST.include?(method_name)
|
24
|
+
add_offence(:convention, node.loc.selector, MSG)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Rubocop
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
# A couple of checks related to the use method visibility modifiers.
|
7
|
+
# Modifiers should be indented as deeps are method definitions and
|
8
|
+
# surrounded by blank lines.
|
9
|
+
class AccessControl < Cop
|
10
|
+
INDENT_MSG = 'Indent %s as deep as method definitions.'
|
11
|
+
BLANK_MSG = 'Keep a blank line before and after %s.'
|
12
|
+
|
13
|
+
PRIVATE_NODE = s(:send, nil, :private)
|
14
|
+
PROTECTED_NODE = s(:send, nil, :protected)
|
15
|
+
PUBLIC_NODE = s(:send, nil, :public)
|
16
|
+
|
17
|
+
def inspect(source_buffer, source, tokens, ast, comments)
|
18
|
+
return unless ast
|
19
|
+
on_node([:class, :module, :sclass], ast) do |class_node|
|
20
|
+
class_start_col = class_node.loc.expression.column
|
21
|
+
|
22
|
+
# we'll have to walk all class children nodes
|
23
|
+
# except other class/module nodes
|
24
|
+
class_node.children.compact.each do |node|
|
25
|
+
on_node(:send, node, [:class, :module, :sclass]) do |send_node|
|
26
|
+
if modifier_node?(send_node)
|
27
|
+
send_start_col = send_node.loc.expression.column
|
28
|
+
selector = send_node.loc.selector.source
|
29
|
+
|
30
|
+
if send_start_col - 2 != class_start_col
|
31
|
+
add_offence(:convention,
|
32
|
+
send_node.loc.expression,
|
33
|
+
format(INDENT_MSG, selector))
|
34
|
+
end
|
35
|
+
|
36
|
+
send_line = send_node.loc.line
|
37
|
+
|
38
|
+
unless source[send_line].chomp.empty? &&
|
39
|
+
source[send_line - 2].chomp.empty?
|
40
|
+
add_offence(:convention,
|
41
|
+
send_node.loc.expression,
|
42
|
+
format(BLANK_MSG, selector))
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
private
|
51
|
+
|
52
|
+
def modifier_node?(node)
|
53
|
+
[PRIVATE_NODE, PROTECTED_NODE, PUBLIC_NODE].include?(node)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Rubocop
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
# The purpose of the this cop is advise the use of
|
7
|
+
# alias_method over the alias keyword whenever possible.
|
8
|
+
class Alias < Cop
|
9
|
+
MSG = 'Use alias_method instead of alias.'
|
10
|
+
|
11
|
+
# TODO make this check context aware - alias_method is not
|
12
|
+
# available outside of classes/modules.
|
13
|
+
def on_alias(node)
|
14
|
+
# alias_method can't be used with global variables
|
15
|
+
new, old = *node
|
16
|
+
|
17
|
+
return if new.type == :gvar && old.type == :gvar
|
18
|
+
|
19
|
+
add_offence(:convention,
|
20
|
+
node.loc.keyword,
|
21
|
+
MSG)
|
22
|
+
|
23
|
+
super
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Rubocop
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
# Here we check if the parameters on a multi-line method call are
|
7
|
+
# aligned.
|
8
|
+
class AlignParameters < Cop
|
9
|
+
MSG = 'Align the parameters of a method call if they span ' +
|
10
|
+
'more than one line.'
|
11
|
+
|
12
|
+
def on_send(node)
|
13
|
+
_receiver, method, *args = *node
|
14
|
+
|
15
|
+
if method != :[]= && args.size > 1
|
16
|
+
first_arg_col = args.first.loc.expression.column
|
17
|
+
prev_arg_line = args.first.loc.expression.line
|
18
|
+
prev_arg_col = first_arg_col
|
19
|
+
|
20
|
+
args.each do |arg|
|
21
|
+
cur_arg_line = arg.loc.expression.line
|
22
|
+
cur_arg_col = arg.loc.expression.column
|
23
|
+
|
24
|
+
if cur_arg_line != prev_arg_line &&
|
25
|
+
cur_arg_col != first_arg_col
|
26
|
+
add_offence(:convention, arg.loc.expression, MSG)
|
27
|
+
end
|
28
|
+
|
29
|
+
prev_arg_col = cur_arg_col
|
30
|
+
prev_arg_line = cur_arg_line
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
super
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Rubocop
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
# This cop checks for uses of *and* and *or*.
|
7
|
+
class AndOr < Cop
|
8
|
+
MSG = 'Use %s instead of %s.'
|
9
|
+
|
10
|
+
OPS = { 'and' => '&&', 'or' => '||' }
|
11
|
+
|
12
|
+
def on_and(node)
|
13
|
+
process_logical_op(node)
|
14
|
+
|
15
|
+
super
|
16
|
+
end
|
17
|
+
|
18
|
+
def on_or(node)
|
19
|
+
process_logical_op(node)
|
20
|
+
|
21
|
+
super
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def process_logical_op(node)
|
27
|
+
op = node.loc.operator.source
|
28
|
+
op_type = node.type.to_s
|
29
|
+
|
30
|
+
if op == op_type
|
31
|
+
add_offence(:convention,
|
32
|
+
node.loc.operator,
|
33
|
+
sprintf(MSG, OPS[op], op))
|
34
|
+
do_autocorrect(node)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def autocorrect_action(node)
|
39
|
+
replacement = (node.type == :and ? '&&' : '||')
|
40
|
+
replace(node.loc.operator, replacement)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|