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,29 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Rubocop
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
# This cop checks whether the source file has a
|
7
|
+
# utf-8 encoding comment. This check makes sense only
|
8
|
+
# in Ruby 1.9, since in 2.0+ utf-8 is the default source file
|
9
|
+
# encoding.
|
10
|
+
class Encoding < Cop
|
11
|
+
MSG = 'Missing utf-8 encoding comment.'
|
12
|
+
|
13
|
+
def inspect(source_buffer, source, tokens, ast, comments)
|
14
|
+
unless RUBY_VERSION >= '2.0.0'
|
15
|
+
expected_line = 0
|
16
|
+
expected_line += 1 if source[expected_line] =~ /^#!/
|
17
|
+
unless source[expected_line] =~ /#.*coding: (UTF|utf)-8/
|
18
|
+
add_offence(:convention,
|
19
|
+
source_range(source_buffer,
|
20
|
+
source[0...expected_line],
|
21
|
+
0, 1),
|
22
|
+
MSG)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Rubocop
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
# This cop checks for END blocks.
|
7
|
+
class EndBlock < Cop
|
8
|
+
MSG = 'Avoid the use of END blocks. Use `Kernel#at_exit` instead.'
|
9
|
+
|
10
|
+
def on_postexe(node)
|
11
|
+
add_offence(:convention, node.loc.keyword, MSG)
|
12
|
+
|
13
|
+
super
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Rubocop
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
# This cop checks for Windows-style line endings in the source code.
|
7
|
+
class EndOfLine < Cop
|
8
|
+
MSG = 'Carriage return character detected.'
|
9
|
+
|
10
|
+
def inspect(source_buffer, source, tokens, ast, comments)
|
11
|
+
source.each_with_index do |line, index|
|
12
|
+
if line =~ /\r$/
|
13
|
+
add_offence(:convention,
|
14
|
+
source_range(source_buffer, source[0...index],
|
15
|
+
line.length - 1, 1),
|
16
|
+
MSG)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Rubocop
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
# This cop checks for uses of "*" as a substitute for *join*.
|
7
|
+
#
|
8
|
+
# Not all cases can reliably checked, due to Ruby's dynamic
|
9
|
+
# types, so we consider only cases when the first argument is an
|
10
|
+
# array literal or the second is a string literal.
|
11
|
+
class FavorJoin < Cop
|
12
|
+
MSG = 'Favor Array#join over Array#*.'
|
13
|
+
|
14
|
+
def on_send(node)
|
15
|
+
receiver_node, method_name, *arg_nodes = *node
|
16
|
+
|
17
|
+
if receiver_node && receiver_node.type == :array &&
|
18
|
+
method_name == :* && arg_nodes[0].type == :str
|
19
|
+
add_offence(:convention,
|
20
|
+
node.loc.selector,
|
21
|
+
MSG)
|
22
|
+
end
|
23
|
+
|
24
|
+
super
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,118 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Rubocop
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
# Common functionality for modifier cops.
|
7
|
+
module FavorModifier
|
8
|
+
# TODO extremely ugly solution that needs lots of polish
|
9
|
+
def check(sexp, comments)
|
10
|
+
case sexp.loc.keyword.source
|
11
|
+
when 'if' then cond, body, _else = *sexp
|
12
|
+
when 'unless' then cond, _else, body = *sexp
|
13
|
+
else cond, body = *sexp
|
14
|
+
end
|
15
|
+
|
16
|
+
if length(sexp) > 3
|
17
|
+
false
|
18
|
+
else
|
19
|
+
body_length = body_length(body)
|
20
|
+
|
21
|
+
if body_length == 0
|
22
|
+
false
|
23
|
+
else
|
24
|
+
indentation = sexp.loc.keyword.column
|
25
|
+
kw_length = sexp.loc.keyword.size
|
26
|
+
cond_length = cond.loc.expression.size
|
27
|
+
space = 1
|
28
|
+
total = indentation + body_length + space + kw_length + space +
|
29
|
+
cond_length
|
30
|
+
total <= LineLength.max && !body_has_comment?(body, comments)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def length(sexp)
|
36
|
+
sexp.loc.expression.source.lines.to_a.size
|
37
|
+
end
|
38
|
+
|
39
|
+
def body_length(body)
|
40
|
+
if body && body.loc.expression
|
41
|
+
body.loc.expression.size
|
42
|
+
else
|
43
|
+
0
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def body_has_comment?(body, comments)
|
48
|
+
comment_lines = comments.map(&:location).map(&:line)
|
49
|
+
body_line = body.loc.expression.line
|
50
|
+
comment_lines.include?(body_line)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# Checks for if and unless statements that would fit on one line
|
55
|
+
# if written as a modifier if/unless.
|
56
|
+
class IfUnlessModifier < Cop
|
57
|
+
include FavorModifier
|
58
|
+
|
59
|
+
def error_message
|
60
|
+
'Favor modifier if/unless usage when you have a single-line body. ' +
|
61
|
+
'Another good alternative is the usage of control flow &&/||.'
|
62
|
+
end
|
63
|
+
|
64
|
+
def inspect(source_buffer, source, tokens, ast, comments)
|
65
|
+
return unless ast
|
66
|
+
on_node(:if, ast) do |node|
|
67
|
+
# discard ternary ops, if/else and modifier if/unless nodes
|
68
|
+
return if ternary_op?(node)
|
69
|
+
return if modifier_if?(node)
|
70
|
+
return if elsif?(node)
|
71
|
+
return if if_else?(node)
|
72
|
+
|
73
|
+
if check(node, comments)
|
74
|
+
add_offence(:convention, node.loc.expression, error_message)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def ternary_op?(node)
|
80
|
+
node.loc.respond_to?(:question)
|
81
|
+
end
|
82
|
+
|
83
|
+
def modifier_if?(node)
|
84
|
+
node.loc.end.nil?
|
85
|
+
end
|
86
|
+
|
87
|
+
def elsif?(node)
|
88
|
+
node.loc.keyword.is?('elsif')
|
89
|
+
end
|
90
|
+
|
91
|
+
def if_else?(node)
|
92
|
+
node.loc.respond_to?(:else) && node.loc.else
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
# Checks for while and until statements that would fit on one line
|
97
|
+
# if written as a modifier while/until.
|
98
|
+
class WhileUntilModifier < Cop
|
99
|
+
include FavorModifier
|
100
|
+
|
101
|
+
MSG =
|
102
|
+
'Favor modifier while/until usage when you have a single-line body.'
|
103
|
+
|
104
|
+
def inspect(source_buffer, source, tokens, ast, comments)
|
105
|
+
return unless ast
|
106
|
+
on_node([:while, :until], ast) do |node|
|
107
|
+
# discard modifier while/until
|
108
|
+
next unless node.loc.end
|
109
|
+
|
110
|
+
if check(node, comments)
|
111
|
+
add_offence(:convention, node.loc.expression, MSG)
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Rubocop
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
# This cop checks for uses of String#%.
|
7
|
+
#
|
8
|
+
# It cannot be implemented in a reliable manner for all cases, so
|
9
|
+
# only two scenarios are considered - if the first argument is a string
|
10
|
+
# literal and if the second argument is an array literal.
|
11
|
+
class FavorSprintf < Cop
|
12
|
+
MSG = 'Favor sprintf over String#%.'
|
13
|
+
|
14
|
+
def on_send(node)
|
15
|
+
receiver_node, method_name, *arg_nodes = *node
|
16
|
+
|
17
|
+
if method_name == :% &&
|
18
|
+
([:str, :dstr].include?(receiver_node.type) ||
|
19
|
+
arg_nodes[0].type == :array)
|
20
|
+
add_offence(:convention, node.loc.selector, MSG)
|
21
|
+
end
|
22
|
+
|
23
|
+
super
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Rubocop
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
# Some common code shared between the two cops.
|
7
|
+
module FavorOtherKeywordOverNegation
|
8
|
+
def check(node)
|
9
|
+
condition, _body, _rest = *node
|
10
|
+
|
11
|
+
# Look at last expression of contents if there's a parenthesis
|
12
|
+
# around condition.
|
13
|
+
condition = condition.children.last while condition.type == :begin
|
14
|
+
|
15
|
+
if condition.type == :send
|
16
|
+
_object, method = *condition
|
17
|
+
if method == :! && !(node.loc.respond_to?(:else) && node.loc.else)
|
18
|
+
add_offence(:convention, node.loc.expression, error_message)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
# Checks for uses of if with a negated condition. Only ifs
|
25
|
+
# without else are considered.
|
26
|
+
class FavorUnlessOverNegatedIf < Cop
|
27
|
+
include FavorOtherKeywordOverNegation
|
28
|
+
|
29
|
+
def on_if(node)
|
30
|
+
check(node)
|
31
|
+
super
|
32
|
+
end
|
33
|
+
|
34
|
+
def error_message
|
35
|
+
'Favor unless (or control flow or) over if for negative conditions.'
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
# Checks for uses of while with a negated condition.
|
40
|
+
class FavorUntilOverNegatedWhile < Cop
|
41
|
+
include FavorOtherKeywordOverNegation
|
42
|
+
|
43
|
+
def on_while(node)
|
44
|
+
check(node)
|
45
|
+
super
|
46
|
+
end
|
47
|
+
|
48
|
+
def error_message
|
49
|
+
'Favor until over while for negative conditions.'
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Rubocop
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
# This cop checks for uses of the Ruby 1.8 hash literal syntax,
|
7
|
+
# when the 1.9 syntax is applicable as well.
|
8
|
+
#
|
9
|
+
# A separate offence is registered for each problematic pair.
|
10
|
+
class HashSyntax < Cop
|
11
|
+
MSG = 'Ruby 1.8 hash syntax detected'
|
12
|
+
|
13
|
+
def on_hash(node)
|
14
|
+
pairs = *node
|
15
|
+
|
16
|
+
sym_indices = pairs.all? { |p| word_symbol_pair?(p) }
|
17
|
+
|
18
|
+
if sym_indices
|
19
|
+
pairs.each do |pair|
|
20
|
+
if pair.loc.operator && pair.loc.operator.is?('=>')
|
21
|
+
add_offence(:convention,
|
22
|
+
pair.loc.expression.begin.join(pair.loc.operator),
|
23
|
+
MSG)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
super
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def word_symbol_pair?(pair)
|
34
|
+
key, _value = *pair
|
35
|
+
|
36
|
+
if key.type == :sym
|
37
|
+
sym_name = key.to_a[0]
|
38
|
+
|
39
|
+
sym_name =~ /\A\w+\z/
|
40
|
+
else
|
41
|
+
false
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Rubocop
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
# Common functionality for cops checking if and unless statements.
|
7
|
+
module IfThenElse
|
8
|
+
def on_if(node)
|
9
|
+
check(node)
|
10
|
+
super
|
11
|
+
end
|
12
|
+
|
13
|
+
def on_unless(node)
|
14
|
+
check(node)
|
15
|
+
super
|
16
|
+
end
|
17
|
+
|
18
|
+
def check(node)
|
19
|
+
# We won't check modifier or ternary conditionals.
|
20
|
+
if node.loc.expression.source =~ /\A(if|unless)\b/
|
21
|
+
if offending_line(node)
|
22
|
+
add_offence(:convention, node.loc.expression, error_message)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Rubocop
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
# Checks for uses of semicolon in if statements.
|
7
|
+
class IfWithSemicolon < Cop
|
8
|
+
include IfThenElse
|
9
|
+
|
10
|
+
def offending_line(node)
|
11
|
+
node.loc.begin.line if node.loc.begin && node.loc.begin.is?(';')
|
12
|
+
end
|
13
|
+
|
14
|
+
def error_message
|
15
|
+
'Never use if x; Use the ternary operator instead.'
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Rubocop
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
# This cop checks for uses of the pre 1.9 lambda syntax for one-line
|
7
|
+
# anonymous functions and uses of the 1.9 lambda syntax for multi-line
|
8
|
+
# anonymous functions.
|
9
|
+
class Lambda < Cop
|
10
|
+
SINGLE_MSG = 'Use the new lambda literal syntax ->(params) {...}.'
|
11
|
+
MULTI_MSG = 'Use the lambda method for multi-line lambdas.'
|
12
|
+
|
13
|
+
TARGET = s(:send, nil, :lambda)
|
14
|
+
|
15
|
+
def on_block(node)
|
16
|
+
# We're looking for
|
17
|
+
# (block
|
18
|
+
# (send nil :lambda)
|
19
|
+
# ...)
|
20
|
+
block_method, = *node
|
21
|
+
|
22
|
+
if block_method == TARGET
|
23
|
+
selector = block_method.loc.selector.source
|
24
|
+
lambda_length = lambda_length(node)
|
25
|
+
|
26
|
+
if selector != '->' && lambda_length == 0
|
27
|
+
add_offence(:convention, block_method.loc.expression, SINGLE_MSG)
|
28
|
+
elsif selector == '->' && lambda_length > 0
|
29
|
+
add_offence(:convention, block_method.loc.expression, MULTI_MSG)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
super
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
def lambda_length(block_node)
|
39
|
+
start_line = block_node.loc.begin.line
|
40
|
+
end_line = block_node.loc.end.line
|
41
|
+
|
42
|
+
end_line - start_line
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|