rbhint 0.8.5.rc1

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 (583) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +20 -0
  3. data/README.md +107 -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 +4133 -0
  9. data/exe/rbhint +17 -0
  10. data/lib/rbhint.rb +6 -0
  11. data/lib/rbhint/version.rb +7 -0
  12. data/lib/rubocop.rb +588 -0
  13. data/lib/rubocop/ast_aliases.rb +8 -0
  14. data/lib/rubocop/cached_data.rb +58 -0
  15. data/lib/rubocop/cli.rb +133 -0
  16. data/lib/rubocop/cli/command.rb +21 -0
  17. data/lib/rubocop/cli/command/auto_genenerate_config.rb +105 -0
  18. data/lib/rubocop/cli/command/base.rb +33 -0
  19. data/lib/rubocop/cli/command/execute_runner.rb +76 -0
  20. data/lib/rubocop/cli/command/init_dotfile.rb +45 -0
  21. data/lib/rubocop/cli/command/show_cops.rb +76 -0
  22. data/lib/rubocop/cli/command/version.rb +17 -0
  23. data/lib/rubocop/cli/environment.rb +21 -0
  24. data/lib/rubocop/comment_config.rb +206 -0
  25. data/lib/rubocop/config.rb +281 -0
  26. data/lib/rubocop/config_loader.rb +277 -0
  27. data/lib/rubocop/config_loader_resolver.rb +234 -0
  28. data/lib/rubocop/config_obsoletion.rb +278 -0
  29. data/lib/rubocop/config_store.rb +58 -0
  30. data/lib/rubocop/config_validator.rb +223 -0
  31. data/lib/rubocop/cop/autocorrect_logic.rb +105 -0
  32. data/lib/rubocop/cop/badge.rb +73 -0
  33. data/lib/rubocop/cop/bundler/duplicated_gem.rb +73 -0
  34. data/lib/rubocop/cop/bundler/gem_comment.rb +133 -0
  35. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +69 -0
  36. data/lib/rubocop/cop/bundler/ordered_gems.rb +73 -0
  37. data/lib/rubocop/cop/commissioner.rb +124 -0
  38. data/lib/rubocop/cop/cop.rb +311 -0
  39. data/lib/rubocop/cop/corrector.rb +196 -0
  40. data/lib/rubocop/cop/correctors/alignment_corrector.rb +142 -0
  41. data/lib/rubocop/cop/correctors/condition_corrector.rb +27 -0
  42. data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +53 -0
  43. data/lib/rubocop/cop/correctors/empty_line_corrector.rb +26 -0
  44. data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +73 -0
  45. data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +136 -0
  46. data/lib/rubocop/cop/correctors/line_break_corrector.rb +61 -0
  47. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +68 -0
  48. data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +44 -0
  49. data/lib/rubocop/cop/correctors/parentheses_corrector.rb +31 -0
  50. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +117 -0
  51. data/lib/rubocop/cop/correctors/punctuation_corrector.rb +29 -0
  52. data/lib/rubocop/cop/correctors/space_corrector.rb +46 -0
  53. data/lib/rubocop/cop/correctors/string_literal_corrector.rb +25 -0
  54. data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +43 -0
  55. data/lib/rubocop/cop/force.rb +42 -0
  56. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +104 -0
  57. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +104 -0
  58. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +85 -0
  59. data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +55 -0
  60. data/lib/rubocop/cop/generator.rb +223 -0
  61. data/lib/rubocop/cop/generator/configuration_injector.rb +66 -0
  62. data/lib/rubocop/cop/generator/require_file_injector.rb +78 -0
  63. data/lib/rubocop/cop/ignored_node.rb +36 -0
  64. data/lib/rubocop/cop/internal_affairs.rb +9 -0
  65. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +59 -0
  66. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +44 -0
  67. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +44 -0
  68. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +54 -0
  69. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +48 -0
  70. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +73 -0
  71. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +52 -0
  72. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +98 -0
  73. data/lib/rubocop/cop/layout/argument_alignment.rb +93 -0
  74. data/lib/rubocop/cop/layout/array_alignment.rb +82 -0
  75. data/lib/rubocop/cop/layout/assignment_indentation.rb +55 -0
  76. data/lib/rubocop/cop/layout/block_alignment.rb +244 -0
  77. data/lib/rubocop/cop/layout/block_end_newline.rb +64 -0
  78. data/lib/rubocop/cop/layout/case_indentation.rb +161 -0
  79. data/lib/rubocop/cop/layout/class_structure.rb +343 -0
  80. data/lib/rubocop/cop/layout/closing_heredoc_indentation.rb +126 -0
  81. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +203 -0
  82. data/lib/rubocop/cop/layout/comment_indentation.rb +141 -0
  83. data/lib/rubocop/cop/layout/condition_position.rb +66 -0
  84. data/lib/rubocop/cop/layout/def_end_alignment.rb +74 -0
  85. data/lib/rubocop/cop/layout/dot_position.rb +105 -0
  86. data/lib/rubocop/cop/layout/else_alignment.rb +142 -0
  87. data/lib/rubocop/cop/layout/empty_comment.rb +151 -0
  88. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +157 -0
  89. data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +64 -0
  90. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +152 -0
  91. data/lib/rubocop/cop/layout/empty_lines.rb +76 -0
  92. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +211 -0
  93. data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +99 -0
  94. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +126 -0
  95. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +45 -0
  96. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +41 -0
  97. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +88 -0
  98. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +136 -0
  99. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +45 -0
  100. data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +62 -0
  101. data/lib/rubocop/cop/layout/end_alignment.rb +189 -0
  102. data/lib/rubocop/cop/layout/end_of_line.rb +92 -0
  103. data/lib/rubocop/cop/layout/extra_spacing.rb +201 -0
  104. data/lib/rubocop/cop/layout/first_argument_indentation.rb +247 -0
  105. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +171 -0
  106. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +45 -0
  107. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +184 -0
  108. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +37 -0
  109. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +53 -0
  110. data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +46 -0
  111. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +100 -0
  112. data/lib/rubocop/cop/layout/hash_alignment.rb +366 -0
  113. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +285 -0
  114. data/lib/rubocop/cop/layout/heredoc_indentation.rb +173 -0
  115. data/lib/rubocop/cop/layout/indentation_consistency.rb +202 -0
  116. data/lib/rubocop/cop/layout/indentation_style.rb +117 -0
  117. data/lib/rubocop/cop/layout/indentation_width.rb +362 -0
  118. data/lib/rubocop/cop/layout/initial_indentation.rb +59 -0
  119. data/lib/rubocop/cop/layout/leading_comment_space.rb +119 -0
  120. data/lib/rubocop/cop/layout/leading_empty_lines.rb +53 -0
  121. data/lib/rubocop/cop/layout/line_length.rb +280 -0
  122. data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +118 -0
  123. data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +39 -0
  124. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +95 -0
  125. data/lib/rubocop/cop/layout/multiline_block_layout.rb +155 -0
  126. data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +118 -0
  127. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +50 -0
  128. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +52 -0
  129. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +134 -0
  130. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +220 -0
  131. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +131 -0
  132. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +123 -0
  133. data/lib/rubocop/cop/layout/parameter_alignment.rb +118 -0
  134. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +191 -0
  135. data/lib/rubocop/cop/layout/space_after_colon.rb +47 -0
  136. data/lib/rubocop/cop/layout/space_after_comma.rb +35 -0
  137. data/lib/rubocop/cop/layout/space_after_method_name.rb +42 -0
  138. data/lib/rubocop/cop/layout/space_after_not.rb +40 -0
  139. data/lib/rubocop/cop/layout/space_after_semicolon.rb +32 -0
  140. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +169 -0
  141. data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +92 -0
  142. data/lib/rubocop/cop/layout/space_around_keyword.rb +244 -0
  143. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +131 -0
  144. data/lib/rubocop/cop/layout/space_around_operators.rb +242 -0
  145. data/lib/rubocop/cop/layout/space_before_block_braces.rb +136 -0
  146. data/lib/rubocop/cop/layout/space_before_comma.rb +31 -0
  147. data/lib/rubocop/cop/layout/space_before_comment.rb +33 -0
  148. data/lib/rubocop/cop/layout/space_before_first_arg.rb +75 -0
  149. data/lib/rubocop/cop/layout/space_before_semicolon.rb +27 -0
  150. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +82 -0
  151. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +229 -0
  152. data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +53 -0
  153. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +248 -0
  154. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +200 -0
  155. data/lib/rubocop/cop/layout/space_inside_parens.rb +113 -0
  156. data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +65 -0
  157. data/lib/rubocop/cop/layout/space_inside_range_literal.rb +63 -0
  158. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +148 -0
  159. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +65 -0
  160. data/lib/rubocop/cop/layout/trailing_empty_lines.rb +113 -0
  161. data/lib/rubocop/cop/layout/trailing_whitespace.rb +77 -0
  162. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +62 -0
  163. data/lib/rubocop/cop/lint/ambiguous_operator.rb +96 -0
  164. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +57 -0
  165. data/lib/rubocop/cop/lint/assignment_in_condition.rb +97 -0
  166. data/lib/rubocop/cop/lint/big_decimal_new.rb +44 -0
  167. data/lib/rubocop/cop/lint/boolean_symbol.rb +50 -0
  168. data/lib/rubocop/cop/lint/circular_argument_reference.rb +72 -0
  169. data/lib/rubocop/cop/lint/debugger.rb +77 -0
  170. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +111 -0
  171. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +137 -0
  172. data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +81 -0
  173. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +53 -0
  174. data/lib/rubocop/cop/lint/duplicate_hash_key.rb +38 -0
  175. data/lib/rubocop/cop/lint/duplicate_methods.rb +235 -0
  176. data/lib/rubocop/cop/lint/each_with_object_argument.rb +42 -0
  177. data/lib/rubocop/cop/lint/else_layout.rb +66 -0
  178. data/lib/rubocop/cop/lint/empty_ensure.rb +60 -0
  179. data/lib/rubocop/cop/lint/empty_expression.rb +42 -0
  180. data/lib/rubocop/cop/lint/empty_interpolation.rb +36 -0
  181. data/lib/rubocop/cop/lint/empty_when.rb +61 -0
  182. data/lib/rubocop/cop/lint/ensure_return.rb +63 -0
  183. data/lib/rubocop/cop/lint/erb_new_arguments.rb +162 -0
  184. data/lib/rubocop/cop/lint/flip_flop.rb +32 -0
  185. data/lib/rubocop/cop/lint/float_out_of_range.rb +35 -0
  186. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +159 -0
  187. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +156 -0
  188. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +101 -0
  189. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +127 -0
  190. data/lib/rubocop/cop/lint/inherit_exception.rb +100 -0
  191. data/lib/rubocop/cop/lint/interpolation_check.rb +40 -0
  192. data/lib/rubocop/cop/lint/literal_as_condition.rb +135 -0
  193. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +98 -0
  194. data/lib/rubocop/cop/lint/loop.rb +65 -0
  195. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +84 -0
  196. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +69 -0
  197. data/lib/rubocop/cop/lint/multiple_comparison.rb +48 -0
  198. data/lib/rubocop/cop/lint/nested_method_definition.rb +104 -0
  199. data/lib/rubocop/cop/lint/nested_percent_literal.rb +51 -0
  200. data/lib/rubocop/cop/lint/next_without_accumulator.rb +50 -0
  201. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +89 -0
  202. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +83 -0
  203. data/lib/rubocop/cop/lint/number_conversion.rb +81 -0
  204. data/lib/rubocop/cop/lint/ordered_magic_comments.rb +86 -0
  205. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +86 -0
  206. data/lib/rubocop/cop/lint/percent_string_array.rb +71 -0
  207. data/lib/rubocop/cop/lint/percent_symbol_array.rb +69 -0
  208. data/lib/rubocop/cop/lint/raise_exception.rb +75 -0
  209. data/lib/rubocop/cop/lint/rand_one.rb +45 -0
  210. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +258 -0
  211. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +119 -0
  212. data/lib/rubocop/cop/lint/redundant_require_statement.rb +50 -0
  213. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +172 -0
  214. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +59 -0
  215. data/lib/rubocop/cop/lint/redundant_with_index.rb +82 -0
  216. data/lib/rubocop/cop/lint/redundant_with_object.rb +83 -0
  217. data/lib/rubocop/cop/lint/regexp_as_condition.rb +29 -0
  218. data/lib/rubocop/cop/lint/require_parentheses.rb +66 -0
  219. data/lib/rubocop/cop/lint/rescue_exception.rb +46 -0
  220. data/lib/rubocop/cop/lint/rescue_type.rb +94 -0
  221. data/lib/rubocop/cop/lint/return_in_void_context.rb +74 -0
  222. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +65 -0
  223. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +94 -0
  224. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +38 -0
  225. data/lib/rubocop/cop/lint/script_permission.rb +70 -0
  226. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +91 -0
  227. data/lib/rubocop/cop/lint/shadowed_argument.rb +182 -0
  228. data/lib/rubocop/cop/lint/shadowed_exception.rb +178 -0
  229. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +53 -0
  230. data/lib/rubocop/cop/lint/struct_new_override.rb +58 -0
  231. data/lib/rubocop/cop/lint/suppressed_exception.rb +92 -0
  232. data/lib/rubocop/cop/lint/syntax.rb +57 -0
  233. data/lib/rubocop/cop/lint/to_json.rb +41 -0
  234. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +82 -0
  235. data/lib/rubocop/cop/lint/unified_integer.rb +43 -0
  236. data/lib/rubocop/cop/lint/unreachable_code.rb +99 -0
  237. data/lib/rubocop/cop/lint/unused_block_argument.rb +165 -0
  238. data/lib/rubocop/cop/lint/unused_method_argument.rb +112 -0
  239. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +76 -0
  240. data/lib/rubocop/cop/lint/uri_regexp.rb +73 -0
  241. data/lib/rubocop/cop/lint/useless_access_modifier.rb +284 -0
  242. data/lib/rubocop/cop/lint/useless_assignment.rb +130 -0
  243. data/lib/rubocop/cop/lint/useless_comparison.rb +28 -0
  244. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +54 -0
  245. data/lib/rubocop/cop/lint/useless_setter_call.rb +168 -0
  246. data/lib/rubocop/cop/lint/void.rb +151 -0
  247. data/lib/rubocop/cop/message_annotator.rb +129 -0
  248. data/lib/rubocop/cop/metrics/abc_size.rb +24 -0
  249. data/lib/rubocop/cop/metrics/block_length.rb +50 -0
  250. data/lib/rubocop/cop/metrics/block_nesting.rb +65 -0
  251. data/lib/rubocop/cop/metrics/class_length.rb +36 -0
  252. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +32 -0
  253. data/lib/rubocop/cop/metrics/method_length.rb +36 -0
  254. data/lib/rubocop/cop/metrics/module_length.rb +36 -0
  255. data/lib/rubocop/cop/metrics/parameter_lists.rb +54 -0
  256. data/lib/rubocop/cop/metrics/perceived_complexity.rb +61 -0
  257. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +84 -0
  258. data/lib/rubocop/cop/migration/department_name.rb +85 -0
  259. data/lib/rubocop/cop/mixin/alignment.rb +72 -0
  260. data/lib/rubocop/cop/mixin/annotation_comment.rb +37 -0
  261. data/lib/rubocop/cop/mixin/array_min_size.rb +57 -0
  262. data/lib/rubocop/cop/mixin/array_syntax.rb +17 -0
  263. data/lib/rubocop/cop/mixin/check_assignment.rb +44 -0
  264. data/lib/rubocop/cop/mixin/check_line_breakable.rb +184 -0
  265. data/lib/rubocop/cop/mixin/classish_length.rb +37 -0
  266. data/lib/rubocop/cop/mixin/code_length.rb +38 -0
  267. data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +100 -0
  268. data/lib/rubocop/cop/mixin/configurable_formatting.rb +45 -0
  269. data/lib/rubocop/cop/mixin/configurable_max.rb +23 -0
  270. data/lib/rubocop/cop/mixin/configurable_naming.rb +16 -0
  271. data/lib/rubocop/cop/mixin/configurable_numbering.rb +17 -0
  272. data/lib/rubocop/cop/mixin/def_node.rb +33 -0
  273. data/lib/rubocop/cop/mixin/documentation_comment.rb +52 -0
  274. data/lib/rubocop/cop/mixin/duplication.rb +46 -0
  275. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +172 -0
  276. data/lib/rubocop/cop/mixin/empty_parameter.rb +24 -0
  277. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +72 -0
  278. data/lib/rubocop/cop/mixin/enforce_superclass.rb +30 -0
  279. data/lib/rubocop/cop/mixin/first_element_line_break.rb +46 -0
  280. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +62 -0
  281. data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +147 -0
  282. data/lib/rubocop/cop/mixin/hash_transform_method.rb +178 -0
  283. data/lib/rubocop/cop/mixin/heredoc.rb +32 -0
  284. data/lib/rubocop/cop/mixin/ignored_methods.rb +19 -0
  285. data/lib/rubocop/cop/mixin/ignored_pattern.rb +29 -0
  286. data/lib/rubocop/cop/mixin/integer_node.rb +14 -0
  287. data/lib/rubocop/cop/mixin/interpolation.rb +27 -0
  288. data/lib/rubocop/cop/mixin/line_length_help.rb +89 -0
  289. data/lib/rubocop/cop/mixin/match_range.rb +26 -0
  290. data/lib/rubocop/cop/mixin/method_complexity.rb +62 -0
  291. data/lib/rubocop/cop/mixin/method_preference.rb +31 -0
  292. data/lib/rubocop/cop/mixin/min_body_length.rb +21 -0
  293. data/lib/rubocop/cop/mixin/multiline_element_indentation.rb +86 -0
  294. data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +33 -0
  295. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +255 -0
  296. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +141 -0
  297. data/lib/rubocop/cop/mixin/negative_conditional.rb +32 -0
  298. data/lib/rubocop/cop/mixin/nil_methods.rb +25 -0
  299. data/lib/rubocop/cop/mixin/on_normal_if_unless.rb +14 -0
  300. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +56 -0
  301. data/lib/rubocop/cop/mixin/parentheses.rb +17 -0
  302. data/lib/rubocop/cop/mixin/parser_diagnostic.rb +37 -0
  303. data/lib/rubocop/cop/mixin/percent_array.rb +52 -0
  304. data/lib/rubocop/cop/mixin/percent_literal.rb +38 -0
  305. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +181 -0
  306. data/lib/rubocop/cop/mixin/preferred_delimiters.rb +53 -0
  307. data/lib/rubocop/cop/mixin/range_help.rb +117 -0
  308. data/lib/rubocop/cop/mixin/rational_literal.rb +18 -0
  309. data/lib/rubocop/cop/mixin/regexp_literal_help.rb +16 -0
  310. data/lib/rubocop/cop/mixin/rescue_node.rb +22 -0
  311. data/lib/rubocop/cop/mixin/safe_assignment.rb +23 -0
  312. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +55 -0
  313. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +49 -0
  314. data/lib/rubocop/cop/mixin/statement_modifier.rb +56 -0
  315. data/lib/rubocop/cop/mixin/string_help.rb +35 -0
  316. data/lib/rubocop/cop/mixin/string_literals_help.rb +23 -0
  317. data/lib/rubocop/cop/mixin/surrounding_space.rb +146 -0
  318. data/lib/rubocop/cop/mixin/target_ruby_version.rb +20 -0
  319. data/lib/rubocop/cop/mixin/too_many_lines.rb +35 -0
  320. data/lib/rubocop/cop/mixin/trailing_body.rb +26 -0
  321. data/lib/rubocop/cop/mixin/trailing_comma.rb +212 -0
  322. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +111 -0
  323. data/lib/rubocop/cop/mixin/unused_argument.rb +33 -0
  324. data/lib/rubocop/cop/naming/accessor_method_name.rb +55 -0
  325. data/lib/rubocop/cop/naming/ascii_identifiers.rb +72 -0
  326. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +43 -0
  327. data/lib/rubocop/cop/naming/block_parameter_name.rb +49 -0
  328. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +43 -0
  329. data/lib/rubocop/cop/naming/constant_name.rb +82 -0
  330. data/lib/rubocop/cop/naming/file_name.rb +225 -0
  331. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +62 -0
  332. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +55 -0
  333. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +171 -0
  334. data/lib/rubocop/cop/naming/method_name.rb +79 -0
  335. data/lib/rubocop/cop/naming/method_parameter_name.rb +58 -0
  336. data/lib/rubocop/cop/naming/predicate_name.rb +108 -0
  337. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +112 -0
  338. data/lib/rubocop/cop/naming/variable_name.rb +52 -0
  339. data/lib/rubocop/cop/naming/variable_number.rb +61 -0
  340. data/lib/rubocop/cop/offense.rb +216 -0
  341. data/lib/rubocop/cop/registry.rb +276 -0
  342. data/lib/rubocop/cop/security/eval.rb +31 -0
  343. data/lib/rubocop/cop/security/json_load.rb +46 -0
  344. data/lib/rubocop/cop/security/marshal_load.rb +39 -0
  345. data/lib/rubocop/cop/security/open.rb +71 -0
  346. data/lib/rubocop/cop/security/yaml_load.rb +37 -0
  347. data/lib/rubocop/cop/severity.rb +75 -0
  348. data/lib/rubocop/cop/style/access_modifier_declarations.rb +132 -0
  349. data/lib/rubocop/cop/style/alias.rb +147 -0
  350. data/lib/rubocop/cop/style/and_or.rb +145 -0
  351. data/lib/rubocop/cop/style/array_join.rb +39 -0
  352. data/lib/rubocop/cop/style/ascii_comments.rb +61 -0
  353. data/lib/rubocop/cop/style/attr.rb +68 -0
  354. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +51 -0
  355. data/lib/rubocop/cop/style/bare_percent_literals.rb +78 -0
  356. data/lib/rubocop/cop/style/begin_block.rb +22 -0
  357. data/lib/rubocop/cop/style/block_comments.rb +70 -0
  358. data/lib/rubocop/cop/style/block_delimiters.rb +384 -0
  359. data/lib/rubocop/cop/style/case_equality.rb +53 -0
  360. data/lib/rubocop/cop/style/character_literal.rb +53 -0
  361. data/lib/rubocop/cop/style/class_and_module_children.rb +151 -0
  362. data/lib/rubocop/cop/style/class_check.rb +59 -0
  363. data/lib/rubocop/cop/style/class_methods.rb +60 -0
  364. data/lib/rubocop/cop/style/class_vars.rb +48 -0
  365. data/lib/rubocop/cop/style/collection_methods.rb +79 -0
  366. data/lib/rubocop/cop/style/colon_method_call.rb +48 -0
  367. data/lib/rubocop/cop/style/colon_method_definition.rb +37 -0
  368. data/lib/rubocop/cop/style/command_literal.rb +187 -0
  369. data/lib/rubocop/cop/style/comment_annotation.rb +97 -0
  370. data/lib/rubocop/cop/style/commented_keyword.rb +73 -0
  371. data/lib/rubocop/cop/style/conditional_assignment.rb +666 -0
  372. data/lib/rubocop/cop/style/constant_visibility.rb +77 -0
  373. data/lib/rubocop/cop/style/copyright.rb +99 -0
  374. data/lib/rubocop/cop/style/date_time.rb +77 -0
  375. data/lib/rubocop/cop/style/def_with_parentheses.rb +57 -0
  376. data/lib/rubocop/cop/style/dir.rb +48 -0
  377. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +49 -0
  378. data/lib/rubocop/cop/style/documentation.rb +135 -0
  379. data/lib/rubocop/cop/style/documentation_method.rb +125 -0
  380. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +55 -0
  381. data/lib/rubocop/cop/style/double_negation.rb +72 -0
  382. data/lib/rubocop/cop/style/each_for_simple_loop.rb +58 -0
  383. data/lib/rubocop/cop/style/each_with_object.rb +110 -0
  384. data/lib/rubocop/cop/style/empty_block_parameter.rb +48 -0
  385. data/lib/rubocop/cop/style/empty_case_condition.rb +107 -0
  386. data/lib/rubocop/cop/style/empty_else.rb +175 -0
  387. data/lib/rubocop/cop/style/empty_lambda_parameter.rb +45 -0
  388. data/lib/rubocop/cop/style/empty_literal.rb +121 -0
  389. data/lib/rubocop/cop/style/empty_method.rb +111 -0
  390. data/lib/rubocop/cop/style/encoding.rb +56 -0
  391. data/lib/rubocop/cop/style/end_block.rb +31 -0
  392. data/lib/rubocop/cop/style/eval_with_location.rb +148 -0
  393. data/lib/rubocop/cop/style/even_odd.rb +58 -0
  394. data/lib/rubocop/cop/style/expand_path_arguments.rb +194 -0
  395. data/lib/rubocop/cop/style/exponential_notation.rb +119 -0
  396. data/lib/rubocop/cop/style/float_division.rb +94 -0
  397. data/lib/rubocop/cop/style/for.rb +88 -0
  398. data/lib/rubocop/cop/style/format_string.rb +127 -0
  399. data/lib/rubocop/cop/style/format_string_token.rb +120 -0
  400. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +234 -0
  401. data/lib/rubocop/cop/style/global_vars.rb +80 -0
  402. data/lib/rubocop/cop/style/guard_clause.rb +145 -0
  403. data/lib/rubocop/cop/style/hash_each_methods.rb +89 -0
  404. data/lib/rubocop/cop/style/hash_syntax.rb +221 -0
  405. data/lib/rubocop/cop/style/hash_transform_keys.rb +83 -0
  406. data/lib/rubocop/cop/style/hash_transform_values.rb +80 -0
  407. data/lib/rubocop/cop/style/identical_conditional_branches.rb +130 -0
  408. data/lib/rubocop/cop/style/if_inside_else.rb +87 -0
  409. data/lib/rubocop/cop/style/if_unless_modifier.rb +189 -0
  410. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +39 -0
  411. data/lib/rubocop/cop/style/if_with_semicolon.rb +46 -0
  412. data/lib/rubocop/cop/style/implicit_runtime_error.rb +32 -0
  413. data/lib/rubocop/cop/style/infinite_loop.rb +128 -0
  414. data/lib/rubocop/cop/style/inline_comment.rb +34 -0
  415. data/lib/rubocop/cop/style/inverse_methods.rb +197 -0
  416. data/lib/rubocop/cop/style/ip_addresses.rb +76 -0
  417. data/lib/rubocop/cop/style/lambda.rb +132 -0
  418. data/lib/rubocop/cop/style/lambda_call.rb +73 -0
  419. data/lib/rubocop/cop/style/line_end_concatenation.rb +125 -0
  420. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +190 -0
  421. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +169 -0
  422. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +52 -0
  423. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +75 -0
  424. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +46 -0
  425. data/lib/rubocop/cop/style/method_def_parentheses.rb +166 -0
  426. data/lib/rubocop/cop/style/method_missing_super.rb +34 -0
  427. data/lib/rubocop/cop/style/min_max.rb +68 -0
  428. data/lib/rubocop/cop/style/missing_else.rb +180 -0
  429. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +46 -0
  430. data/lib/rubocop/cop/style/mixin_grouping.rb +148 -0
  431. data/lib/rubocop/cop/style/mixin_usage.rb +90 -0
  432. data/lib/rubocop/cop/style/module_function.rb +150 -0
  433. data/lib/rubocop/cop/style/multiline_block_chain.rb +40 -0
  434. data/lib/rubocop/cop/style/multiline_if_modifier.rb +67 -0
  435. data/lib/rubocop/cop/style/multiline_if_then.rb +50 -0
  436. data/lib/rubocop/cop/style/multiline_memoization.rb +94 -0
  437. data/lib/rubocop/cop/style/multiline_method_signature.rb +61 -0
  438. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +38 -0
  439. data/lib/rubocop/cop/style/multiline_when_then.rb +74 -0
  440. data/lib/rubocop/cop/style/multiple_comparison.rb +92 -0
  441. data/lib/rubocop/cop/style/mutable_constant.rb +172 -0
  442. data/lib/rubocop/cop/style/negated_if.rb +99 -0
  443. data/lib/rubocop/cop/style/negated_unless.rb +89 -0
  444. data/lib/rubocop/cop/style/negated_while.rb +48 -0
  445. data/lib/rubocop/cop/style/nested_modifier.rb +107 -0
  446. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +67 -0
  447. data/lib/rubocop/cop/style/nested_ternary_operator.rb +32 -0
  448. data/lib/rubocop/cop/style/next.rb +244 -0
  449. data/lib/rubocop/cop/style/nil_comparison.rb +75 -0
  450. data/lib/rubocop/cop/style/non_nil_check.rb +136 -0
  451. data/lib/rubocop/cop/style/not.rb +82 -0
  452. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +124 -0
  453. data/lib/rubocop/cop/style/numeric_literals.rb +114 -0
  454. data/lib/rubocop/cop/style/numeric_predicate.rb +138 -0
  455. data/lib/rubocop/cop/style/one_line_conditional.rb +98 -0
  456. data/lib/rubocop/cop/style/option_hash.rb +55 -0
  457. data/lib/rubocop/cop/style/optional_arguments.rb +58 -0
  458. data/lib/rubocop/cop/style/or_assignment.rb +96 -0
  459. data/lib/rubocop/cop/style/parallel_assignment.rb +287 -0
  460. data/lib/rubocop/cop/style/parentheses_around_condition.rb +117 -0
  461. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +127 -0
  462. data/lib/rubocop/cop/style/percent_q_literals.rb +73 -0
  463. data/lib/rubocop/cop/style/perl_backrefs.rb +38 -0
  464. data/lib/rubocop/cop/style/preferred_hash_methods.rb +75 -0
  465. data/lib/rubocop/cop/style/proc.rb +34 -0
  466. data/lib/rubocop/cop/style/raise_args.rb +145 -0
  467. data/lib/rubocop/cop/style/random_with_offset.rb +158 -0
  468. data/lib/rubocop/cop/style/redundant_begin.rb +91 -0
  469. data/lib/rubocop/cop/style/redundant_capital_w.rb +51 -0
  470. data/lib/rubocop/cop/style/redundant_condition.rb +124 -0
  471. data/lib/rubocop/cop/style/redundant_conditional.rb +97 -0
  472. data/lib/rubocop/cop/style/redundant_exception.rb +60 -0
  473. data/lib/rubocop/cop/style/redundant_freeze.rb +67 -0
  474. data/lib/rubocop/cop/style/redundant_interpolation.rb +98 -0
  475. data/lib/rubocop/cop/style/redundant_parentheses.rb +227 -0
  476. data/lib/rubocop/cop/style/redundant_percent_q.rb +112 -0
  477. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +89 -0
  478. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +130 -0
  479. data/lib/rubocop/cop/style/redundant_return.rb +169 -0
  480. data/lib/rubocop/cop/style/redundant_self.rb +171 -0
  481. data/lib/rubocop/cop/style/redundant_sort.rb +165 -0
  482. data/lib/rubocop/cop/style/redundant_sort_by.rb +50 -0
  483. data/lib/rubocop/cop/style/regexp_literal.rb +228 -0
  484. data/lib/rubocop/cop/style/rescue_modifier.rb +73 -0
  485. data/lib/rubocop/cop/style/rescue_standard_error.rb +124 -0
  486. data/lib/rubocop/cop/style/return_nil.rb +89 -0
  487. data/lib/rubocop/cop/style/safe_navigation.rb +271 -0
  488. data/lib/rubocop/cop/style/sample.rb +144 -0
  489. data/lib/rubocop/cop/style/self_assignment.rb +97 -0
  490. data/lib/rubocop/cop/style/semicolon.rb +101 -0
  491. data/lib/rubocop/cop/style/send.rb +31 -0
  492. data/lib/rubocop/cop/style/signal_exception.rb +211 -0
  493. data/lib/rubocop/cop/style/single_line_block_params.rb +95 -0
  494. data/lib/rubocop/cop/style/single_line_methods.rb +83 -0
  495. data/lib/rubocop/cop/style/slicing_with_range.rb +39 -0
  496. data/lib/rubocop/cop/style/special_global_vars.rb +207 -0
  497. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +83 -0
  498. data/lib/rubocop/cop/style/stderr_puts.rb +61 -0
  499. data/lib/rubocop/cop/style/string_hash_keys.rb +50 -0
  500. data/lib/rubocop/cop/style/string_literals.rb +129 -0
  501. data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +49 -0
  502. data/lib/rubocop/cop/style/string_methods.rb +46 -0
  503. data/lib/rubocop/cop/style/strip.rb +46 -0
  504. data/lib/rubocop/cop/style/struct_inheritance.rb +39 -0
  505. data/lib/rubocop/cop/style/symbol_array.rb +119 -0
  506. data/lib/rubocop/cop/style/symbol_literal.rb +32 -0
  507. data/lib/rubocop/cop/style/symbol_proc.rb +110 -0
  508. data/lib/rubocop/cop/style/ternary_parentheses.rb +220 -0
  509. data/lib/rubocop/cop/style/trailing_body_on_class.rb +43 -0
  510. data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +54 -0
  511. data/lib/rubocop/cop/style/trailing_body_on_module.rb +43 -0
  512. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +109 -0
  513. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +99 -0
  514. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +88 -0
  515. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +100 -0
  516. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +91 -0
  517. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +165 -0
  518. data/lib/rubocop/cop/style/trivial_accessors.rb +191 -0
  519. data/lib/rubocop/cop/style/unless_else.rb +55 -0
  520. data/lib/rubocop/cop/style/unpack_first.rb +61 -0
  521. data/lib/rubocop/cop/style/variable_interpolation.rb +48 -0
  522. data/lib/rubocop/cop/style/when_then.rb +37 -0
  523. data/lib/rubocop/cop/style/while_until_do.rb +59 -0
  524. data/lib/rubocop/cop/style/while_until_modifier.rb +61 -0
  525. data/lib/rubocop/cop/style/word_array.rb +102 -0
  526. data/lib/rubocop/cop/style/yoda_condition.rb +156 -0
  527. data/lib/rubocop/cop/style/zero_length_predicate.rb +117 -0
  528. data/lib/rubocop/cop/team.rb +240 -0
  529. data/lib/rubocop/cop/util.rb +151 -0
  530. data/lib/rubocop/cop/utils/format_string.rb +120 -0
  531. data/lib/rubocop/cop/variable_force.rb +463 -0
  532. data/lib/rubocop/cop/variable_force/assignment.rb +97 -0
  533. data/lib/rubocop/cop/variable_force/branch.rb +320 -0
  534. data/lib/rubocop/cop/variable_force/branchable.rb +23 -0
  535. data/lib/rubocop/cop/variable_force/reference.rb +49 -0
  536. data/lib/rubocop/cop/variable_force/scope.rb +110 -0
  537. data/lib/rubocop/cop/variable_force/variable.rb +114 -0
  538. data/lib/rubocop/cop/variable_force/variable_table.rb +129 -0
  539. data/lib/rubocop/core_ext/string.rb +23 -0
  540. data/lib/rubocop/error.rb +34 -0
  541. data/lib/rubocop/ext/processed_source.rb +18 -0
  542. data/lib/rubocop/file_finder.rb +42 -0
  543. data/lib/rubocop/formatter/auto_gen_config_formatter.rb +16 -0
  544. data/lib/rubocop/formatter/base_formatter.rb +119 -0
  545. data/lib/rubocop/formatter/clang_style_formatter.rb +57 -0
  546. data/lib/rubocop/formatter/colorizable.rb +41 -0
  547. data/lib/rubocop/formatter/disabled_config_formatter.rb +216 -0
  548. data/lib/rubocop/formatter/emacs_style_formatter.rb +37 -0
  549. data/lib/rubocop/formatter/file_list_formatter.rb +20 -0
  550. data/lib/rubocop/formatter/formatter_set.rb +104 -0
  551. data/lib/rubocop/formatter/fuubar_style_formatter.rb +80 -0
  552. data/lib/rubocop/formatter/html_formatter.rb +141 -0
  553. data/lib/rubocop/formatter/json_formatter.rb +81 -0
  554. data/lib/rubocop/formatter/junit_formatter.rb +84 -0
  555. data/lib/rubocop/formatter/offense_count_formatter.rb +74 -0
  556. data/lib/rubocop/formatter/pacman_formatter.rb +80 -0
  557. data/lib/rubocop/formatter/progress_formatter.rb +63 -0
  558. data/lib/rubocop/formatter/quiet_formatter.rb +13 -0
  559. data/lib/rubocop/formatter/simple_text_formatter.rb +138 -0
  560. data/lib/rubocop/formatter/tap_formatter.rb +82 -0
  561. data/lib/rubocop/formatter/text_util.rb +20 -0
  562. data/lib/rubocop/formatter/worst_offenders_formatter.rb +62 -0
  563. data/lib/rubocop/magic_comment.rb +214 -0
  564. data/lib/rubocop/name_similarity.rb +24 -0
  565. data/lib/rubocop/options.rb +481 -0
  566. data/lib/rubocop/path_util.rb +85 -0
  567. data/lib/rubocop/platform.rb +11 -0
  568. data/lib/rubocop/rake_task.rb +80 -0
  569. data/lib/rubocop/remote_config.rb +104 -0
  570. data/lib/rubocop/result_cache.rb +205 -0
  571. data/lib/rubocop/rspec/cop_helper.rb +71 -0
  572. data/lib/rubocop/rspec/expect_offense.rb +273 -0
  573. data/lib/rubocop/rspec/host_environment_simulation_helper.rb +28 -0
  574. data/lib/rubocop/rspec/shared_contexts.rb +129 -0
  575. data/lib/rubocop/rspec/support.rb +13 -0
  576. data/lib/rubocop/runner.rb +386 -0
  577. data/lib/rubocop/string_interpreter.rb +57 -0
  578. data/lib/rubocop/target_finder.rb +196 -0
  579. data/lib/rubocop/target_ruby.rb +154 -0
  580. data/lib/rubocop/version.rb +23 -0
  581. data/lib/rubocop/warning.rb +11 -0
  582. data/lib/rubocop/yaml_duplication_checker.rb +39 -0
  583. metadata +780 -0
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'tempfile'
4
+
5
+ # This module provides methods that make it easier to test Cops.
6
+ module CopHelper
7
+ extend RSpec::SharedContext
8
+
9
+ let(:ruby_version) { 2.4 }
10
+ let(:rails_version) { false }
11
+
12
+ def inspect_source_file(source)
13
+ Tempfile.open('tmp') { |f| inspect_source(source, f) }
14
+ end
15
+
16
+ def inspect_source(source, file = nil)
17
+ RuboCop::Formatter::DisabledConfigFormatter.config_to_allow_offenses = {}
18
+ RuboCop::Formatter::DisabledConfigFormatter.detected_styles = {}
19
+ processed_source = parse_source(source, file)
20
+ raise 'Error parsing example code' unless processed_source.valid_syntax?
21
+
22
+ _investigate(cop, processed_source)
23
+ end
24
+
25
+ def parse_source(source, file = nil)
26
+ if file&.respond_to?(:write)
27
+ file.write(source)
28
+ file.rewind
29
+ file = file.path
30
+ end
31
+
32
+ RuboCop::ProcessedSource.new(source, ruby_version, file)
33
+ end
34
+
35
+ def autocorrect_source_file(source)
36
+ Tempfile.open('tmp') { |f| autocorrect_source(source, f) }
37
+ end
38
+
39
+ def autocorrect_source(source, file = nil)
40
+ RuboCop::Formatter::DisabledConfigFormatter.config_to_allow_offenses = {}
41
+ RuboCop::Formatter::DisabledConfigFormatter.detected_styles = {}
42
+ cop.instance_variable_get(:@options)[:auto_correct] = true
43
+ processed_source = parse_source(source, file)
44
+ _investigate(cop, processed_source)
45
+
46
+ corrector =
47
+ RuboCop::Cop::Corrector.new(processed_source.buffer, cop.corrections)
48
+ corrector.rewrite
49
+ end
50
+
51
+ def _investigate(cop, processed_source)
52
+ team = RuboCop::Cop::Team.new([cop], nil, raise_error: true)
53
+ team.inspect_file(processed_source)
54
+ end
55
+ end
56
+
57
+ module RuboCop
58
+ module Cop
59
+ # Monkey-patch Cop for tests to provide easy access to messages and
60
+ # highlights.
61
+ class Cop
62
+ def messages
63
+ offenses.sort.map(&:message)
64
+ end
65
+
66
+ def highlights
67
+ offenses.sort.map { |o| o.location.source }
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,273 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module RSpec
5
+ # Mixin for `expect_offense` and `expect_no_offenses`
6
+ #
7
+ # This mixin makes it easier to specify strict offense expectations
8
+ # in a declarative and visual fashion. Just type out the code that
9
+ # should generate a offense, annotate code by writing '^'s
10
+ # underneath each character that should be highlighted, and follow
11
+ # the carets with a string (separated by a space) that is the
12
+ # message of the offense. You can include multiple offenses in
13
+ # one code snippet.
14
+ #
15
+ # @example Usage
16
+ #
17
+ # expect_offense(<<~RUBY)
18
+ # a do
19
+ # b
20
+ # end.c
21
+ # ^^^^^ Avoid chaining a method call on a do...end block.
22
+ # RUBY
23
+ #
24
+ # @example Equivalent assertion without `expect_offense`
25
+ #
26
+ # inspect_source(<<~RUBY)
27
+ # a do
28
+ # b
29
+ # end.c
30
+ # RUBY
31
+ #
32
+ # expect(cop.offenses.size).to be(1)
33
+ #
34
+ # offense = cop.offenses.first
35
+ # expect(offense.line).to be(3)
36
+ # expect(offense.column_range).to be(0...5)
37
+ # expect(offense.message).to eql(
38
+ # 'Avoid chaining a method call on a do...end block.'
39
+ # )
40
+ #
41
+ # Auto-correction can be tested using `expect_correction` after
42
+ # `expect_offense`.
43
+ #
44
+ # @example `expect_offense` and `expect_correction`
45
+ #
46
+ # expect_offense(<<~RUBY)
47
+ # x % 2 == 0
48
+ # ^^^^^^^^^^ Replace with `Integer#even?`.
49
+ # RUBY
50
+ #
51
+ # expect_correction(<<~RUBY)
52
+ # x.even?
53
+ # RUBY
54
+ #
55
+ # If you do not want to specify an offense then use the
56
+ # companion method `expect_no_offenses`. This method is a much
57
+ # simpler assertion since it just inspects the source and checks
58
+ # that there were no offenses. The `expect_offense` method has
59
+ # to do more work by parsing out lines that contain carets.
60
+ #
61
+ # If the code produces an offense that could not be auto-corrected, you can
62
+ # use `expect_no_corrections` after `expect_offense`.
63
+ #
64
+ # @example `expect_offense` and `expect_no_corrections`
65
+ #
66
+ # expect_offense(<<~RUBY)
67
+ # a do
68
+ # b
69
+ # end.c
70
+ # ^^^^^ Avoid chaining a method call on a do...end block.
71
+ # RUBY
72
+ #
73
+ # expect_no_corrections
74
+ #
75
+ # If your code has variables of different lengths, you can use `%{foo}`
76
+ # and `^{foo}` to format your template:
77
+ #
78
+ # %w[raise fail].each do |keyword|
79
+ # expect_offense(<<~RUBY, keyword: keyword)
80
+ # %{keyword}(RuntimeError, msg)
81
+ # ^{keyword}^^^^^^^^^^^^^^^^^^^ Redundant `RuntimeError` argument can be removed.
82
+ # RUBY
83
+ module ExpectOffense
84
+ def format_offense(source, **replacements)
85
+ replacements.each do |keyword, value|
86
+ source = source.gsub("%{#{keyword}}", value)
87
+ .gsub("^{#{keyword}}", '^' * value.size)
88
+ end
89
+ source
90
+ end
91
+
92
+ # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
93
+ def expect_offense(source, file = nil, **replacements)
94
+ source = format_offense(source, **replacements)
95
+ RuboCop::Formatter::DisabledConfigFormatter
96
+ .config_to_allow_offenses = {}
97
+ RuboCop::Formatter::DisabledConfigFormatter.detected_styles = {}
98
+ cop.instance_variable_get(:@options)[:auto_correct] = true
99
+
100
+ expected_annotations = AnnotatedSource.parse(source)
101
+
102
+ if expected_annotations.plain_source == source
103
+ raise 'Use `expect_no_offenses` to assert that no offenses are found'
104
+ end
105
+
106
+ @processed_source = parse_source(expected_annotations.plain_source,
107
+ file)
108
+
109
+ raise 'Error parsing example code' unless @processed_source.valid_syntax?
110
+
111
+ _investigate(cop, @processed_source)
112
+ actual_annotations =
113
+ expected_annotations.with_offense_annotations(cop.offenses)
114
+
115
+ expect(actual_annotations.to_s).to eq(expected_annotations.to_s)
116
+ end
117
+
118
+ def expect_correction(correction, loop: true)
119
+ raise '`expect_correction` must follow `expect_offense`' unless @processed_source
120
+
121
+ iteration = 0
122
+ new_source = loop do
123
+ iteration += 1
124
+
125
+ corrector =
126
+ RuboCop::Cop::Corrector.new(@processed_source.buffer, cop.corrections)
127
+ corrected_source = corrector.rewrite
128
+
129
+ break corrected_source unless loop
130
+ break corrected_source if cop.corrections.empty?
131
+ break corrected_source if corrected_source == @processed_source.buffer.source
132
+
133
+ if iteration > RuboCop::Runner::MAX_ITERATIONS
134
+ raise RuboCop::Runner::InfiniteCorrectionLoop.new(@processed_source.path, [])
135
+ end
136
+
137
+ # Prepare for next loop
138
+ cop.instance_variable_set(:@corrections, [])
139
+ # Cache invalidation. This is bad!
140
+ cop.instance_variable_set(:@token_table, nil)
141
+ @processed_source = parse_source(corrected_source,
142
+ @processed_source.path)
143
+ _investigate(cop, @processed_source)
144
+ end
145
+
146
+ expect(new_source).to eq(correction)
147
+ end
148
+ # rubocop:enable Metrics/AbcSize, Metrics/MethodLength
149
+
150
+ def expect_no_corrections
151
+ raise '`expect_no_corrections` must follow `expect_offense`' unless @processed_source
152
+
153
+ return if cop.corrections.empty?
154
+
155
+ # In order to print a nice diff, e.g. what source got corrected to,
156
+ # we need to run the actual corrections
157
+
158
+ corrector =
159
+ RuboCop::Cop::Corrector.new(@processed_source.buffer, cop.corrections)
160
+ new_source = corrector.rewrite
161
+
162
+ expect(new_source).to eq(@processed_source.buffer.source)
163
+ end
164
+
165
+ def expect_no_offenses(source, file = nil)
166
+ inspect_source(source, file)
167
+
168
+ expected_annotations = AnnotatedSource.parse(source)
169
+ actual_annotations =
170
+ expected_annotations.with_offense_annotations(cop.offenses)
171
+ expect(actual_annotations.to_s).to eq(source)
172
+ end
173
+
174
+ # Parsed representation of code annotated with the `^^^ Message` style
175
+ class AnnotatedSource
176
+ ANNOTATION_PATTERN = /\A\s*\^+ /.freeze
177
+
178
+ # @param annotated_source [String] string passed to the matchers
179
+ #
180
+ # Separates annotation lines from source lines. Tracks the real
181
+ # source line number that each annotation corresponds to.
182
+ #
183
+ # @return [AnnotatedSource]
184
+ def self.parse(annotated_source)
185
+ source = []
186
+ annotations = []
187
+
188
+ annotated_source.each_line do |source_line|
189
+ if ANNOTATION_PATTERN.match?(source_line)
190
+ annotations << [source.size, source_line]
191
+ else
192
+ source << source_line
193
+ end
194
+ end
195
+
196
+ new(source, annotations)
197
+ end
198
+
199
+ # @param lines [Array<String>]
200
+ # @param annotations [Array<(Integer, String)>]
201
+ # each entry is the annotated line number and the annotation text
202
+ #
203
+ # @note annotations are sorted so that reconstructing the annotation
204
+ # text via {#to_s} is deterministic
205
+ def initialize(lines, annotations)
206
+ @lines = lines.freeze
207
+ @annotations = annotations.sort.freeze
208
+ end
209
+
210
+ # Construct annotated source string (like what we parse)
211
+ #
212
+ # Reconstruct a deterministic annotated source string. This is
213
+ # useful for eliminating semantically irrelevant annotation
214
+ # ordering differences.
215
+ #
216
+ # @example standardization
217
+ #
218
+ # source1 = AnnotatedSource.parse(<<-RUBY)
219
+ # line1
220
+ # ^ Annotation 1
221
+ # ^^ Annotation 2
222
+ # RUBY
223
+ #
224
+ # source2 = AnnotatedSource.parse(<<-RUBY)
225
+ # line1
226
+ # ^^ Annotation 2
227
+ # ^ Annotation 1
228
+ # RUBY
229
+ #
230
+ # source1.to_s == source2.to_s # => true
231
+ #
232
+ # @return [String]
233
+ def to_s
234
+ reconstructed = lines.dup
235
+
236
+ annotations.reverse_each do |line_number, annotation|
237
+ reconstructed.insert(line_number, annotation)
238
+ end
239
+
240
+ reconstructed.join
241
+ end
242
+
243
+ # Return the plain source code without annotations
244
+ #
245
+ # @return [String]
246
+ def plain_source
247
+ lines.join
248
+ end
249
+
250
+ # Annotate the source code with the RuboCop offenses provided
251
+ #
252
+ # @param offenses [Array<RuboCop::Cop::Offense>]
253
+ #
254
+ # @return [self]
255
+ def with_offense_annotations(offenses)
256
+ offense_annotations =
257
+ offenses.map do |offense|
258
+ indent = ' ' * offense.column
259
+ carets = '^' * offense.column_length
260
+
261
+ [offense.line, "#{indent}#{carets} #{offense.message}\n"]
262
+ end
263
+
264
+ self.class.new(lines, offense_annotations)
265
+ end
266
+
267
+ private
268
+
269
+ attr_reader :lines, :annotations
270
+ end
271
+ end
272
+ end
273
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ # RuboCop can be run in contexts where unexpected other libraries are included,
4
+ # which may interfere with its normal behavior. In order to test those
5
+ # situations, it may be necessary to require another library for the duration
6
+ # of one spec
7
+ module HostEnvironmentSimulatorHelper
8
+ def in_its_own_process_with(*files)
9
+ if ::Process.respond_to?(:fork)
10
+ pid = ::Process.fork do
11
+ # Need to write coverage result under different name
12
+ if defined?(SimpleCov)
13
+ SimpleCov.command_name "rspec-fork-#{Process.pid}"
14
+ SimpleCov.pid = Process.pid
15
+ end
16
+
17
+ files.each { |file| require file }
18
+ yield
19
+ end
20
+ ::Process.wait(pid)
21
+
22
+ # assert that the block did not fail
23
+ expect($CHILD_STATUS).to be_success
24
+ else
25
+ warn 'Process.fork is not available.'
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,129 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'tmpdir'
4
+ require 'fileutils'
5
+
6
+ RSpec.shared_context 'isolated environment', :isolated_environment do
7
+ around do |example|
8
+ Dir.mktmpdir do |tmpdir|
9
+ original_home = ENV['HOME']
10
+ original_xdg_config_home = ENV['XDG_CONFIG_HOME']
11
+
12
+ # Make sure to expand all symlinks in the path first. Otherwise we may
13
+ # get mismatched pathnames when loading config files later on.
14
+ tmpdir = File.realpath(tmpdir)
15
+
16
+ # Make upwards search for .rubocop.yml files stop at this directory.
17
+ RuboCop::FileFinder.root_level = tmpdir
18
+
19
+ begin
20
+ virtual_home = File.expand_path(File.join(tmpdir, 'home'))
21
+ Dir.mkdir(virtual_home)
22
+ ENV['HOME'] = virtual_home
23
+ ENV.delete('XDG_CONFIG_HOME')
24
+
25
+ working_dir = File.join(tmpdir, 'work')
26
+ Dir.mkdir(working_dir)
27
+
28
+ RuboCop::PathUtil.chdir(working_dir) do
29
+ example.run
30
+ end
31
+ ensure
32
+ ENV['HOME'] = original_home
33
+ ENV['XDG_CONFIG_HOME'] = original_xdg_config_home
34
+
35
+ RuboCop::FileFinder.root_level = nil
36
+ end
37
+ end
38
+ end
39
+ end
40
+
41
+ # This context assumes nothing and defines `cop`, among others.
42
+ RSpec.shared_context 'config', :config do # rubocop:disable Metrics/BlockLength
43
+ ### Meant to be overridden at will
44
+
45
+ let(:source) { 'code = {some: :ruby}' }
46
+
47
+ let(:cop_class) do
48
+ if described_class.is_a?(Class) && described_class < RuboCop::Cop::Cop
49
+ described_class
50
+ else
51
+ RuboCop::Cop::Cop
52
+ end
53
+ end
54
+
55
+ let(:cop_config) { {} }
56
+
57
+ let(:other_cops) { {} }
58
+
59
+ let(:cop_options) { {} }
60
+
61
+ ### Utilities
62
+
63
+ def source_range(range, buffer: source_buffer)
64
+ Parser::Source::Range.new(buffer, range.begin,
65
+ range.exclude_end? ? range.end : range.end + 1)
66
+ end
67
+
68
+ ### Useful intermediary steps (less likely to be overridden)
69
+
70
+ let(:processed_source) { parse_source(source, 'test') }
71
+
72
+ let(:source_buffer) { processed_source.buffer }
73
+
74
+ let(:all_cops_config) do
75
+ rails = { 'TargetRubyVersion' => ruby_version }
76
+ rails['TargetRailsVersion'] = rails_version if rails_version
77
+ rails
78
+ end
79
+
80
+ let(:cur_cop_config) do
81
+ RuboCop::ConfigLoader
82
+ .default_configuration.for_cop(cop_class)
83
+ .merge({
84
+ 'Enabled' => true, # in case it is 'pending'
85
+ 'AutoCorrect' => true # in case defaults set it to false
86
+ })
87
+ .merge(cop_config)
88
+ end
89
+
90
+ let(:config) do
91
+ hash = { 'AllCops' => all_cops_config,
92
+ cop_class.cop_name => cur_cop_config }.merge!(other_cops)
93
+
94
+ RuboCop::Config.new(hash, "#{Dir.pwd}/.rubocop.yml")
95
+ end
96
+
97
+ let(:cop) do
98
+ cop_class.new(config, cop_options)
99
+ .tap { |cop| cop.processed_source = processed_source }
100
+ end
101
+ end
102
+
103
+ RSpec.shared_context 'mock console output' do
104
+ before do
105
+ $stdout = StringIO.new
106
+ $stderr = StringIO.new
107
+ end
108
+
109
+ after do
110
+ $stdout = STDOUT
111
+ $stderr = STDERR
112
+ end
113
+ end
114
+
115
+ RSpec.shared_context 'ruby 2.4', :ruby24 do
116
+ let(:ruby_version) { 2.4 }
117
+ end
118
+
119
+ RSpec.shared_context 'ruby 2.5', :ruby25 do
120
+ let(:ruby_version) { 2.5 }
121
+ end
122
+
123
+ RSpec.shared_context 'ruby 2.6', :ruby26 do
124
+ let(:ruby_version) { 2.6 }
125
+ end
126
+
127
+ RSpec.shared_context 'ruby 2.7', :ruby27 do
128
+ let(:ruby_version) { 2.7 }
129
+ end