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,33 @@
1
+ # encoding: utf-8
2
+
3
+ module Rubocop
4
+ module Cop
5
+ module Style
6
+ # This cops checks for class and module names with
7
+ # an underscore in them.
8
+ class ClassAndModuleCamelCase < Cop
9
+ MSG = 'Use CamelCase for classes and modules.'
10
+
11
+ def on_class(node)
12
+ check_name(node)
13
+
14
+ super
15
+ end
16
+
17
+ def on_module(node)
18
+ check_name(node)
19
+
20
+ super
21
+ end
22
+
23
+ private
24
+
25
+ def check_name(node)
26
+ name = node.loc.name.source
27
+
28
+ add_offence(:convention, node.loc.name, MSG) if name =~ /_/
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,22 @@
1
+ # encoding: utf-8
2
+
3
+ module Rubocop
4
+ module Cop
5
+ module Style
6
+ # This cop checks for uses of the class/module name instead of
7
+ # self, when defining class/module methods.
8
+ class ClassMethods < Cop
9
+ MSG = 'Prefer self over class/module for class/module methods.'
10
+
11
+ # TODO - check if we're in a class/module
12
+ def on_defs(node)
13
+ definee, _name, _args, _body = *node
14
+
15
+ if definee.type == :const
16
+ add_offence(:convention, definee.loc.name, MSG)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,56 @@
1
+ # encoding: utf-8
2
+
3
+ module Rubocop
4
+ module Cop
5
+ module Style
6
+ # This cop checks for uses of unidiomatic method names
7
+ # from the Enumerable module.
8
+ #
9
+ # The current definition of the check is flawed and should be
10
+ # enhanced by check for by blocks & procs as arguments of the
11
+ # methods.
12
+ class CollectionMethods < Cop
13
+ MSG = 'Prefer %s over %s.'
14
+
15
+ PREFERRED_METHODS = {
16
+ collect: 'map',
17
+ inject: 'reduce',
18
+ detect: 'find',
19
+ find_all: 'select'
20
+ }
21
+
22
+ def on_block(node)
23
+ method, _args, _body = *node
24
+
25
+ check_method_node(method)
26
+
27
+ super
28
+ end
29
+
30
+ def on_send(node)
31
+ _receiver, _method_name, *args = *node
32
+
33
+ if args.size == 1 && args.first.type == :block_pass
34
+ check_method_node(node)
35
+ end
36
+
37
+ super
38
+ end
39
+
40
+ private
41
+
42
+ def check_method_node(node)
43
+ _receiver, method_name, *_args = *node
44
+
45
+ if PREFERRED_METHODS[method_name]
46
+ add_offence(
47
+ :convention,
48
+ node.loc.selector,
49
+ sprintf(MSG, PREFERRED_METHODS[method_name], method_name)
50
+ )
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,29 @@
1
+ # encoding: utf-8
2
+
3
+ module Rubocop
4
+ module Cop
5
+ module Style
6
+ # This cop checks for methods invoked via the :: operator instead
7
+ # of the . operator (like FileUtils::rmdir instead of FileUtils.rmdir).
8
+ class ColonMethodCall < Cop
9
+ MSG = 'Do not use :: for method calls.'
10
+
11
+ def on_send(node)
12
+ receiver, _method_name, *_args = *node
13
+
14
+ # discard methods with nil receivers and op methods(like [])
15
+ if receiver && node.loc.dot && node.loc.dot.is?('::')
16
+ add_offence(:convention, node.loc.dot, MSG)
17
+ do_autocorrect(node)
18
+ end
19
+
20
+ super
21
+ end
22
+
23
+ def autocorrect_action(node)
24
+ replace(node.loc.dot, '.')
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,31 @@
1
+ # encoding: utf-8
2
+
3
+ module Rubocop
4
+ module Cop
5
+ module Style
6
+ # This cop checks whether constant names are written using
7
+ # SCREAMING_SNAKE_CASE.
8
+ #
9
+ # To avoid false positives, it ignores cases in which we cannot know
10
+ # for certain the type of value that would be assigned to a constant.
11
+ class ConstantName < Cop
12
+ MSG = 'Use SCREAMING_SNAKE_CASE for constants.'
13
+ SNAKE_CASE = /^[\dA-Z_]+$/
14
+
15
+ def on_casgn(node)
16
+ _scope, const_name, value = *node
17
+
18
+ # We cannot know the result of method calls line
19
+ # NewClass = something_that_returns_a_class
20
+ unless value && value.type == :send
21
+ if const_name !~ SNAKE_CASE
22
+ add_offence(:convention, node.loc.name, MSG)
23
+ end
24
+ end
25
+
26
+ super
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,70 @@
1
+ # encoding: utf-8
2
+
3
+ module Rubocop
4
+ module Cop
5
+ module Style
6
+ # This cop checks for parentheses in the definition of a method,
7
+ # that does not take any arguments. Both instance and
8
+ # class/singleton methods are checked.
9
+ class DefWithParentheses < Cop
10
+ MSG = "Omit the parentheses in defs when the method doesn't accept " +
11
+ 'any arguments.'
12
+
13
+ def on_def(node)
14
+ start_line = node.loc.keyword.line
15
+ end_line = node.loc.end.line
16
+
17
+ return if start_line == end_line
18
+
19
+ _, args = *node
20
+ if args.children == [] && args.loc.begin
21
+ add_offence(:convention, args.loc.begin, MSG)
22
+ end
23
+
24
+ super
25
+ end
26
+
27
+ def on_defs(node)
28
+ start_line = node.loc.keyword.line
29
+ end_line = node.loc.end.line
30
+
31
+ return if start_line == end_line
32
+
33
+ _, _, args = *node
34
+ if args.children == [] && args.loc.begin
35
+ add_offence(:convention, args.loc.begin, MSG)
36
+ end
37
+
38
+ super
39
+ end
40
+ end
41
+
42
+ # This cop checks for missing parentheses in the definition of a
43
+ # method, that takes arguments. Both instance and
44
+ # class/singleton methods are checked.
45
+ class DefWithoutParentheses < Cop
46
+ MSG = 'Use def with parentheses when there are arguments.'
47
+
48
+ def on_def(node)
49
+ _, args = *node
50
+
51
+ if args.children.size > 0 && args.loc.begin.nil?
52
+ add_offence(:convention, args.loc.expression, MSG)
53
+ end
54
+
55
+ super
56
+ end
57
+
58
+ def on_defs(node)
59
+ _, _, args = *node
60
+
61
+ if args.children.size > 0 && args.loc.begin.nil?
62
+ add_offence(:convention, args.loc.expression, MSG)
63
+ end
64
+
65
+ super
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,58 @@
1
+ # encoding: utf-8
2
+
3
+ module Rubocop
4
+ module Cop
5
+ module Style
6
+ # This cop checks for missing top-level documentation of
7
+ # classes and modules. Classes with no body are exempt from the
8
+ # check and so are namespace modules - modules that have nothing in
9
+ # their bodies except classes or other other modules.
10
+ class Documentation < Cop
11
+ MSG = 'Missing top-level %s documentation comment.'
12
+
13
+ def inspect(source_buffer, source, tokens, ast, comments)
14
+ return unless ast
15
+
16
+ ast_with_comments = Parser::Source::Comment.associate(ast, comments)
17
+
18
+ check_classes(ast, ast_with_comments)
19
+ check_modules(ast, ast_with_comments)
20
+ end
21
+
22
+ private
23
+
24
+ def check_classes(ast, ast_with_comments)
25
+ on_node(:class, ast) do |node|
26
+ _name, _superclass, body = *node
27
+
28
+ if body != nil && ast_with_comments[node].empty?
29
+ add_offence(:convention, node.loc.keyword, format(MSG, 'class'))
30
+ end
31
+ end
32
+ end
33
+
34
+ def check_modules(ast, ast_with_comments)
35
+ on_node(:module, ast) do |node|
36
+ _name, body = *node
37
+
38
+ if body.nil?
39
+ namespace = false
40
+ elsif body.type == :begin
41
+ namespace = body.children.all? do |n|
42
+ [:class, :module].include?(n.type)
43
+ end
44
+ elsif body.type == :class || body.type == :module
45
+ namespace = true
46
+ else
47
+ namespace = false
48
+ end
49
+
50
+ if !namespace && ast_with_comments[node].empty?
51
+ add_offence(:convention, node.loc.keyword, format(MSG, 'module'))
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,25 @@
1
+ # encoding: utf-8
2
+
3
+ module Rubocop
4
+ module Cop
5
+ module Style
6
+ # This cop checks the . position in multi-line method calls.
7
+ class DotPosition < Cop
8
+ MSG = 'Place the . on the next line, together with the method name.'
9
+
10
+ def on_send(node)
11
+ return unless node.loc.dot
12
+
13
+ dot_line = node.loc.dot.line
14
+ selector_line = node.loc.selector.line
15
+
16
+ if dot_line != selector_line
17
+ add_offence(:convention, node.loc.dot, MSG)
18
+ end
19
+
20
+ super
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,26 @@
1
+ # encoding: utf-8
2
+
3
+ module Rubocop
4
+ module Cop
5
+ module Style
6
+ # This cop checks whether method definitions are
7
+ # separated by empty lines.
8
+ class EmptyLineBetweenDefs < Cop
9
+ MSG = 'Use empty lines between defs.'
10
+
11
+ def on_def(node)
12
+ def_start = node.loc.keyword.line
13
+ def_end = node.loc.end.line
14
+
15
+ if @prev_def_end && (def_start - @prev_def_end) < 2
16
+ add_offence(:convention, node.loc.keyword, MSG)
17
+ end
18
+
19
+ @prev_def_end = def_end
20
+
21
+ super
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,40 @@
1
+ # encoding: utf-8
2
+
3
+ module Rubocop
4
+ module Cop
5
+ module Style
6
+ # This cops checks for two or more consecutive blank lines.
7
+ class EmptyLines < Cop
8
+ MSG = 'Extra blank line detected.'
9
+ LINE_OFFSET = 2
10
+
11
+ def inspect(source_buffer, source, tokens, ast, comments)
12
+ return if tokens.empty?
13
+
14
+ prev_line = 1
15
+
16
+ tokens.each do |token|
17
+ cur_line = token.pos.line
18
+ line_diff = cur_line - prev_line
19
+
20
+ if line_diff > LINE_OFFSET
21
+ # we need to be wary of comments since they
22
+ # don't show up in the tokens
23
+ ((prev_line + 1)...cur_line).each do |line|
24
+ # we check if the prev and current lines are empty
25
+ if source[line - 2].empty? && source[line - 1].empty?
26
+ add_offence(:convention,
27
+ source_range(source_buffer,
28
+ source[0...(line - 1)], 0, 1),
29
+ MSG)
30
+ end
31
+ end
32
+ end
33
+
34
+ prev_line = cur_line
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,53 @@
1
+ # encoding: utf-8
2
+
3
+ module Rubocop
4
+ module Cop
5
+ module Style
6
+ # This cop checks for the use of a method, the result of which
7
+ # would be a literal, like an empty array, hash or string.
8
+ class EmptyLiteral < Cop
9
+ ARR_MSG = 'Use array literal [] instead of Array.new.'
10
+ HASH_MSG = 'Use hash literal {} instead of Hash.new.'
11
+ STR_MSG = "Use string literal '' instead of String.new."
12
+
13
+ # Empty array node
14
+ #
15
+ # (send
16
+ # (const nil :Array) :new)
17
+ ARRAY_NODE = s(:send, s(:const, nil, :Array), :new)
18
+
19
+ # Empty hash node
20
+ #
21
+ # (send
22
+ # (const nil :Hash) :new)
23
+ HASH_NODE = s(:send, s(:const, nil, :Hash), :new)
24
+
25
+ # Empty string node
26
+ #
27
+ # (send
28
+ # (const nil :String) :new)
29
+ STR_NODE = s(:send, s(:const, nil, :String), :new)
30
+
31
+ def on_send(node)
32
+ case node
33
+ when ARRAY_NODE
34
+ add_offence(:convention,
35
+ node.loc.expression,
36
+ ARR_MSG)
37
+ when HASH_NODE
38
+ add_offence(:convention,
39
+ node.loc.expression,
40
+ HASH_MSG)
41
+ when STR_NODE
42
+ add_offence(:convention,
43
+ node.loc.expression,
44
+ STR_MSG)
45
+ end
46
+ end
47
+
48
+ # TODO Check block contents as well
49
+ alias_method :on_block, :ignore_node
50
+ end
51
+ end
52
+ end
53
+ end