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.
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