sabat-rubocop 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (239) hide show
  1. data/.gitignore +50 -0
  2. data/.rspec +1 -0
  3. data/.rubocop.yml +7 -0
  4. data/.travis.yml +7 -0
  5. data/.yardopts +2 -0
  6. data/CHANGELOG.md +268 -0
  7. data/CONTRIBUTING.md +16 -0
  8. data/Gemfile +7 -0
  9. data/LICENSE.txt +20 -0
  10. data/README.md +324 -0
  11. data/Rakefile +29 -0
  12. data/bin/rubocop +22 -0
  13. data/config/default.yml +58 -0
  14. data/config/disabled.yml +5 -0
  15. data/config/enabled.yml +403 -0
  16. data/lib/rubocop.rb +116 -0
  17. data/lib/rubocop/cli.rb +407 -0
  18. data/lib/rubocop/config.rb +250 -0
  19. data/lib/rubocop/config_store.rb +39 -0
  20. data/lib/rubocop/cop/cop.rb +138 -0
  21. data/lib/rubocop/cop/lint/assignment_in_condition.rb +54 -0
  22. data/lib/rubocop/cop/lint/end_alignment.rb +189 -0
  23. data/lib/rubocop/cop/lint/end_in_method.rb +30 -0
  24. data/lib/rubocop/cop/lint/ensure_return.rb +22 -0
  25. data/lib/rubocop/cop/lint/eval.rb +22 -0
  26. data/lib/rubocop/cop/lint/handle_exceptions.rb +20 -0
  27. data/lib/rubocop/cop/lint/literal_in_condition.rb +81 -0
  28. data/lib/rubocop/cop/lint/loop.rb +29 -0
  29. data/lib/rubocop/cop/lint/rescue_exception.rb +29 -0
  30. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +34 -0
  31. data/lib/rubocop/cop/lint/unreachable_code.rb +35 -0
  32. data/lib/rubocop/cop/lint/unused_local_variable.rb +32 -0
  33. data/lib/rubocop/cop/lint/void.rb +58 -0
  34. data/lib/rubocop/cop/offence.rb +136 -0
  35. data/lib/rubocop/cop/rails/validation.rb +30 -0
  36. data/lib/rubocop/cop/style/access_control.rb +58 -0
  37. data/lib/rubocop/cop/style/alias.rb +28 -0
  38. data/lib/rubocop/cop/style/align_parameters.rb +39 -0
  39. data/lib/rubocop/cop/style/and_or.rb +45 -0
  40. data/lib/rubocop/cop/style/ascii_comments.rb +21 -0
  41. data/lib/rubocop/cop/style/ascii_identifiers.rb +22 -0
  42. data/lib/rubocop/cop/style/attr.rb +20 -0
  43. data/lib/rubocop/cop/style/avoid_class_vars.rb +20 -0
  44. data/lib/rubocop/cop/style/avoid_for.rb +18 -0
  45. data/lib/rubocop/cop/style/avoid_global_vars.rb +65 -0
  46. data/lib/rubocop/cop/style/avoid_perl_backrefs.rb +21 -0
  47. data/lib/rubocop/cop/style/avoid_perlisms.rb +50 -0
  48. data/lib/rubocop/cop/style/begin_block.rb +18 -0
  49. data/lib/rubocop/cop/style/block_comments.rb +20 -0
  50. data/lib/rubocop/cop/style/block_nesting.rb +47 -0
  51. data/lib/rubocop/cop/style/blocks.rb +27 -0
  52. data/lib/rubocop/cop/style/case_equality.rb +22 -0
  53. data/lib/rubocop/cop/style/case_indentation.rb +28 -0
  54. data/lib/rubocop/cop/style/character_literal.rb +37 -0
  55. data/lib/rubocop/cop/style/class_and_module_camel_case.rb +33 -0
  56. data/lib/rubocop/cop/style/class_methods.rb +22 -0
  57. data/lib/rubocop/cop/style/collection_methods.rb +56 -0
  58. data/lib/rubocop/cop/style/colon_method_call.rb +29 -0
  59. data/lib/rubocop/cop/style/constant_name.rb +31 -0
  60. data/lib/rubocop/cop/style/def_parentheses.rb +70 -0
  61. data/lib/rubocop/cop/style/documentation.rb +58 -0
  62. data/lib/rubocop/cop/style/dot_position.rb +25 -0
  63. data/lib/rubocop/cop/style/empty_line_between_defs.rb +26 -0
  64. data/lib/rubocop/cop/style/empty_lines.rb +40 -0
  65. data/lib/rubocop/cop/style/empty_literal.rb +53 -0
  66. data/lib/rubocop/cop/style/encoding.rb +29 -0
  67. data/lib/rubocop/cop/style/end_block.rb +18 -0
  68. data/lib/rubocop/cop/style/end_of_line.rb +23 -0
  69. data/lib/rubocop/cop/style/favor_join.rb +29 -0
  70. data/lib/rubocop/cop/style/favor_modifier.rb +118 -0
  71. data/lib/rubocop/cop/style/favor_sprintf.rb +28 -0
  72. data/lib/rubocop/cop/style/favor_unless_over_negated_if.rb +54 -0
  73. data/lib/rubocop/cop/style/hash_syntax.rb +47 -0
  74. data/lib/rubocop/cop/style/if_then_else.rb +29 -0
  75. data/lib/rubocop/cop/style/if_with_semicolon.rb +20 -0
  76. data/lib/rubocop/cop/style/lambda.rb +47 -0
  77. data/lib/rubocop/cop/style/leading_comment_space.rb +25 -0
  78. data/lib/rubocop/cop/style/line_continuation.rb +26 -0
  79. data/lib/rubocop/cop/style/line_length.rb +30 -0
  80. data/lib/rubocop/cop/style/method_and_variable_snake_case.rb +61 -0
  81. data/lib/rubocop/cop/style/method_call_parentheses.rb +22 -0
  82. data/lib/rubocop/cop/style/method_length.rb +57 -0
  83. data/lib/rubocop/cop/style/multiline_if_then.rb +47 -0
  84. data/lib/rubocop/cop/style/not.rb +24 -0
  85. data/lib/rubocop/cop/style/numeric_literals.rb +25 -0
  86. data/lib/rubocop/cop/style/one_line_conditional.rb +20 -0
  87. data/lib/rubocop/cop/style/op_method.rb +29 -0
  88. data/lib/rubocop/cop/style/parameter_lists.rb +42 -0
  89. data/lib/rubocop/cop/style/parentheses_around_condition.rb +42 -0
  90. data/lib/rubocop/cop/style/proc.rb +30 -0
  91. data/lib/rubocop/cop/style/reduce_arguments.rb +34 -0
  92. data/lib/rubocop/cop/style/regexp_literal.rb +39 -0
  93. data/lib/rubocop/cop/style/rescue_modifier.rb +55 -0
  94. data/lib/rubocop/cop/style/semicolon.rb +51 -0
  95. data/lib/rubocop/cop/style/single_line_methods.rb +48 -0
  96. data/lib/rubocop/cop/style/space_after_comma_etc.rb +69 -0
  97. data/lib/rubocop/cop/style/space_after_control_keyword.rb +32 -0
  98. data/lib/rubocop/cop/style/string_literals.rb +36 -0
  99. data/lib/rubocop/cop/style/surrounding_space.rb +314 -0
  100. data/lib/rubocop/cop/style/symbol_array.rb +31 -0
  101. data/lib/rubocop/cop/style/symbol_name.rb +27 -0
  102. data/lib/rubocop/cop/style/tab.rb +25 -0
  103. data/lib/rubocop/cop/style/ternary_operator.rb +49 -0
  104. data/lib/rubocop/cop/style/trailing_whitespace.rb +24 -0
  105. data/lib/rubocop/cop/style/trivial_accessors.rb +32 -0
  106. data/lib/rubocop/cop/style/unless_else.rb +26 -0
  107. data/lib/rubocop/cop/style/variable_interpolation.rb +32 -0
  108. data/lib/rubocop/cop/style/when_then.rb +25 -0
  109. data/lib/rubocop/cop/style/while_until_do.rb +45 -0
  110. data/lib/rubocop/cop/style/word_array.rb +44 -0
  111. data/lib/rubocop/cop/util.rb +27 -0
  112. data/lib/rubocop/cop/variable_inspector.rb +280 -0
  113. data/lib/rubocop/formatter/base_formatter.rb +119 -0
  114. data/lib/rubocop/formatter/clang_style_formatter.rb +21 -0
  115. data/lib/rubocop/formatter/emacs_style_formatter.rb +17 -0
  116. data/lib/rubocop/formatter/formatter_set.rb +77 -0
  117. data/lib/rubocop/formatter/json_formatter.rb +76 -0
  118. data/lib/rubocop/formatter/progress_formatter.rb +63 -0
  119. data/lib/rubocop/formatter/simple_text_formatter.rb +62 -0
  120. data/lib/rubocop/version.rb +21 -0
  121. data/rubocop.gemspec +36 -0
  122. data/spec/.rubocop.yml +5 -0
  123. data/spec/project_spec.rb +24 -0
  124. data/spec/rubocop/cli_spec.rb +906 -0
  125. data/spec/rubocop/config_spec.rb +470 -0
  126. data/spec/rubocop/config_store_spec.rb +66 -0
  127. data/spec/rubocop/cops/cop_spec.rb +38 -0
  128. data/spec/rubocop/cops/lint/assignment_in_condition_spec.rb +111 -0
  129. data/spec/rubocop/cops/lint/end_alignment_spec.rb +333 -0
  130. data/spec/rubocop/cops/lint/end_in_method_spec.rb +35 -0
  131. data/spec/rubocop/cops/lint/ensure_return_spec.rb +37 -0
  132. data/spec/rubocop/cops/lint/eval_spec.rb +41 -0
  133. data/spec/rubocop/cops/lint/handle_exceptions_spec.rb +36 -0
  134. data/spec/rubocop/cops/lint/literal_in_condition_spec.rb +42 -0
  135. data/spec/rubocop/cops/lint/loop_spec.rb +33 -0
  136. data/spec/rubocop/cops/lint/rescue_exception_spec.rb +127 -0
  137. data/spec/rubocop/cops/lint/shadowing_outer_local_variable_spec.rb +243 -0
  138. data/spec/rubocop/cops/lint/unreachable_code_spec.rb +69 -0
  139. data/spec/rubocop/cops/lint/unused_local_variable_spec.rb +497 -0
  140. data/spec/rubocop/cops/lint/void_spec.rb +63 -0
  141. data/spec/rubocop/cops/offence_spec.rb +133 -0
  142. data/spec/rubocop/cops/rails/validation_spec.rb +27 -0
  143. data/spec/rubocop/cops/style/access_control_spec.rb +142 -0
  144. data/spec/rubocop/cops/style/alias_spec.rb +47 -0
  145. data/spec/rubocop/cops/style/align_parameters_spec.rb +199 -0
  146. data/spec/rubocop/cops/style/and_or_spec.rb +39 -0
  147. data/spec/rubocop/cops/style/ascii_comments_spec.rb +28 -0
  148. data/spec/rubocop/cops/style/ascii_identifiers_spec.rb +28 -0
  149. data/spec/rubocop/cops/style/attr_spec.rb +20 -0
  150. data/spec/rubocop/cops/style/avoid_class_vars_spec.rb +27 -0
  151. data/spec/rubocop/cops/style/avoid_for_spec.rb +37 -0
  152. data/spec/rubocop/cops/style/avoid_global_vars_spec.rb +34 -0
  153. data/spec/rubocop/cops/style/avoid_perl_backrefs_spec.rb +20 -0
  154. data/spec/rubocop/cops/style/avoid_perlisms_spec.rb +47 -0
  155. data/spec/rubocop/cops/style/begin_block_spec.rb +19 -0
  156. data/spec/rubocop/cops/style/block_comments_spec.rb +27 -0
  157. data/spec/rubocop/cops/style/block_nesting_spec.rb +159 -0
  158. data/spec/rubocop/cops/style/blocks_spec.rb +35 -0
  159. data/spec/rubocop/cops/style/case_equality_spec.rb +18 -0
  160. data/spec/rubocop/cops/style/case_indentation_spec.rb +88 -0
  161. data/spec/rubocop/cops/style/character_literal_spec.rb +28 -0
  162. data/spec/rubocop/cops/style/class_and_module_camel_case_spec.rb +46 -0
  163. data/spec/rubocop/cops/style/class_methods_spec.rb +51 -0
  164. data/spec/rubocop/cops/style/collection_methods_spec.rb +41 -0
  165. data/spec/rubocop/cops/style/colon_method_call_spec.rb +55 -0
  166. data/spec/rubocop/cops/style/constant_name_spec.rb +56 -0
  167. data/spec/rubocop/cops/style/def_with_parentheses_spec.rb +40 -0
  168. data/spec/rubocop/cops/style/def_without_parentheses_spec.rb +34 -0
  169. data/spec/rubocop/cops/style/documentation_spec.rb +79 -0
  170. data/spec/rubocop/cops/style/dot_position_spec.rb +30 -0
  171. data/spec/rubocop/cops/style/empty_line_between_defs_spec.rb +85 -0
  172. data/spec/rubocop/cops/style/empty_lines_spec.rb +40 -0
  173. data/spec/rubocop/cops/style/empty_literal_spec.rb +91 -0
  174. data/spec/rubocop/cops/style/encoding_spec.rb +49 -0
  175. data/spec/rubocop/cops/style/end_block_spec.rb +19 -0
  176. data/spec/rubocop/cops/style/end_of_line_spec.rb +25 -0
  177. data/spec/rubocop/cops/style/favor_join_spec.rb +37 -0
  178. data/spec/rubocop/cops/style/favor_modifier_spec.rb +160 -0
  179. data/spec/rubocop/cops/style/favor_sprintf_spec.rb +53 -0
  180. data/spec/rubocop/cops/style/favor_unless_over_negated_if_spec.rb +64 -0
  181. data/spec/rubocop/cops/style/favor_until_over_negated_while_spec.rb +47 -0
  182. data/spec/rubocop/cops/style/hash_syntax_spec.rb +51 -0
  183. data/spec/rubocop/cops/style/if_with_semicolon_spec.rb +25 -0
  184. data/spec/rubocop/cops/style/lambda_spec.rb +45 -0
  185. data/spec/rubocop/cops/style/leading_comment_space_spec.rb +65 -0
  186. data/spec/rubocop/cops/style/line_continuation_spec.rb +26 -0
  187. data/spec/rubocop/cops/style/line_length_spec.rb +25 -0
  188. data/spec/rubocop/cops/style/method_and_variable_snake_case_spec.rb +95 -0
  189. data/spec/rubocop/cops/style/method_call_parentheses_spec.rb +25 -0
  190. data/spec/rubocop/cops/style/method_length_spec.rb +151 -0
  191. data/spec/rubocop/cops/style/multiline_if_then_spec.rb +97 -0
  192. data/spec/rubocop/cops/style/not_spec.rb +28 -0
  193. data/spec/rubocop/cops/style/numeric_literals_spec.rb +51 -0
  194. data/spec/rubocop/cops/style/one_line_conditional_spec.rb +18 -0
  195. data/spec/rubocop/cops/style/op_method_spec.rb +80 -0
  196. data/spec/rubocop/cops/style/parameter_lists_spec.rb +49 -0
  197. data/spec/rubocop/cops/style/parentheses_around_condition_spec.rb +59 -0
  198. data/spec/rubocop/cops/style/proc_spec.rb +28 -0
  199. data/spec/rubocop/cops/style/reduce_arguments_spec.rb +59 -0
  200. data/spec/rubocop/cops/style/regexp_literal_spec.rb +83 -0
  201. data/spec/rubocop/cops/style/rescue_modifier_spec.rb +122 -0
  202. data/spec/rubocop/cops/style/semicolon_spec.rb +95 -0
  203. data/spec/rubocop/cops/style/single_line_methods_spec.rb +54 -0
  204. data/spec/rubocop/cops/style/space_after_colon_spec.rb +29 -0
  205. data/spec/rubocop/cops/style/space_after_comma_spec.rb +31 -0
  206. data/spec/rubocop/cops/style/space_after_control_keyword_spec.rb +69 -0
  207. data/spec/rubocop/cops/style/space_after_semicolon_spec.rb +24 -0
  208. data/spec/rubocop/cops/style/space_around_braces_spec.rb +49 -0
  209. data/spec/rubocop/cops/style/space_around_equals_in_default_parameter_spec.rb +34 -0
  210. data/spec/rubocop/cops/style/space_around_operators_spec.rb +216 -0
  211. data/spec/rubocop/cops/style/space_inside_brackets_spec.rb +51 -0
  212. data/spec/rubocop/cops/style/space_inside_hash_literal_braces_spec.rb +99 -0
  213. data/spec/rubocop/cops/style/space_inside_parens_spec.rb +33 -0
  214. data/spec/rubocop/cops/style/string_literals_spec.rb +62 -0
  215. data/spec/rubocop/cops/style/symbol_array_spec.rb +45 -0
  216. data/spec/rubocop/cops/style/symbol_name_spec.rb +122 -0
  217. data/spec/rubocop/cops/style/tab_spec.rb +23 -0
  218. data/spec/rubocop/cops/style/ternary_operator_spec.rb +42 -0
  219. data/spec/rubocop/cops/style/trailing_whitespace_spec.rb +29 -0
  220. data/spec/rubocop/cops/style/trivial_accessors_spec.rb +338 -0
  221. data/spec/rubocop/cops/style/unless_else_spec.rb +31 -0
  222. data/spec/rubocop/cops/style/variable_interpolation_spec.rb +53 -0
  223. data/spec/rubocop/cops/style/when_then_spec.rb +40 -0
  224. data/spec/rubocop/cops/style/while_until_do_spec.rb +47 -0
  225. data/spec/rubocop/cops/style/word_array_spec.rb +61 -0
  226. data/spec/rubocop/cops/variable_inspector_spec.rb +374 -0
  227. data/spec/rubocop/formatter/base_formatter_spec.rb +190 -0
  228. data/spec/rubocop/formatter/clang_style_formatter_spec.rb +70 -0
  229. data/spec/rubocop/formatter/emacs_style_formatter_spec.rb +32 -0
  230. data/spec/rubocop/formatter/formatter_set_spec.rb +132 -0
  231. data/spec/rubocop/formatter/json_formatter_spec.rb +142 -0
  232. data/spec/rubocop/formatter/progress_formatter_spec.rb +196 -0
  233. data/spec/rubocop/formatter/simple_text_formatter_spec.rb +74 -0
  234. data/spec/spec_helper.rb +92 -0
  235. data/spec/support/file_helper.rb +21 -0
  236. data/spec/support/isolated_environment.rb +27 -0
  237. data/spec/support/mri_syntax_checker.rb +69 -0
  238. data/spec/support/shared_examples.rb +33 -0
  239. 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