rubocop 0.71.0 → 0.75.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 (280) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +5 -8
  3. data/bin/console +1 -0
  4. data/config/default.yml +84 -488
  5. data/lib/rubocop.rb +16 -54
  6. data/lib/rubocop/ast/builder.rb +2 -0
  7. data/lib/rubocop/ast/node.rb +9 -15
  8. data/lib/rubocop/ast/node/float_node.rb +12 -0
  9. data/lib/rubocop/ast/node/int_node.rb +12 -0
  10. data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +4 -4
  11. data/lib/rubocop/ast/node/mixin/numeric_node.rb +21 -0
  12. data/lib/rubocop/ast/node/resbody_node.rb +1 -6
  13. data/lib/rubocop/ast/traversal.rb +3 -3
  14. data/lib/rubocop/cached_data.rb +1 -1
  15. data/lib/rubocop/comment_config.rb +3 -2
  16. data/lib/rubocop/config.rb +21 -508
  17. data/lib/rubocop/config_loader.rb +22 -8
  18. data/lib/rubocop/config_loader_resolver.rb +2 -16
  19. data/lib/rubocop/config_obsoletion.rb +213 -0
  20. data/lib/rubocop/config_validator.rb +239 -0
  21. data/lib/rubocop/cop/autocorrect_logic.rb +71 -1
  22. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +1 -1
  23. data/lib/rubocop/cop/bundler/ordered_gems.rb +1 -1
  24. data/lib/rubocop/cop/commissioner.rb +3 -9
  25. data/lib/rubocop/cop/cop.rb +39 -12
  26. data/lib/rubocop/cop/corrector.rb +2 -3
  27. data/lib/rubocop/cop/correctors/alignment_corrector.rb +43 -17
  28. data/lib/rubocop/cop/correctors/empty_line_corrector.rb +2 -2
  29. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +2 -2
  30. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +1 -1
  31. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +2 -2
  32. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -1
  33. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +1 -1
  34. data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +55 -0
  35. data/lib/rubocop/cop/generator.rb +4 -4
  36. data/lib/rubocop/cop/generator/configuration_injector.rb +9 -4
  37. data/lib/rubocop/cop/generator/require_file_injector.rb +1 -1
  38. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +2 -2
  39. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +1 -1
  40. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +2 -2
  41. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +1 -1
  42. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +2 -2
  43. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +2 -2
  44. data/lib/rubocop/cop/layout/block_alignment.rb +3 -3
  45. data/lib/rubocop/cop/layout/class_structure.rb +2 -2
  46. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +1 -1
  47. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +22 -7
  48. data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +2 -2
  49. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +2 -2
  50. data/lib/rubocop/cop/layout/extra_spacing.rb +14 -59
  51. data/lib/rubocop/cop/layout/indent_assignment.rb +10 -1
  52. data/lib/rubocop/cop/layout/indent_first_argument.rb +7 -3
  53. data/lib/rubocop/cop/layout/indent_first_parameter.rb +7 -3
  54. data/lib/rubocop/cop/layout/indent_heredoc.rb +4 -4
  55. data/lib/rubocop/cop/layout/indentation_consistency.rb +13 -12
  56. data/lib/rubocop/cop/layout/indentation_width.rb +28 -10
  57. data/lib/rubocop/cop/layout/leading_comment_space.rb +28 -0
  58. data/lib/rubocop/cop/layout/multiline_block_layout.rb +24 -2
  59. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +18 -4
  60. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +5 -1
  61. data/lib/rubocop/cop/layout/space_around_operators.rb +42 -23
  62. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +1 -1
  63. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +21 -2
  64. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +24 -40
  65. data/lib/rubocop/cop/layout/tab.rb +10 -22
  66. data/lib/rubocop/cop/lint/assignment_in_condition.rb +17 -4
  67. data/lib/rubocop/cop/lint/big_decimal_new.rb +1 -1
  68. data/lib/rubocop/cop/lint/debugger.rb +4 -6
  69. data/lib/rubocop/cop/lint/duplicate_methods.rb +3 -3
  70. data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
  71. data/lib/rubocop/cop/lint/empty_interpolation.rb +4 -4
  72. data/lib/rubocop/cop/lint/erb_new_arguments.rb +57 -1
  73. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +11 -37
  74. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +1 -1
  75. data/lib/rubocop/cop/lint/inherit_exception.rb +1 -1
  76. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +7 -8
  77. data/lib/rubocop/cop/lint/multiple_compare.rb +1 -1
  78. data/lib/rubocop/cop/lint/nested_method_definition.rb +3 -3
  79. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
  80. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +1 -1
  81. data/lib/rubocop/cop/lint/number_conversion.rb +4 -4
  82. data/lib/rubocop/cop/lint/rand_one.rb +1 -1
  83. data/lib/rubocop/cop/lint/redundant_with_index.rb +1 -1
  84. data/lib/rubocop/cop/lint/redundant_with_object.rb +1 -1
  85. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +5 -5
  86. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +1 -1
  87. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +91 -0
  88. data/lib/rubocop/cop/lint/string_conversion_in_interpolation.rb +6 -6
  89. data/lib/rubocop/cop/lint/unified_integer.rb +1 -1
  90. data/lib/rubocop/cop/lint/unneeded_cop_disable_directive.rb +1 -1
  91. data/lib/rubocop/cop/lint/unneeded_require_statement.rb +1 -1
  92. data/lib/rubocop/cop/lint/unneeded_splat_expansion.rb +7 -2
  93. data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
  94. data/lib/rubocop/cop/lint/unused_block_argument.rb +22 -6
  95. data/lib/rubocop/cop/lint/unused_method_argument.rb +23 -5
  96. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +1 -1
  97. data/lib/rubocop/cop/lint/uri_regexp.rb +2 -2
  98. data/lib/rubocop/cop/lint/useless_access_modifier.rb +6 -6
  99. data/lib/rubocop/cop/lint/useless_setter_call.rb +1 -1
  100. data/lib/rubocop/cop/lint/void.rb +3 -22
  101. data/lib/rubocop/cop/message_annotator.rb +16 -7
  102. data/lib/rubocop/cop/metrics/class_length.rb +1 -1
  103. data/lib/rubocop/cop/metrics/line_length.rb +6 -0
  104. data/lib/rubocop/cop/metrics/module_length.rb +1 -1
  105. data/lib/rubocop/cop/metrics/parameter_lists.rb +1 -1
  106. data/lib/rubocop/cop/migration/department_name.rb +44 -0
  107. data/lib/rubocop/cop/mixin/alignment.rb +1 -1
  108. data/lib/rubocop/cop/mixin/def_node.rb +1 -1
  109. data/lib/rubocop/cop/mixin/documentation_comment.rb +0 -2
  110. data/lib/rubocop/cop/mixin/empty_parameter.rb +1 -1
  111. data/lib/rubocop/cop/mixin/enforce_superclass.rb +4 -4
  112. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +1 -1
  113. data/lib/rubocop/cop/mixin/interpolation.rb +27 -0
  114. data/lib/rubocop/cop/mixin/method_complexity.rb +1 -1
  115. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +3 -3
  116. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +87 -0
  117. data/lib/rubocop/cop/mixin/safe_mode.rb +2 -0
  118. data/lib/rubocop/cop/mixin/surrounding_space.rb +7 -5
  119. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -1
  120. data/lib/rubocop/cop/naming/constant_name.rb +2 -2
  121. data/lib/rubocop/cop/naming/method_name.rb +12 -1
  122. data/lib/rubocop/cop/naming/predicate_name.rb +1 -1
  123. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +21 -20
  124. data/lib/rubocop/cop/naming/variable_name.rb +1 -0
  125. data/lib/rubocop/cop/offense.rb +18 -7
  126. data/lib/rubocop/cop/registry.rb +22 -1
  127. data/lib/rubocop/cop/security/eval.rb +1 -1
  128. data/lib/rubocop/cop/security/json_load.rb +1 -1
  129. data/lib/rubocop/cop/security/marshal_load.rb +1 -1
  130. data/lib/rubocop/cop/security/open.rb +1 -1
  131. data/lib/rubocop/cop/security/yaml_load.rb +1 -1
  132. data/lib/rubocop/cop/style/access_modifier_declarations.rb +1 -0
  133. data/lib/rubocop/cop/style/alias.rb +1 -1
  134. data/lib/rubocop/cop/style/block_delimiters.rb +2 -1
  135. data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +29 -10
  136. data/lib/rubocop/cop/style/class_and_module_children.rb +1 -1
  137. data/lib/rubocop/cop/style/colon_method_call.rb +1 -1
  138. data/lib/rubocop/cop/style/commented_keyword.rb +16 -30
  139. data/lib/rubocop/cop/style/conditional_assignment.rb +8 -9
  140. data/lib/rubocop/cop/style/constant_visibility.rb +14 -3
  141. data/lib/rubocop/cop/style/date_time.rb +3 -3
  142. data/lib/rubocop/cop/style/dir.rb +1 -1
  143. data/lib/rubocop/cop/style/documentation_method.rb +45 -1
  144. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +55 -0
  145. data/lib/rubocop/cop/style/each_for_simple_loop.rb +1 -1
  146. data/lib/rubocop/cop/style/each_with_object.rb +1 -1
  147. data/lib/rubocop/cop/style/eval_with_location.rb +2 -2
  148. data/lib/rubocop/cop/style/even_odd.rb +1 -1
  149. data/lib/rubocop/cop/style/expand_path_arguments.rb +4 -4
  150. data/lib/rubocop/cop/style/float_division.rb +94 -0
  151. data/lib/rubocop/cop/style/format_string.rb +13 -9
  152. data/lib/rubocop/cop/style/format_string_token.rb +18 -69
  153. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +18 -33
  154. data/lib/rubocop/cop/style/guard_clause.rb +39 -10
  155. data/lib/rubocop/cop/style/hash_syntax.rb +2 -2
  156. data/lib/rubocop/cop/style/if_inside_else.rb +42 -0
  157. data/lib/rubocop/cop/style/if_unless_modifier.rb +51 -15
  158. data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
  159. data/lib/rubocop/cop/style/inverse_methods.rb +2 -2
  160. data/lib/rubocop/cop/style/lambda.rb +0 -2
  161. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +32 -26
  162. data/lib/rubocop/cop/style/min_max.rb +1 -1
  163. data/lib/rubocop/cop/style/mixin_usage.rb +12 -2
  164. data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
  165. data/lib/rubocop/cop/style/multiline_when_then.rb +55 -0
  166. data/lib/rubocop/cop/style/multiple_comparison.rb +1 -1
  167. data/lib/rubocop/cop/style/mutable_constant.rb +3 -3
  168. data/lib/rubocop/cop/style/nested_modifier.rb +18 -2
  169. data/lib/rubocop/cop/style/numeric_predicate.rb +3 -3
  170. data/lib/rubocop/cop/style/option_hash.rb +1 -1
  171. data/lib/rubocop/cop/style/or_assignment.rb +8 -3
  172. data/lib/rubocop/cop/style/parentheses_around_condition.rb +15 -1
  173. data/lib/rubocop/cop/style/random_with_offset.rb +6 -6
  174. data/lib/rubocop/cop/style/redundant_conditional.rb +2 -2
  175. data/lib/rubocop/cop/style/redundant_exception.rb +2 -2
  176. data/lib/rubocop/cop/style/redundant_freeze.rb +1 -1
  177. data/lib/rubocop/cop/style/redundant_parentheses.rb +15 -6
  178. data/lib/rubocop/cop/style/redundant_return.rb +12 -0
  179. data/lib/rubocop/cop/style/redundant_self.rb +18 -1
  180. data/lib/rubocop/cop/style/redundant_sort_by.rb +1 -1
  181. data/lib/rubocop/cop/style/rescue_modifier.rb +24 -0
  182. data/lib/rubocop/cop/style/rescue_standard_error.rb +2 -2
  183. data/lib/rubocop/cop/style/return_nil.rb +1 -1
  184. data/lib/rubocop/cop/style/safe_navigation.rb +19 -2
  185. data/lib/rubocop/cop/style/sample.rb +1 -1
  186. data/lib/rubocop/cop/style/semicolon.rb +11 -0
  187. data/lib/rubocop/cop/style/single_line_methods.rb +8 -1
  188. data/lib/rubocop/cop/style/stderr_puts.rb +1 -1
  189. data/lib/rubocop/cop/style/string_hash_keys.rb +2 -2
  190. data/lib/rubocop/cop/style/strip.rb +1 -1
  191. data/lib/rubocop/cop/style/struct_inheritance.rb +3 -3
  192. data/lib/rubocop/cop/style/symbol_proc.rb +1 -1
  193. data/lib/rubocop/cop/style/ternary_parentheses.rb +32 -3
  194. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +4 -6
  195. data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
  196. data/lib/rubocop/cop/style/unneeded_sort.rb +1 -1
  197. data/lib/rubocop/cop/style/unpack_first.rb +1 -1
  198. data/lib/rubocop/cop/style/variable_interpolation.rb +6 -16
  199. data/lib/rubocop/cop/style/word_array.rb +2 -2
  200. data/lib/rubocop/cop/style/zero_length_predicate.rb +6 -6
  201. data/lib/rubocop/cop/team.rb +15 -14
  202. data/lib/rubocop/cop/utils/format_string.rb +128 -0
  203. data/lib/rubocop/cop/variable_force/variable.rb +15 -2
  204. data/lib/rubocop/core_ext/string.rb +0 -24
  205. data/lib/rubocop/error.rb +23 -0
  206. data/lib/rubocop/formatter/clang_style_formatter.rb +8 -3
  207. data/lib/rubocop/formatter/emacs_style_formatter.rb +22 -9
  208. data/lib/rubocop/formatter/file_list_formatter.rb +1 -1
  209. data/lib/rubocop/formatter/formatter_set.rb +16 -15
  210. data/lib/rubocop/formatter/pacman_formatter.rb +80 -0
  211. data/lib/rubocop/formatter/simple_text_formatter.rb +16 -4
  212. data/lib/rubocop/formatter/tap_formatter.rb +17 -4
  213. data/lib/rubocop/magic_comment.rb +4 -0
  214. data/lib/rubocop/node_pattern.rb +2 -2
  215. data/lib/rubocop/options.rb +21 -17
  216. data/lib/rubocop/path_util.rb +1 -1
  217. data/lib/rubocop/processed_source.rb +6 -1
  218. data/lib/rubocop/rspec/cop_helper.rb +0 -1
  219. data/lib/rubocop/rspec/expect_offense.rb +4 -1
  220. data/lib/rubocop/rspec/shared_contexts.rb +12 -17
  221. data/lib/rubocop/rspec/support.rb +0 -1
  222. data/lib/rubocop/runner.rb +14 -25
  223. data/lib/rubocop/target_finder.rb +6 -4
  224. data/lib/rubocop/version.rb +1 -1
  225. data/lib/rubocop/yaml_duplication_checker.rb +8 -2
  226. metadata +17 -92
  227. data/lib/rubocop/cop/mixin/ignored_method_patterns.rb +0 -19
  228. data/lib/rubocop/cop/mixin/target_rails_version.rb +0 -16
  229. data/lib/rubocop/cop/rails/action_filter.rb +0 -117
  230. data/lib/rubocop/cop/rails/active_record_aliases.rb +0 -48
  231. data/lib/rubocop/cop/rails/active_record_override.rb +0 -82
  232. data/lib/rubocop/cop/rails/active_support_aliases.rb +0 -69
  233. data/lib/rubocop/cop/rails/application_job.rb +0 -40
  234. data/lib/rubocop/cop/rails/application_record.rb +0 -40
  235. data/lib/rubocop/cop/rails/assert_not.rb +0 -44
  236. data/lib/rubocop/cop/rails/belongs_to.rb +0 -102
  237. data/lib/rubocop/cop/rails/blank.rb +0 -164
  238. data/lib/rubocop/cop/rails/bulk_change_table.rb +0 -289
  239. data/lib/rubocop/cop/rails/create_table_with_timestamps.rb +0 -91
  240. data/lib/rubocop/cop/rails/date.rb +0 -161
  241. data/lib/rubocop/cop/rails/delegate.rb +0 -132
  242. data/lib/rubocop/cop/rails/delegate_allow_blank.rb +0 -37
  243. data/lib/rubocop/cop/rails/dynamic_find_by.rb +0 -91
  244. data/lib/rubocop/cop/rails/enum_uniqueness.rb +0 -45
  245. data/lib/rubocop/cop/rails/environment_comparison.rb +0 -68
  246. data/lib/rubocop/cop/rails/exit.rb +0 -67
  247. data/lib/rubocop/cop/rails/file_path.rb +0 -108
  248. data/lib/rubocop/cop/rails/find_by.rb +0 -55
  249. data/lib/rubocop/cop/rails/find_each.rb +0 -51
  250. data/lib/rubocop/cop/rails/has_and_belongs_to_many.rb +0 -25
  251. data/lib/rubocop/cop/rails/has_many_or_has_one_dependent.rb +0 -106
  252. data/lib/rubocop/cop/rails/http_positional_arguments.rb +0 -117
  253. data/lib/rubocop/cop/rails/http_status.rb +0 -179
  254. data/lib/rubocop/cop/rails/ignored_skip_action_filter_option.rb +0 -94
  255. data/lib/rubocop/cop/rails/inverse_of.rb +0 -246
  256. data/lib/rubocop/cop/rails/lexically_scoped_action_filter.rb +0 -175
  257. data/lib/rubocop/cop/rails/link_to_blank.rb +0 -98
  258. data/lib/rubocop/cop/rails/not_null_column.rb +0 -67
  259. data/lib/rubocop/cop/rails/output.rb +0 -49
  260. data/lib/rubocop/cop/rails/output_safety.rb +0 -99
  261. data/lib/rubocop/cop/rails/pluralization_grammar.rb +0 -107
  262. data/lib/rubocop/cop/rails/presence.rb +0 -124
  263. data/lib/rubocop/cop/rails/present.rb +0 -153
  264. data/lib/rubocop/cop/rails/read_write_attribute.rb +0 -74
  265. data/lib/rubocop/cop/rails/redundant_allow_nil.rb +0 -111
  266. data/lib/rubocop/cop/rails/redundant_receiver_in_with_options.rb +0 -136
  267. data/lib/rubocop/cop/rails/reflection_class_name.rb +0 -37
  268. data/lib/rubocop/cop/rails/refute_methods.rb +0 -76
  269. data/lib/rubocop/cop/rails/relative_date_constant.rb +0 -93
  270. data/lib/rubocop/cop/rails/request_referer.rb +0 -56
  271. data/lib/rubocop/cop/rails/reversible_migration.rb +0 -286
  272. data/lib/rubocop/cop/rails/safe_navigation.rb +0 -87
  273. data/lib/rubocop/cop/rails/save_bang.rb +0 -316
  274. data/lib/rubocop/cop/rails/scope_args.rb +0 -29
  275. data/lib/rubocop/cop/rails/skips_model_validations.rb +0 -87
  276. data/lib/rubocop/cop/rails/time_zone.rb +0 -238
  277. data/lib/rubocop/cop/rails/uniq_before_pluck.rb +0 -105
  278. data/lib/rubocop/cop/rails/unknown_env.rb +0 -63
  279. data/lib/rubocop/cop/rails/validation.rb +0 -109
  280. data/lib/rubocop/rspec/shared_examples.rb +0 -59
@@ -45,7 +45,7 @@ module RuboCop
45
45
  'Instead, use %<replacements>s depending on your specific use ' \
46
46
  'case.'
47
47
 
48
- def_node_matcher :uri_escape_unescape?, <<-PATTERN
48
+ def_node_matcher :uri_escape_unescape?, <<~PATTERN
49
49
  (send
50
50
  (const ${nil? cbase} :URI) ${:escape :encode :unescape :decode}
51
51
  ...)
@@ -18,13 +18,13 @@ module RuboCop
18
18
  'be used. Instead, use `%<top_level>sURI::DEFAULT_PARSER.' \
19
19
  'make_regexp%<arg>s`.'
20
20
 
21
- def_node_matcher :uri_regexp_with_argument?, <<-PATTERN
21
+ def_node_matcher :uri_regexp_with_argument?, <<~PATTERN
22
22
  (send
23
23
  (const ${nil? cbase} :URI) :regexp
24
24
  (str $_))
25
25
  PATTERN
26
26
 
27
- def_node_matcher :uri_regexp_without_argument?, <<-PATTERN
27
+ def_node_matcher :uri_regexp_without_argument?, <<~PATTERN
28
28
  (send
29
29
  (const ${nil? cbase} :URI) :regexp)
30
30
  PATTERN
@@ -113,19 +113,19 @@ module RuboCop
113
113
 
114
114
  private
115
115
 
116
- def_node_matcher :static_method_definition?, <<-PATTERN
116
+ def_node_matcher :static_method_definition?, <<~PATTERN
117
117
  {def (send nil? {:attr :attr_reader :attr_writer :attr_accessor} ...)}
118
118
  PATTERN
119
119
 
120
- def_node_matcher :dynamic_method_definition?, <<-PATTERN
120
+ def_node_matcher :dynamic_method_definition?, <<~PATTERN
121
121
  {(send nil? :define_method ...) (block (send nil? :define_method ...) ...)}
122
122
  PATTERN
123
123
 
124
- def_node_matcher :class_or_instance_eval?, <<-PATTERN
124
+ def_node_matcher :class_or_instance_eval?, <<~PATTERN
125
125
  (block (send _ {:class_eval :instance_eval}) ...)
126
126
  PATTERN
127
127
 
128
- def_node_matcher :class_or_module_or_struct_new_call?, <<-PATTERN
128
+ def_node_matcher :class_or_module_or_struct_new_call?, <<~PATTERN
129
129
  (block (send (const nil? {:Class :Module :Struct}) :new ...) ...)
130
130
  PATTERN
131
131
 
@@ -202,7 +202,7 @@ module RuboCop
202
202
  cop_config.fetch('MethodCreatingMethods', []).any? do |m|
203
203
  matcher_name = "#{m}_method?".to_sym
204
204
  unless respond_to?(matcher_name)
205
- self.class.def_node_matcher matcher_name, <<-PATTERN
205
+ self.class.def_node_matcher matcher_name, <<~PATTERN
206
206
  {def (send nil? :#{m} ...)}
207
207
  PATTERN
208
208
  end
@@ -226,7 +226,7 @@ module RuboCop
226
226
  cop_config.fetch('ContextCreatingMethods', []).any? do |m|
227
227
  matcher_name = "#{m}_block?".to_sym
228
228
  unless respond_to?(matcher_name)
229
- self.class.def_node_matcher matcher_name, <<-PATTERN
229
+ self.class.def_node_matcher matcher_name, <<~PATTERN
230
230
  (block (send {nil? const} {:#{m}} ...) ...)
231
231
  PATTERN
232
232
  end
@@ -49,7 +49,7 @@ module RuboCop
49
49
 
50
50
  private
51
51
 
52
- def_node_matcher :setter_call_to_local_variable?, <<-PATTERN
52
+ def_node_matcher :setter_call_to_local_variable?, <<~PATTERN
53
53
  [(send (lvar _) ...) setter_method?]
54
54
  PATTERN
55
55
 
@@ -6,55 +6,36 @@ module RuboCop
6
6
  # This cop checks for operators, variables, literals, and nonmutating
7
7
  # methods used in void context.
8
8
  #
9
- # @example
10
- #
9
+ # @example CheckForMethodsWithNoSideEffects: false (default)
11
10
  # # bad
12
- #
13
11
  # def some_method
14
12
  # some_num * 10
15
13
  # do_something
16
14
  # end
17
15
  #
18
- # @example
19
- #
20
- # # bad
21
- #
22
16
  # def some_method(some_var)
23
17
  # some_var
24
18
  # do_something
25
19
  # end
26
20
  #
27
- # @example
28
- #
29
- # # bad, when CheckForMethodsWithNoSideEffects is set true
30
- #
21
+ # @example CheckForMethodsWithNoSideEffects: true
22
+ # # bad
31
23
  # def some_method(some_array)
32
24
  # some_array.sort
33
25
  # do_something(some_array)
34
26
  # end
35
27
  #
36
- # @example
37
- #
38
28
  # # good
39
- #
40
29
  # def some_method
41
30
  # do_something
42
31
  # some_num * 10
43
32
  # end
44
33
  #
45
- # @example
46
- #
47
- # # good
48
- #
49
34
  # def some_method(some_var)
50
35
  # do_something
51
36
  # some_var
52
37
  # end
53
38
  #
54
- # @example
55
- #
56
- # # good, when CheckForMethodsWithNoSideEffects is set true
57
- #
58
39
  # def some_method(some_array)
59
40
  # some_array.sort!
60
41
  # do_something(some_array)
@@ -9,11 +9,11 @@ module RuboCop
9
9
  #
10
10
  # @example
11
11
  # RuboCop::Cop::MessageAnnotator.new(
12
- # config, cop_config, @options
13
- # ).annotate('message', 'Cop/CopName')
12
+ # config, cop_name, cop_config, @options
13
+ # ).annotate('message')
14
14
  # #=> 'Cop/CopName: message (http://example.org/styleguide)'
15
15
  class MessageAnnotator
16
- attr_reader :options, :config, :cop_config
16
+ attr_reader :options, :config, :cop_name, :cop_config
17
17
 
18
18
  @style_guide_urls = {}
19
19
 
@@ -29,6 +29,7 @@ module RuboCop
29
29
  # :ExtraDetails [Boolean] Include cop details
30
30
  # :DisplayCopNames [Boolean] Include cop name
31
31
  #
32
+ # @param [String] cop_name for specific cop name
32
33
  # @param [Hash] cop_config configs for specific cop, from config#for_cop
33
34
  # @option cop_config [String] :StyleGuide Extension of base styleguide URL
34
35
  # @option cop_config [String] :Reference Full reference URL
@@ -43,8 +44,9 @@ module RuboCop
43
44
  # Include debug output
44
45
  # @option options [Boolean] :display_cop_names
45
46
  # Include cop name
46
- def initialize(config, cop_config, options)
47
+ def initialize(config, cop_name, cop_config, options)
47
48
  @config = config
49
+ @cop_name = cop_name
48
50
  @cop_config = cop_config || {}
49
51
  @options = options
50
52
  end
@@ -53,8 +55,8 @@ module RuboCop
53
55
  # based on params passed into initializer
54
56
  #
55
57
  # @return [String] annotated message
56
- def annotate(message, name)
57
- message = "#{name}: #{message}" if display_cop_names?
58
+ def annotate(message)
59
+ message = "#{cop_name}: #{message}" if display_cop_names?
58
60
  message += " #{details}" if extra_details? && details
59
61
  if display_style_guide?
60
62
  links = urls.join(', ')
@@ -74,7 +76,7 @@ module RuboCop
74
76
  return nil if url.nil? || url.empty?
75
77
 
76
78
  self.class.style_guide_urls[url] ||= begin
77
- base_url = config.for_all_cops['StyleGuideBaseURL']
79
+ base_url = style_guide_base_url
78
80
  if base_url.nil? || base_url.empty?
79
81
  url
80
82
  else
@@ -83,6 +85,13 @@ module RuboCop
83
85
  end
84
86
  end
85
87
 
88
+ def style_guide_base_url
89
+ department_name = cop_name.split('/').first
90
+
91
+ config.for_department(department_name)['StyleGuideBaseURL'] ||
92
+ config.for_all_cops['StyleGuideBaseURL']
93
+ end
94
+
86
95
  def display_style_guide?
87
96
  (options[:display_style_guide] ||
88
97
  config.for_all_cops['DisplayStyleGuide']) &&
@@ -21,7 +21,7 @@ module RuboCop
21
21
 
22
22
  private
23
23
 
24
- def_node_matcher :class_definition?, <<-PATTERN
24
+ def_node_matcher :class_definition?, <<~PATTERN
25
25
  (casgn nil? _ (block (send (const nil? :Class) :new) ...))
26
26
  PATTERN
27
27
 
@@ -10,6 +10,7 @@ module RuboCop
10
10
  # The maximum length is configurable.
11
11
  # The tab size is configured in the `IndentationWidth`
12
12
  # of the `Layout/Tab` cop.
13
+ # It also ignores a shebang line by default.
13
14
  #
14
15
  # This cop has some autocorrection capabilities.
15
16
  # It can programmatically shorten certain long lines by
@@ -138,9 +139,14 @@ module RuboCop
138
139
 
139
140
  def ignored_line?(line, line_index)
140
141
  matches_ignored_pattern?(line) ||
142
+ shebang?(line, line_index) ||
141
143
  heredocs && line_in_permitted_heredoc?(line_index.succ)
142
144
  end
143
145
 
146
+ def shebang?(line, line_index)
147
+ line_index.zero? && line.start_with?('#!')
148
+ end
149
+
144
150
  def register_offense(loc, line, line_index)
145
151
  message = format(MSG, length: line_length(line), max: max)
146
152
 
@@ -21,7 +21,7 @@ module RuboCop
21
21
 
22
22
  private
23
23
 
24
- def_node_matcher :module_definition?, <<-PATTERN
24
+ def_node_matcher :module_definition?, <<~PATTERN
25
25
  (casgn nil? _ (block (send (const nil? :Module) :new) ...))
26
26
  PATTERN
27
27
 
@@ -25,7 +25,7 @@ module RuboCop
25
25
 
26
26
  private
27
27
 
28
- def_node_matcher :argument_to_lambda_or_proc?, <<-PATTERN
28
+ def_node_matcher :argument_to_lambda_or_proc?, <<~PATTERN
29
29
  ^lambda_or_proc?
30
30
  PATTERN
31
31
 
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Migration
6
+ # Check that cop names in rubocop:disable comments are given with
7
+ # department name.
8
+ class DepartmentName < Cop
9
+ include RangeHelp
10
+
11
+ MSG = 'Department name is missing.'
12
+
13
+ def investigate(processed_source)
14
+ processed_source.each_comment do |comment|
15
+ next if comment.text !~ /\A(# *rubocop:((dis|en)able|todo) +)(.*)/
16
+
17
+ offset = Regexp.last_match(1).length
18
+ Regexp.last_match(4).scan(%r{[\w/]+|\W+}) do |name|
19
+ check_cop_name(name, comment, offset)
20
+ offset += name.length
21
+ end
22
+ end
23
+ end
24
+
25
+ def autocorrect(range)
26
+ shall_warn = false
27
+ qualified_cop_name = Cop.registry.qualified_cop_name(range.source,
28
+ nil, shall_warn)
29
+ ->(corrector) { corrector.replace(range, qualified_cop_name) }
30
+ end
31
+
32
+ private
33
+
34
+ def check_cop_name(name, comment, offset)
35
+ return if name !~ /^[A-Z]/ || name =~ %r{/}
36
+
37
+ start = comment.location.expression.begin_pos + offset
38
+ range = range_between(start, start + name.length)
39
+ add_offense(range, location: range)
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -13,7 +13,7 @@ module RuboCop
13
13
 
14
14
  def configured_indentation_width
15
15
  cop_config['IndentationWidth'] ||
16
- config.for_cop('IndentationWidth')['Width']
16
+ config.for_cop('Layout/IndentationWidth')['Width']
17
17
  end
18
18
 
19
19
  def indentation(node)
@@ -25,7 +25,7 @@ module RuboCop
25
25
  processed_source[0..index].map(&:strip)
26
26
  end
27
27
 
28
- def_node_matcher :non_public_modifier?, <<-PATTERN
28
+ def_node_matcher :non_public_modifier?, <<~PATTERN
29
29
  (send nil? {:private :protected} ({def defs} ...))
30
30
  PATTERN
31
31
  end
@@ -9,8 +9,6 @@ module RuboCop
9
9
 
10
10
  private
11
11
 
12
- def_node_matcher :constant_definition?, '{class module casgn}'
13
-
14
12
  def documentation_comment?(node)
15
13
  preceding_lines = preceding_lines(node)
16
14
 
@@ -8,7 +8,7 @@ module RuboCop
8
8
 
9
9
  private
10
10
 
11
- def_node_matcher :empty_arguments?, <<-PATTERN
11
+ def_node_matcher :empty_arguments?, <<~PATTERN
12
12
  (block _ $(args) _)
13
13
  PATTERN
14
14
 
@@ -5,12 +5,12 @@ module RuboCop
5
5
  # Common functionality for enforcing a specific superclass
6
6
  module EnforceSuperclass
7
7
  def self.included(base)
8
- base.def_node_matcher :class_definition, <<-PATTERN
9
- (class (const _ !:#{base::SUPERCLASS}) #{base::BASE_PATTERN} ...)
8
+ base.def_node_matcher :class_definition, <<~PATTERN
9
+ (class (const _ !:#{base::SUPERCLASS}) #{base::BASE_PATTERN} ...)
10
10
  PATTERN
11
11
 
12
- base.def_node_matcher :class_new_definition, <<-PATTERN
13
- [!^(casgn nil? :#{base::SUPERCLASS} ...) (send (const nil? :Class) :new #{base::BASE_PATTERN})]
12
+ base.def_node_matcher :class_new_definition, <<~PATTERN
13
+ [!^(casgn nil? :#{base::SUPERCLASS} ...) (send (const nil? :Class) :new #{base::BASE_PATTERN})]
14
14
  PATTERN
15
15
  end
16
16
 
@@ -12,7 +12,7 @@ module RuboCop
12
12
 
13
13
  def frozen_string_literal_comment_exists?
14
14
  leading_comment_lines.any? do |line|
15
- MagicComment.parse(line).frozen_string_literal_specified?
15
+ MagicComment.parse(line).valid_literal_value?
16
16
  end
17
17
  end
18
18
 
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ # Common functionality for working with string interpolations.
6
+ #
7
+ # @abstract Subclasses are expected to implement {#on_interpolation}.
8
+ module Interpolation
9
+ def on_dstr(node)
10
+ on_node_with_interpolations(node)
11
+ end
12
+
13
+ alias on_xstr on_dstr
14
+ alias on_dsym on_dstr
15
+ alias on_regexp on_dstr
16
+
17
+ def on_node_with_interpolations(node)
18
+ node.each_child_node(:begin) do |begin_node|
19
+ on_interpolation(begin_node)
20
+ end
21
+ end
22
+
23
+ # @!method on_interpolation(begin_node)
24
+ # Inspect the `:begin` node of an interpolation
25
+ end
26
+ end
27
+ end
@@ -20,7 +20,7 @@ module RuboCop
20
20
 
21
21
  private
22
22
 
23
- def_node_matcher :define_method?, <<-PATTERN
23
+ def_node_matcher :define_method?, <<~PATTERN
24
24
  (block
25
25
  (send nil? :define_method ({sym str} $_))
26
26
  args
@@ -159,11 +159,11 @@ module RuboCop
159
159
  break false if a.block_type?
160
160
 
161
161
  next if a.setter_method?
162
+ next unless kind == :with_or_without_parentheses ||
163
+ kind == :with_parentheses && parentheses?(a)
162
164
 
163
165
  a.arguments.any? do |arg|
164
- within_node?(node, arg) && (kind == :with_or_without_parentheses ||
165
- kind == :with_parentheses &&
166
- parentheses?(node.parent))
166
+ within_node?(node, arg)
167
167
  end
168
168
  end
169
169
  end
@@ -19,6 +19,18 @@ module RuboCop
19
19
  aligned_with_adjacent_line?(range, method(:aligned_operator?))
20
20
  end
21
21
 
22
+ def aligned_with_preceding_assignment(token)
23
+ preceding_line_range = token.line.downto(1)
24
+
25
+ aligned_with_assignment(token, preceding_line_range)
26
+ end
27
+
28
+ def aligned_with_subsequent_assignment(token)
29
+ subsequent_line_range = token.line.upto(processed_source.lines.length)
30
+
31
+ aligned_with_assignment(token, subsequent_line_range)
32
+ end
33
+
22
34
  def aligned_with_adjacent_line?(range, predicate)
23
35
  # minus 2 because node.loc.line is zero-based
24
36
  pre = (range.line - 2).downto(0)
@@ -89,6 +101,81 @@ module RuboCop
89
101
  def aligned_identical?(range, line)
90
102
  range.source == line[range.column, range.size]
91
103
  end
104
+
105
+ def aligned_with_assignment(token, line_range)
106
+ token_line_indent = processed_source
107
+ .line_indentation(token.line)
108
+ assignment_lines = relevant_assignment_lines(line_range)
109
+ relevant_line_number = assignment_lines[1]
110
+
111
+ return :none unless relevant_line_number
112
+
113
+ relevant_indent = processed_source
114
+ .line_indentation(relevant_line_number)
115
+
116
+ return :none if relevant_indent < token_line_indent
117
+
118
+ assignment_line = processed_source.lines[relevant_line_number - 1]
119
+
120
+ return :none unless assignment_line
121
+
122
+ aligned_assignment?(token.pos, assignment_line) ? :yes : :no
123
+ end
124
+
125
+ def assignment_lines
126
+ @assignment_lines ||= assignment_tokens.map(&:line)
127
+ end
128
+
129
+ def assignment_tokens
130
+ @assignment_tokens ||= begin
131
+ tokens = processed_source.tokens.select(&:equal_sign?)
132
+
133
+ # we don't want to operate on equals signs which are part of an
134
+ # optarg in a method definition
135
+ # e.g.: def method(optarg = default_val); end
136
+ tokens = remove_optarg_equals(tokens, processed_source)
137
+
138
+ # Only attempt to align the first = on each line
139
+ Set.new(tokens.uniq(&:line))
140
+ end
141
+ end
142
+
143
+ # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity
144
+ # rubocop:disable Metrics/PerceivedComplexity, Metrics/MethodLength
145
+ def relevant_assignment_lines(line_range)
146
+ result = []
147
+ original_line_indent = processed_source
148
+ .line_indentation(line_range.first)
149
+ relevant_line_indent_at_level = true
150
+
151
+ line_range.each do |line_number|
152
+ current_line_indent = processed_source.line_indentation(line_number)
153
+ blank_line = processed_source.lines[line_number - 1].blank?
154
+
155
+ if (current_line_indent < original_line_indent && !blank_line) ||
156
+ (relevant_line_indent_at_level && blank_line)
157
+ break
158
+ end
159
+
160
+ result << line_number if assignment_lines.include?(line_number) &&
161
+ current_line_indent == original_line_indent
162
+
163
+ unless blank_line
164
+ relevant_line_indent_at_level = \
165
+ current_line_indent == original_line_indent
166
+ end
167
+ end
168
+
169
+ result
170
+ end
171
+ # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity
172
+ # rubocop:enable Metrics/PerceivedComplexity, Metrics/MethodLength
173
+
174
+ def remove_optarg_equals(asgn_tokens, processed_source)
175
+ optargs = processed_source.ast.each_node(:optarg)
176
+ optarg_eql = optargs.map { |o| o.loc.operator.begin_pos }.to_set
177
+ asgn_tokens.reject { |t| optarg_eql.include?(t.begin_pos) }
178
+ end
92
179
  end
93
180
  end
94
181
  end