rubocop 1.3.0 → 1.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (76) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/config/default.yml +75 -16
  4. data/lib/rubocop.rb +5 -0
  5. data/lib/rubocop/cli.rb +5 -1
  6. data/lib/rubocop/cli/command/execute_runner.rb +26 -11
  7. data/lib/rubocop/cli/command/suggest_extensions.rb +67 -0
  8. data/lib/rubocop/config_loader.rb +12 -4
  9. data/lib/rubocop/config_loader_resolver.rb +5 -1
  10. data/lib/rubocop/config_obsoletion.rb +21 -3
  11. data/lib/rubocop/config_regeneration.rb +1 -1
  12. data/lib/rubocop/config_validator.rb +8 -1
  13. data/lib/rubocop/cop/autocorrect_logic.rb +21 -6
  14. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +1 -1
  15. data/lib/rubocop/cop/generator.rb +2 -9
  16. data/lib/rubocop/cop/generator/configuration_injector.rb +1 -1
  17. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +1 -1
  18. data/lib/rubocop/cop/layout/class_structure.rb +15 -3
  19. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +80 -10
  20. data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +6 -1
  21. data/lib/rubocop/cop/layout/end_of_line.rb +5 -5
  22. data/lib/rubocop/cop/layout/first_argument_indentation.rb +7 -2
  23. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -1
  24. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +2 -1
  25. data/lib/rubocop/cop/lint/constant_definition_in_block.rb +4 -1
  26. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +1 -1
  27. data/lib/rubocop/cop/lint/missing_super.rb +7 -4
  28. data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +1 -1
  29. data/lib/rubocop/cop/lint/to_enum_arguments.rb +6 -15
  30. data/lib/rubocop/cop/lint/unexpected_block_arity.rb +85 -0
  31. data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +20 -6
  32. data/lib/rubocop/cop/metrics/abc_size.rb +25 -1
  33. data/lib/rubocop/cop/metrics/block_length.rb +13 -7
  34. data/lib/rubocop/cop/metrics/method_length.rb +7 -2
  35. data/lib/rubocop/cop/metrics/parameter_lists.rb +64 -1
  36. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +20 -10
  37. data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +146 -0
  38. data/lib/rubocop/cop/metrics/utils/repeated_csend_discount.rb +6 -1
  39. data/lib/rubocop/cop/mixin/configurable_numbering.rb +4 -3
  40. data/lib/rubocop/cop/mixin/enforce_superclass.rb +9 -1
  41. data/lib/rubocop/cop/mixin/ignored_methods.rb +36 -3
  42. data/lib/rubocop/cop/mixin/method_complexity.rb +6 -0
  43. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +1 -1
  44. data/lib/rubocop/cop/mixin/visibility_help.rb +1 -3
  45. data/lib/rubocop/cop/style/and_or.rb +10 -0
  46. data/lib/rubocop/cop/style/class_and_module_children.rb +8 -3
  47. data/lib/rubocop/cop/style/document_dynamic_eval_definition.rb +8 -1
  48. data/lib/rubocop/cop/style/documentation.rb +12 -1
  49. data/lib/rubocop/cop/style/format_string.rb +8 -3
  50. data/lib/rubocop/cop/style/if_with_semicolon.rb +39 -4
  51. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +2 -2
  52. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +11 -2
  53. data/lib/rubocop/cop/style/negated_if_else_condition.rb +3 -1
  54. data/lib/rubocop/cop/style/numeric_literals.rb +14 -11
  55. data/lib/rubocop/cop/style/redundant_argument.rb +75 -0
  56. data/lib/rubocop/cop/style/redundant_condition.rb +2 -1
  57. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +1 -1
  58. data/lib/rubocop/cop/style/sole_nested_conditional.rb +49 -3
  59. data/lib/rubocop/cop/style/symbol_proc.rb +5 -3
  60. data/lib/rubocop/cop/util.rb +1 -1
  61. data/lib/rubocop/cop/variable_force/branch.rb +1 -1
  62. data/lib/rubocop/cop/variable_force/scope.rb +1 -1
  63. data/lib/rubocop/core_ext/hash.rb +20 -0
  64. data/lib/rubocop/ext/regexp_node.rb +5 -10
  65. data/lib/rubocop/ext/regexp_parser.rb +2 -9
  66. data/lib/rubocop/formatter/disabled_config_formatter.rb +21 -6
  67. data/lib/rubocop/options.rb +5 -0
  68. data/lib/rubocop/rake_task.rb +2 -2
  69. data/lib/rubocop/runner.rb +1 -1
  70. data/lib/rubocop/target_finder.rb +1 -1
  71. data/lib/rubocop/target_ruby.rb +12 -4
  72. data/lib/rubocop/version.rb +1 -1
  73. metadata +12 -10
  74. data/bin/console +0 -10
  75. data/bin/rubocop-profile +0 -32
  76. data/bin/setup +0 -7
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5013f1930869ad961d7fe1cf2cd8bad7a36a15bc37f6cf42e1663fbdb61f2cc2
4
- data.tar.gz: 1ac4e658406f0f6e22a068f28fab225a8e9f53c59a79f89f0e52157cdc076efc
3
+ metadata.gz: 4ce46e11fac05ae40731d9a49b0c4229aa719d395a3f946b294965c52513ad1b
4
+ data.tar.gz: 56c6f908f370d96d011287d67172e41c9a8a3a21748fb04d5235d0f957ffd64f
5
5
  SHA512:
6
- metadata.gz: 555adab63cf768a150f37d2ca84e08f2322e84182528949e09bd5eda4c79348e4c41dc17d23737785ea044a78f54f99d99d512047446d7437efdeaf306147f32
7
- data.tar.gz: 3fe186c044fd8733f4edef4055c036106d739e485dbfdcdbffe7882961175695edb79aafe27c1b11a8bbe9791f0754f26e7bd7534571dd09955bd5caf6aa6afe
6
+ metadata.gz: f58d45c385e3fcccee94a8c258dd9536fb768c8ae069201411bb22f3c33dac0806b1d177f7f5562a27b71ae25ab3896917c06c29703c1f1c7d276506442069c6
7
+ data.tar.gz: ca55f537a662481c1337f6301d162074138c76a36c3332715aa2304ef2b67363df4b026ec1aa4dabe6e9c6b7833c0ed48edca99ea249a152a6a563a6242beeac
data/README.md CHANGED
@@ -51,7 +51,7 @@ To prevent an unwanted RuboCop update you might want to use a conservative versi
51
51
  in your `Gemfile`:
52
52
 
53
53
  ```rb
54
- gem 'rubocop', '~> 1.3', require: false
54
+ gem 'rubocop', '~> 1.5', require: false
55
55
  ```
56
56
 
57
57
  See [versioning](https://docs.rubocop.org/rubocop/1.0/versioning.html) for further details.
@@ -139,6 +139,16 @@ AllCops:
139
139
  # from the lock file.) If the Ruby version is still unresolved, RuboCop will
140
140
  # use the oldest officially supported Ruby version (currently Ruby 2.4).
141
141
  TargetRubyVersion: ~
142
+ # Determines if a notification for extension libraries should be shown when
143
+ # rubocop is run. Keys are the name of the extension, and values are an array
144
+ # of gems in the Gemfile that the extension is suggested for, if not already
145
+ # included.
146
+ SuggestExtensions:
147
+ rubocop-rails: [rails]
148
+ rubocop-rspec: [rspec, rspec-rails]
149
+ rubocop-minitest: [minitest]
150
+ rubocop-sequel: [sequel]
151
+ rubocop-rake: [rake]
142
152
 
143
153
  #################### Bundler ###############################
144
154
 
@@ -459,10 +469,14 @@ Layout/EmptyLineAfterMultilineCondition:
459
469
  - https://github.com/airbnb/ruby#multiline-if-newline
460
470
 
461
471
  Layout/EmptyLineBetweenDefs:
462
- Description: 'Use empty lines between defs.'
472
+ Description: 'Use empty lines between class/module/method defs.'
463
473
  StyleGuide: '#empty-lines-between-methods'
464
474
  Enabled: true
465
475
  VersionAdded: '0.49'
476
+ VersionChanged: '1.4'
477
+ EmptyLineBetweenMethodDefs: true
478
+ EmptyLineBetweenClassDefs: true
479
+ EmptyLineBetweenModuleDefs: true
466
480
  # If `true`, this parameter means that single line method definitions don't
467
481
  # need an empty line between them.
468
482
  AllowAdjacentOneLineDefs: false
@@ -891,8 +905,8 @@ Layout/LineLength:
891
905
  StyleGuide: '#max-line-length'
892
906
  Enabled: true
893
907
  VersionAdded: '0.25'
894
- VersionChanged: '1.3'
895
- AutoCorrect: false
908
+ VersionChanged: '1.4'
909
+ AutoCorrect: true
896
910
  Max: 120
897
911
  # To make it possible to copy or click on URIs in the code, we allow lines
898
912
  # containing a URI to be longer than Max.
@@ -1176,7 +1190,7 @@ Layout/SpaceBeforeBlockBraces:
1176
1190
  SupportedStylesForEmptyBraces:
1177
1191
  - space
1178
1192
  - no_space
1179
- VersionChanged: '0.52.1'
1193
+ VersionChanged: '0.52'
1180
1194
 
1181
1195
  Layout/SpaceBeforeComma:
1182
1196
  Description: 'No spaces before commas.'
@@ -1401,7 +1415,10 @@ Lint/ConstantDefinitionInBlock:
1401
1415
  Enabled: true
1402
1416
  VersionAdded: '0.91'
1403
1417
  VersionChanged: '1.3'
1404
- AllowedMethods: []
1418
+ # `enums` for Typed Enums via T::Enum in Sorbet.
1419
+ # https://sorbet.org/docs/tenum
1420
+ AllowedMethods:
1421
+ - enums
1405
1422
 
1406
1423
  Lint/ConstantResolution:
1407
1424
  Description: 'Check that constants are fully qualified with `::`.'
@@ -1681,6 +1698,7 @@ Lint/MissingSuper:
1681
1698
  without calls to `super`'.
1682
1699
  Enabled: true
1683
1700
  VersionAdded: '0.89'
1701
+ VersionChanged: '1.4'
1684
1702
 
1685
1703
  Lint/MixedRegexpCaptureTypes:
1686
1704
  Description: 'Do not mix named captures and numbered captures in a Regexp literal.'
@@ -1862,7 +1880,7 @@ Lint/RescueException:
1862
1880
  StyleGuide: '#no-blind-rescues'
1863
1881
  Enabled: true
1864
1882
  VersionAdded: '0.9'
1865
- VersionChanged: '0.27.1'
1883
+ VersionChanged: '0.27'
1866
1884
 
1867
1885
  Lint/RescueType:
1868
1886
  Description: 'Avoid rescuing from non constants that could result in a `TypeError`.'
@@ -1990,6 +2008,23 @@ Lint/UnderscorePrefixedVariableName:
1990
2008
  VersionAdded: '0.21'
1991
2009
  AllowKeywordBlockArguments: false
1992
2010
 
2011
+ Lint/UnexpectedBlockArity:
2012
+ Description: 'Looks for blocks that have fewer arguments that the calling method expects.'
2013
+ Enabled: pending
2014
+ Safe: false
2015
+ VersionAdded: '1.5'
2016
+ Methods:
2017
+ chunk_while: 2
2018
+ each_with_index: 2
2019
+ each_with_object: 2
2020
+ inject: 2
2021
+ max: 2
2022
+ min: 2
2023
+ minmax: 2
2024
+ reduce: 2
2025
+ slice_when: 2
2026
+ sort: 2
2027
+
1993
2028
  Lint/UnifiedInteger:
1994
2029
  Description: 'Use Integer instead of Fixnum or Bignum.'
1995
2030
  Enabled: true
@@ -1999,6 +2034,7 @@ Lint/UnmodifiedReduceAccumulator:
1999
2034
  Description: Checks for `reduce` or `inject` blocks that do not update the accumulator each iteration.
2000
2035
  Enabled: pending
2001
2036
  VersionAdded: '1.1'
2037
+ VersionChanged: '1.5'
2002
2038
 
2003
2039
  Lint/UnreachableCode:
2004
2040
  Description: 'Unreachable code.'
@@ -2102,21 +2138,23 @@ Metrics/AbcSize:
2102
2138
  - https://en.wikipedia.org/wiki/ABC_Software_Metric
2103
2139
  Enabled: true
2104
2140
  VersionAdded: '0.27'
2105
- VersionChanged: '0.81'
2141
+ VersionChanged: '1.5'
2106
2142
  # The ABC size is a calculated magnitude, so this number can be an Integer or
2107
2143
  # a Float.
2108
2144
  IgnoredMethods: []
2145
+ CountRepeatedAttributes: true
2109
2146
  Max: 17
2110
2147
 
2111
2148
  Metrics/BlockLength:
2112
2149
  Description: 'Avoid long blocks with many lines.'
2113
2150
  Enabled: true
2114
2151
  VersionAdded: '0.44'
2115
- VersionChanged: '0.87'
2152
+ VersionChanged: '1.5'
2116
2153
  CountComments: false # count full line comments?
2117
2154
  Max: 25
2118
2155
  CountAsOne: []
2119
- ExcludedMethods:
2156
+ ExcludedMethods: [] # deprecated, retained for backwards compatibility
2157
+ IgnoredMethods:
2120
2158
  # By default, exclude the `#refine` method, as it tends to have larger
2121
2159
  # associated blocks.
2122
2160
  - refine
@@ -2157,11 +2195,12 @@ Metrics/MethodLength:
2157
2195
  StyleGuide: '#short-methods'
2158
2196
  Enabled: true
2159
2197
  VersionAdded: '0.25'
2160
- VersionChanged: '0.87'
2198
+ VersionChanged: '1.5'
2161
2199
  CountComments: false # count full line comments?
2162
2200
  Max: 10
2163
2201
  CountAsOne: []
2164
- ExcludedMethods: []
2202
+ ExcludedMethods: [] # deprecated, retained for backwards compatibility
2203
+ IgnoredMethods: []
2165
2204
 
2166
2205
  Metrics/ModuleLength:
2167
2206
  Description: 'Avoid modules longer than 100 lines of code.'
@@ -2177,8 +2216,10 @@ Metrics/ParameterLists:
2177
2216
  StyleGuide: '#too-many-params'
2178
2217
  Enabled: true
2179
2218
  VersionAdded: '0.25'
2219
+ VersionChanged: '1.5'
2180
2220
  Max: 5
2181
2221
  CountKeywordArgs: true
2222
+ MaxOptionalParameters: 3
2182
2223
 
2183
2224
  Metrics/PerceivedComplexity:
2184
2225
  Description: >-
@@ -2448,7 +2489,7 @@ Naming/VariableNumber:
2448
2489
  StyleGuide: '#snake-case-symbols-methods-vars-with-numbers'
2449
2490
  Enabled: true
2450
2491
  VersionAdded: '0.50'
2451
- VersionChanged: '1.3'
2492
+ VersionChanged: '1.4'
2452
2493
  EnforcedStyle: normalcase
2453
2494
  SupportedStyles:
2454
2495
  - snake_case
@@ -2456,7 +2497,13 @@ Naming/VariableNumber:
2456
2497
  - non_integer
2457
2498
  CheckMethodNames: true
2458
2499
  CheckSymbols: true
2459
- AllowedIdentifiers: []
2500
+ AllowedIdentifiers:
2501
+ - capture3 # Open3.capture3
2502
+ - iso8601 # Time#iso8601
2503
+ - rfc1123_date # CGI.rfc1123_date
2504
+ - rfc822 # Time#rfc822
2505
+ - rfc2822 # Time#rfc2822
2506
+ - rfc3339 # DateTime.rfc3339
2460
2507
 
2461
2508
  #################### Security ##############################
2462
2509
 
@@ -3917,7 +3964,7 @@ Style/PercentLiteralDelimiters:
3917
3964
  '%r': '{}'
3918
3965
  '%w': '[]'
3919
3966
  '%W': '[]'
3920
- VersionChanged: '0.48.1'
3967
+ VersionChanged: '0.48'
3921
3968
 
3922
3969
  Style/PercentQLiterals:
3923
3970
  Description: 'Checks if uses of %Q/%q match the configured preference.'
@@ -3973,6 +4020,17 @@ Style/RandomWithOffset:
3973
4020
  Enabled: true
3974
4021
  VersionAdded: '0.52'
3975
4022
 
4023
+ Style/RedundantArgument:
4024
+ Description: 'Check for a redundant argument passed to certain methods.'
4025
+ Enabled: pending
4026
+ Safe: false
4027
+ VersionAdded: '1.4'
4028
+ Methods:
4029
+ # Array#join
4030
+ join: ''
4031
+ # String#split
4032
+ split: ' '
4033
+
3976
4034
  Style/RedundantAssignment:
3977
4035
  Description: 'Checks for redundant assignment before returning.'
3978
4036
  Enabled: true
@@ -4243,6 +4301,7 @@ Style/SoleNestedConditional:
4243
4301
  which can be merged into outer conditional node.
4244
4302
  Enabled: true
4245
4303
  VersionAdded: '0.89'
4304
+ VersionChanged: '1.5'
4246
4305
  AllowModifier: false
4247
4306
 
4248
4307
  Style/SpecialGlobalVars:
@@ -4324,7 +4383,7 @@ Style/StringMethods:
4324
4383
  Description: 'Checks if configured preferred methods are used over non-preferred.'
4325
4384
  Enabled: false
4326
4385
  VersionAdded: '0.34'
4327
- VersionChanged: '0.34.2'
4386
+ VersionChanged: '0.34'
4328
4387
  # Mapping from undesired method to desired_method
4329
4388
  # e.g. to use `to_sym` over `intern`:
4330
4389
  #
@@ -4375,7 +4434,7 @@ Style/SymbolProc:
4375
4434
  Enabled: true
4376
4435
  Safe: false
4377
4436
  VersionAdded: '0.26'
4378
- VersionChanged: '0.64'
4437
+ VersionChanged: '1.5'
4379
4438
  # A list of method names to be ignored by the check.
4380
4439
  # The names should be fairly unique, otherwise you'll end up ignoring lots of code.
4381
4440
  IgnoredMethods:
@@ -18,6 +18,7 @@ require_relative 'rubocop/ext/regexp_node'
18
18
  require_relative 'rubocop/ext/regexp_parser'
19
19
 
20
20
  require_relative 'rubocop/core_ext/string'
21
+ require_relative 'rubocop/core_ext/hash'
21
22
  require_relative 'rubocop/ext/processed_source'
22
23
 
23
24
  require_relative 'rubocop/path_util'
@@ -88,6 +89,7 @@ require_relative 'rubocop/cop/mixin/interpolation'
88
89
  require_relative 'rubocop/cop/mixin/line_length_help'
89
90
  require_relative 'rubocop/cop/mixin/match_range'
90
91
  require_relative 'rubocop/cop/metrics/utils/repeated_csend_discount'
92
+ require_relative 'rubocop/cop/metrics/utils/repeated_attribute_discount'
91
93
  require_relative 'rubocop/cop/mixin/method_complexity'
92
94
  require_relative 'rubocop/cop/mixin/method_preference'
93
95
  require_relative 'rubocop/cop/mixin/min_body_length'
@@ -341,6 +343,7 @@ require_relative 'rubocop/cop/lint/to_json'
341
343
  require_relative 'rubocop/cop/lint/top_level_return_with_argument'
342
344
  require_relative 'rubocop/cop/lint/trailing_comma_in_attribute_declaration'
343
345
  require_relative 'rubocop/cop/lint/underscore_prefixed_variable_name'
346
+ require_relative 'rubocop/cop/lint/unexpected_block_arity'
344
347
  require_relative 'rubocop/cop/lint/unified_integer'
345
348
  require_relative 'rubocop/cop/lint/unmodified_reduce_accumulator'
346
349
  require_relative 'rubocop/cop/lint/unreachable_code'
@@ -529,6 +532,7 @@ require_relative 'rubocop/cop/style/preferred_hash_methods'
529
532
  require_relative 'rubocop/cop/style/proc'
530
533
  require_relative 'rubocop/cop/style/raise_args'
531
534
  require_relative 'rubocop/cop/style/random_with_offset'
535
+ require_relative 'rubocop/cop/style/redundant_argument'
532
536
  require_relative 'rubocop/cop/style/redundant_begin'
533
537
  require_relative 'rubocop/cop/style/redundant_capital_w'
534
538
  require_relative 'rubocop/cop/style/redundant_condition'
@@ -645,6 +649,7 @@ require_relative 'rubocop/cli/command/auto_genenerate_config'
645
649
  require_relative 'rubocop/cli/command/execute_runner'
646
650
  require_relative 'rubocop/cli/command/init_dotfile'
647
651
  require_relative 'rubocop/cli/command/show_cops'
652
+ require_relative 'rubocop/cli/command/suggest_extensions'
648
653
  require_relative 'rubocop/cli/command/version'
649
654
  require_relative 'rubocop/config_regeneration'
650
655
  require_relative 'rubocop/options'
@@ -69,10 +69,14 @@ module RuboCop
69
69
  if @options[:auto_gen_config]
70
70
  run_command(:auto_gen_config)
71
71
  else
72
- run_command(:execute_runner)
72
+ run_command(:execute_runner).tap { suggest_extensions }
73
73
  end
74
74
  end
75
75
 
76
+ def suggest_extensions
77
+ run_command(:suggest_extensions)
78
+ end
79
+
76
80
  def validate_options_vs_config
77
81
  if @options[:parallel] &&
78
82
  !@config_store.for_pwd.for_all_cops['UseCache']
@@ -22,12 +22,13 @@ module RuboCop
22
22
  def execute_runner(paths)
23
23
  runner = Runner.new(@options, @config_store)
24
24
 
25
- all_passed = runner.run(paths)
26
- display_warning_summary(runner.warnings)
27
- display_error_summary(runner.errors)
28
- maybe_print_corrected_source
25
+ all_pass_or_excluded = with_redirect do
26
+ all_passed = runner.run(paths)
27
+ display_summary(runner)
28
+ all_passed || @options[:auto_gen_config]
29
+ end
29
30
 
30
- all_pass_or_excluded = all_passed || @options[:auto_gen_config]
31
+ maybe_print_corrected_source
31
32
 
32
33
  if runner.aborting?
33
34
  STATUS_INTERRUPTED
@@ -38,6 +39,25 @@ module RuboCop
38
39
  end
39
40
  end
40
41
 
42
+ def with_redirect
43
+ if @options[:stderr]
44
+ orig_stdout = $stdout.dup
45
+ $stdout.reopen($stderr)
46
+
47
+ result = yield
48
+
49
+ $stdout.reopen(orig_stdout)
50
+ result
51
+ else
52
+ yield
53
+ end
54
+ end
55
+
56
+ def display_summary(runner)
57
+ display_warning_summary(runner.warnings)
58
+ display_error_summary(runner.errors)
59
+ end
60
+
41
61
  def display_warning_summary(warnings)
42
62
  return if warnings.empty?
43
63
 
@@ -69,14 +89,9 @@ module RuboCop
69
89
  # See: https://github.com/rubocop-hq/rubocop/issues/8673
70
90
  return if INTEGRATION_FORMATTERS.include?(@options[:format])
71
91
 
72
- # If we are asked to autocorrect source code read from stdin, the only
73
- # reasonable place to write it is to stdout
74
- # Unfortunately, we also write other information to stdout
75
- # So a delimiter is needed for tools to easily identify where the
76
- # autocorrected source begins
77
92
  return unless @options[:stdin] && @options[:auto_correct]
78
93
 
79
- puts '=' * 20
94
+ (@options[:stderr] ? $stderr : $stdout).puts '=' * 20
80
95
  print @options[:stdin]
81
96
  end
82
97
  end
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ class CLI
5
+ module Command
6
+ # Run all the selected cops and report the result.
7
+ # @api private
8
+ class SuggestExtensions < Base
9
+ # Combination of short and long formatter names.
10
+ INCLUDED_FORMATTERS = %w[p progress fu fuubar pa pacman].freeze
11
+
12
+ self.command_name = :suggest_extensions
13
+
14
+ def run
15
+ return if skip? || extensions.none?
16
+
17
+ puts
18
+ puts 'Tip: Based on detected gems, the following '\
19
+ 'RuboCop extension libraries might be helpful:'
20
+
21
+ extensions.each do |extension|
22
+ puts " * #{extension} (http://github.com/rubocop-hq/#{extension})"
23
+ end
24
+
25
+ puts
26
+ puts 'You can opt out of this message by adding the following to your config:'
27
+ puts ' AllCops:'
28
+ puts ' SuggestExtensions: false'
29
+ puts if @options[:display_time]
30
+ end
31
+
32
+ private
33
+
34
+ def skip?
35
+ # Disable outputting the notification:
36
+ # 1. On CI
37
+ # 2. When given RuboCop options that it doesn't make sense for
38
+ # 3. For all formatters except specified in `INCLUDED_FORMATTERS'`
39
+ ENV['CI'] ||
40
+ @options[:only] || @options[:debug] || @options[:list_target_files] || @options[:out] ||
41
+ !INCLUDED_FORMATTERS.include?(current_formatter)
42
+ end
43
+
44
+ def current_formatter
45
+ @options[:format] || @config_store.for_pwd.for_all_cops['DefaultFormatter'] || 'p'
46
+ end
47
+
48
+ def extensions
49
+ extensions = @config_store.for_pwd.for_all_cops['SuggestExtensions']
50
+ return [] unless extensions
51
+
52
+ extensions.select { |_, v| (v & dependent_gems).any? }.keys - dependent_gems
53
+ end
54
+
55
+ def dependent_gems
56
+ # This only includes gems in Gemfile, not in lockfile
57
+ Bundler.load.dependencies.map(&:name)
58
+ end
59
+
60
+ def puts(*args)
61
+ output = (@options[:stderr] ? $stderr : $stdout)
62
+ output.puts(*args)
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -109,7 +109,7 @@ module RuboCop
109
109
  end
110
110
 
111
111
  merge_with_default(config, config_file).tap do |merged_config|
112
- warn_on_pending_cops(merged_config.pending_cops) unless possible_new_cops?(config)
112
+ warn_on_pending_cops(merged_config.pending_cops) unless possible_new_cops?(merged_config)
113
113
  end
114
114
  end
115
115
 
@@ -255,10 +255,18 @@ module RuboCop
255
255
  "Configuration file not found: #{absolute_path}"
256
256
  end
257
257
 
258
- raise 'SafeYAML is unmaintained, no longer needed and should be removed' if defined?(SafeYAML)
258
+ def yaml_safe_load(yaml_code, filename)
259
+ yaml_safe_load!(yaml_code, filename)
260
+ rescue ::StandardError
261
+ if defined?(::SafeYAML)
262
+ raise 'SafeYAML is unmaintained, no longer needed and should be removed'
263
+ end
264
+
265
+ raise
266
+ end
259
267
 
260
268
  if Gem::Version.new(Psych::VERSION) >= Gem::Version.new('3.1.0')
261
- def yaml_safe_load(yaml_code, filename)
269
+ def yaml_safe_load!(yaml_code, filename)
262
270
  YAML.safe_load(yaml_code,
263
271
  permitted_classes: [Regexp, Symbol],
264
272
  permitted_symbols: [],
@@ -266,7 +274,7 @@ module RuboCop
266
274
  filename: filename)
267
275
  end
268
276
  else # Ruby < 2.6
269
- def yaml_safe_load(yaml_code, filename)
277
+ def yaml_safe_load!(yaml_code, filename)
270
278
  YAML.safe_load(yaml_code, [Regexp, Symbol], [], true, filename)
271
279
  end
272
280
  end