rubocop 0.70.0 → 0.75.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (274) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +6 -10
  3. data/bin/console +1 -0
  4. data/config/default.yml +91 -494
  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 -4
  18. data/lib/rubocop/config_loader_resolver.rb +2 -8
  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/gemspec/duplicated_assignment.rb +2 -2
  31. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -1
  32. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +1 -1
  33. data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +55 -0
  34. data/lib/rubocop/cop/generator.rb +4 -4
  35. data/lib/rubocop/cop/generator/configuration_injector.rb +9 -4
  36. data/lib/rubocop/cop/generator/require_file_injector.rb +1 -1
  37. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +2 -2
  38. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +1 -1
  39. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +2 -2
  40. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +1 -1
  41. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +2 -2
  42. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +2 -2
  43. data/lib/rubocop/cop/layout/block_alignment.rb +3 -3
  44. data/lib/rubocop/cop/layout/class_structure.rb +2 -2
  45. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +1 -1
  46. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +3 -1
  47. data/lib/rubocop/cop/layout/extra_spacing.rb +14 -59
  48. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +4 -0
  49. data/lib/rubocop/cop/layout/indent_assignment.rb +9 -1
  50. data/lib/rubocop/cop/layout/indent_first_argument.rb +7 -3
  51. data/lib/rubocop/cop/layout/indent_first_parameter.rb +7 -3
  52. data/lib/rubocop/cop/layout/indent_heredoc.rb +4 -4
  53. data/lib/rubocop/cop/layout/indentation_consistency.rb +13 -12
  54. data/lib/rubocop/cop/layout/indentation_width.rb +28 -10
  55. data/lib/rubocop/cop/layout/leading_comment_space.rb +28 -0
  56. data/lib/rubocop/cop/layout/multiline_block_layout.rb +24 -2
  57. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +2 -0
  58. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +18 -4
  59. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +5 -1
  60. data/lib/rubocop/cop/layout/space_around_operators.rb +42 -23
  61. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +1 -1
  62. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +21 -2
  63. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +24 -40
  64. data/lib/rubocop/cop/layout/tab.rb +10 -22
  65. data/lib/rubocop/cop/lint/assignment_in_condition.rb +17 -4
  66. data/lib/rubocop/cop/lint/big_decimal_new.rb +1 -1
  67. data/lib/rubocop/cop/lint/debugger.rb +4 -6
  68. data/lib/rubocop/cop/lint/duplicate_methods.rb +3 -3
  69. data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
  70. data/lib/rubocop/cop/lint/empty_interpolation.rb +4 -4
  71. data/lib/rubocop/cop/lint/erb_new_arguments.rb +57 -1
  72. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +11 -37
  73. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +1 -1
  74. data/lib/rubocop/cop/lint/inherit_exception.rb +1 -1
  75. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +7 -8
  76. data/lib/rubocop/cop/lint/multiple_compare.rb +1 -1
  77. data/lib/rubocop/cop/lint/nested_method_definition.rb +3 -3
  78. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
  79. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +1 -1
  80. data/lib/rubocop/cop/lint/number_conversion.rb +4 -4
  81. data/lib/rubocop/cop/lint/rand_one.rb +1 -1
  82. data/lib/rubocop/cop/lint/redundant_with_index.rb +1 -1
  83. data/lib/rubocop/cop/lint/redundant_with_object.rb +1 -1
  84. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +5 -5
  85. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +1 -1
  86. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +91 -0
  87. data/lib/rubocop/cop/lint/string_conversion_in_interpolation.rb +6 -6
  88. data/lib/rubocop/cop/lint/unified_integer.rb +1 -1
  89. data/lib/rubocop/cop/lint/unneeded_cop_disable_directive.rb +1 -1
  90. data/lib/rubocop/cop/lint/unneeded_require_statement.rb +1 -1
  91. data/lib/rubocop/cop/lint/unneeded_splat_expansion.rb +7 -2
  92. data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
  93. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +1 -1
  94. data/lib/rubocop/cop/lint/uri_regexp.rb +2 -2
  95. data/lib/rubocop/cop/lint/useless_access_modifier.rb +6 -6
  96. data/lib/rubocop/cop/lint/useless_setter_call.rb +1 -1
  97. data/lib/rubocop/cop/message_annotator.rb +16 -7
  98. data/lib/rubocop/cop/metrics/class_length.rb +1 -1
  99. data/lib/rubocop/cop/metrics/line_length.rb +6 -0
  100. data/lib/rubocop/cop/metrics/module_length.rb +1 -1
  101. data/lib/rubocop/cop/metrics/parameter_lists.rb +1 -1
  102. data/lib/rubocop/cop/migration/department_name.rb +44 -0
  103. data/lib/rubocop/cop/mixin/alignment.rb +1 -1
  104. data/lib/rubocop/cop/mixin/def_node.rb +1 -1
  105. data/lib/rubocop/cop/mixin/documentation_comment.rb +0 -2
  106. data/lib/rubocop/cop/mixin/empty_parameter.rb +1 -1
  107. data/lib/rubocop/cop/mixin/enforce_superclass.rb +4 -4
  108. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +1 -1
  109. data/lib/rubocop/cop/mixin/hash_alignment.rb +4 -0
  110. data/lib/rubocop/cop/mixin/interpolation.rb +27 -0
  111. data/lib/rubocop/cop/mixin/method_complexity.rb +1 -1
  112. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +3 -3
  113. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +87 -0
  114. data/lib/rubocop/cop/mixin/safe_mode.rb +2 -0
  115. data/lib/rubocop/cop/mixin/surrounding_space.rb +7 -5
  116. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -1
  117. data/lib/rubocop/cop/naming/constant_name.rb +2 -2
  118. data/lib/rubocop/cop/naming/method_name.rb +12 -1
  119. data/lib/rubocop/cop/naming/predicate_name.rb +1 -1
  120. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +20 -22
  121. data/lib/rubocop/cop/naming/variable_name.rb +1 -0
  122. data/lib/rubocop/cop/offense.rb +18 -7
  123. data/lib/rubocop/cop/registry.rb +22 -1
  124. data/lib/rubocop/cop/security/eval.rb +1 -1
  125. data/lib/rubocop/cop/security/json_load.rb +1 -1
  126. data/lib/rubocop/cop/security/marshal_load.rb +1 -1
  127. data/lib/rubocop/cop/security/open.rb +1 -1
  128. data/lib/rubocop/cop/security/yaml_load.rb +1 -1
  129. data/lib/rubocop/cop/style/access_modifier_declarations.rb +1 -0
  130. data/lib/rubocop/cop/style/alias.rb +1 -1
  131. data/lib/rubocop/cop/style/block_delimiters.rb +2 -1
  132. data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +29 -10
  133. data/lib/rubocop/cop/style/class_and_module_children.rb +1 -1
  134. data/lib/rubocop/cop/style/colon_method_call.rb +1 -1
  135. data/lib/rubocop/cop/style/commented_keyword.rb +16 -30
  136. data/lib/rubocop/cop/style/conditional_assignment.rb +8 -9
  137. data/lib/rubocop/cop/style/constant_visibility.rb +14 -3
  138. data/lib/rubocop/cop/style/date_time.rb +3 -3
  139. data/lib/rubocop/cop/style/dir.rb +1 -1
  140. data/lib/rubocop/cop/style/documentation_method.rb +1 -1
  141. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +55 -0
  142. data/lib/rubocop/cop/style/each_for_simple_loop.rb +1 -1
  143. data/lib/rubocop/cop/style/each_with_object.rb +1 -1
  144. data/lib/rubocop/cop/style/eval_with_location.rb +2 -2
  145. data/lib/rubocop/cop/style/even_odd.rb +1 -1
  146. data/lib/rubocop/cop/style/expand_path_arguments.rb +3 -3
  147. data/lib/rubocop/cop/style/float_division.rb +94 -0
  148. data/lib/rubocop/cop/style/format_string.rb +13 -9
  149. data/lib/rubocop/cop/style/format_string_token.rb +10 -40
  150. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +18 -33
  151. data/lib/rubocop/cop/style/guard_clause.rb +39 -10
  152. data/lib/rubocop/cop/style/hash_syntax.rb +2 -2
  153. data/lib/rubocop/cop/style/if_inside_else.rb +42 -0
  154. data/lib/rubocop/cop/style/if_unless_modifier.rb +51 -15
  155. data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
  156. data/lib/rubocop/cop/style/inverse_methods.rb +2 -2
  157. data/lib/rubocop/cop/style/lambda.rb +0 -2
  158. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +12 -6
  159. data/lib/rubocop/cop/style/min_max.rb +1 -1
  160. data/lib/rubocop/cop/style/mixin_usage.rb +12 -2
  161. data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
  162. data/lib/rubocop/cop/style/multiline_when_then.rb +55 -0
  163. data/lib/rubocop/cop/style/multiple_comparison.rb +1 -1
  164. data/lib/rubocop/cop/style/mutable_constant.rb +3 -3
  165. data/lib/rubocop/cop/style/nested_modifier.rb +18 -2
  166. data/lib/rubocop/cop/style/numeric_predicate.rb +3 -3
  167. data/lib/rubocop/cop/style/option_hash.rb +1 -1
  168. data/lib/rubocop/cop/style/or_assignment.rb +8 -3
  169. data/lib/rubocop/cop/style/parentheses_around_condition.rb +15 -1
  170. data/lib/rubocop/cop/style/random_with_offset.rb +6 -6
  171. data/lib/rubocop/cop/style/redundant_conditional.rb +2 -2
  172. data/lib/rubocop/cop/style/redundant_exception.rb +2 -2
  173. data/lib/rubocop/cop/style/redundant_freeze.rb +1 -1
  174. data/lib/rubocop/cop/style/redundant_parentheses.rb +15 -6
  175. data/lib/rubocop/cop/style/redundant_self.rb +18 -1
  176. data/lib/rubocop/cop/style/redundant_sort_by.rb +1 -1
  177. data/lib/rubocop/cop/style/rescue_modifier.rb +24 -0
  178. data/lib/rubocop/cop/style/rescue_standard_error.rb +2 -2
  179. data/lib/rubocop/cop/style/return_nil.rb +1 -1
  180. data/lib/rubocop/cop/style/safe_navigation.rb +11 -2
  181. data/lib/rubocop/cop/style/sample.rb +1 -1
  182. data/lib/rubocop/cop/style/single_line_methods.rb +8 -1
  183. data/lib/rubocop/cop/style/stderr_puts.rb +1 -1
  184. data/lib/rubocop/cop/style/string_hash_keys.rb +2 -2
  185. data/lib/rubocop/cop/style/strip.rb +1 -1
  186. data/lib/rubocop/cop/style/struct_inheritance.rb +3 -3
  187. data/lib/rubocop/cop/style/symbol_proc.rb +1 -1
  188. data/lib/rubocop/cop/style/ternary_parentheses.rb +32 -3
  189. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +4 -0
  190. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +4 -6
  191. data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
  192. data/lib/rubocop/cop/style/unneeded_sort.rb +1 -1
  193. data/lib/rubocop/cop/style/unpack_first.rb +1 -1
  194. data/lib/rubocop/cop/style/variable_interpolation.rb +6 -16
  195. data/lib/rubocop/cop/style/word_array.rb +2 -2
  196. data/lib/rubocop/cop/style/zero_length_predicate.rb +6 -6
  197. data/lib/rubocop/cop/team.rb +15 -14
  198. data/lib/rubocop/cop/utils/format_string.rb +128 -0
  199. data/lib/rubocop/cop/variable_force/variable.rb +15 -2
  200. data/lib/rubocop/core_ext/string.rb +0 -24
  201. data/lib/rubocop/error.rb +23 -0
  202. data/lib/rubocop/formatter/emacs_style_formatter.rb +8 -5
  203. data/lib/rubocop/formatter/formatter_set.rb +2 -1
  204. data/lib/rubocop/formatter/pacman_formatter.rb +80 -0
  205. data/lib/rubocop/formatter/simple_text_formatter.rb +9 -1
  206. data/lib/rubocop/formatter/tap_formatter.rb +9 -1
  207. data/lib/rubocop/magic_comment.rb +4 -0
  208. data/lib/rubocop/node_pattern.rb +86 -7
  209. data/lib/rubocop/options.rb +18 -2
  210. data/lib/rubocop/path_util.rb +1 -1
  211. data/lib/rubocop/processed_source.rb +9 -1
  212. data/lib/rubocop/rspec/cop_helper.rb +0 -1
  213. data/lib/rubocop/rspec/expect_offense.rb +4 -1
  214. data/lib/rubocop/rspec/shared_contexts.rb +12 -17
  215. data/lib/rubocop/rspec/support.rb +0 -1
  216. data/lib/rubocop/runner.rb +20 -15
  217. data/lib/rubocop/target_finder.rb +6 -4
  218. data/lib/rubocop/version.rb +1 -1
  219. data/lib/rubocop/yaml_duplication_checker.rb +8 -2
  220. metadata +16 -70
  221. data/lib/rubocop/cop/mixin/ignored_method_patterns.rb +0 -19
  222. data/lib/rubocop/cop/mixin/target_rails_version.rb +0 -16
  223. data/lib/rubocop/cop/rails/action_filter.rb +0 -117
  224. data/lib/rubocop/cop/rails/active_record_aliases.rb +0 -48
  225. data/lib/rubocop/cop/rails/active_record_override.rb +0 -82
  226. data/lib/rubocop/cop/rails/active_support_aliases.rb +0 -69
  227. data/lib/rubocop/cop/rails/application_job.rb +0 -40
  228. data/lib/rubocop/cop/rails/application_record.rb +0 -40
  229. data/lib/rubocop/cop/rails/assert_not.rb +0 -44
  230. data/lib/rubocop/cop/rails/belongs_to.rb +0 -102
  231. data/lib/rubocop/cop/rails/blank.rb +0 -164
  232. data/lib/rubocop/cop/rails/bulk_change_table.rb +0 -289
  233. data/lib/rubocop/cop/rails/create_table_with_timestamps.rb +0 -91
  234. data/lib/rubocop/cop/rails/date.rb +0 -161
  235. data/lib/rubocop/cop/rails/delegate.rb +0 -132
  236. data/lib/rubocop/cop/rails/delegate_allow_blank.rb +0 -37
  237. data/lib/rubocop/cop/rails/dynamic_find_by.rb +0 -91
  238. data/lib/rubocop/cop/rails/enum_uniqueness.rb +0 -45
  239. data/lib/rubocop/cop/rails/environment_comparison.rb +0 -68
  240. data/lib/rubocop/cop/rails/exit.rb +0 -67
  241. data/lib/rubocop/cop/rails/file_path.rb +0 -108
  242. data/lib/rubocop/cop/rails/find_by.rb +0 -55
  243. data/lib/rubocop/cop/rails/find_each.rb +0 -51
  244. data/lib/rubocop/cop/rails/has_and_belongs_to_many.rb +0 -25
  245. data/lib/rubocop/cop/rails/has_many_or_has_one_dependent.rb +0 -106
  246. data/lib/rubocop/cop/rails/http_positional_arguments.rb +0 -117
  247. data/lib/rubocop/cop/rails/http_status.rb +0 -179
  248. data/lib/rubocop/cop/rails/ignored_skip_action_filter_option.rb +0 -94
  249. data/lib/rubocop/cop/rails/inverse_of.rb +0 -246
  250. data/lib/rubocop/cop/rails/lexically_scoped_action_filter.rb +0 -175
  251. data/lib/rubocop/cop/rails/link_to_blank.rb +0 -98
  252. data/lib/rubocop/cop/rails/not_null_column.rb +0 -67
  253. data/lib/rubocop/cop/rails/output.rb +0 -49
  254. data/lib/rubocop/cop/rails/output_safety.rb +0 -99
  255. data/lib/rubocop/cop/rails/pluralization_grammar.rb +0 -107
  256. data/lib/rubocop/cop/rails/presence.rb +0 -124
  257. data/lib/rubocop/cop/rails/present.rb +0 -153
  258. data/lib/rubocop/cop/rails/read_write_attribute.rb +0 -74
  259. data/lib/rubocop/cop/rails/redundant_allow_nil.rb +0 -111
  260. data/lib/rubocop/cop/rails/redundant_receiver_in_with_options.rb +0 -136
  261. data/lib/rubocop/cop/rails/reflection_class_name.rb +0 -37
  262. data/lib/rubocop/cop/rails/refute_methods.rb +0 -76
  263. data/lib/rubocop/cop/rails/relative_date_constant.rb +0 -93
  264. data/lib/rubocop/cop/rails/request_referer.rb +0 -56
  265. data/lib/rubocop/cop/rails/reversible_migration.rb +0 -286
  266. data/lib/rubocop/cop/rails/safe_navigation.rb +0 -87
  267. data/lib/rubocop/cop/rails/save_bang.rb +0 -316
  268. data/lib/rubocop/cop/rails/scope_args.rb +0 -29
  269. data/lib/rubocop/cop/rails/skips_model_validations.rb +0 -87
  270. data/lib/rubocop/cop/rails/time_zone.rb +0 -238
  271. data/lib/rubocop/cop/rails/uniq_before_pluck.rb +0 -105
  272. data/lib/rubocop/cop/rails/unknown_env.rb +0 -63
  273. data/lib/rubocop/cop/rails/validation.rb +0 -109
  274. data/lib/rubocop/rspec/shared_examples.rb +0 -59
@@ -5,12 +5,13 @@ module RuboCop
5
5
  module Layout
6
6
  # This cop checks for inconsistent indentation.
7
7
  #
8
- # The difference between `rails` and `normal` is that the `rails` style
9
- # prescribes that in classes and modules the `protected` and `private`
10
- # modifier keywords shall be indented the same as public methods and that
11
- # protected and private members shall be indented one step more than the
12
- # modifiers. Other than that, both styles mean that entities on the same
13
- # logical depth shall have the same indentation.
8
+ # The difference between `indented_internal_methods` and `normal` is
9
+ # that the `indented_internal_methods` style prescribes that in
10
+ # classes and modules the `protected` and `private` modifier keywords
11
+ # shall be indented the same as public methods and that protected and
12
+ # private members shall be indented one step more than the modifiers.
13
+ # Other than that, both styles mean that entities on the same logical
14
+ # depth shall have the same indentation.
14
15
  #
15
16
  # @example EnforcedStyle: normal (default)
16
17
  # # bad
@@ -65,7 +66,7 @@ module RuboCop
65
66
  # end
66
67
  # end
67
68
  #
68
- # @example EnforcedStyle: rails
69
+ # @example EnforcedStyle: indented_internal_methods
69
70
  # # bad
70
71
  # class A
71
72
  # def test
@@ -166,8 +167,8 @@ module RuboCop
166
167
  end
167
168
 
168
169
  def check(node)
169
- if style == :rails
170
- check_rails_style(node)
170
+ if style == :indented_internal_methods
171
+ check_indented_internal_methods_style(node)
171
172
  else
172
173
  check_normal_style(node)
173
174
  end
@@ -180,13 +181,13 @@ module RuboCop
180
181
  )
181
182
  end
182
183
 
183
- def check_rails_style(node)
184
+ def check_indented_internal_methods_style(node)
184
185
  children_to_check = [[]]
185
186
  node.children.each do |child|
186
187
  # Modifier nodes have special indentation and will be checked by
187
188
  # the AccessModifierIndentation cop. This cop uses them as dividers
188
- # in rails mode. Then consistency is checked only within each
189
- # section delimited by a modifier node.
189
+ # in indented_internal_methods mode. Then consistency is checked
190
+ # only within each section delimited by a modifier node.
190
191
  if bare_access_modifier?(child)
191
192
  children_to_check << []
192
193
  else
@@ -52,7 +52,7 @@ module RuboCop
52
52
  MSG = 'Use %<configured_indentation_width>d (not %<indentation>d) ' \
53
53
  'spaces for%<name>s indentation.'
54
54
 
55
- def_node_matcher :access_modifier?, <<-PATTERN
55
+ def_node_matcher :access_modifier?, <<~PATTERN
56
56
  [(send ...) access_modifier?]
57
57
  PATTERN
58
58
 
@@ -83,7 +83,7 @@ module RuboCop
83
83
 
84
84
  check_indentation(end_loc, node.body)
85
85
 
86
- return unless indentation_consistency_style == 'rails'
86
+ return unless indented_internal_methods_style?
87
87
 
88
88
  check_members(end_loc, [node.body])
89
89
  end
@@ -155,14 +155,10 @@ module RuboCop
155
155
 
156
156
  return unless members.any? && members.first.begin_type?
157
157
 
158
- if indentation_consistency_style == 'rails'
159
- check_members_for_rails_style(members)
158
+ if indentation_consistency_style == 'indented_internal_methods'
159
+ check_members_for_indented_internal_methods_style(members)
160
160
  else
161
- members.first.children.each do |member|
162
- next if member.send_type? && member.access_modifier?
163
-
164
- check_indentation(base, member)
165
- end
161
+ check_members_for_normal_style(base, members)
166
162
  end
167
163
  end
168
164
 
@@ -170,19 +166,29 @@ module RuboCop
170
166
  return unless member
171
167
 
172
168
  if access_modifier?(member.children.first)
169
+ return if access_modifier_indentation_style == 'outdent'
170
+
173
171
  member.children.first
174
172
  else
175
173
  member
176
174
  end
177
175
  end
178
176
 
179
- def check_members_for_rails_style(members)
177
+ def check_members_for_indented_internal_methods_style(members)
180
178
  each_member(members) do |member, previous_modifier|
181
179
  check_indentation(previous_modifier, member,
182
180
  indentation_consistency_style)
183
181
  end
184
182
  end
185
183
 
184
+ def check_members_for_normal_style(base, members)
185
+ members.first.children.each do |member|
186
+ next if member.send_type? && member.access_modifier?
187
+
188
+ check_indentation(base, member)
189
+ end
190
+ end
191
+
186
192
  def each_member(members)
187
193
  previous_modifier = nil
188
194
  members.first.children.each do |member|
@@ -195,6 +201,18 @@ module RuboCop
195
201
  end
196
202
  end
197
203
 
204
+ def indented_internal_methods_style?
205
+ indentation_consistency_style == 'indented_internal_methods'
206
+ end
207
+
208
+ def special_modifier?(node)
209
+ node.bare_access_modifier? && SPECIAL_MODIFIERS.include?(node.source)
210
+ end
211
+
212
+ def access_modifier_indentation_style
213
+ config.for_cop('Layout/AccessModifierIndentation')['EnforcedStyle']
214
+ end
215
+
198
216
  def indentation_consistency_style
199
217
  config.for_cop('Layout/IndentationConsistency')['EnforcedStyle']
200
218
  end
@@ -16,6 +16,25 @@ module RuboCop
16
16
  #
17
17
  # # good
18
18
  # # Some comment
19
+ #
20
+ # @example AllowDoxygenCommentStyle: false (default)
21
+ #
22
+ # # bad
23
+ #
24
+ # #**
25
+ # # Some comment
26
+ # # Another line of comment
27
+ # #*
28
+ #
29
+ # @example AllowDoxygenCommentStyle: true
30
+ #
31
+ # # good
32
+ #
33
+ # #**
34
+ # # Some comment
35
+ # # Another line of comment
36
+ # #*
37
+ #
19
38
  class LeadingCommentSpace < Cop
20
39
  include RangeHelp
21
40
 
@@ -25,6 +44,7 @@ module RuboCop
25
44
  processed_source.each_comment do |comment|
26
45
  next unless comment.text =~ /\A#+[^#\s=:+-]/
27
46
  next if comment.loc.line == 1 && allowed_on_first_line?(comment)
47
+ next if allow_doxygen_comment? && doxygen_comment_style?(comment)
28
48
 
29
49
  add_offense(comment)
30
50
  end
@@ -54,6 +74,14 @@ module RuboCop
54
74
  def rackup_config_file?
55
75
  File.basename(processed_source.file_path).eql?('config.ru')
56
76
  end
77
+
78
+ def allow_doxygen_comment?
79
+ cop_config['AllowDoxygenCommentStyle']
80
+ end
81
+
82
+ def doxygen_comment_style?(comment)
83
+ comment.text.start_with?('#*')
84
+ end
57
85
  end
58
86
  end
59
87
  end
@@ -5,7 +5,9 @@ module RuboCop
5
5
  module Layout
6
6
  # This cop checks whether the multiline do end blocks have a newline
7
7
  # after the start of the block. Additionally, it checks whether the block
8
- # arguments, if any, are on the same line as the start of the block.
8
+ # arguments, if any, are on the same line as the start of the
9
+ # block. Putting block arguments on separate lines, because the whole
10
+ # line would otherwise be too long, is accepted.
9
11
  #
10
12
  # @example
11
13
  # # bad
@@ -35,6 +37,17 @@ module RuboCop
35
37
  # foo(i)
36
38
  # bar(i)
37
39
  # }
40
+ #
41
+ # # good
42
+ # blah { |
43
+ # long_list,
44
+ # of_parameters,
45
+ # that_would_not,
46
+ # fit_on_one_line
47
+ # |
48
+ # foo(i)
49
+ # bar(i)
50
+ # }
38
51
  class MultilineBlockLayout < Cop
39
52
  include RangeHelp
40
53
 
@@ -42,11 +55,13 @@ module RuboCop
42
55
  'the block start.'
43
56
  ARG_MSG = 'Block argument expression is not on the same line as the ' \
44
57
  'block start.'
58
+ PIPE_SIZE = '|'.length
45
59
 
46
60
  def on_block(node)
47
61
  return if node.single_line?
48
62
 
49
- unless args_on_beginning_line?(node)
63
+ unless args_on_beginning_line?(node) ||
64
+ line_break_necessary_in_args?(node)
50
65
  add_offense_for_expression(node, node.arguments, ARG_MSG)
51
66
  end
52
67
 
@@ -79,6 +94,13 @@ module RuboCop
79
94
  node.loc.begin.line == node.arguments.loc.last_line
80
95
  end
81
96
 
97
+ def line_break_necessary_in_args?(node)
98
+ needed_length = node.source_range.column +
99
+ node.source.lines.first.length +
100
+ block_arg_string(node.arguments).length + PIPE_SIZE
101
+ needed_length > max_line_length
102
+ end
103
+
82
104
  def add_offense_for_expression(node, expr, msg)
83
105
  expression = expr.source_range
84
106
  range = range_between(expression.begin_pos, expression.end_pos)
@@ -26,6 +26,8 @@ module RuboCop
26
26
  'on a separate line.'
27
27
 
28
28
  def on_send(node)
29
+ return if node.method_name == :[]=
30
+
29
31
  args = node.arguments
30
32
 
31
33
  # If there is a trailing hash arg without explicit braces, like this:
@@ -30,6 +30,8 @@ module RuboCop
30
30
  ANCESTOR_TYPES = %i[kwbegin def defs class module].freeze
31
31
  RUBY_2_5_ANCESTOR_TYPES = (ANCESTOR_TYPES + %i[block]).freeze
32
32
  ANCESTOR_TYPES_WITH_ACCESS_MODIFIERS = %i[def defs].freeze
33
+ ALTERNATIVE_ACCESS_MODIFIERS = %i[public_class_method
34
+ private_class_method].freeze
33
35
 
34
36
  def on_resbody(node)
35
37
  check(node) unless modifier?(node)
@@ -99,8 +101,12 @@ module RuboCop
99
101
  case node.type
100
102
  when :block, :kwbegin
101
103
  node.loc.begin
102
- when :def, :defs, :class, :module
104
+ when :def, :defs, :class, :module,
105
+ :lvasgn, :ivasgn, :cvasgn, :gvasgn, :casgn
103
106
  node.loc.name
107
+ when :masgn
108
+ mlhs_node, = *node
109
+ mlhs_node.loc.expression
104
110
  else
105
111
  # It is a wrapper with access modifier.
106
112
  node.child_nodes.first.loc.name
@@ -150,9 +156,7 @@ module RuboCop
150
156
  ANCESTOR_TYPES_WITH_ACCESS_MODIFIERS.include?(node.type)
151
157
 
152
158
  access_modifier_node = node.ancestors.first
153
- return nil unless
154
- access_modifier_node.respond_to?(:access_modifier?) &&
155
- access_modifier_node.access_modifier?
159
+ return nil unless access_modifier?(access_modifier_node)
156
160
 
157
161
  access_modifier_node
158
162
  end
@@ -169,6 +173,16 @@ module RuboCop
169
173
 
170
174
  range_between(begin_pos - current_column, begin_pos)
171
175
  end
176
+
177
+ def access_modifier?(node)
178
+ return true if node.respond_to?(:access_modifier?) &&
179
+ node.access_modifier?
180
+
181
+ return true if node.respond_to?(:method_name) &&
182
+ ALTERNATIVE_ACCESS_MODIFIERS.include?(node.method_name)
183
+
184
+ false
185
+ end
172
186
  end
173
187
  end
174
188
  end
@@ -3,7 +3,9 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Layout
6
- # Checks the spacing inside and after block parameters pipes.
6
+ # Checks the spacing inside and after block parameters pipes. Line breaks
7
+ # inside parameter pipes are checked by `Layout/MultilineBlockLayout` and
8
+ # not by this cop.
7
9
  #
8
10
  # @example EnforcedStyleInsidePipes: no_space (default)
9
11
  # # bad
@@ -156,6 +158,8 @@ module RuboCop
156
158
  return if space_begin_pos >= space_end_pos
157
159
 
158
160
  range = range_between(space_begin_pos, space_end_pos)
161
+ return if range.source.include?("\n")
162
+
159
163
  add_offense(range, location: range,
160
164
  message: "#{msg} block parameter detected.")
161
165
  end
@@ -34,14 +34,14 @@ module RuboCop
34
34
 
35
35
  return if hash_table_style? && !node.parent.pairs_on_same_line?
36
36
 
37
- check_operator(node.loc.operator, node.source_range)
37
+ check_operator(:pair, node.loc.operator, node.source_range)
38
38
  end
39
39
 
40
40
  def on_if(node)
41
41
  return unless node.ternary?
42
42
 
43
- check_operator(node.loc.question, node.if_branch.source_range)
44
- check_operator(node.loc.colon, node.else_branch.source_range)
43
+ check_operator(:if, node.loc.question, node.if_branch.source_range)
44
+ check_operator(:if, node.loc.colon, node.else_branch.source_range)
45
45
  end
46
46
 
47
47
  def on_resbody(node)
@@ -49,23 +49,33 @@ module RuboCop
49
49
 
50
50
  _, variable, = *node
51
51
 
52
- check_operator(node.loc.assoc, variable.source_range)
52
+ check_operator(:resbody, node.loc.assoc, variable.source_range)
53
53
  end
54
54
 
55
55
  def on_send(node)
56
56
  if node.setter_method?
57
57
  on_special_asgn(node)
58
58
  elsif regular_operator?(node)
59
- check_operator(node.loc.selector, node.first_argument.source_range)
59
+ check_operator(:send,
60
+ node.loc.selector,
61
+ node.first_argument.source_range)
60
62
  end
61
63
  end
62
64
 
65
+ def on_assignment(node)
66
+ _, rhs, = *node
67
+
68
+ return unless rhs
69
+
70
+ check_operator(:assignment, node.loc.operator, rhs.source_range)
71
+ end
72
+
63
73
  def on_binary(node)
64
74
  _, rhs, = *node
65
75
 
66
76
  return unless rhs
67
77
 
68
- check_operator(node.loc.operator, rhs.source_range)
78
+ check_operator(:binary, node.loc.operator, rhs.source_range)
69
79
  end
70
80
 
71
81
  def on_special_asgn(node)
@@ -73,20 +83,20 @@ module RuboCop
73
83
 
74
84
  return unless right
75
85
 
76
- check_operator(node.loc.operator, right.source_range)
86
+ check_operator(:special_asgn, node.loc.operator, right.source_range)
77
87
  end
78
88
 
79
89
  alias on_or on_binary
80
90
  alias on_and on_binary
81
- alias on_lvasgn on_binary
82
- alias on_masgn on_binary
91
+ alias on_lvasgn on_assignment
92
+ alias on_masgn on_assignment
83
93
  alias on_casgn on_special_asgn
84
- alias on_ivasgn on_binary
85
- alias on_cvasgn on_binary
86
- alias on_gvasgn on_binary
94
+ alias on_ivasgn on_assignment
95
+ alias on_cvasgn on_assignment
96
+ alias on_gvasgn on_assignment
87
97
  alias on_class on_binary
88
- alias on_or_asgn on_binary
89
- alias on_and_asgn on_binary
98
+ alias on_or_asgn on_assignment
99
+ alias on_and_asgn on_assignment
90
100
  alias on_op_asgn on_special_asgn
91
101
 
92
102
  def autocorrect(range)
@@ -113,35 +123,44 @@ module RuboCop
113
123
  !IRREGULAR_METHODS.include?(send_node.method_name)
114
124
  end
115
125
 
116
- def check_operator(operator, right_operand)
126
+ def check_operator(type, operator, right_operand)
117
127
  with_space = range_with_surrounding_space(range: operator)
118
128
  return if with_space.source.start_with?("\n")
119
129
 
120
- offense(operator, with_space, right_operand) do |msg|
130
+ offense(type, operator, with_space, right_operand) do |msg|
121
131
  add_offense(with_space, location: operator, message: msg)
122
132
  end
123
133
  end
124
134
 
125
- def offense(operator, with_space, right_operand)
126
- msg = offense_message(operator, with_space, right_operand)
135
+ def offense(type, operator, with_space, right_operand)
136
+ msg = offense_message(type, operator, with_space, right_operand)
127
137
  yield msg if msg
128
138
  end
129
139
 
130
- def offense_message(operator, with_space, right_operand)
140
+ def offense_message(type, operator, with_space, right_operand)
131
141
  if operator.is?('**')
132
142
  'Space around operator `**` detected.' unless with_space.is?('**')
133
143
  elsif with_space.source !~ /^\s.*\s$/
134
144
  "Surrounding space missing for operator `#{operator.source}`."
135
- elsif excess_leading_space?(operator, with_space) ||
145
+ elsif excess_leading_space?(type, operator, with_space) ||
136
146
  excess_trailing_space?(right_operand, with_space)
137
147
  "Operator `#{operator.source}` should be surrounded " \
138
148
  'by a single space.'
139
149
  end
140
150
  end
141
151
 
142
- def excess_leading_space?(operator, with_space)
143
- with_space.source.start_with?(EXCESSIVE_SPACE) &&
144
- (!allow_for_alignment? || !aligned_with_operator?(operator))
152
+ def excess_leading_space?(type, operator, with_space)
153
+ return false unless allow_for_alignment?
154
+ return false unless with_space.source.start_with?(EXCESSIVE_SPACE)
155
+
156
+ return !aligned_with_operator?(operator) unless type == :assignment
157
+
158
+ token = Token.new(operator, nil, operator.source)
159
+ align_preceding = aligned_with_preceding_assignment(token)
160
+
161
+ return align_preceding == :no unless align_preceding == :none
162
+
163
+ aligned_with_subsequent_assignment(token) != :yes
145
164
  end
146
165
 
147
166
  def excess_trailing_space?(right_operand, with_space)