standard 1.21.1 → 1.22.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7a7fc419962214950950e1f1babe8ea008c878c3309e7066a7a971fea897df23
4
- data.tar.gz: b0d510b5788332ebca799de9a665ca8df590cb5679360daca36d67dcddf2e539
3
+ metadata.gz: 0be084d42bce81134fcc2055df53cd9a3b639814b7e64f91e3c2e05faa4675ce
4
+ data.tar.gz: f4c0f98c8b6597cbd136e2990f50767892ba2797d9b351ec8e3e277ff7d67910
5
5
  SHA512:
6
- metadata.gz: 59badefc6eb57920133e0f6440374e60d96211f5496fae8acc1be5b1e90852152c38f44043918818af54a7bfa59489472af47f3b41883b7ab343ee4330d02d84
7
- data.tar.gz: 44fcaabf3eeedae4935562e4cc73d90e3b6e0116be4b18a0ae9f5359f21c8bb6cce4df77a69d27f7bd680350be052161eb6d7bcc26e2e71f45a0513078a9d25c
6
+ metadata.gz: 1e9a9a9912071e338b36f0e4db34a8077c896fa6356d3ffa31a064a5ce7201d31a778895fbf051003640dcd92b837456202487c8b275236457063b451dc5c752
7
+ data.tar.gz: c4923a5c46669684793406b8dd70ce9b0d8f974fd280f846da920e018613e292ac235137254cb17b8c15ea8eebcf5da0c059602dce83a2b95df99f98760a6626
data/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.22.0
4
+
5
+ * Add `extend_config` option [#506](https://github.com/testdouble/standard/pull/506)
6
+
3
7
  ## 1.21.1
4
8
 
5
9
  * Fix standard comment directives [#498](https://github.com/testdouble/standard/pull/498)
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- standard (1.21.1)
4
+ standard (1.22.0)
5
5
  language_server-protocol (~> 3.17.0.2)
6
6
  rubocop (= 1.42.0)
7
7
  rubocop-performance (= 1.15.2)
data/README.md CHANGED
@@ -215,9 +215,7 @@ inherit_gem:
215
215
 
216
216
  ## Who uses Ruby Standard Style?
217
217
 
218
- (This section will not [look very
219
- familiar](https://github.com/standard/standard#who-uses-javascript-standard-style)
220
- if you've used StandardJS.)
218
+ Here are a few examples of Ruby Standard-compliant teams & projects:
221
219
 
222
220
  * [Test Double](https://testdouble.com/agency)
223
221
  * [Amazon Web Services](https://aws.amazon.com/)
@@ -244,9 +242,7 @@ if you've used StandardJS.)
244
242
  * [RubyCI](https://ruby.ci)
245
243
  * [thoughtbot](https://thoughtbot.com/)
246
244
 
247
- If your team starts using Standard, [send a pull
248
- request](https://github.com/testdouble/standard/edit/main/README.md) to let us
249
- know!
245
+ Does your team use Standard? [Add your name to the list](https://github.com/testdouble/standard/edit/main/README.md)!
250
246
 
251
247
  ## Is there a readme badge?
252
248
 
@@ -401,6 +397,51 @@ configurations](https://github.com/testdouble/standard/tree/main/config) and
401
397
  consider helping out by submitting a pull request if you find a rule that won't
402
398
  work for older Rubies.
403
399
 
400
+ ## How do I use Standard with RuboCop extensions or custom rules?
401
+
402
+ If you want to use Standard in conjunction with RuboCop extensions or custom
403
+ cops, you can specify them in your own [RuboCop configuration
404
+ YAML](https://docs.rubocop.org/rubocop/configuration.html) files and
405
+ `.standard.yml` using the "extend_config:` setting:
406
+
407
+ ```yml
408
+ # .standard.yml
409
+ extend_config:
410
+ - .betterlint.yml
411
+ ```
412
+
413
+ Which in turn would refer to a RuboCop configuration file:
414
+
415
+ ```yml
416
+ # .betterlint.yml
417
+ require:
418
+ - rubocop/cop/betterment.rb
419
+
420
+ AllCops:
421
+ DisabledByDefault: true
422
+
423
+ Betterment/UnscopedFind:
424
+ Enabled: true
425
+
426
+ unauthenticated_models:
427
+ - SystemConfiguration
428
+ ```
429
+
430
+ When Standard runs, it will merge your configuration files with Standard's base
431
+ ruleset. To ensure that this feature does not result in Standard's rules being
432
+ modified, any configuration of rules includued in `rubocop` or
433
+ `rubocop-performance` will be ignored. Most settings under `AllCops:` can be
434
+ configured, unless they'd conflict with a setting used by Standard (like
435
+ `TargetRubyVersion`) or prevent Standard's own rules from running (like
436
+ `StyleGuideCopsOnly`). If you specify multiple YAML files under `extend_config`,
437
+ note that their resulting RuboCop configurations will be merged in order (i.e.
438
+ last-in-wins).
439
+
440
+ If you find that Standard's `extend_config` feature doesn't meet your needs,
441
+ Evil Martians also maintains [a regularly updated
442
+ guide](https://evilmartians.com/chronicles/rubocoping-with-legacy-bring-your-ruby-code-up-to-standard)
443
+ on how to configure RuboCop to load and execute Standard's ruleset.
444
+
404
445
  ## How do I change the output?
405
446
 
406
447
  Standard's built-in formatter is intentionally minimal, printing only unfixed
@@ -492,13 +533,6 @@ either:
492
533
  gem to your build, which will automatically ensure that the comment is
493
534
  prepended for every applicable file in your project
494
535
 
495
- ## How do I use Standard with RuboCop extensions?
496
-
497
- This is not officially supported by Standard. However, Evil Martians wrote up [a
498
- regularly updated
499
- guide](https://evilmartians.com/chronicles/rubocoping-with-legacy-bring-your-ruby-code-up-to-standard)
500
- on how to do so.
501
-
502
536
  ## How often is Standard updated?
503
537
 
504
538
  We aim to update Standard once a month, in the first week of the month. In between releases, we'll be considering RuboCop updates, RuboCop Performance updates, and community contributions.
@@ -0,0 +1,50 @@
1
+ require_relative "../file_finder"
2
+
3
+ class Standard::CreatesConfigStore
4
+ class MergesUserConfigExtensions
5
+ DISALLOWED_ALLCOPS_KEYS = [
6
+ "Include",
7
+ "Exclude",
8
+ "StyleGuideCopsOnly",
9
+ "TargetRubyVersion"
10
+ ].freeze
11
+
12
+ def call(options_config, standard_config)
13
+ return unless standard_config[:extend_config]&.any?
14
+
15
+ extended_config = load_and_merge_extended_rubocop_configs(standard_config)
16
+ merge_standard_and_user_all_cops!(options_config, extended_config)
17
+ merge_extended_rules_into_standard!(options_config, extended_config)
18
+ end
19
+
20
+ private
21
+
22
+ def load_and_merge_extended_rubocop_configs(standard_config)
23
+ {
24
+ "AllCops" => {}
25
+ }.tap do |config|
26
+ standard_config[:extend_config].each do |path|
27
+ extension = RuboCop::ConfigLoader.load_file(Standard::FileFinder.new.call(path, Dir.pwd)).to_h
28
+ config["AllCops"].merge!(extension["AllCops"]) if extension.key?("AllCops")
29
+ config.merge!(except(extension, ["AllCops"]))
30
+ end
31
+ end
32
+ end
33
+
34
+ def merge_standard_and_user_all_cops!(options_config, extended_config)
35
+ options_config["AllCops"].merge!(
36
+ except(extended_config["AllCops"], DISALLOWED_ALLCOPS_KEYS)
37
+ )
38
+ end
39
+
40
+ def merge_extended_rules_into_standard!(options_config, extended_config)
41
+ except(extended_config, options_config.keys).each do |key, value|
42
+ options_config[key] = value
43
+ end
44
+ end
45
+
46
+ def except(hash, keys)
47
+ hash.reject { |key, _| keys.include?(key) }.to_h
48
+ end
49
+ end
50
+ end
@@ -3,6 +3,7 @@ require "rubocop"
3
3
  require_relative "creates_config_store/assigns_rubocop_yaml"
4
4
  require_relative "creates_config_store/sets_target_ruby_version"
5
5
  require_relative "creates_config_store/configures_ignored_paths"
6
+ require_relative "creates_config_store/merges_user_config_extensions"
6
7
 
7
8
  module Standard
8
9
  class CreatesConfigStore
@@ -10,6 +11,7 @@ module Standard
10
11
  @assigns_rubocop_yaml = AssignsRubocopYaml.new
11
12
  @sets_target_ruby_version = SetsTargetRubyVersion.new
12
13
  @configures_ignored_paths = ConfiguresIgnoredPaths.new
14
+ @merges_user_config_extensions = MergesUserConfigExtensions.new
13
15
  end
14
16
 
15
17
  def call(standard_config)
@@ -17,6 +19,7 @@ module Standard
17
19
  options_config = @assigns_rubocop_yaml.call(config_store, standard_config)
18
20
  @sets_target_ruby_version.call(options_config, standard_config)
19
21
  @configures_ignored_paths.call(options_config, standard_config)
22
+ @merges_user_config_extensions.call(options_config, standard_config)
20
23
  end
21
24
  end
22
25
  end
@@ -1,9 +1,23 @@
1
+ require_relative "runners/rubocop"
2
+ require_relative "runners/version"
3
+ require_relative "runners/verbose_version"
4
+ require_relative "runners/lsp"
5
+ require_relative "runners/genignore"
6
+ require_relative "runners/help"
7
+
1
8
  module Standard
2
9
  class LoadsRunner
3
- # Warning: clever metaprogramming. 99% of the time this is Runners::Rubocop
10
+ RUNNERS = {
11
+ rubocop: ::Standard::Runners::Rubocop,
12
+ version: ::Standard::Runners::Version,
13
+ verbose_version: ::Standard::Runners::VerboseVersion,
14
+ lsp: ::Standard::Runners::Lsp,
15
+ genignore: ::Standard::Runners::Genignore,
16
+ help: ::Standard::Runners::Help
17
+ }.freeze
18
+
4
19
  def call(command)
5
- require_relative "runners/#{command}"
6
- ::Standard::Runners.const_get(command.to_s.capitalize).new
20
+ RUNNERS[command].new
7
21
  end
8
22
  end
9
23
  end
@@ -32,7 +32,8 @@ module Standard
32
32
  default_ignores: standard_yaml.key?("default_ignores") ? !!standard_yaml["default_ignores"] : true,
33
33
  config_root: yaml_path ? Pathname.new(yaml_path).dirname.to_s : nil,
34
34
  todo_file: todo_path,
35
- todo_ignore_files: (todo_yaml["ignore"] || []).map { |f| (Hash === f) ? f.keys.first : f }
35
+ todo_ignore_files: Array(todo_yaml["ignore"]).map { |f| (Hash === f) ? f.keys.first : f },
36
+ extend_config: Array(standard_yaml["extend_config"])
36
37
  }
37
38
  end
38
39
 
@@ -20,7 +20,7 @@ module Standard
20
20
 
21
21
  def separate_argv(argv)
22
22
  argv.partition do |flag|
23
- ["--generate-todo", "--fix", "--no-fix", "--version", "-v", "--help", "-h", "--lsp"].include?(flag)
23
+ ["--generate-todo", "--fix", "--no-fix", "--version", "-v", "--verbose-version", "-V", "--help", "-h", "--lsp"].include?(flag)
24
24
  end
25
25
  end
26
26
 
@@ -39,6 +39,8 @@ module Standard
39
39
  :help
40
40
  elsif (argv & ["--version", "-v"]).any?
41
41
  :version
42
+ elsif (argv & ["--verbose-version", "-V"]).any?
43
+ :verbose_version
42
44
  elsif (argv & ["--generate-todo"]).any?
43
45
  :genignore
44
46
  elsif (argv & ["--lsp"]).any?
@@ -15,6 +15,7 @@ module Standard
15
15
  --generate-todo Create a .standard_todo.yml that lists all the files that contain errors
16
16
  --lsp Start a LSP server listening on STDIN
17
17
  -v, --version Print the version of Standard
18
+ -V, --verbose-version Print the version of Standard and its dependencies.
18
19
  -h, --help Print this message
19
20
  FILE Files to lint [default: ./]
20
21
 
@@ -0,0 +1,14 @@
1
+ require_relative "rubocop"
2
+
3
+ module Standard
4
+ module Runners
5
+ class VerboseVersion
6
+ def call(config)
7
+ puts <<-MSG.gsub(/^ {10}/, "")
8
+ Standard version: #{Standard::VERSION}
9
+ RuboCop version: #{RuboCop::Version.version(debug: true)}
10
+ MSG
11
+ end
12
+ end
13
+ end
14
+ end
@@ -1,3 +1,3 @@
1
1
  module Standard
2
- VERSION = Gem::Version.new("1.21.1")
2
+ VERSION = Gem::Version.new("1.22.0")
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: standard
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.21.1
4
+ version: 1.22.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Justin Searls
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-01-04 00:00:00.000000000 Z
11
+ date: 2023-01-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rubocop
@@ -95,6 +95,7 @@ files:
95
95
  - lib/standard/creates_config_store.rb
96
96
  - lib/standard/creates_config_store/assigns_rubocop_yaml.rb
97
97
  - lib/standard/creates_config_store/configures_ignored_paths.rb
98
+ - lib/standard/creates_config_store/merges_user_config_extensions.rb
98
99
  - lib/standard/creates_config_store/sets_target_ruby_version.rb
99
100
  - lib/standard/detects_fixability.rb
100
101
  - lib/standard/file_finder.rb
@@ -112,6 +113,7 @@ files:
112
113
  - lib/standard/runners/help.rb
113
114
  - lib/standard/runners/lsp.rb
114
115
  - lib/standard/runners/rubocop.rb
116
+ - lib/standard/runners/verbose_version.rb
115
117
  - lib/standard/runners/version.rb
116
118
  - lib/standard/version.rb
117
119
  - standard.gemspec