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,189 @@
1
+ # encoding: utf-8
2
+
3
+ module Rubocop
4
+ module Cop
5
+ module Lint
6
+ # This cop checks whether the end keywords are aligned properly.
7
+ #
8
+ # For keywords (if, def, etc.) the end is aligned with the start
9
+ # of the keyword.
10
+ # For blocks - with the start of the expression where the block
11
+ # is defined.
12
+ #
13
+ # @example
14
+ #
15
+ # variable = if true
16
+ # end
17
+ #
18
+ # variable = lambda do |i|
19
+ # i
20
+ # end
21
+ class EndAlignment < Cop
22
+ MSG = 'end at %d, %d is not aligned with %s at %d, %d'
23
+
24
+ def initialize
25
+ super
26
+ @inspected_blocks = []
27
+ end
28
+
29
+ def inspect(source_buffer, source, tokens, ast, comments)
30
+ @inspected_blocks = []
31
+ super
32
+ end
33
+
34
+ def on_def(node)
35
+ check(node)
36
+ super
37
+ end
38
+
39
+ def on_defs(node)
40
+ check(node)
41
+ super
42
+ end
43
+
44
+ def on_class(node)
45
+ check(node)
46
+ super
47
+ end
48
+
49
+ def on_module(node)
50
+ check(node)
51
+ super
52
+ end
53
+
54
+ def on_if(node)
55
+ check(node) if node.loc.respond_to?(:end)
56
+ super
57
+ end
58
+
59
+ def on_while(node)
60
+ check(node)
61
+ super
62
+ end
63
+
64
+ def on_until(node)
65
+ check(node)
66
+ super
67
+ end
68
+
69
+ # Block related alignments
70
+
71
+ def on_block(node)
72
+ return if already_processed_node?(node)
73
+ check_block_alignment(node.loc.expression, node.loc)
74
+ super
75
+ end
76
+
77
+ def on_and(node)
78
+ return if already_processed_node?(node)
79
+
80
+ _left, right = *node
81
+ if right.type == :block
82
+ check_block_alignment(node.loc.expression, right.loc)
83
+ @inspected_blocks << right
84
+ end
85
+ super
86
+ end
87
+
88
+ alias_method :on_or, :on_and
89
+
90
+ def on_lvasgn(node)
91
+ _, children = *node
92
+ process_block_assignment(node, children)
93
+ super
94
+ end
95
+
96
+ alias_method :on_ivasgn, :on_lvasgn
97
+ alias_method :on_cvasgn, :on_lvasgn
98
+ alias_method :on_gvasgn, :on_lvasgn
99
+ alias_method :on_and_asgn, :on_lvasgn
100
+ alias_method :on_or_asgn, :on_lvasgn
101
+
102
+ def on_casgn(node)
103
+ _, _, children = *node
104
+ process_block_assignment(node, children)
105
+ super
106
+ end
107
+
108
+ def on_op_asgn(node)
109
+ variable, _op, args = *node
110
+ process_block_assignment(variable, args)
111
+ super
112
+ end
113
+
114
+ def on_send(node)
115
+ _receiver, _method, *args = *node
116
+ process_block_assignment(node, args.last)
117
+ super
118
+ end
119
+
120
+ def on_masgn(node)
121
+ variables, args = *node
122
+ process_block_assignment(variables, args)
123
+ super
124
+ end
125
+
126
+ private
127
+
128
+ def process_block_assignment(begin_node, block_node)
129
+ return unless block_node
130
+ return if already_processed_node?(block_node)
131
+
132
+ while block_node.type == :send
133
+ receiver, _method, args = *block_node
134
+ if receiver && [:block, :send].include?(receiver.type)
135
+ block_node = receiver
136
+ elsif args && [:block, :send].include?(args.type)
137
+ block_node = args
138
+ else
139
+ break
140
+ end
141
+ end
142
+ if block_node.type == :block
143
+ # Align with the expression that is on the same line
144
+ # where the block is defined
145
+ return if block_is_on_next_line?(begin_node, block_node)
146
+
147
+ @inspected_blocks << block_node
148
+ check_block_alignment(begin_node.loc.expression, block_node.loc)
149
+ end
150
+ end
151
+
152
+ def check_block_alignment(start_loc, block_loc)
153
+ end_loc = block_loc.end
154
+ if block_loc.begin.line != end_loc.line &&
155
+ start_loc.column != end_loc.column
156
+ add_offence(:warning,
157
+ end_loc,
158
+ sprintf(MSG, end_loc.line, end_loc.column,
159
+ start_loc.source.lines.to_a.first.chomp,
160
+ start_loc.line, start_loc.column))
161
+ end
162
+ end
163
+
164
+ def check(node)
165
+ # discard modifier forms of if/while/until
166
+ return unless node.loc.end
167
+
168
+ kw_loc = node.loc.keyword
169
+ end_loc = node.loc.end
170
+
171
+ if kw_loc.line != end_loc.line && kw_loc.column != end_loc.column
172
+ add_offence(:warning,
173
+ end_loc,
174
+ sprintf(MSG, end_loc.line, end_loc.column,
175
+ kw_loc.source, kw_loc.line, kw_loc.column))
176
+ end
177
+ end
178
+
179
+ def already_processed_node?(node)
180
+ @inspected_blocks.include?(node)
181
+ end
182
+
183
+ def block_is_on_next_line?(begin_node, block_node)
184
+ begin_node.loc.line != block_node.loc.line
185
+ end
186
+ end
187
+ end
188
+ end
189
+ end
@@ -0,0 +1,30 @@
1
+ # encoding: utf-8
2
+
3
+ module Rubocop
4
+ module Cop
5
+ module Lint
6
+ # This cop checks for END blocks in method definitions.
7
+ class EndInMethod < Cop
8
+ MSG = 'END found in method definition. Use `at_exit` instead.'
9
+
10
+ def on_def(node)
11
+ check(node)
12
+ super
13
+ end
14
+
15
+ def on_defs(node)
16
+ check(node)
17
+ super
18
+ end
19
+
20
+ private
21
+
22
+ def check(node)
23
+ on_node(:postexe, node) do |end_node|
24
+ add_offence(:warning, end_node.loc.keyword, MSG)
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,22 @@
1
+ # encoding: utf-8
2
+
3
+ module Rubocop
4
+ module Cop
5
+ module Lint
6
+ # This cop checks for *return* from an *ensure* block.
7
+ class EnsureReturn < Cop
8
+ MSG = 'Never return from an ensure block.'
9
+
10
+ def on_ensure(node)
11
+ _body, ensure_body = *node
12
+
13
+ on_node(:return, ensure_body) do |e|
14
+ add_offence(:warning, e.loc.expression, MSG)
15
+ end
16
+
17
+ super
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,22 @@
1
+ # encoding: utf-8
2
+
3
+ module Rubocop
4
+ module Cop
5
+ module Lint
6
+ # This cop checks for the use of *Kernel#eval*.
7
+ class Eval < Cop
8
+ MSG = 'The use of eval is a serious security risk.'
9
+
10
+ def on_send(node)
11
+ receiver, method_name, = *node
12
+
13
+ if receiver.nil? && method_name == :eval
14
+ add_offence(:warning, node.loc.selector, MSG)
15
+ end
16
+
17
+ super
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,20 @@
1
+ # encoding: utf-8
2
+
3
+ module Rubocop
4
+ module Cop
5
+ module Lint
6
+ # This cop checks for *rescue* blocks with no body.
7
+ class HandleExceptions < Cop
8
+ MSG = 'Do not suppress exceptions.'
9
+
10
+ def on_resbody(node)
11
+ _exc_list_node, _exc_var_node, body_node = *node
12
+
13
+ add_offence(:warning, node.loc.expression, MSG) unless body_node
14
+
15
+ super
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,81 @@
1
+ # encoding: utf-8
2
+
3
+ module Rubocop
4
+ module Cop
5
+ module Lint
6
+ # This cop checks for literals used as the conditions or as
7
+ # operands in and/or expressions serving as the conditions of
8
+ # if/while/until.
9
+ #
10
+ # @example
11
+ #
12
+ # if 20
13
+ # do_something
14
+ # end
15
+ #
16
+ # if some_var && true
17
+ # do_something
18
+ # end
19
+ #
20
+ class LiteralInCondition < Cop
21
+ MSG = 'Literal %s appeared in a condition.'
22
+
23
+ LITERALS = [:str, :dstr, :int, :float, :array,
24
+ :hash, :regexp, :nil, :true, :false]
25
+
26
+ def on_if(node)
27
+ check_for_literal(node)
28
+
29
+ super
30
+ end
31
+
32
+ def on_while(node)
33
+ check_for_literal(node)
34
+
35
+ super
36
+ end
37
+
38
+ def on_while_post(node)
39
+ check_for_literal(node)
40
+
41
+ super
42
+ end
43
+
44
+ def on_until(node)
45
+ check_for_literal(node)
46
+
47
+ super
48
+ end
49
+
50
+ def on_until_post(node)
51
+ check_for_literal(node)
52
+
53
+ super
54
+ end
55
+
56
+ private
57
+
58
+ def check_for_literal(node)
59
+ cond, = *node
60
+
61
+ # if the code node is literal we obviously have a problem
62
+ if LITERALS.include?(cond.type)
63
+ add_offence(:warning, cond.loc.expression,
64
+ format(MSG, cond.loc.expression.source))
65
+ elsif [:and, :or].include?(cond.type)
66
+ # alternatively we have to consider a logical node with a
67
+ # literal argument
68
+ *operands = *cond
69
+ operands.each do |op|
70
+ if LITERALS.include?(op.type)
71
+ add_offence(:warning, op.loc.expression,
72
+ format(MSG, op.loc.expression.source))
73
+
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,29 @@
1
+ # encoding: utf-8
2
+
3
+ module Rubocop
4
+ module Cop
5
+ module Lint
6
+ # This cop checks for uses of *begin...end while/until something*.
7
+ class Loop < Cop
8
+ MSG = 'Use Kernel#loop with break rather than ' +
9
+ 'begin/end/until(or while).'
10
+
11
+ def on_while_post(node)
12
+ register_offence(node)
13
+ super
14
+ end
15
+
16
+ def on_until_post(node)
17
+ register_offence(node)
18
+ super
19
+ end
20
+
21
+ private
22
+
23
+ def register_offence(node)
24
+ add_offence(:warning, node.loc.keyword, MSG)
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,29 @@
1
+ # encoding: utf-8
2
+
3
+ module Rubocop
4
+ module Cop
5
+ module Lint
6
+ # This cop checks for *rescue* blocks targeting the Exception class.
7
+ class RescueException < Cop
8
+ MSG = 'Avoid rescuing the Exception class.'
9
+
10
+ def on_resbody(node)
11
+ return unless node.children.first
12
+ rescue_args = node.children.first.children
13
+ if rescue_args.any? { |a| targets_exception?(a) }
14
+ add_offence(:warning, node.location.expression, MSG)
15
+ end
16
+
17
+ super
18
+ end
19
+
20
+ def targets_exception?(rescue_arg_node)
21
+ return false unless rescue_arg_node.type == :const
22
+ namespace, klass_name = *rescue_arg_node
23
+ return false unless namespace.nil? || namespace.type == :cbase
24
+ klass_name == :Exception
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,34 @@
1
+ # encoding: utf-8
2
+
3
+ module Rubocop
4
+ module Cop
5
+ module Lint
6
+ # This cop looks for use of the same name as outer local variables
7
+ # for block arguments or block local variables.
8
+ # This is a mimic of the warning
9
+ # "shadowing outer local variable - foo" from `ruby -cw`.
10
+ class ShadowingOuterLocalVariable < Cop
11
+ include VariableInspector
12
+
13
+ MSG = 'Shadowing outer local variable - %s'
14
+
15
+ def inspect(source_buffer, source, tokens, ast, comments)
16
+ inspect_variables(ast)
17
+ end
18
+
19
+ def before_declaring_variable(entry)
20
+ # Only block scope can reference outer local variables.
21
+ return unless variable_table.current_scope.node.type == :block
22
+ return unless ARGUMENT_DECLARATION_TYPES.include?(entry.node.type)
23
+ return if entry.name.to_s.start_with?('_')
24
+
25
+ outer_local_variable = variable_table.find_variable_entry(entry.name)
26
+ return unless outer_local_variable
27
+
28
+ message = sprintf(MSG, entry.name)
29
+ add_offence(:warning, entry.node.loc.expression, message)
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end