standard 1.21.0 → 1.24.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +35 -0
- data/Gemfile +1 -0
- data/Gemfile.lock +16 -12
- data/README.md +85 -13
- data/config/base.yml +13 -0
- data/config/ruby-2.3.yml +3 -0
- data/lib/standard/creates_config_store/merges_user_config_extensions.rb +67 -0
- data/lib/standard/creates_config_store.rb +3 -0
- data/lib/standard/loads_runner.rb +17 -3
- data/lib/standard/loads_yaml_config.rb +2 -1
- data/lib/standard/lsp/kills_server.rb +10 -0
- data/lib/standard/lsp/logger.rb +19 -0
- data/lib/standard/lsp/routes.rb +204 -0
- data/lib/standard/lsp/server.rb +20 -128
- data/lib/standard/lsp/standardizer.rb +43 -27
- data/lib/standard/merges_settings.rb +3 -1
- data/lib/standard/rubocop/ext.rb +9 -0
- data/lib/standard/runners/help.rb +1 -0
- data/lib/standard/runners/lsp.rb +1 -2
- data/lib/standard/runners/verbose_version.rb +14 -0
- data/lib/standard/version.rb +1 -1
- data/standard.gemspec +1 -1
- metadata +14 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cc7f5e2e4baad0d0471e6aba98df29bd5d8bb3db7c4a8fc3557581572a30865b
|
4
|
+
data.tar.gz: 76083326596e81461fc7cf9664421d4089555d9a3b1a2f8706e2884522379611
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 47a6281011618bc51cd198c5dad586608d97c64ed05a4146d8549739332d22d70669f24fd9a59e1508c6b1ec6d631387949d589ab97241adf296fd0c2ec5ca22
|
7
|
+
data.tar.gz: dbca4f6a5c7e0777e93a98f3c6f0f14b4a15210cadcad1c8489f16319e636fe92ee5de19a295389fb3cdec7b73c37bd86510aa7de0b3dd8537f8033766cbd45c
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,40 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## 1.24.3
|
4
|
+
|
5
|
+
* _Further_ _further_ _further_ improve `--lsp` server to ignore files correctly
|
6
|
+
|
7
|
+
## 1.24.2
|
8
|
+
|
9
|
+
* _Further_ _further_ improve `--lsp` server to always respond to requests
|
10
|
+
|
11
|
+
## 1.24.1
|
12
|
+
|
13
|
+
* _Further_ improve `--lsp` server to better support commands used by VS Code
|
14
|
+
|
15
|
+
## 1.24.0
|
16
|
+
|
17
|
+
* Improve `--lsp` server to better support the commands used by VS Code
|
18
|
+
|
19
|
+
## 1.23.0
|
20
|
+
|
21
|
+
* Update rubocop from 1.42.0 to [1.44.1](https://github.com/rubocop/rubocop/releases/tag/v1.44.1)
|
22
|
+
|
23
|
+
## 1.22.1
|
24
|
+
|
25
|
+
* Improve the behavior of `extend_config` to more accurately reflect how Rubocop
|
26
|
+
extensions would behave when loaded via the `rubocop` CLI (by capturing any
|
27
|
+
mutations to RuboCop's default configuration)
|
28
|
+
[#512](https://github.com/testdouble/standard/pull/512)
|
29
|
+
|
30
|
+
## 1.22.0
|
31
|
+
|
32
|
+
* Add `extend_config` option [#506](https://github.com/testdouble/standard/pull/506)
|
33
|
+
|
34
|
+
## 1.21.1
|
35
|
+
|
36
|
+
* Fix standard comment directives [#498](https://github.com/testdouble/standard/pull/498)
|
37
|
+
|
3
38
|
## 1.21.0
|
4
39
|
|
5
40
|
* Update rubocop-performance from 1.15.1 to [1.15.2](https://github.com/rubocop/rubocop-performance/releases/tag/v1.15.2)
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
standard (1.
|
4
|
+
standard (1.24.3)
|
5
5
|
language_server-protocol (~> 3.17.0.2)
|
6
|
-
rubocop (= 1.
|
6
|
+
rubocop (= 1.44.1)
|
7
7
|
rubocop-performance (= 1.15.2)
|
8
8
|
|
9
9
|
GEM
|
@@ -14,31 +14,34 @@ GEM
|
|
14
14
|
docile (1.4.0)
|
15
15
|
gimme (0.5.0)
|
16
16
|
json (2.6.3)
|
17
|
-
language_server-protocol (3.17.0.
|
17
|
+
language_server-protocol (3.17.0.3)
|
18
|
+
m (1.6.1)
|
19
|
+
method_source (>= 0.6.7)
|
20
|
+
rake (>= 0.9.2.2)
|
18
21
|
method_source (1.0.0)
|
19
22
|
minitest (5.17.0)
|
20
23
|
parallel (1.22.1)
|
21
|
-
parser (3.2.
|
24
|
+
parser (3.2.1.0)
|
22
25
|
ast (~> 2.4.1)
|
23
|
-
pry (0.14.
|
26
|
+
pry (0.14.2)
|
24
27
|
coderay (~> 1.1)
|
25
28
|
method_source (~> 1.0)
|
26
29
|
rainbow (3.1.1)
|
27
30
|
rake (13.0.6)
|
28
|
-
regexp_parser (2.
|
31
|
+
regexp_parser (2.7.0)
|
29
32
|
rexml (3.2.5)
|
30
|
-
rubocop (1.
|
33
|
+
rubocop (1.44.1)
|
31
34
|
json (~> 2.3)
|
32
35
|
parallel (~> 1.10)
|
33
|
-
parser (>= 3.
|
36
|
+
parser (>= 3.2.0.0)
|
34
37
|
rainbow (>= 2.2.2, < 4.0)
|
35
38
|
regexp_parser (>= 1.8, < 3.0)
|
36
39
|
rexml (>= 3.2.5, < 4.0)
|
37
40
|
rubocop-ast (>= 1.24.1, < 2.0)
|
38
41
|
ruby-progressbar (~> 1.7)
|
39
|
-
unicode-display_width (>=
|
40
|
-
rubocop-ast (1.
|
41
|
-
parser (>= 3.
|
42
|
+
unicode-display_width (>= 2.4.0, < 3.0)
|
43
|
+
rubocop-ast (1.26.0)
|
44
|
+
parser (>= 3.2.1.0)
|
42
45
|
rubocop-performance (1.15.2)
|
43
46
|
rubocop (>= 1.7.0, < 2.0)
|
44
47
|
rubocop-ast (>= 0.4.0)
|
@@ -49,7 +52,7 @@ GEM
|
|
49
52
|
simplecov_json_formatter (~> 0.1)
|
50
53
|
simplecov-html (0.12.3)
|
51
54
|
simplecov_json_formatter (0.1.4)
|
52
|
-
unicode-display_width (2.4.
|
55
|
+
unicode-display_width (2.4.2)
|
53
56
|
|
54
57
|
PLATFORMS
|
55
58
|
ruby
|
@@ -58,6 +61,7 @@ PLATFORMS
|
|
58
61
|
DEPENDENCIES
|
59
62
|
bundler
|
60
63
|
gimme
|
64
|
+
m
|
61
65
|
minitest (~> 5.0)
|
62
66
|
pry
|
63
67
|
rake (~> 13.0)
|
data/README.md
CHANGED
@@ -215,12 +215,12 @@ inherit_gem:
|
|
215
215
|
|
216
216
|
## Who uses Ruby Standard Style?
|
217
217
|
|
218
|
-
|
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/)
|
222
|
+
* [Arrows](https://arrows.to/)
|
223
|
+
* [Avo Admin](https://avohq.io/)
|
224
224
|
* [Babylist](https://www.babylist.com/)
|
225
225
|
* [Brand New Box](https://brandnewbox.com)
|
226
226
|
* [Brave Software](https://github.com/brave-intl/publishers)
|
@@ -244,9 +244,7 @@ if you've used StandardJS.)
|
|
244
244
|
* [RubyCI](https://ruby.ci)
|
245
245
|
* [thoughtbot](https://thoughtbot.com/)
|
246
246
|
|
247
|
-
|
248
|
-
request](https://github.com/testdouble/standard/edit/main/README.md) to let us
|
249
|
-
know!
|
247
|
+
Does your team use Standard? [Add your name to the list](https://github.com/testdouble/standard/edit/main/README.md)!
|
250
248
|
|
251
249
|
## Is there a readme badge?
|
252
250
|
|
@@ -401,6 +399,87 @@ configurations](https://github.com/testdouble/standard/tree/main/config) and
|
|
401
399
|
consider helping out by submitting a pull request if you find a rule that won't
|
402
400
|
work for older Rubies.
|
403
401
|
|
402
|
+
## How do I use Standard with RuboCop extensions or custom rules?
|
403
|
+
|
404
|
+
If you want to use Standard in conjunction with RuboCop extensions or custom
|
405
|
+
cops, you can specify them in your own [RuboCop configuration
|
406
|
+
YAML](https://docs.rubocop.org/rubocop/configuration.html) files and
|
407
|
+
`.standard.yml` using the "extend_config` setting.
|
408
|
+
|
409
|
+
For a simple example, you could include [rubocop-rails](https://github.com/rubocop/rubocop-rails)
|
410
|
+
when Standard runs by first specifying a file in `.standard.yml`:
|
411
|
+
|
412
|
+
```yaml
|
413
|
+
# .standard.yml
|
414
|
+
|
415
|
+
extend_config:
|
416
|
+
- .standard_rubocop_extensions.yml
|
417
|
+
```
|
418
|
+
|
419
|
+
And a minimal RuboCop configuration file:
|
420
|
+
|
421
|
+
```yaml
|
422
|
+
# .standard_rubocop_extensions.yml
|
423
|
+
|
424
|
+
require:
|
425
|
+
- rubocop-rails
|
426
|
+
```
|
427
|
+
|
428
|
+
That's it! Now, in addition to all of Standard's built-in rules, `standardrb`
|
429
|
+
and `rake standard` will also execute the default configuration of the
|
430
|
+
`rubocop-rails` gem without needing to invoke `rubocop` separately.
|
431
|
+
|
432
|
+
For a slightly more complex example, we could add the
|
433
|
+
[https://github.com/Betterment/betterlint] gem from our friends at
|
434
|
+
[Betterment](https://www.betterment.com), first by telling Standard where our
|
435
|
+
configuration file is:
|
436
|
+
|
437
|
+
```yml
|
438
|
+
# .standard.yml
|
439
|
+
|
440
|
+
extend_config:
|
441
|
+
- .betterlint.yml
|
442
|
+
```
|
443
|
+
|
444
|
+
But if we only wanted to enable a particular rule, we could configure it more
|
445
|
+
narrowly, like this:
|
446
|
+
|
447
|
+
```yml
|
448
|
+
# .betterlint.yml
|
449
|
+
|
450
|
+
require:
|
451
|
+
- rubocop/cop/betterment.rb
|
452
|
+
|
453
|
+
AllCops:
|
454
|
+
DisabledByDefault: true
|
455
|
+
|
456
|
+
Betterment/UnscopedFind:
|
457
|
+
Enabled: true
|
458
|
+
|
459
|
+
unauthenticated_models:
|
460
|
+
- SystemConfiguration
|
461
|
+
```
|
462
|
+
|
463
|
+
This same approach works for more than just gems! Just require a Ruby file that
|
464
|
+
defines or loads your [custom RuboCop
|
465
|
+
implementation](https://docs.rubocop.org/rubocop/development.html) and configure
|
466
|
+
it using `extend_config`.
|
467
|
+
|
468
|
+
When Standard encounters an `extend_config` property, it will merge your
|
469
|
+
configuration files with Standard's base ruleset. To prevent Standard's built-in
|
470
|
+
rules from being modified, any configuration of rules includued in the `rubocop`
|
471
|
+
or `rubocop-performance` gems will be ignored. Most settings under `AllCops:`
|
472
|
+
can be configured, however, unless they'd conflict with a setting used by
|
473
|
+
Standard (like `TargetRubyVersion`) or prevent Standard's own rules from running
|
474
|
+
(like `StyleGuideCopsOnly`). If you specify multiple YAML files under
|
475
|
+
`extend_config`, note that their resulting RuboCop configurations will be merged
|
476
|
+
in order (i.e. last-in-wins).
|
477
|
+
|
478
|
+
If you find that Standard's `extend_config` feature doesn't meet your needs,
|
479
|
+
Evil Martians also maintains [a regularly updated
|
480
|
+
guide](https://evilmartians.com/chronicles/rubocoping-with-legacy-bring-your-ruby-code-up-to-standard)
|
481
|
+
on how to configure RuboCop to load and execute Standard's ruleset.
|
482
|
+
|
404
483
|
## How do I change the output?
|
405
484
|
|
406
485
|
Standard's built-in formatter is intentionally minimal, printing only unfixed
|
@@ -492,13 +571,6 @@ either:
|
|
492
571
|
gem to your build, which will automatically ensure that the comment is
|
493
572
|
prepended for every applicable file in your project
|
494
573
|
|
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
574
|
## How often is Standard updated?
|
503
575
|
|
504
576
|
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.
|
data/config/base.yml
CHANGED
@@ -38,6 +38,9 @@ Gemspec/DependencyVersion:
|
|
38
38
|
Gemspec/DeprecatedAttributeAssignment:
|
39
39
|
Enabled: true
|
40
40
|
|
41
|
+
Gemspec/DevelopmentDependencies:
|
42
|
+
Enabled: false
|
43
|
+
|
41
44
|
Gemspec/DuplicatedAssignment:
|
42
45
|
Enabled: true
|
43
46
|
Include:
|
@@ -824,6 +827,9 @@ Lint/UselessElseWithoutRescue:
|
|
824
827
|
Lint/UselessMethodDefinition:
|
825
828
|
Enabled: false
|
826
829
|
|
830
|
+
Lint/UselessRescue:
|
831
|
+
Enabled: true
|
832
|
+
|
827
833
|
Lint/UselessRuby2Keywords:
|
828
834
|
Enabled: true
|
829
835
|
|
@@ -1213,6 +1219,9 @@ Style/CommentAnnotation:
|
|
1213
1219
|
Style/CommentedKeyword:
|
1214
1220
|
Enabled: false
|
1215
1221
|
|
1222
|
+
Style/ComparableClamp:
|
1223
|
+
Enabled: true
|
1224
|
+
|
1216
1225
|
Style/ConcatArrayLiterals:
|
1217
1226
|
Enabled: false
|
1218
1227
|
|
@@ -1269,6 +1278,7 @@ Style/EmptyCaseCondition:
|
|
1269
1278
|
|
1270
1279
|
Style/EmptyElse:
|
1271
1280
|
Enabled: true
|
1281
|
+
AllowComments: true
|
1272
1282
|
EnforcedStyle: both
|
1273
1283
|
|
1274
1284
|
Style/EmptyHeredoc:
|
@@ -1406,6 +1416,9 @@ Style/InlineComment:
|
|
1406
1416
|
Style/InverseMethods:
|
1407
1417
|
Enabled: false
|
1408
1418
|
|
1419
|
+
Style/InvertibleUnlessCondition:
|
1420
|
+
Enabled: false
|
1421
|
+
|
1409
1422
|
Style/IpAddresses:
|
1410
1423
|
Enabled: false
|
1411
1424
|
|
data/config/ruby-2.3.yml
CHANGED
@@ -0,0 +1,67 @@
|
|
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
|
+
|
11
|
+
# The AllCops[Enabled] key is an unused artifact of #merge_with_default.
|
12
|
+
# See: https://github.com/rubocop/rubocop/blob/master/lib/rubocop/config_loader_resolver.rb#L81-L85
|
13
|
+
"Enabled"
|
14
|
+
].freeze
|
15
|
+
|
16
|
+
def call(options_config, standard_config)
|
17
|
+
return unless standard_config[:extend_config]&.any?
|
18
|
+
|
19
|
+
extended_config = load_and_merge_extended_rubocop_configs(options_config, standard_config).to_h
|
20
|
+
merge_standard_and_user_all_cops!(options_config, extended_config)
|
21
|
+
merge_extended_rules_into_standard!(options_config, extended_config)
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def load_and_merge_extended_rubocop_configs(options_config, standard_config)
|
27
|
+
fake_out_rubocop_default_configuration(options_config) do |fake_config|
|
28
|
+
standard_config[:extend_config].reduce(fake_config) do |config, path|
|
29
|
+
RuboCop::ConfigLoader.instance_variable_set(:@default_configuration, config)
|
30
|
+
|
31
|
+
user_rubocop_yaml_path = Standard::FileFinder.new.call(path, Dir.pwd)
|
32
|
+
extension = RuboCop::ConfigLoader.load_file(user_rubocop_yaml_path)
|
33
|
+
RuboCop::ConfigLoader.merge_with_default(extension, path)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def merge_standard_and_user_all_cops!(options_config, extended_config)
|
39
|
+
options_config["AllCops"].merge!(
|
40
|
+
except(extended_config["AllCops"], DISALLOWED_ALLCOPS_KEYS)
|
41
|
+
)
|
42
|
+
end
|
43
|
+
|
44
|
+
def merge_extended_rules_into_standard!(options_config, extended_config)
|
45
|
+
except(extended_config, options_config.keys).each do |key, value|
|
46
|
+
options_config[key] = value
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def fake_out_rubocop_default_configuration(options_config)
|
51
|
+
og_default_config = RuboCop::ConfigLoader.instance_variable_get(:@default_configuration)
|
52
|
+
result = yield blank_rubocop_config(options_config)
|
53
|
+
RuboCop::ConfigLoader.instance_variable_set(:@default_configuration, og_default_config)
|
54
|
+
result
|
55
|
+
end
|
56
|
+
|
57
|
+
# Blank configuration object to merge extensions into, with all known
|
58
|
+
# AllCops keys set to avoid warnings about unknown properties
|
59
|
+
def blank_rubocop_config(example_config)
|
60
|
+
RuboCop::Config.new(example_config.to_h.slice("AllCops"), "")
|
61
|
+
end
|
62
|
+
|
63
|
+
def except(hash_or_config, keys)
|
64
|
+
hash_or_config.to_h.reject { |key, _| keys.include?(key) }.to_h
|
65
|
+
end
|
66
|
+
end
|
67
|
+
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
|
-
|
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
|
-
|
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"]
|
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
|
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Standard
|
2
|
+
module Lsp
|
3
|
+
class Logger
|
4
|
+
def initialize
|
5
|
+
@puts_onces = []
|
6
|
+
end
|
7
|
+
|
8
|
+
def puts(message)
|
9
|
+
warn("[server] #{message}")
|
10
|
+
end
|
11
|
+
|
12
|
+
def puts_once(message)
|
13
|
+
return if @puts_onces.include?(message)
|
14
|
+
@puts_onces << message
|
15
|
+
puts(message)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,204 @@
|
|
1
|
+
require_relative "kills_server"
|
2
|
+
|
3
|
+
module Standard
|
4
|
+
module Lsp
|
5
|
+
class Routes
|
6
|
+
def initialize(writer, logger, standardizer)
|
7
|
+
@writer = writer
|
8
|
+
@logger = logger
|
9
|
+
@standardizer = standardizer
|
10
|
+
|
11
|
+
@text_cache = {}
|
12
|
+
@kills_server = KillsServer.new
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.handle(name, &block)
|
16
|
+
define_method("handle_#{name}", &block)
|
17
|
+
end
|
18
|
+
|
19
|
+
def for(name)
|
20
|
+
name = "handle_#{name}"
|
21
|
+
if respond_to?(name)
|
22
|
+
method(name)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
handle "initialize" do |request|
|
27
|
+
@writer.write(id: request[:id], result: Proto::Interface::InitializeResult.new(
|
28
|
+
capabilities: Proto::Interface::ServerCapabilities.new(
|
29
|
+
document_formatting_provider: true,
|
30
|
+
diagnostic_provider: true,
|
31
|
+
execute_command_provider: true,
|
32
|
+
text_document_sync: Proto::Interface::TextDocumentSyncOptions.new(
|
33
|
+
change: Proto::Constant::TextDocumentSyncKind::FULL
|
34
|
+
)
|
35
|
+
)
|
36
|
+
))
|
37
|
+
end
|
38
|
+
|
39
|
+
handle "initialized" do |request|
|
40
|
+
@logger.puts "Standard Ruby v#{Standard::VERSION} LSP server initialized, pid #{Process.pid}"
|
41
|
+
end
|
42
|
+
|
43
|
+
handle "shutdown" do |request|
|
44
|
+
@logger.puts "Client asked to shutdown Standard LSP server."
|
45
|
+
@kills_server.call do
|
46
|
+
@writer.write(id: request[:id], result: nil)
|
47
|
+
@logger.puts "Exiting..."
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
handle "textDocument/diagnostic" do |request|
|
52
|
+
doc = request[:params][:textDocument]
|
53
|
+
result = diagnostic(doc[:uri], doc[:text])
|
54
|
+
@writer.write(result)
|
55
|
+
end
|
56
|
+
|
57
|
+
handle "textDocument/didChange" do |request|
|
58
|
+
params = request[:params]
|
59
|
+
result = diagnostic(params[:textDocument][:uri], params[:contentChanges][0][:text])
|
60
|
+
@writer.write(result)
|
61
|
+
end
|
62
|
+
|
63
|
+
handle "textDocument/didOpen" do |request|
|
64
|
+
doc = request[:params][:textDocument]
|
65
|
+
result = diagnostic(doc[:uri], doc[:text])
|
66
|
+
@writer.write(result)
|
67
|
+
end
|
68
|
+
|
69
|
+
handle "textDocument/didClose" do |request|
|
70
|
+
@text_cache.delete(request.dig(:params, :textDocument, :uri))
|
71
|
+
end
|
72
|
+
|
73
|
+
handle "textDocument/formatting" do |request|
|
74
|
+
uri = request[:params][:textDocument][:uri]
|
75
|
+
@writer.write({id: request[:id], result: format_file(uri)})
|
76
|
+
end
|
77
|
+
|
78
|
+
handle "workspace/didChangeWatchedFiles" do |request|
|
79
|
+
if request[:params][:changes].any? { |change| change[:uri].end_with?(".standard.yml") }
|
80
|
+
@logger.puts "Configuration file changed; restart required"
|
81
|
+
@kills_server.call
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
handle "workspace/executeCommand" do |request|
|
86
|
+
if request[:params][:command] == "standardRuby.formatAutoFixes"
|
87
|
+
uri = request[:params][:arguments][0][:uri]
|
88
|
+
@writer.write({
|
89
|
+
id: request[:id],
|
90
|
+
method: "workspace/applyEdit",
|
91
|
+
params: {
|
92
|
+
label: "Format with Standard Ruby auto-fixes",
|
93
|
+
edit: {
|
94
|
+
changes: {
|
95
|
+
uri => format_file(uri)
|
96
|
+
}
|
97
|
+
}
|
98
|
+
}
|
99
|
+
})
|
100
|
+
else
|
101
|
+
handle_unsupported_method(request, request[:params][:command])
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
handle "textDocument/didSave" do |_request|
|
106
|
+
# Nothing to do
|
107
|
+
end
|
108
|
+
|
109
|
+
handle "$/cancelRequest" do |_request|
|
110
|
+
# Can't cancel anything because single-threaded
|
111
|
+
end
|
112
|
+
|
113
|
+
handle "$/setTrace" do |_request|
|
114
|
+
# No-op, we log everything
|
115
|
+
end
|
116
|
+
|
117
|
+
def handle_unsupported_method(request, method = request[:method])
|
118
|
+
@writer.write({id: request[:id], error: Proto::Interface::ResponseError.new(
|
119
|
+
code: Proto::Constant::ErrorCodes::METHOD_NOT_FOUND,
|
120
|
+
message: "Unsupported Method: #{method}"
|
121
|
+
)})
|
122
|
+
@logger.puts "Unsupported Method: #{method}"
|
123
|
+
end
|
124
|
+
|
125
|
+
def handle_method_missing(request)
|
126
|
+
if request.key?(:id)
|
127
|
+
@writer.write({id: request[:id], result: nil})
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
private
|
132
|
+
|
133
|
+
def uri_to_path(uri)
|
134
|
+
uri.sub(%r{^file://}, "")
|
135
|
+
end
|
136
|
+
|
137
|
+
def format_file(file_uri)
|
138
|
+
text = @text_cache[file_uri]
|
139
|
+
if text.nil?
|
140
|
+
@logger.puts "Format request arrived before text synchonized; skipping: `#{file_uri}'"
|
141
|
+
[]
|
142
|
+
else
|
143
|
+
new_text = @standardizer.format(uri_to_path(file_uri), text)
|
144
|
+
if new_text == text
|
145
|
+
[]
|
146
|
+
else
|
147
|
+
[{
|
148
|
+
newText: new_text,
|
149
|
+
range: {
|
150
|
+
start: {line: 0, character: 0},
|
151
|
+
end: {line: text.count("\n") + 1, character: 0}
|
152
|
+
}
|
153
|
+
}]
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
def diagnostic(file_uri, text)
|
159
|
+
@text_cache[file_uri] = text
|
160
|
+
offenses = @standardizer.offenses(uri_to_path(file_uri), text)
|
161
|
+
|
162
|
+
lsp_diagnostics = offenses.map { |o|
|
163
|
+
code = o[:cop_name]
|
164
|
+
|
165
|
+
msg = o[:message].delete_prefix(code)
|
166
|
+
loc = o[:location]
|
167
|
+
|
168
|
+
severity = case o[:severity]
|
169
|
+
when "error", "fatal"
|
170
|
+
SEV::ERROR
|
171
|
+
when "warning"
|
172
|
+
SEV::WARNING
|
173
|
+
when "convention"
|
174
|
+
SEV::INFORMATION
|
175
|
+
when "refactor", "info"
|
176
|
+
SEV::HINT
|
177
|
+
else # the above cases fully cover what RuboCop sends at this time
|
178
|
+
logger.puts "Unknown severity: #{severity.inspect}"
|
179
|
+
SEV::HINT
|
180
|
+
end
|
181
|
+
|
182
|
+
{
|
183
|
+
code: code,
|
184
|
+
message: msg,
|
185
|
+
range: {
|
186
|
+
start: {character: loc[:start_column] - 1, line: loc[:start_line] - 1},
|
187
|
+
end: {character: loc[:last_column] - 1, line: loc[:last_line] - 1}
|
188
|
+
},
|
189
|
+
severity: severity,
|
190
|
+
source: "standard"
|
191
|
+
}
|
192
|
+
}
|
193
|
+
|
194
|
+
{
|
195
|
+
method: "textDocument/publishDiagnostics",
|
196
|
+
params: {
|
197
|
+
uri: file_uri,
|
198
|
+
diagnostics: lsp_diagnostics
|
199
|
+
}
|
200
|
+
}
|
201
|
+
end
|
202
|
+
end
|
203
|
+
end
|
204
|
+
end
|
data/lib/standard/lsp/server.rb
CHANGED
@@ -1,144 +1,36 @@
|
|
1
1
|
require "language_server-protocol"
|
2
2
|
require_relative "standardizer"
|
3
|
+
require_relative "routes"
|
4
|
+
require_relative "logger"
|
3
5
|
|
4
6
|
module Standard
|
5
|
-
module
|
6
|
-
|
7
|
-
|
8
|
-
SEV = Proto::Constant::DiagnosticSeverity
|
9
|
-
|
10
|
-
def self.start(standardizer)
|
11
|
-
new(standardizer).start
|
12
|
-
end
|
13
|
-
|
14
|
-
attr_accessor :standardizer, :writer, :reader, :logger, :text_cache, :subscribers
|
15
|
-
|
16
|
-
def initialize(standardizer)
|
17
|
-
self.standardizer = standardizer
|
18
|
-
self.writer = Proto::Transport::Io::Writer.new($stdout)
|
19
|
-
self.reader = Proto::Transport::Io::Reader.new($stdin)
|
20
|
-
self.logger = $stderr
|
21
|
-
self.text_cache = {}
|
22
|
-
|
23
|
-
self.subscribers = {
|
24
|
-
"initialize" => ->(request) {
|
25
|
-
init_result = Proto::Interface::InitializeResult.new(
|
26
|
-
capabilities: Proto::Interface::ServerCapabilities.new(
|
27
|
-
document_formatting_provider: true,
|
28
|
-
diagnostic_provider: true,
|
29
|
-
text_document_sync: Proto::Constant::TextDocumentSyncKind::FULL
|
30
|
-
)
|
31
|
-
)
|
32
|
-
writer.write(id: request[:id], result: init_result)
|
33
|
-
},
|
34
|
-
|
35
|
-
"initialized" => ->(request) { logger.puts "standard v#{Standard::VERSION} initialized, pid #{Process.pid}" },
|
7
|
+
module Lsp
|
8
|
+
Proto = LanguageServer::Protocol
|
9
|
+
SEV = Proto::Constant::DiagnosticSeverity
|
36
10
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
result = diagnostic(params[:textDocument][:uri], params[:contentChanges][0][:text])
|
45
|
-
writer.write(result)
|
46
|
-
},
|
47
|
-
|
48
|
-
"textDocument/didOpen" => ->(request) {
|
49
|
-
td = request[:params][:textDocument]
|
50
|
-
result = diagnostic(td[:uri], td[:text])
|
51
|
-
writer.write(result)
|
52
|
-
},
|
53
|
-
|
54
|
-
"textDocument/didClose" => ->(request) {
|
55
|
-
text_cache.delete(request.dig(:params, :textDocument, :uri))
|
56
|
-
},
|
57
|
-
|
58
|
-
"textDocument/formatting" => ->(request) {
|
59
|
-
uri = request[:params][:textDocument][:uri]
|
60
|
-
writer.write({id: request[:id], result: format_file(uri)})
|
61
|
-
},
|
62
|
-
|
63
|
-
"textDocument/didSave" => ->(request) {}
|
64
|
-
}
|
11
|
+
class Server
|
12
|
+
def initialize(config)
|
13
|
+
@writer = Proto::Transport::Io::Writer.new($stdout)
|
14
|
+
@reader = Proto::Transport::Io::Reader.new($stdin)
|
15
|
+
@logger = Logger.new
|
16
|
+
@standardizer = Standard::Lsp::Standardizer.new(config, @logger)
|
17
|
+
@routes = Routes.new(@writer, @logger, @standardizer)
|
65
18
|
end
|
66
19
|
|
67
20
|
def start
|
68
|
-
reader.read do |request|
|
69
|
-
|
70
|
-
|
71
|
-
|
21
|
+
@reader.read do |request|
|
22
|
+
if !request.key?(:method)
|
23
|
+
@routes.handle_method_missing(request)
|
24
|
+
elsif (route = @routes.for(request[:method]))
|
25
|
+
route.call(request)
|
72
26
|
else
|
73
|
-
|
27
|
+
@routes.handle_unsupported_method(request)
|
74
28
|
end
|
75
29
|
rescue => e
|
76
|
-
logger.puts "
|
77
|
-
logger.puts e.backtrace.inspect
|
30
|
+
@logger.puts "Error #{e.class} #{e.message[0..100]}"
|
31
|
+
@logger.puts e.backtrace.inspect
|
78
32
|
end
|
79
33
|
end
|
80
|
-
|
81
|
-
def format_file(file_uri)
|
82
|
-
text = text_cache[file_uri]
|
83
|
-
new_text = standardizer.format(text)
|
84
|
-
|
85
|
-
if new_text == text
|
86
|
-
[]
|
87
|
-
else
|
88
|
-
[{
|
89
|
-
newText: new_text,
|
90
|
-
range: {
|
91
|
-
start: {line: 0, character: 0},
|
92
|
-
end: {line: text.count("\n") + 1, character: 0}
|
93
|
-
}
|
94
|
-
}]
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
def diagnostic(file_uri, text)
|
99
|
-
text_cache[file_uri] = text
|
100
|
-
offenses = standardizer.offenses(text)
|
101
|
-
|
102
|
-
lsp_diagnostics = offenses.map { |o|
|
103
|
-
code = o[:cop_name]
|
104
|
-
|
105
|
-
msg = o[:message].delete_prefix(code)
|
106
|
-
loc = o[:location]
|
107
|
-
|
108
|
-
severity = case o[:severity]
|
109
|
-
when "error", "fatal"
|
110
|
-
SEV::ERROR
|
111
|
-
when "warning"
|
112
|
-
SEV::WARNING
|
113
|
-
when "convention"
|
114
|
-
SEV::INFORMATION
|
115
|
-
when "refactor", "info"
|
116
|
-
SEV::HINT
|
117
|
-
else # the above cases fully cover what RuboCop sends at this time
|
118
|
-
logger.puts "unknown severity: #{severity.inspect}"
|
119
|
-
SEV::HINT
|
120
|
-
end
|
121
|
-
|
122
|
-
{
|
123
|
-
code: code,
|
124
|
-
message: msg,
|
125
|
-
range: {
|
126
|
-
start: {character: loc[:start_column] - 1, line: loc[:start_line] - 1},
|
127
|
-
end: {character: loc[:last_column] - 1, line: loc[:last_line] - 1}
|
128
|
-
},
|
129
|
-
severity: severity,
|
130
|
-
source: "standard"
|
131
|
-
}
|
132
|
-
}
|
133
|
-
|
134
|
-
{
|
135
|
-
method: "textDocument/publishDiagnostics",
|
136
|
-
params: {
|
137
|
-
diagnostics: lsp_diagnostics,
|
138
|
-
uri: file_uri
|
139
|
-
}
|
140
|
-
}
|
141
|
-
end
|
142
34
|
end
|
143
35
|
end
|
144
36
|
end
|
@@ -1,49 +1,65 @@
|
|
1
1
|
require_relative "../runners/rubocop"
|
2
|
-
require "tempfile"
|
3
2
|
|
4
3
|
module Standard
|
5
|
-
module
|
4
|
+
module Lsp
|
6
5
|
class Standardizer
|
7
|
-
def initialize(config)
|
8
|
-
@
|
9
|
-
@
|
6
|
+
def initialize(config, logger)
|
7
|
+
@config = config
|
8
|
+
@logger = logger
|
9
|
+
@rubocop_runner = Standard::Runners::Rubocop.new
|
10
10
|
end
|
11
11
|
|
12
|
-
|
13
|
-
|
12
|
+
# This abuses the --stdin option of rubocop and reads the formatted text
|
13
|
+
# from the options[:stdin] that rubocop mutates. This depends on
|
14
|
+
# parallel: false as well as the fact that rubocop doesn't otherwise dup
|
15
|
+
# or reassign that options object. Risky business!
|
16
|
+
#
|
17
|
+
# Reassigning options[:stdin] is done here:
|
18
|
+
# https://github.com/rubocop/rubocop/blob/master/lib/rubocop/cop/team.rb#L131
|
19
|
+
# Printing options[:stdin]
|
20
|
+
# https://github.com/rubocop/rubocop/blob/master/lib/rubocop/cli/command/execute_runner.rb#L95
|
21
|
+
# Setting `parallel: true` would break this here:
|
22
|
+
# https://github.com/rubocop/rubocop/blob/master/lib/rubocop/runner.rb#L72
|
23
|
+
def format(path, text)
|
24
|
+
ad_hoc_config = fork_config(path, text, format: true)
|
25
|
+
capture_rubocop_stdout(ad_hoc_config)
|
26
|
+
ad_hoc_config.rubocop_options[:stdin]
|
14
27
|
end
|
15
28
|
|
16
|
-
def offenses(text)
|
17
|
-
results =
|
18
|
-
|
29
|
+
def offenses(path, text)
|
30
|
+
results = JSON.parse(
|
31
|
+
capture_rubocop_stdout(fork_config(path, text, format: false)),
|
32
|
+
symbolize_names: true
|
33
|
+
)
|
34
|
+
if results[:files].empty?
|
35
|
+
@logger.puts_once "Ignoring file, per configuration: #{path}"
|
36
|
+
[]
|
37
|
+
else
|
38
|
+
results.dig(:files, 0, :offenses)
|
39
|
+
end
|
19
40
|
end
|
20
41
|
|
21
42
|
private
|
22
43
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
def make_config(file, format)
|
34
|
-
# Can't make frozen versions of this hash because RuboCop mutates it
|
35
|
-
o = if format
|
36
|
-
{autocorrect: true, formatters: [["Standard::Formatter", nil]], parallel: true, todo_file: nil, todo_ignore_files: [], safe_autocorrect: true}
|
44
|
+
BASE_OPTIONS = {
|
45
|
+
force_exclusion: true,
|
46
|
+
parallel: false,
|
47
|
+
todo_file: nil,
|
48
|
+
todo_ignore_files: []
|
49
|
+
}
|
50
|
+
def fork_config(path, text, format:)
|
51
|
+
options = if format
|
52
|
+
{stdin: text, autocorrect: true, formatters: [], safe_autocorrect: true}
|
37
53
|
else
|
38
|
-
{autocorrect: false, formatters: [["json"]],
|
54
|
+
{stdin: text, autocorrect: false, formatters: [["json"]], format: "json"}
|
39
55
|
end
|
40
|
-
Standard::Config.new(@
|
56
|
+
Standard::Config.new(@config.runner, [path], BASE_OPTIONS.merge(options), @config.rubocop_config_store)
|
41
57
|
end
|
42
58
|
|
43
59
|
def capture_rubocop_stdout(config)
|
44
60
|
redir = StringIO.new
|
45
61
|
$stdout = redir
|
46
|
-
@
|
62
|
+
@rubocop_runner.call(config)
|
47
63
|
redir.string
|
48
64
|
ensure
|
49
65
|
$stdout = STDOUT
|
@@ -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?
|
data/lib/standard/rubocop/ext.rb
CHANGED
@@ -13,4 +13,13 @@ module RuboCop
|
|
13
13
|
.gsub(" ", '\s*')
|
14
14
|
)
|
15
15
|
end
|
16
|
+
|
17
|
+
class CommentConfig
|
18
|
+
alias_method :old_initialize, :initialize
|
19
|
+
|
20
|
+
def initialize(processed_source)
|
21
|
+
old_initialize(processed_source)
|
22
|
+
@no_directives &&= !processed_source.raw_source.include?("standard")
|
23
|
+
end
|
24
|
+
end
|
16
25
|
end
|
@@ -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
|
|
data/lib/standard/runners/lsp.rb
CHANGED
@@ -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
|
data/lib/standard/version.rb
CHANGED
data/standard.gemspec
CHANGED
@@ -19,7 +19,7 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
20
20
|
spec.require_paths = ["lib"]
|
21
21
|
|
22
|
-
spec.add_dependency "rubocop", "1.
|
22
|
+
spec.add_dependency "rubocop", "1.44.1"
|
23
23
|
spec.add_dependency "rubocop-performance", "1.15.2"
|
24
24
|
|
25
25
|
# not semver: first three are lsp protocol version, last is patch
|
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.
|
4
|
+
version: 1.24.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Justin Searls
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-02-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rubocop
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - '='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 1.
|
19
|
+
version: 1.44.1
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - '='
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 1.
|
26
|
+
version: 1.44.1
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rubocop-performance
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -52,7 +52,7 @@ dependencies:
|
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: 3.17.0.2
|
55
|
-
description:
|
55
|
+
description:
|
56
56
|
email:
|
57
57
|
- searls@gmail.com
|
58
58
|
executables:
|
@@ -95,12 +95,16 @@ 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
|
101
102
|
- lib/standard/formatter.rb
|
102
103
|
- lib/standard/loads_runner.rb
|
103
104
|
- lib/standard/loads_yaml_config.rb
|
105
|
+
- lib/standard/lsp/kills_server.rb
|
106
|
+
- lib/standard/lsp/logger.rb
|
107
|
+
- lib/standard/lsp/routes.rb
|
104
108
|
- lib/standard/lsp/server.rb
|
105
109
|
- lib/standard/lsp/standardizer.rb
|
106
110
|
- lib/standard/merges_settings.rb
|
@@ -112,13 +116,14 @@ files:
|
|
112
116
|
- lib/standard/runners/help.rb
|
113
117
|
- lib/standard/runners/lsp.rb
|
114
118
|
- lib/standard/runners/rubocop.rb
|
119
|
+
- lib/standard/runners/verbose_version.rb
|
115
120
|
- lib/standard/runners/version.rb
|
116
121
|
- lib/standard/version.rb
|
117
122
|
- standard.gemspec
|
118
123
|
homepage: https://github.com/testdouble/standard
|
119
124
|
licenses: []
|
120
125
|
metadata: {}
|
121
|
-
post_install_message:
|
126
|
+
post_install_message:
|
122
127
|
rdoc_options: []
|
123
128
|
require_paths:
|
124
129
|
- lib
|
@@ -133,8 +138,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
133
138
|
- !ruby/object:Gem::Version
|
134
139
|
version: '0'
|
135
140
|
requirements: []
|
136
|
-
rubygems_version: 3.
|
137
|
-
signing_key:
|
141
|
+
rubygems_version: 3.3.26
|
142
|
+
signing_key:
|
138
143
|
specification_version: 4
|
139
144
|
summary: Ruby Style Guide, with linter & automatic code fixer
|
140
145
|
test_files: []
|