rubocop 0.87.1

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 (593) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +20 -0
  3. data/README.md +225 -0
  4. data/assets/logo.png +0 -0
  5. data/assets/output.html.erb +261 -0
  6. data/bin/console +10 -0
  7. data/bin/setup +7 -0
  8. data/config/default.yml +4203 -0
  9. data/exe/rubocop +17 -0
  10. data/lib/rubocop.rb +598 -0
  11. data/lib/rubocop/ast_aliases.rb +8 -0
  12. data/lib/rubocop/cached_data.rb +58 -0
  13. data/lib/rubocop/cli.rb +131 -0
  14. data/lib/rubocop/cli/command.rb +21 -0
  15. data/lib/rubocop/cli/command/auto_genenerate_config.rb +140 -0
  16. data/lib/rubocop/cli/command/base.rb +33 -0
  17. data/lib/rubocop/cli/command/execute_runner.rb +76 -0
  18. data/lib/rubocop/cli/command/init_dotfile.rb +45 -0
  19. data/lib/rubocop/cli/command/show_cops.rb +76 -0
  20. data/lib/rubocop/cli/command/version.rb +17 -0
  21. data/lib/rubocop/cli/environment.rb +21 -0
  22. data/lib/rubocop/comment_config.rb +206 -0
  23. data/lib/rubocop/config.rb +281 -0
  24. data/lib/rubocop/config_loader.rb +236 -0
  25. data/lib/rubocop/config_loader_resolver.rb +234 -0
  26. data/lib/rubocop/config_obsoletion.rb +277 -0
  27. data/lib/rubocop/config_store.rb +58 -0
  28. data/lib/rubocop/config_validator.rb +223 -0
  29. data/lib/rubocop/cop/autocorrect_logic.rb +95 -0
  30. data/lib/rubocop/cop/badge.rb +73 -0
  31. data/lib/rubocop/cop/base.rb +399 -0
  32. data/lib/rubocop/cop/bundler/duplicated_gem.rb +73 -0
  33. data/lib/rubocop/cop/bundler/gem_comment.rb +133 -0
  34. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +59 -0
  35. data/lib/rubocop/cop/bundler/ordered_gems.rb +73 -0
  36. data/lib/rubocop/cop/commissioner.rb +122 -0
  37. data/lib/rubocop/cop/cop.rb +160 -0
  38. data/lib/rubocop/cop/corrector.rb +119 -0
  39. data/lib/rubocop/cop/correctors/alignment_corrector.rb +142 -0
  40. data/lib/rubocop/cop/correctors/condition_corrector.rb +27 -0
  41. data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +53 -0
  42. data/lib/rubocop/cop/correctors/empty_line_corrector.rb +26 -0
  43. data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +73 -0
  44. data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +136 -0
  45. data/lib/rubocop/cop/correctors/line_break_corrector.rb +61 -0
  46. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +68 -0
  47. data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +44 -0
  48. data/lib/rubocop/cop/correctors/parentheses_corrector.rb +31 -0
  49. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +117 -0
  50. data/lib/rubocop/cop/correctors/punctuation_corrector.rb +29 -0
  51. data/lib/rubocop/cop/correctors/space_corrector.rb +46 -0
  52. data/lib/rubocop/cop/correctors/string_literal_corrector.rb +25 -0
  53. data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +43 -0
  54. data/lib/rubocop/cop/force.rb +42 -0
  55. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +104 -0
  56. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +104 -0
  57. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +85 -0
  58. data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +55 -0
  59. data/lib/rubocop/cop/generator.rb +223 -0
  60. data/lib/rubocop/cop/generator/configuration_injector.rb +66 -0
  61. data/lib/rubocop/cop/generator/require_file_injector.rb +78 -0
  62. data/lib/rubocop/cop/ignored_node.rb +36 -0
  63. data/lib/rubocop/cop/internal_affairs.rb +9 -0
  64. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +59 -0
  65. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +44 -0
  66. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +41 -0
  67. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +54 -0
  68. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +48 -0
  69. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +73 -0
  70. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +52 -0
  71. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +98 -0
  72. data/lib/rubocop/cop/layout/argument_alignment.rb +93 -0
  73. data/lib/rubocop/cop/layout/array_alignment.rb +82 -0
  74. data/lib/rubocop/cop/layout/assignment_indentation.rb +55 -0
  75. data/lib/rubocop/cop/layout/block_alignment.rb +244 -0
  76. data/lib/rubocop/cop/layout/block_end_newline.rb +64 -0
  77. data/lib/rubocop/cop/layout/case_indentation.rb +160 -0
  78. data/lib/rubocop/cop/layout/class_structure.rb +308 -0
  79. data/lib/rubocop/cop/layout/closing_heredoc_indentation.rb +126 -0
  80. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +203 -0
  81. data/lib/rubocop/cop/layout/comment_indentation.rb +141 -0
  82. data/lib/rubocop/cop/layout/condition_position.rb +66 -0
  83. data/lib/rubocop/cop/layout/def_end_alignment.rb +74 -0
  84. data/lib/rubocop/cop/layout/dot_position.rb +105 -0
  85. data/lib/rubocop/cop/layout/else_alignment.rb +142 -0
  86. data/lib/rubocop/cop/layout/empty_comment.rb +151 -0
  87. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +157 -0
  88. data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +64 -0
  89. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +152 -0
  90. data/lib/rubocop/cop/layout/empty_lines.rb +76 -0
  91. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +211 -0
  92. data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +99 -0
  93. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +121 -0
  94. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +45 -0
  95. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +41 -0
  96. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +88 -0
  97. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +136 -0
  98. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +45 -0
  99. data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +62 -0
  100. data/lib/rubocop/cop/layout/end_alignment.rb +189 -0
  101. data/lib/rubocop/cop/layout/end_of_line.rb +92 -0
  102. data/lib/rubocop/cop/layout/extra_spacing.rb +201 -0
  103. data/lib/rubocop/cop/layout/first_argument_indentation.rb +251 -0
  104. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +171 -0
  105. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +45 -0
  106. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +184 -0
  107. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +37 -0
  108. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +53 -0
  109. data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +46 -0
  110. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +100 -0
  111. data/lib/rubocop/cop/layout/hash_alignment.rb +365 -0
  112. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +285 -0
  113. data/lib/rubocop/cop/layout/heredoc_indentation.rb +173 -0
  114. data/lib/rubocop/cop/layout/indentation_consistency.rb +202 -0
  115. data/lib/rubocop/cop/layout/indentation_style.rb +117 -0
  116. data/lib/rubocop/cop/layout/indentation_width.rb +362 -0
  117. data/lib/rubocop/cop/layout/initial_indentation.rb +59 -0
  118. data/lib/rubocop/cop/layout/leading_comment_space.rb +119 -0
  119. data/lib/rubocop/cop/layout/leading_empty_lines.rb +53 -0
  120. data/lib/rubocop/cop/layout/line_length.rb +280 -0
  121. data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +118 -0
  122. data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +39 -0
  123. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +95 -0
  124. data/lib/rubocop/cop/layout/multiline_block_layout.rb +154 -0
  125. data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +118 -0
  126. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +50 -0
  127. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +52 -0
  128. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +134 -0
  129. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +220 -0
  130. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +131 -0
  131. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +123 -0
  132. data/lib/rubocop/cop/layout/parameter_alignment.rb +118 -0
  133. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +191 -0
  134. data/lib/rubocop/cop/layout/space_after_colon.rb +47 -0
  135. data/lib/rubocop/cop/layout/space_after_comma.rb +35 -0
  136. data/lib/rubocop/cop/layout/space_after_method_name.rb +42 -0
  137. data/lib/rubocop/cop/layout/space_after_not.rb +40 -0
  138. data/lib/rubocop/cop/layout/space_after_semicolon.rb +32 -0
  139. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +163 -0
  140. data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +92 -0
  141. data/lib/rubocop/cop/layout/space_around_keyword.rb +244 -0
  142. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +131 -0
  143. data/lib/rubocop/cop/layout/space_around_operators.rb +242 -0
  144. data/lib/rubocop/cop/layout/space_before_block_braces.rb +150 -0
  145. data/lib/rubocop/cop/layout/space_before_comma.rb +31 -0
  146. data/lib/rubocop/cop/layout/space_before_comment.rb +33 -0
  147. data/lib/rubocop/cop/layout/space_before_first_arg.rb +75 -0
  148. data/lib/rubocop/cop/layout/space_before_semicolon.rb +27 -0
  149. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +82 -0
  150. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +229 -0
  151. data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +53 -0
  152. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +248 -0
  153. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +200 -0
  154. data/lib/rubocop/cop/layout/space_inside_parens.rb +113 -0
  155. data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +65 -0
  156. data/lib/rubocop/cop/layout/space_inside_range_literal.rb +63 -0
  157. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +148 -0
  158. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +65 -0
  159. data/lib/rubocop/cop/layout/trailing_empty_lines.rb +113 -0
  160. data/lib/rubocop/cop/layout/trailing_whitespace.rb +77 -0
  161. data/lib/rubocop/cop/legacy/corrections_proxy.rb +49 -0
  162. data/lib/rubocop/cop/legacy/corrector.rb +29 -0
  163. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +62 -0
  164. data/lib/rubocop/cop/lint/ambiguous_operator.rb +96 -0
  165. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +57 -0
  166. data/lib/rubocop/cop/lint/assignment_in_condition.rb +97 -0
  167. data/lib/rubocop/cop/lint/big_decimal_new.rb +44 -0
  168. data/lib/rubocop/cop/lint/boolean_symbol.rb +50 -0
  169. data/lib/rubocop/cop/lint/circular_argument_reference.rb +72 -0
  170. data/lib/rubocop/cop/lint/constant_resolution.rb +89 -0
  171. data/lib/rubocop/cop/lint/debugger.rb +77 -0
  172. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +111 -0
  173. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +137 -0
  174. data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +81 -0
  175. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +53 -0
  176. data/lib/rubocop/cop/lint/duplicate_hash_key.rb +38 -0
  177. data/lib/rubocop/cop/lint/duplicate_methods.rb +235 -0
  178. data/lib/rubocop/cop/lint/each_with_object_argument.rb +42 -0
  179. data/lib/rubocop/cop/lint/else_layout.rb +66 -0
  180. data/lib/rubocop/cop/lint/empty_ensure.rb +60 -0
  181. data/lib/rubocop/cop/lint/empty_expression.rb +42 -0
  182. data/lib/rubocop/cop/lint/empty_interpolation.rb +36 -0
  183. data/lib/rubocop/cop/lint/empty_when.rb +61 -0
  184. data/lib/rubocop/cop/lint/ensure_return.rb +63 -0
  185. data/lib/rubocop/cop/lint/erb_new_arguments.rb +162 -0
  186. data/lib/rubocop/cop/lint/flip_flop.rb +32 -0
  187. data/lib/rubocop/cop/lint/float_out_of_range.rb +35 -0
  188. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +195 -0
  189. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +156 -0
  190. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +101 -0
  191. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +127 -0
  192. data/lib/rubocop/cop/lint/inherit_exception.rb +100 -0
  193. data/lib/rubocop/cop/lint/interpolation_check.rb +53 -0
  194. data/lib/rubocop/cop/lint/literal_as_condition.rb +135 -0
  195. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +98 -0
  196. data/lib/rubocop/cop/lint/loop.rb +65 -0
  197. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +84 -0
  198. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +69 -0
  199. data/lib/rubocop/cop/lint/multiple_comparison.rb +48 -0
  200. data/lib/rubocop/cop/lint/nested_method_definition.rb +104 -0
  201. data/lib/rubocop/cop/lint/nested_percent_literal.rb +51 -0
  202. data/lib/rubocop/cop/lint/next_without_accumulator.rb +50 -0
  203. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +89 -0
  204. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +83 -0
  205. data/lib/rubocop/cop/lint/number_conversion.rb +81 -0
  206. data/lib/rubocop/cop/lint/ordered_magic_comments.rb +86 -0
  207. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +91 -0
  208. data/lib/rubocop/cop/lint/percent_string_array.rb +71 -0
  209. data/lib/rubocop/cop/lint/percent_symbol_array.rb +69 -0
  210. data/lib/rubocop/cop/lint/raise_exception.rb +83 -0
  211. data/lib/rubocop/cop/lint/rand_one.rb +45 -0
  212. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +264 -0
  213. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +119 -0
  214. data/lib/rubocop/cop/lint/redundant_require_statement.rb +50 -0
  215. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +172 -0
  216. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +59 -0
  217. data/lib/rubocop/cop/lint/redundant_with_index.rb +82 -0
  218. data/lib/rubocop/cop/lint/redundant_with_object.rb +83 -0
  219. data/lib/rubocop/cop/lint/regexp_as_condition.rb +35 -0
  220. data/lib/rubocop/cop/lint/require_parentheses.rb +66 -0
  221. data/lib/rubocop/cop/lint/rescue_exception.rb +46 -0
  222. data/lib/rubocop/cop/lint/rescue_type.rb +94 -0
  223. data/lib/rubocop/cop/lint/return_in_void_context.rb +74 -0
  224. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +65 -0
  225. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +94 -0
  226. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +46 -0
  227. data/lib/rubocop/cop/lint/script_permission.rb +70 -0
  228. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +91 -0
  229. data/lib/rubocop/cop/lint/shadowed_argument.rb +182 -0
  230. data/lib/rubocop/cop/lint/shadowed_exception.rb +178 -0
  231. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +53 -0
  232. data/lib/rubocop/cop/lint/struct_new_override.rb +58 -0
  233. data/lib/rubocop/cop/lint/suppressed_exception.rb +92 -0
  234. data/lib/rubocop/cop/lint/syntax.rb +42 -0
  235. data/lib/rubocop/cop/lint/to_json.rb +41 -0
  236. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +82 -0
  237. data/lib/rubocop/cop/lint/unified_integer.rb +43 -0
  238. data/lib/rubocop/cop/lint/unreachable_code.rb +99 -0
  239. data/lib/rubocop/cop/lint/unused_block_argument.rb +165 -0
  240. data/lib/rubocop/cop/lint/unused_method_argument.rb +112 -0
  241. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +76 -0
  242. data/lib/rubocop/cop/lint/uri_regexp.rb +73 -0
  243. data/lib/rubocop/cop/lint/useless_access_modifier.rb +284 -0
  244. data/lib/rubocop/cop/lint/useless_assignment.rb +130 -0
  245. data/lib/rubocop/cop/lint/useless_comparison.rb +28 -0
  246. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +54 -0
  247. data/lib/rubocop/cop/lint/useless_setter_call.rb +168 -0
  248. data/lib/rubocop/cop/lint/void.rb +151 -0
  249. data/lib/rubocop/cop/message_annotator.rb +129 -0
  250. data/lib/rubocop/cop/metrics/abc_size.rb +24 -0
  251. data/lib/rubocop/cop/metrics/block_length.rb +72 -0
  252. data/lib/rubocop/cop/metrics/block_nesting.rb +65 -0
  253. data/lib/rubocop/cop/metrics/class_length.rb +59 -0
  254. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +64 -0
  255. data/lib/rubocop/cop/metrics/method_length.rb +59 -0
  256. data/lib/rubocop/cop/metrics/module_length.rb +59 -0
  257. data/lib/rubocop/cop/metrics/parameter_lists.rb +54 -0
  258. data/lib/rubocop/cop/metrics/perceived_complexity.rb +61 -0
  259. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +84 -0
  260. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +129 -0
  261. data/lib/rubocop/cop/metrics/utils/iterating_block.rb +61 -0
  262. data/lib/rubocop/cop/migration/department_name.rb +85 -0
  263. data/lib/rubocop/cop/mixin/alignment.rb +72 -0
  264. data/lib/rubocop/cop/mixin/allowed_methods.rb +19 -0
  265. data/lib/rubocop/cop/mixin/annotation_comment.rb +37 -0
  266. data/lib/rubocop/cop/mixin/array_min_size.rb +57 -0
  267. data/lib/rubocop/cop/mixin/array_syntax.rb +17 -0
  268. data/lib/rubocop/cop/mixin/auto_corrector.rb +12 -0
  269. data/lib/rubocop/cop/mixin/check_assignment.rb +44 -0
  270. data/lib/rubocop/cop/mixin/check_line_breakable.rb +184 -0
  271. data/lib/rubocop/cop/mixin/code_length.rb +42 -0
  272. data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +100 -0
  273. data/lib/rubocop/cop/mixin/configurable_formatting.rb +45 -0
  274. data/lib/rubocop/cop/mixin/configurable_max.rb +23 -0
  275. data/lib/rubocop/cop/mixin/configurable_naming.rb +16 -0
  276. data/lib/rubocop/cop/mixin/configurable_numbering.rb +17 -0
  277. data/lib/rubocop/cop/mixin/def_node.rb +33 -0
  278. data/lib/rubocop/cop/mixin/documentation_comment.rb +52 -0
  279. data/lib/rubocop/cop/mixin/duplication.rb +46 -0
  280. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +172 -0
  281. data/lib/rubocop/cop/mixin/empty_parameter.rb +24 -0
  282. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +72 -0
  283. data/lib/rubocop/cop/mixin/enforce_superclass.rb +32 -0
  284. data/lib/rubocop/cop/mixin/first_element_line_break.rb +46 -0
  285. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +62 -0
  286. data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +147 -0
  287. data/lib/rubocop/cop/mixin/hash_transform_method.rb +178 -0
  288. data/lib/rubocop/cop/mixin/heredoc.rb +32 -0
  289. data/lib/rubocop/cop/mixin/ignored_methods.rb +19 -0
  290. data/lib/rubocop/cop/mixin/ignored_pattern.rb +29 -0
  291. data/lib/rubocop/cop/mixin/integer_node.rb +14 -0
  292. data/lib/rubocop/cop/mixin/interpolation.rb +27 -0
  293. data/lib/rubocop/cop/mixin/line_length_help.rb +89 -0
  294. data/lib/rubocop/cop/mixin/match_range.rb +26 -0
  295. data/lib/rubocop/cop/mixin/method_complexity.rb +62 -0
  296. data/lib/rubocop/cop/mixin/method_preference.rb +31 -0
  297. data/lib/rubocop/cop/mixin/min_body_length.rb +21 -0
  298. data/lib/rubocop/cop/mixin/multiline_element_indentation.rb +86 -0
  299. data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +33 -0
  300. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +255 -0
  301. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +141 -0
  302. data/lib/rubocop/cop/mixin/negative_conditional.rb +32 -0
  303. data/lib/rubocop/cop/mixin/nil_methods.rb +23 -0
  304. data/lib/rubocop/cop/mixin/on_normal_if_unless.rb +14 -0
  305. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +61 -0
  306. data/lib/rubocop/cop/mixin/parentheses.rb +16 -0
  307. data/lib/rubocop/cop/mixin/parser_diagnostic.rb +37 -0
  308. data/lib/rubocop/cop/mixin/percent_array.rb +52 -0
  309. data/lib/rubocop/cop/mixin/percent_literal.rb +38 -0
  310. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +181 -0
  311. data/lib/rubocop/cop/mixin/preferred_delimiters.rb +53 -0
  312. data/lib/rubocop/cop/mixin/range_help.rb +117 -0
  313. data/lib/rubocop/cop/mixin/rational_literal.rb +18 -0
  314. data/lib/rubocop/cop/mixin/regexp_literal_help.rb +43 -0
  315. data/lib/rubocop/cop/mixin/rescue_node.rb +22 -0
  316. data/lib/rubocop/cop/mixin/safe_assignment.rb +23 -0
  317. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +55 -0
  318. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +49 -0
  319. data/lib/rubocop/cop/mixin/statement_modifier.rb +56 -0
  320. data/lib/rubocop/cop/mixin/string_help.rb +35 -0
  321. data/lib/rubocop/cop/mixin/string_literals_help.rb +23 -0
  322. data/lib/rubocop/cop/mixin/surrounding_space.rb +151 -0
  323. data/lib/rubocop/cop/mixin/target_ruby_version.rb +20 -0
  324. data/lib/rubocop/cop/mixin/too_many_lines.rb +25 -0
  325. data/lib/rubocop/cop/mixin/trailing_body.rb +26 -0
  326. data/lib/rubocop/cop/mixin/trailing_comma.rb +212 -0
  327. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +113 -0
  328. data/lib/rubocop/cop/mixin/unused_argument.rb +33 -0
  329. data/lib/rubocop/cop/mixin/visibility_help.rb +50 -0
  330. data/lib/rubocop/cop/naming/accessor_method_name.rb +55 -0
  331. data/lib/rubocop/cop/naming/ascii_identifiers.rb +95 -0
  332. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +43 -0
  333. data/lib/rubocop/cop/naming/block_parameter_name.rb +49 -0
  334. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +43 -0
  335. data/lib/rubocop/cop/naming/constant_name.rb +82 -0
  336. data/lib/rubocop/cop/naming/file_name.rb +223 -0
  337. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +62 -0
  338. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +55 -0
  339. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +171 -0
  340. data/lib/rubocop/cop/naming/method_name.rb +79 -0
  341. data/lib/rubocop/cop/naming/method_parameter_name.rb +58 -0
  342. data/lib/rubocop/cop/naming/predicate_name.rb +106 -0
  343. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +112 -0
  344. data/lib/rubocop/cop/naming/variable_name.rb +52 -0
  345. data/lib/rubocop/cop/naming/variable_number.rb +61 -0
  346. data/lib/rubocop/cop/offense.rb +230 -0
  347. data/lib/rubocop/cop/registry.rb +276 -0
  348. data/lib/rubocop/cop/security/eval.rb +31 -0
  349. data/lib/rubocop/cop/security/json_load.rb +46 -0
  350. data/lib/rubocop/cop/security/marshal_load.rb +39 -0
  351. data/lib/rubocop/cop/security/open.rb +71 -0
  352. data/lib/rubocop/cop/security/yaml_load.rb +37 -0
  353. data/lib/rubocop/cop/severity.rb +75 -0
  354. data/lib/rubocop/cop/style/access_modifier_declarations.rb +132 -0
  355. data/lib/rubocop/cop/style/accessor_grouping.rb +140 -0
  356. data/lib/rubocop/cop/style/alias.rb +147 -0
  357. data/lib/rubocop/cop/style/and_or.rb +145 -0
  358. data/lib/rubocop/cop/style/array_join.rb +39 -0
  359. data/lib/rubocop/cop/style/ascii_comments.rb +61 -0
  360. data/lib/rubocop/cop/style/attr.rb +68 -0
  361. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +51 -0
  362. data/lib/rubocop/cop/style/bare_percent_literals.rb +78 -0
  363. data/lib/rubocop/cop/style/begin_block.rb +22 -0
  364. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +145 -0
  365. data/lib/rubocop/cop/style/block_comments.rb +70 -0
  366. data/lib/rubocop/cop/style/block_delimiters.rb +382 -0
  367. data/lib/rubocop/cop/style/case_equality.rb +53 -0
  368. data/lib/rubocop/cop/style/character_literal.rb +53 -0
  369. data/lib/rubocop/cop/style/class_and_module_children.rb +151 -0
  370. data/lib/rubocop/cop/style/class_check.rb +59 -0
  371. data/lib/rubocop/cop/style/class_methods.rb +60 -0
  372. data/lib/rubocop/cop/style/class_vars.rb +69 -0
  373. data/lib/rubocop/cop/style/collection_methods.rb +79 -0
  374. data/lib/rubocop/cop/style/colon_method_call.rb +48 -0
  375. data/lib/rubocop/cop/style/colon_method_definition.rb +37 -0
  376. data/lib/rubocop/cop/style/command_literal.rb +187 -0
  377. data/lib/rubocop/cop/style/comment_annotation.rb +97 -0
  378. data/lib/rubocop/cop/style/commented_keyword.rb +73 -0
  379. data/lib/rubocop/cop/style/conditional_assignment.rb +666 -0
  380. data/lib/rubocop/cop/style/constant_visibility.rb +77 -0
  381. data/lib/rubocop/cop/style/copyright.rb +99 -0
  382. data/lib/rubocop/cop/style/date_time.rb +77 -0
  383. data/lib/rubocop/cop/style/def_with_parentheses.rb +57 -0
  384. data/lib/rubocop/cop/style/dir.rb +48 -0
  385. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +49 -0
  386. data/lib/rubocop/cop/style/documentation.rb +135 -0
  387. data/lib/rubocop/cop/style/documentation_method.rb +125 -0
  388. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +55 -0
  389. data/lib/rubocop/cop/style/double_negation.rb +72 -0
  390. data/lib/rubocop/cop/style/each_for_simple_loop.rb +58 -0
  391. data/lib/rubocop/cop/style/each_with_object.rb +110 -0
  392. data/lib/rubocop/cop/style/empty_block_parameter.rb +48 -0
  393. data/lib/rubocop/cop/style/empty_case_condition.rb +109 -0
  394. data/lib/rubocop/cop/style/empty_else.rb +175 -0
  395. data/lib/rubocop/cop/style/empty_lambda_parameter.rb +45 -0
  396. data/lib/rubocop/cop/style/empty_literal.rb +121 -0
  397. data/lib/rubocop/cop/style/empty_method.rb +111 -0
  398. data/lib/rubocop/cop/style/encoding.rb +56 -0
  399. data/lib/rubocop/cop/style/end_block.rb +31 -0
  400. data/lib/rubocop/cop/style/eval_with_location.rb +148 -0
  401. data/lib/rubocop/cop/style/even_odd.rb +58 -0
  402. data/lib/rubocop/cop/style/expand_path_arguments.rb +194 -0
  403. data/lib/rubocop/cop/style/exponential_notation.rb +119 -0
  404. data/lib/rubocop/cop/style/float_division.rb +94 -0
  405. data/lib/rubocop/cop/style/for.rb +88 -0
  406. data/lib/rubocop/cop/style/format_string.rb +127 -0
  407. data/lib/rubocop/cop/style/format_string_token.rb +120 -0
  408. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +234 -0
  409. data/lib/rubocop/cop/style/global_vars.rb +80 -0
  410. data/lib/rubocop/cop/style/guard_clause.rb +145 -0
  411. data/lib/rubocop/cop/style/hash_each_methods.rb +89 -0
  412. data/lib/rubocop/cop/style/hash_syntax.rb +221 -0
  413. data/lib/rubocop/cop/style/hash_transform_keys.rb +83 -0
  414. data/lib/rubocop/cop/style/hash_transform_values.rb +80 -0
  415. data/lib/rubocop/cop/style/identical_conditional_branches.rb +130 -0
  416. data/lib/rubocop/cop/style/if_inside_else.rb +87 -0
  417. data/lib/rubocop/cop/style/if_unless_modifier.rb +189 -0
  418. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +51 -0
  419. data/lib/rubocop/cop/style/if_with_semicolon.rb +46 -0
  420. data/lib/rubocop/cop/style/implicit_runtime_error.rb +32 -0
  421. data/lib/rubocop/cop/style/infinite_loop.rb +128 -0
  422. data/lib/rubocop/cop/style/inline_comment.rb +34 -0
  423. data/lib/rubocop/cop/style/inverse_methods.rb +197 -0
  424. data/lib/rubocop/cop/style/ip_addresses.rb +76 -0
  425. data/lib/rubocop/cop/style/lambda.rb +132 -0
  426. data/lib/rubocop/cop/style/lambda_call.rb +73 -0
  427. data/lib/rubocop/cop/style/line_end_concatenation.rb +125 -0
  428. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +190 -0
  429. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +169 -0
  430. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +52 -0
  431. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +75 -0
  432. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +46 -0
  433. data/lib/rubocop/cop/style/method_def_parentheses.rb +166 -0
  434. data/lib/rubocop/cop/style/method_missing_super.rb +34 -0
  435. data/lib/rubocop/cop/style/min_max.rb +68 -0
  436. data/lib/rubocop/cop/style/missing_else.rb +180 -0
  437. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +46 -0
  438. data/lib/rubocop/cop/style/mixin_grouping.rb +148 -0
  439. data/lib/rubocop/cop/style/mixin_usage.rb +90 -0
  440. data/lib/rubocop/cop/style/module_function.rb +150 -0
  441. data/lib/rubocop/cop/style/multiline_block_chain.rb +49 -0
  442. data/lib/rubocop/cop/style/multiline_if_modifier.rb +67 -0
  443. data/lib/rubocop/cop/style/multiline_if_then.rb +50 -0
  444. data/lib/rubocop/cop/style/multiline_memoization.rb +94 -0
  445. data/lib/rubocop/cop/style/multiline_method_signature.rb +61 -0
  446. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +49 -0
  447. data/lib/rubocop/cop/style/multiline_when_then.rb +74 -0
  448. data/lib/rubocop/cop/style/multiple_comparison.rb +92 -0
  449. data/lib/rubocop/cop/style/mutable_constant.rb +172 -0
  450. data/lib/rubocop/cop/style/negated_if.rb +99 -0
  451. data/lib/rubocop/cop/style/negated_unless.rb +89 -0
  452. data/lib/rubocop/cop/style/negated_while.rb +48 -0
  453. data/lib/rubocop/cop/style/nested_modifier.rb +107 -0
  454. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +64 -0
  455. data/lib/rubocop/cop/style/nested_ternary_operator.rb +59 -0
  456. data/lib/rubocop/cop/style/next.rb +244 -0
  457. data/lib/rubocop/cop/style/nil_comparison.rb +75 -0
  458. data/lib/rubocop/cop/style/non_nil_check.rb +136 -0
  459. data/lib/rubocop/cop/style/not.rb +82 -0
  460. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +124 -0
  461. data/lib/rubocop/cop/style/numeric_literals.rb +114 -0
  462. data/lib/rubocop/cop/style/numeric_predicate.rb +138 -0
  463. data/lib/rubocop/cop/style/one_line_conditional.rb +98 -0
  464. data/lib/rubocop/cop/style/option_hash.rb +55 -0
  465. data/lib/rubocop/cop/style/optional_arguments.rb +58 -0
  466. data/lib/rubocop/cop/style/or_assignment.rb +96 -0
  467. data/lib/rubocop/cop/style/parallel_assignment.rb +287 -0
  468. data/lib/rubocop/cop/style/parentheses_around_condition.rb +117 -0
  469. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +127 -0
  470. data/lib/rubocop/cop/style/percent_q_literals.rb +73 -0
  471. data/lib/rubocop/cop/style/perl_backrefs.rb +38 -0
  472. data/lib/rubocop/cop/style/preferred_hash_methods.rb +75 -0
  473. data/lib/rubocop/cop/style/proc.rb +34 -0
  474. data/lib/rubocop/cop/style/raise_args.rb +145 -0
  475. data/lib/rubocop/cop/style/random_with_offset.rb +152 -0
  476. data/lib/rubocop/cop/style/redundant_assignment.rb +117 -0
  477. data/lib/rubocop/cop/style/redundant_begin.rb +91 -0
  478. data/lib/rubocop/cop/style/redundant_capital_w.rb +51 -0
  479. data/lib/rubocop/cop/style/redundant_condition.rb +124 -0
  480. data/lib/rubocop/cop/style/redundant_conditional.rb +98 -0
  481. data/lib/rubocop/cop/style/redundant_exception.rb +64 -0
  482. data/lib/rubocop/cop/style/redundant_fetch_block.rb +122 -0
  483. data/lib/rubocop/cop/style/redundant_freeze.rb +67 -0
  484. data/lib/rubocop/cop/style/redundant_interpolation.rb +98 -0
  485. data/lib/rubocop/cop/style/redundant_parentheses.rb +233 -0
  486. data/lib/rubocop/cop/style/redundant_percent_q.rb +112 -0
  487. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +90 -0
  488. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +121 -0
  489. data/lib/rubocop/cop/style/redundant_return.rb +169 -0
  490. data/lib/rubocop/cop/style/redundant_self.rb +168 -0
  491. data/lib/rubocop/cop/style/redundant_sort.rb +165 -0
  492. data/lib/rubocop/cop/style/redundant_sort_by.rb +50 -0
  493. data/lib/rubocop/cop/style/regexp_literal.rb +228 -0
  494. data/lib/rubocop/cop/style/rescue_modifier.rb +73 -0
  495. data/lib/rubocop/cop/style/rescue_standard_error.rb +124 -0
  496. data/lib/rubocop/cop/style/return_nil.rb +89 -0
  497. data/lib/rubocop/cop/style/safe_navigation.rb +271 -0
  498. data/lib/rubocop/cop/style/sample.rb +144 -0
  499. data/lib/rubocop/cop/style/self_assignment.rb +97 -0
  500. data/lib/rubocop/cop/style/semicolon.rb +101 -0
  501. data/lib/rubocop/cop/style/send.rb +31 -0
  502. data/lib/rubocop/cop/style/signal_exception.rb +211 -0
  503. data/lib/rubocop/cop/style/single_line_block_params.rb +95 -0
  504. data/lib/rubocop/cop/style/single_line_methods.rb +83 -0
  505. data/lib/rubocop/cop/style/slicing_with_range.rb +39 -0
  506. data/lib/rubocop/cop/style/special_global_vars.rb +207 -0
  507. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +83 -0
  508. data/lib/rubocop/cop/style/stderr_puts.rb +61 -0
  509. data/lib/rubocop/cop/style/string_hash_keys.rb +50 -0
  510. data/lib/rubocop/cop/style/string_literals.rb +129 -0
  511. data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +49 -0
  512. data/lib/rubocop/cop/style/string_methods.rb +46 -0
  513. data/lib/rubocop/cop/style/strip.rb +46 -0
  514. data/lib/rubocop/cop/style/struct_inheritance.rb +60 -0
  515. data/lib/rubocop/cop/style/symbol_array.rb +119 -0
  516. data/lib/rubocop/cop/style/symbol_literal.rb +32 -0
  517. data/lib/rubocop/cop/style/symbol_proc.rb +110 -0
  518. data/lib/rubocop/cop/style/ternary_parentheses.rb +220 -0
  519. data/lib/rubocop/cop/style/trailing_body_on_class.rb +43 -0
  520. data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +54 -0
  521. data/lib/rubocop/cop/style/trailing_body_on_module.rb +43 -0
  522. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +109 -0
  523. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +99 -0
  524. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +88 -0
  525. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +100 -0
  526. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +91 -0
  527. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +165 -0
  528. data/lib/rubocop/cop/style/trivial_accessors.rb +192 -0
  529. data/lib/rubocop/cop/style/unless_else.rb +55 -0
  530. data/lib/rubocop/cop/style/unpack_first.rb +61 -0
  531. data/lib/rubocop/cop/style/variable_interpolation.rb +48 -0
  532. data/lib/rubocop/cop/style/when_then.rb +37 -0
  533. data/lib/rubocop/cop/style/while_until_do.rb +59 -0
  534. data/lib/rubocop/cop/style/while_until_modifier.rb +61 -0
  535. data/lib/rubocop/cop/style/word_array.rb +102 -0
  536. data/lib/rubocop/cop/style/yoda_condition.rb +173 -0
  537. data/lib/rubocop/cop/style/zero_length_predicate.rb +117 -0
  538. data/lib/rubocop/cop/team.rb +256 -0
  539. data/lib/rubocop/cop/util.rb +151 -0
  540. data/lib/rubocop/cop/utils/format_string.rb +137 -0
  541. data/lib/rubocop/cop/variable_force.rb +463 -0
  542. data/lib/rubocop/cop/variable_force/assignment.rb +97 -0
  543. data/lib/rubocop/cop/variable_force/branch.rb +320 -0
  544. data/lib/rubocop/cop/variable_force/branchable.rb +23 -0
  545. data/lib/rubocop/cop/variable_force/reference.rb +49 -0
  546. data/lib/rubocop/cop/variable_force/scope.rb +110 -0
  547. data/lib/rubocop/cop/variable_force/variable.rb +114 -0
  548. data/lib/rubocop/cop/variable_force/variable_table.rb +129 -0
  549. data/lib/rubocop/core_ext/string.rb +23 -0
  550. data/lib/rubocop/error.rb +34 -0
  551. data/lib/rubocop/ext/processed_source.rb +18 -0
  552. data/lib/rubocop/file_finder.rb +42 -0
  553. data/lib/rubocop/formatter/auto_gen_config_formatter.rb +16 -0
  554. data/lib/rubocop/formatter/base_formatter.rb +119 -0
  555. data/lib/rubocop/formatter/clang_style_formatter.rb +57 -0
  556. data/lib/rubocop/formatter/colorizable.rb +41 -0
  557. data/lib/rubocop/formatter/disabled_config_formatter.rb +216 -0
  558. data/lib/rubocop/formatter/emacs_style_formatter.rb +37 -0
  559. data/lib/rubocop/formatter/file_list_formatter.rb +20 -0
  560. data/lib/rubocop/formatter/formatter_set.rb +104 -0
  561. data/lib/rubocop/formatter/fuubar_style_formatter.rb +80 -0
  562. data/lib/rubocop/formatter/html_formatter.rb +141 -0
  563. data/lib/rubocop/formatter/json_formatter.rb +81 -0
  564. data/lib/rubocop/formatter/junit_formatter.rb +84 -0
  565. data/lib/rubocop/formatter/offense_count_formatter.rb +74 -0
  566. data/lib/rubocop/formatter/pacman_formatter.rb +80 -0
  567. data/lib/rubocop/formatter/progress_formatter.rb +63 -0
  568. data/lib/rubocop/formatter/quiet_formatter.rb +13 -0
  569. data/lib/rubocop/formatter/simple_text_formatter.rb +138 -0
  570. data/lib/rubocop/formatter/tap_formatter.rb +82 -0
  571. data/lib/rubocop/formatter/text_util.rb +20 -0
  572. data/lib/rubocop/formatter/worst_offenders_formatter.rb +62 -0
  573. data/lib/rubocop/magic_comment.rb +214 -0
  574. data/lib/rubocop/name_similarity.rb +28 -0
  575. data/lib/rubocop/options.rb +488 -0
  576. data/lib/rubocop/path_util.rb +85 -0
  577. data/lib/rubocop/platform.rb +11 -0
  578. data/lib/rubocop/rake_task.rb +77 -0
  579. data/lib/rubocop/remote_config.rb +104 -0
  580. data/lib/rubocop/result_cache.rb +205 -0
  581. data/lib/rubocop/rspec/cop_helper.rb +71 -0
  582. data/lib/rubocop/rspec/expect_offense.rb +288 -0
  583. data/lib/rubocop/rspec/host_environment_simulation_helper.rb +28 -0
  584. data/lib/rubocop/rspec/shared_contexts.rb +129 -0
  585. data/lib/rubocop/rspec/support.rb +13 -0
  586. data/lib/rubocop/runner.rb +388 -0
  587. data/lib/rubocop/string_interpreter.rb +57 -0
  588. data/lib/rubocop/target_finder.rb +196 -0
  589. data/lib/rubocop/target_ruby.rb +154 -0
  590. data/lib/rubocop/version.rb +23 -0
  591. data/lib/rubocop/warning.rb +11 -0
  592. data/lib/rubocop/yaml_duplication_checker.rb +39 -0
  593. metadata +795 -0
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ # This cop checks for cases when you could use a block
7
+ # accepting version of a method that does automatic
8
+ # resource cleanup.
9
+ #
10
+ # @example
11
+ #
12
+ # # bad
13
+ # f = File.open('file')
14
+ #
15
+ # # good
16
+ # File.open('file') do |f|
17
+ # # ...
18
+ # end
19
+ class AutoResourceCleanup < Cop
20
+ MSG = 'Use the block version of `%<class>s.%<method>s`.'
21
+
22
+ TARGET_METHODS = {
23
+ File: :open
24
+ }.freeze
25
+
26
+ def on_send(node)
27
+ TARGET_METHODS.each do |target_class, target_method|
28
+ target_receiver = s(:const, nil, target_class)
29
+
30
+ next if node.receiver != target_receiver
31
+ next if node.method_name != target_method
32
+ next if cleanup?(node)
33
+
34
+ add_offense(node,
35
+ message: format(MSG,
36
+ class: target_class,
37
+ method: target_method))
38
+ end
39
+ end
40
+
41
+ private
42
+
43
+ def cleanup?(node)
44
+ parent = node.parent
45
+ node.block_argument? ||
46
+ (parent && (parent.block_type? || !parent.lvasgn_type?))
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,78 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ # This cop checks if usage of %() or %Q() matches configuration.
7
+ #
8
+ # @example EnforcedStyle: bare_percent (default)
9
+ # # bad
10
+ # %Q(He said: "#{greeting}")
11
+ # %q{She said: 'Hi'}
12
+ #
13
+ # # good
14
+ # %(He said: "#{greeting}")
15
+ # %{She said: 'Hi'}
16
+ #
17
+ # @example EnforcedStyle: percent_q
18
+ # # bad
19
+ # %|He said: "#{greeting}"|
20
+ # %/She said: 'Hi'/
21
+ #
22
+ # # good
23
+ # %Q|He said: "#{greeting}"|
24
+ # %q/She said: 'Hi'/
25
+ #
26
+ class BarePercentLiterals < Cop
27
+ include ConfigurableEnforcedStyle
28
+
29
+ MSG = 'Use `%%%<good>s` instead of `%%%<bad>s`.'
30
+
31
+ def on_dstr(node)
32
+ check(node)
33
+ end
34
+
35
+ def on_str(node)
36
+ check(node)
37
+ end
38
+
39
+ def autocorrect(node)
40
+ src = node.loc.begin.source
41
+ replacement = src.start_with?('%Q') ? '%' : '%Q'
42
+ lambda do |corrector|
43
+ corrector.replace(node.loc.begin, src.sub(/%Q?/, replacement))
44
+ end
45
+ end
46
+
47
+ private
48
+
49
+ def check(node)
50
+ return if node.heredoc?
51
+ return unless node.loc.respond_to?(:begin)
52
+ return unless node.loc.begin
53
+
54
+ source = node.loc.begin.source
55
+ if requires_percent_q?(source)
56
+ add_offense_for_wrong_style(node, 'Q', '')
57
+ elsif requires_bare_percent?(source)
58
+ add_offense_for_wrong_style(node, '', 'Q')
59
+ end
60
+ end
61
+
62
+ def requires_percent_q?(source)
63
+ style == :percent_q && /^%[^\w]/.match?(source)
64
+ end
65
+
66
+ def requires_bare_percent?(source)
67
+ style == :bare_percent && source.start_with?('%Q')
68
+ end
69
+
70
+ def add_offense_for_wrong_style(node, good, bad)
71
+ add_offense(node, location: :begin, message: format(MSG,
72
+ good: good,
73
+ bad: bad))
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ #
7
+ # This cop checks for BEGIN blocks.
8
+ #
9
+ # @example
10
+ # # bad
11
+ # BEGIN { test }
12
+ #
13
+ class BeginBlock < Cop
14
+ MSG = 'Avoid the use of `BEGIN` blocks.'
15
+
16
+ def on_preexe(node)
17
+ add_offense(node, location: :keyword)
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,145 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'set'
4
+
5
+ module RuboCop
6
+ module Cop
7
+ module Style
8
+ # This cop checks for places where `attr_reader` and `attr_writer`
9
+ # for the same method can be combined into single `attr_accessor`.
10
+ #
11
+ # @example
12
+ # # bad
13
+ # class Foo
14
+ # attr_reader :bar
15
+ # attr_writer :bar
16
+ # end
17
+ #
18
+ # # good
19
+ # class Foo
20
+ # attr_accessor :bar
21
+ # end
22
+ #
23
+ class BisectedAttrAccessor < Cop
24
+ include VisibilityHelp
25
+
26
+ MSG = 'Combine both accessors into `attr_accessor %<name>s`.'
27
+
28
+ def on_class(class_node)
29
+ VISIBILITY_SCOPES.each do |visibility|
30
+ reader_names, writer_names = accessor_names(class_node, visibility)
31
+
32
+ accessor_macroses(class_node, visibility).each do |macro|
33
+ check(macro, reader_names, writer_names)
34
+ end
35
+ end
36
+ end
37
+ alias on_sclass on_class
38
+ alias on_module on_class
39
+
40
+ def autocorrect(node)
41
+ macro = node.parent
42
+
43
+ lambda do |corrector|
44
+ corrector.replace(macro, replacement(macro, node))
45
+ end
46
+ end
47
+
48
+ private
49
+
50
+ def accessor_names(class_node, visibility)
51
+ reader_names = Set.new
52
+ writer_names = Set.new
53
+
54
+ accessor_macroses(class_node, visibility).each do |macro|
55
+ names = macro.arguments.map(&:source)
56
+
57
+ names.each do |name|
58
+ if attr_reader?(macro)
59
+ reader_names.add(name)
60
+ else
61
+ writer_names.add(name)
62
+ end
63
+ end
64
+ end
65
+
66
+ [reader_names, writer_names]
67
+ end
68
+
69
+ def accessor_macroses(class_node, visibility)
70
+ class_def = class_node.body
71
+ return [] if !class_def || class_def.def_type?
72
+
73
+ send_nodes =
74
+ if class_def.send_type?
75
+ [class_def]
76
+ else
77
+ class_def.each_child_node(:send)
78
+ end
79
+
80
+ send_nodes.select { |node| attr_within_visibility_scope?(node, visibility) }
81
+ end
82
+
83
+ def attr_within_visibility_scope?(node, visibility)
84
+ node.macro? &&
85
+ (attr_reader?(node) || attr_writer?(node)) &&
86
+ node_visibility(node) == visibility
87
+ end
88
+
89
+ def attr_reader?(send_node)
90
+ send_node.method?(:attr_reader) || send_node.method?(:attr)
91
+ end
92
+
93
+ def attr_writer?(send_node)
94
+ send_node.method?(:attr_writer)
95
+ end
96
+
97
+ def check(macro, reader_names, writer_names)
98
+ macro.arguments.each do |arg_node|
99
+ name = arg_node.source
100
+
101
+ if (attr_reader?(macro) && writer_names.include?(name)) ||
102
+ (attr_writer?(macro) && reader_names.include?(name))
103
+ add_offense(arg_node, message: format(MSG, name: name))
104
+ end
105
+ end
106
+ end
107
+
108
+ def replacement(macro, node)
109
+ class_node = macro.each_ancestor(:class, :sclass, :module).first
110
+ reader_names, writer_names = accessor_names(class_node, node_visibility(macro))
111
+
112
+ rest_args = rest_args(macro.arguments, reader_names, writer_names)
113
+
114
+ if attr_reader?(macro)
115
+ attr_reader_replacement(macro, node, rest_args)
116
+ elsif rest_args.empty?
117
+ ''
118
+ else
119
+ "#{macro.method_name} #{rest_args.map(&:source).join(', ')}"
120
+ end
121
+ end
122
+
123
+ def rest_args(args, reader_names, writer_names)
124
+ args.reject do |arg|
125
+ name = arg.source
126
+ reader_names.include?(name) && writer_names.include?(name)
127
+ end
128
+ end
129
+
130
+ def attr_reader_replacement(macro, node, rest_args)
131
+ if rest_args.empty?
132
+ "attr_accessor #{node.source}"
133
+ else
134
+ "attr_accessor #{node.source}\n"\
135
+ "#{indent(macro)}#{macro.method_name} #{rest_args.map(&:source).join(', ')}"
136
+ end
137
+ end
138
+
139
+ def indent(node)
140
+ ' ' * node.loc.column
141
+ end
142
+ end
143
+ end
144
+ end
145
+ end
@@ -0,0 +1,70 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ # This cop looks for uses of block comments (=begin...=end).
7
+ #
8
+ # @example
9
+ # # bad
10
+ # =begin
11
+ # Multiple lines
12
+ # of comments...
13
+ # =end
14
+ #
15
+ # # good
16
+ # # Multiple lines
17
+ # # of comments...
18
+ #
19
+ class BlockComments < Cop
20
+ include RangeHelp
21
+
22
+ MSG = 'Do not use block comments.'
23
+ BEGIN_LENGTH = "=begin\n".length
24
+ END_LENGTH = "\n=end".length
25
+
26
+ def investigate(processed_source)
27
+ processed_source.each_comment do |comment|
28
+ next unless comment.document?
29
+
30
+ add_offense(comment)
31
+ end
32
+ end
33
+
34
+ def autocorrect(comment)
35
+ eq_begin, eq_end, contents = parts(comment)
36
+
37
+ lambda do |corrector|
38
+ corrector.remove(eq_begin)
39
+ unless contents.length.zero?
40
+ corrector.replace(contents,
41
+ contents.source
42
+ .gsub(/\A/, '# ')
43
+ .gsub(/\n\n/, "\n#\n")
44
+ .gsub(/\n(?=[^#])/, "\n# "))
45
+ end
46
+ corrector.remove(eq_end)
47
+ end
48
+ end
49
+
50
+ private
51
+
52
+ def parts(comment)
53
+ expr = comment.loc.expression
54
+ eq_begin = expr.resize(BEGIN_LENGTH)
55
+ eq_end = eq_end_part(comment, expr)
56
+ contents = range_between(eq_begin.end_pos, eq_end.begin_pos)
57
+ [eq_begin, eq_end, contents]
58
+ end
59
+
60
+ def eq_end_part(comment, expr)
61
+ if comment.text.chomp == comment.text
62
+ range_between(expr.end_pos - END_LENGTH - 1, expr.end_pos - 2)
63
+ else
64
+ range_between(expr.end_pos - END_LENGTH, expr.end_pos)
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,382 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ # Check for uses of braces or do/end around single line or
7
+ # multi-line blocks.
8
+ #
9
+ # @example EnforcedStyle: line_count_based (default)
10
+ # # bad - single line block
11
+ # items.each do |item| item / 5 end
12
+ #
13
+ # # good - single line block
14
+ # items.each { |item| item / 5 }
15
+ #
16
+ # # bad - multi-line block
17
+ # things.map { |thing|
18
+ # something = thing.some_method
19
+ # process(something)
20
+ # }
21
+ #
22
+ # # good - multi-line block
23
+ # things.map do |thing|
24
+ # something = thing.some_method
25
+ # process(something)
26
+ # end
27
+ #
28
+ # @example EnforcedStyle: semantic
29
+ # # Prefer `do...end` over `{...}` for procedural blocks.
30
+ #
31
+ # # return value is used/assigned
32
+ # # bad
33
+ # foo = map do |x|
34
+ # x
35
+ # end
36
+ # puts (map do |x|
37
+ # x
38
+ # end)
39
+ #
40
+ # # return value is not used out of scope
41
+ # # good
42
+ # map do |x|
43
+ # x
44
+ # end
45
+ #
46
+ # # Prefer `{...}` over `do...end` for functional blocks.
47
+ #
48
+ # # return value is not used out of scope
49
+ # # bad
50
+ # each { |x|
51
+ # x
52
+ # }
53
+ #
54
+ # # return value is used/assigned
55
+ # # good
56
+ # foo = map { |x|
57
+ # x
58
+ # }
59
+ # map { |x|
60
+ # x
61
+ # }.inspect
62
+ #
63
+ # # The AllowBracesOnProceduralOneLiners option is ignored unless the
64
+ # # EnforcedStyle is set to `semantic`. If so:
65
+ #
66
+ # # If the AllowBracesOnProceduralOneLiners option is unspecified, or
67
+ # # set to `false` or any other falsey value, then semantic purity is
68
+ # # maintained, so one-line procedural blocks must use do-end, not
69
+ # # braces.
70
+ #
71
+ # # bad
72
+ # collection.each { |element| puts element }
73
+ #
74
+ # # good
75
+ # collection.each do |element| puts element end
76
+ #
77
+ # # If the AllowBracesOnProceduralOneLiners option is set to `true`, or
78
+ # # any other truthy value, then one-line procedural blocks may use
79
+ # # either style. (There is no setting for requiring braces on them.)
80
+ #
81
+ # # good
82
+ # collection.each { |element| puts element }
83
+ #
84
+ # # also good
85
+ # collection.each do |element| puts element end
86
+ #
87
+ # @example EnforcedStyle: braces_for_chaining
88
+ # # bad
89
+ # words.each do |word|
90
+ # word.flip.flop
91
+ # end.join("-")
92
+ #
93
+ # # good
94
+ # words.each { |word|
95
+ # word.flip.flop
96
+ # }.join("-")
97
+ #
98
+ # @example EnforcedStyle: always_braces
99
+ # # bad
100
+ # words.each do |word|
101
+ # word.flip.flop
102
+ # end
103
+ #
104
+ # # good
105
+ # words.each { |word|
106
+ # word.flip.flop
107
+ # }
108
+ #
109
+ # @example BracesRequiredMethods: ['sig']
110
+ #
111
+ # # Methods listed in the BracesRequiredMethods list, such as 'sig'
112
+ # # in this example, will require `{...}` braces. This option takes
113
+ # # precedence over all other configurations except IgnoredMethods.
114
+ #
115
+ # # bad
116
+ # sig do
117
+ # params(
118
+ # foo: string,
119
+ # ).void
120
+ # end
121
+ # def bar(foo)
122
+ # puts foo
123
+ # end
124
+ #
125
+ # # good
126
+ # sig {
127
+ # params(
128
+ # foo: string,
129
+ # ).void
130
+ # }
131
+ # def bar(foo)
132
+ # puts foo
133
+ # end
134
+ #
135
+ class BlockDelimiters < Cop
136
+ include ConfigurableEnforcedStyle
137
+ include IgnoredMethods
138
+
139
+ ALWAYS_BRACES_MESSAGE = 'Prefer `{...}` over `do...end` for blocks.'
140
+
141
+ BRACES_REQUIRED_MESSAGE = 'Brace delimiters `{...}` required for ' \
142
+ "'%<method_name>s' method."
143
+
144
+ def on_send(node)
145
+ return unless node.arguments?
146
+ return if node.parenthesized?
147
+ return if node.operator_method? || node.assignment_method?
148
+
149
+ node.arguments.each do |arg|
150
+ get_blocks(arg) do |block|
151
+ # If there are no parentheses around the arguments, then braces
152
+ # and do-end have different meaning due to how they bind, so we
153
+ # allow either.
154
+ ignore_node(block)
155
+ end
156
+ end
157
+ end
158
+
159
+ def on_block(node)
160
+ return if ignored_node?(node)
161
+
162
+ add_offense(node, location: :begin) unless proper_block_style?(node)
163
+ end
164
+
165
+ def autocorrect(node)
166
+ return if correction_would_break_code?(node)
167
+
168
+ if node.braces?
169
+ replace_braces_with_do_end(node.loc)
170
+ else
171
+ replace_do_end_with_braces(node.loc)
172
+ end
173
+ end
174
+
175
+ private
176
+
177
+ def line_count_based_message(node)
178
+ if node.multiline?
179
+ 'Avoid using `{...}` for multi-line blocks.'
180
+ else
181
+ 'Prefer `{...}` over `do...end` for single-line blocks.'
182
+ end
183
+ end
184
+
185
+ def semantic_message(node)
186
+ block_begin = node.loc.begin.source
187
+
188
+ if block_begin == '{'
189
+ 'Prefer `do...end` over `{...}` for procedural blocks.'
190
+ else
191
+ 'Prefer `{...}` over `do...end` for functional blocks.'
192
+ end
193
+ end
194
+
195
+ def braces_for_chaining_message(node)
196
+ if node.multiline?
197
+ if node.chained?
198
+ 'Prefer `{...}` over `do...end` for multi-line chained blocks.'
199
+ else
200
+ 'Prefer `do...end` for multi-line blocks without chaining.'
201
+ end
202
+ else
203
+ 'Prefer `{...}` over `do...end` for single-line blocks.'
204
+ end
205
+ end
206
+
207
+ def braces_required_message(node)
208
+ format(BRACES_REQUIRED_MESSAGE, method_name: node.method_name.to_s)
209
+ end
210
+
211
+ def message(node)
212
+ return braces_required_message(node) if braces_required_method?(node.method_name)
213
+
214
+ case style
215
+ when :line_count_based then line_count_based_message(node)
216
+ when :semantic then semantic_message(node)
217
+ when :braces_for_chaining then braces_for_chaining_message(node)
218
+ when :always_braces then ALWAYS_BRACES_MESSAGE
219
+ end
220
+ end
221
+
222
+ def replace_braces_with_do_end(loc)
223
+ b = loc.begin
224
+ e = loc.end
225
+
226
+ lambda do |corrector|
227
+ corrector.insert_before(b, ' ') unless whitespace_before?(b)
228
+ corrector.insert_before(e, ' ') unless whitespace_before?(e)
229
+ corrector.insert_after(b, ' ') unless whitespace_after?(b)
230
+ corrector.replace(b, 'do')
231
+ corrector.replace(e, 'end')
232
+ end
233
+ end
234
+
235
+ def replace_do_end_with_braces(loc)
236
+ b = loc.begin
237
+ e = loc.end
238
+
239
+ lambda do |corrector|
240
+ corrector.insert_after(b, ' ') unless whitespace_after?(b, 2)
241
+
242
+ corrector.replace(b, '{')
243
+ corrector.replace(e, '}')
244
+ end
245
+ end
246
+
247
+ def whitespace_before?(range)
248
+ /\s/.match?(range.source_buffer.source[range.begin_pos - 1, 1])
249
+ end
250
+
251
+ def whitespace_after?(range, length = 1)
252
+ /\s/.match?(range.source_buffer.source[range.begin_pos + length, 1])
253
+ end
254
+
255
+ def get_blocks(node, &block)
256
+ case node.type
257
+ when :block
258
+ yield node
259
+ when :send
260
+ get_blocks(node.receiver, &block) if node.receiver
261
+ when :hash
262
+ # A hash which is passed as method argument may have no braces
263
+ # In that case, one of the K/V pairs could contain a block node
264
+ # which could change in meaning if do...end replaced {...}
265
+ return if node.braces?
266
+
267
+ node.each_child_node { |child| get_blocks(child, &block) }
268
+ when :pair
269
+ node.each_child_node { |child| get_blocks(child, &block) }
270
+ end
271
+ end
272
+
273
+ def proper_block_style?(node)
274
+ return special_method_proper_block_style?(node) if special_method?(node.method_name)
275
+
276
+ case style
277
+ when :line_count_based then line_count_based_block_style?(node)
278
+ when :semantic then semantic_block_style?(node)
279
+ when :braces_for_chaining then braces_for_chaining_style?(node)
280
+ when :always_braces then braces_style?(node)
281
+ end
282
+ end
283
+
284
+ def special_method?(method_name)
285
+ ignored_method?(method_name) || braces_required_method?(method_name)
286
+ end
287
+
288
+ def special_method_proper_block_style?(node)
289
+ method_name = node.method_name
290
+ return true if ignored_method?(method_name)
291
+ return node.braces? if braces_required_method?(method_name)
292
+ end
293
+
294
+ def braces_required_method?(method_name)
295
+ braces_required_methods.include?(method_name.to_s)
296
+ end
297
+
298
+ def braces_required_methods
299
+ cop_config.fetch('BracesRequiredMethods', [])
300
+ end
301
+
302
+ def line_count_based_block_style?(node)
303
+ node.multiline? ^ node.braces?
304
+ end
305
+
306
+ def semantic_block_style?(node)
307
+ method_name = node.method_name
308
+
309
+ if node.braces?
310
+ functional_method?(method_name) || functional_block?(node) ||
311
+ (procedural_oneliners_may_have_braces? && !node.multiline?)
312
+ else
313
+ procedural_method?(method_name) || !return_value_used?(node)
314
+ end
315
+ end
316
+
317
+ def braces_for_chaining_style?(node)
318
+ block_begin = node.loc.begin.source
319
+
320
+ block_begin == if node.multiline?
321
+ (node.chained? ? '{' : 'do')
322
+ else
323
+ '{'
324
+ end
325
+ end
326
+
327
+ def braces_style?(node)
328
+ node.loc.begin.source == '{'
329
+ end
330
+
331
+ def correction_would_break_code?(node)
332
+ return unless node.keywords?
333
+
334
+ node.send_node.arguments? && !node.send_node.parenthesized?
335
+ end
336
+
337
+ def functional_method?(method_name)
338
+ cop_config['FunctionalMethods'].map(&:to_sym).include?(method_name)
339
+ end
340
+
341
+ def functional_block?(node)
342
+ return_value_used?(node) || return_value_of_scope?(node)
343
+ end
344
+
345
+ def procedural_oneliners_may_have_braces?
346
+ cop_config['AllowBracesOnProceduralOneLiners']
347
+ end
348
+
349
+ def procedural_method?(method_name)
350
+ cop_config['ProceduralMethods'].map(&:to_sym).include?(method_name)
351
+ end
352
+
353
+ def return_value_used?(node)
354
+ return unless node.parent
355
+
356
+ # If there are parentheses around the block, check if that
357
+ # is being used.
358
+ if node.parent.begin_type?
359
+ return_value_used?(node.parent)
360
+ else
361
+ node.parent.assignment? || node.parent.send_type?
362
+ end
363
+ end
364
+
365
+ def return_value_of_scope?(node)
366
+ return unless node.parent
367
+
368
+ conditional?(node.parent) || array_or_range?(node.parent) ||
369
+ node.parent.children.last == node
370
+ end
371
+
372
+ def conditional?(node)
373
+ node.if_type? || node.or_type? || node.and_type?
374
+ end
375
+
376
+ def array_or_range?(node)
377
+ node.array_type? || node.range_type?
378
+ end
379
+ end
380
+ end
381
+ end
382
+ end