standard 1.37.0 → 1.39.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d2deb844275c075310374ee37f374dfb1ab31ded453dd65744a051c2b4c1139a
4
- data.tar.gz: 036bbabc58241f5edf1b18a0da1d47e36262b51c37a196298bc0ef4b5e5ba4e5
3
+ metadata.gz: b15a7085baa8421e82fec821f8562214b001cfe17bd6a02f7a061bc892f047fa
4
+ data.tar.gz: f67e28527faebd95dc452a57f8994523c11f2f3e5be6c28da458d374852c5f9e
5
5
  SHA512:
6
- metadata.gz: 2723bef6152debb628fd5f510f527296d30714c5e68bff12489b9af0ce6add2361c44911198dea8f764b5302ec24049f7da3671f15e033543f42427f951abe46
7
- data.tar.gz: 3804a98d3c95ae5a040380f2dff8b8aaf15431c95392a42563d1687c513e84d55e14337351d24222d301b89755443527b10b5ea2ed93ad2ee93f323c4188a36b
6
+ metadata.gz: d6040219e08da54f2ccfff731e787228e9226b20ba0380530513a41b0f29946eecf1503e41cd93e8f6beca3259258a713ad2f6815099325074a11ec2fcaf8915
7
+ data.tar.gz: 6749ee4c00f5cad2c52b774e96048f82769046a9527dccc6515e0ee75ed274987d72f11d6422407c747ceed15c8b9c12a884c94573657af07811d7f013889135
@@ -16,7 +16,11 @@ jobs:
16
16
  strategy:
17
17
  matrix:
18
18
  os: [ubuntu-latest]
19
- ruby-version: [2.7, '3.0', 3.1, 3.2, 3.3]
19
+ ruby-version:
20
+ - '3.0'
21
+ - '3.1'
22
+ - '3.2'
23
+ - '3.3'
20
24
 
21
25
  runs-on: ${{ matrix.os }}
22
26
 
data/.standard.yml CHANGED
@@ -1,4 +1,4 @@
1
- ruby_version: 2.6
1
+ ruby_version: 3.0
2
2
  ignore:
3
3
  - tmp/**/*
4
4
  - test/fixture/**/*
data/CHANGELOG.md CHANGED
@@ -1,5 +1,22 @@
1
1
  # Changelog
2
2
 
3
+ ## Unreleased
4
+
5
+ ## 1.39.0
6
+
7
+ * Add support for LSP Code Actions / Quick Fix under Ruby LSP [#636](https://github.com/standardrb/standard/pull/636)
8
+
9
+ ## 1.38.0
10
+
11
+ * Update minimum Ruby version to 3.0
12
+ * @koic backported a line column bug in our LSP
13
+ [#635](https://github.com/standardrb/standard/pull/635)
14
+ * Implement a basic [Ruby LSP
15
+ add-on](https://github.com/Shopify/ruby-lsp/blob/main/ADDONS.md), which means
16
+ users would no longer need to install [our custom VS Code
17
+ extension](https://marketplace.visualstudio.com/items?itemName=testdouble.vscode-standard-ruby)
18
+ [#630](https://github.com/standardrb/standard/pull/630)
19
+
3
20
  ## 1.37.0
4
21
 
5
22
  * Updates rubocop to [1.64.1](https://github.com/rubocop/rubocop/releases/tag/v1.64.1)
data/Gemfile CHANGED
@@ -6,6 +6,8 @@ gem "bundler"
6
6
  gem "minitest", "~> 5.0"
7
7
  gem "rake", "~> 13.0"
8
8
  gem "m"
9
+ gem "mutex_m"
10
+ gem "ruby-lsp"
9
11
 
10
12
  # You may want to run these off path locally:
11
13
  # gem "lint_roller", path: "../lint_roller"
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- standard (1.37.0)
4
+ standard (1.39.0)
5
5
  language_server-protocol (~> 3.17.0.2)
6
6
  lint_roller (~> 1.0)
7
7
  rubocop (~> 1.64.0)
@@ -21,10 +21,12 @@ GEM
21
21
  rake (>= 0.9.2.2)
22
22
  method_source (1.0.0)
23
23
  minitest (5.20.0)
24
+ mutex_m (0.2.0)
24
25
  parallel (1.23.0)
25
26
  parser (3.3.0.5)
26
27
  ast (~> 2.4.1)
27
28
  racc
29
+ prism (0.27.0)
28
30
  racc (1.7.1)
29
31
  rainbow (3.1.1)
30
32
  rake (13.0.6)
@@ -46,6 +48,10 @@ GEM
46
48
  rubocop-performance (1.21.0)
47
49
  rubocop (>= 1.48.1, < 2.0)
48
50
  rubocop-ast (>= 1.31.1, < 2.0)
51
+ ruby-lsp (0.16.6)
52
+ language_server-protocol (~> 3.17.0)
53
+ prism (>= 0.23.0, < 0.28)
54
+ sorbet-runtime (>= 0.5.10782)
49
55
  ruby-progressbar (1.13.0)
50
56
  simplecov (0.22.0)
51
57
  docile (~> 1.1)
@@ -53,6 +59,7 @@ GEM
53
59
  simplecov_json_formatter (~> 0.1)
54
60
  simplecov-html (0.12.3)
55
61
  simplecov_json_formatter (0.1.4)
62
+ sorbet-runtime (0.5.11385)
56
63
  standard-custom (1.0.2)
57
64
  lint_roller (~> 1.0)
58
65
  rubocop (~> 1.50)
@@ -69,7 +76,9 @@ DEPENDENCIES
69
76
  bundler
70
77
  m
71
78
  minitest (~> 5.0)
79
+ mutex_m
72
80
  rake (~> 13.0)
81
+ ruby-lsp
73
82
  simplecov
74
83
  standard!
75
84
 
data/config/default.yml CHANGED
@@ -1,6 +1,5 @@
1
1
  AllCops:
2
- # Prevent RuboCop from exploding when it finds an older-than-2.6 .ruby-version
3
- TargetRubyVersion: 2.6
2
+ TargetRubyVersion: 3.0
4
3
  Exclude: []
5
4
  DisabledByDefault: true
6
5
  StyleGuideBaseURL: https://github.com/standardrb/standard
data/config/ruby-3.2.yml CHANGED
@@ -1,4 +1,4 @@
1
- inherit_from: ./base.yml
1
+ inherit_from: ./ruby-3.3.yml
2
2
 
3
3
  AllCops:
4
4
  TargetRubyVersion: 3.2
@@ -0,0 +1,4 @@
1
+ inherit_from: ./base.yml
2
+
3
+ AllCops:
4
+ TargetRubyVersion: 3.3
@@ -0,0 +1,58 @@
1
+ require "standard"
2
+ require_relative "wraps_built_in_lsp_standardizer"
3
+
4
+ module RubyLsp
5
+ module Standard
6
+ class Addon < ::RubyLsp::Addon
7
+ def name
8
+ "Standard Ruby"
9
+ end
10
+
11
+ def activate(global_state, message_queue)
12
+ @logger = ::Standard::Lsp::Logger.new(prefix: "[Standard Ruby]")
13
+ @logger.puts "Activating Standard Ruby LSP addon v#{::Standard::VERSION}"
14
+ RuboCop::LSP.enable
15
+ @wraps_built_in_lsp_standardizer = WrapsBuiltinLspStandardizer.new
16
+ global_state.register_formatter("standard", @wraps_built_in_lsp_standardizer)
17
+ register_additional_file_watchers(global_state, message_queue)
18
+ @logger.puts "Initialized Standard Ruby LSP addon #{::Standard::VERSION}"
19
+ end
20
+
21
+ def deactivate
22
+ @wraps_built_in_lsp_standardizer = nil
23
+ end
24
+
25
+ def register_additional_file_watchers(global_state, message_queue)
26
+ return unless global_state.supports_watching_files
27
+
28
+ message_queue << Request.new(
29
+ id: "standard-file-watcher",
30
+ method: "client/registerCapability",
31
+ params: Interface::RegistrationParams.new(
32
+ registrations: [
33
+ Interface::Registration.new(
34
+ id: "workspace/didChangeWatchedFilesStandard",
35
+ method: "workspace/didChangeWatchedFiles",
36
+ register_options: Interface::DidChangeWatchedFilesRegistrationOptions.new(
37
+ watchers: [
38
+ Interface::FileSystemWatcher.new(
39
+ glob_pattern: "**/.standard.yml",
40
+ kind: Constant::WatchKind::CREATE | Constant::WatchKind::CHANGE | Constant::WatchKind::DELETE
41
+ )
42
+ ]
43
+ )
44
+ )
45
+ ]
46
+ )
47
+ )
48
+ end
49
+
50
+ def workspace_did_change_watched_files(changes)
51
+ if changes.any? { |change| change[:uri].end_with?(".standard.yml") }
52
+ @wraps_built_in_lsp_standardizer.init!
53
+ @logger.puts "Re-initialized Standard Ruby LSP addon #{::Standard::VERSION} due to .standard.yml file change"
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,36 @@
1
+ module RubyLsp
2
+ module Standard
3
+ class WrapsBuiltinLspStandardizer
4
+ include RubyLsp::Requests::Support::Formatter
5
+ def initialize
6
+ init!
7
+ end
8
+
9
+ def init!
10
+ @standardizer = ::Standard::Lsp::Standardizer.new(
11
+ ::Standard::BuildsConfig.new.call([])
12
+ )
13
+ end
14
+
15
+ def run_formatting(uri, document)
16
+ @standardizer.format(uri_to_path(uri), document.source)
17
+ end
18
+
19
+ def run_diagnostic(uri, document)
20
+ @standardizer.offenses(uri_to_path(uri), document.source, document.encoding)
21
+ end
22
+
23
+ private
24
+
25
+ # duplicated from: lib/standard/lsp/routes.rb
26
+ # modified to incorporate Ruby LSP's to_standardized_path method
27
+ def uri_to_path(uri)
28
+ if uri.respond_to?(:to_standardized_path) && !(standardized_path = uri.to_standardized_path).nil?
29
+ standardized_path
30
+ else
31
+ uri.to_s.sub(%r{^file://}, "")
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -57,6 +57,8 @@ module Standard::Base
57
57
  "ruby-3.1.yml"
58
58
  elsif desired_version < Gem::Version.new("3.3")
59
59
  "ruby-3.2.yml"
60
+ elsif desired_version < Gem::Version.new("3.4")
61
+ "ruby-3.3.yml"
60
62
  else
61
63
  default
62
64
  end
@@ -0,0 +1,168 @@
1
+ module Standard
2
+ module Lsp
3
+ class Diagnostic
4
+ Constant = LanguageServer::Protocol::Constant
5
+ Interface = LanguageServer::Protocol::Interface
6
+
7
+ RUBOCOP_TO_LSP_SEVERITY = {
8
+ info: Constant::DiagnosticSeverity::HINT,
9
+ refactor: Constant::DiagnosticSeverity::INFORMATION,
10
+ convention: Constant::DiagnosticSeverity::INFORMATION,
11
+ warning: Constant::DiagnosticSeverity::WARNING,
12
+ error: Constant::DiagnosticSeverity::ERROR,
13
+ fatal: Constant::DiagnosticSeverity::ERROR
14
+ }.freeze
15
+
16
+ def initialize(document_encoding, offense, uri, cop_class)
17
+ @document_encoding = document_encoding
18
+ @offense = offense
19
+ @uri = uri
20
+ @cop_class = cop_class
21
+ end
22
+
23
+ def to_lsp_code_actions
24
+ code_actions = []
25
+
26
+ code_actions << autocorrect_action if correctable?
27
+ code_actions << disable_line_action
28
+
29
+ code_actions
30
+ end
31
+
32
+ def to_lsp_diagnostic(config)
33
+ highlighted = @offense.highlighted_area
34
+ Interface::Diagnostic.new(
35
+ message: message,
36
+ source: "Standard Ruby",
37
+ code: @offense.cop_name,
38
+ code_description: code_description(config),
39
+ severity: severity,
40
+ range: Interface::Range.new(
41
+ start: Interface::Position.new(
42
+ line: @offense.line - 1,
43
+ character: highlighted.begin_pos
44
+ ),
45
+ end: Interface::Position.new(
46
+ line: @offense.line - 1,
47
+ character: highlighted.end_pos
48
+ )
49
+ ),
50
+ data: {
51
+ correctable: correctable?,
52
+ code_actions: to_lsp_code_actions
53
+ }
54
+ )
55
+ end
56
+
57
+ private
58
+
59
+ def message
60
+ message = @offense.message
61
+ message += "\n\nThis offense is not auto-correctable.\n" unless correctable?
62
+ message
63
+ end
64
+
65
+ def severity
66
+ RUBOCOP_TO_LSP_SEVERITY[@offense.severity.name]
67
+ end
68
+
69
+ def code_description(config)
70
+ return unless @cop_class
71
+
72
+ if (doc_url = @cop_class.documentation_url(config))
73
+ Interface::CodeDescription.new(href: doc_url)
74
+ end
75
+ end
76
+
77
+ def autocorrect_action
78
+ Interface::CodeAction.new(
79
+ title: "Autocorrect #{@offense.cop_name}",
80
+ kind: Constant::CodeActionKind::QUICK_FIX,
81
+ edit: Interface::WorkspaceEdit.new(
82
+ document_changes: [
83
+ Interface::TextDocumentEdit.new(
84
+ text_document: Interface::OptionalVersionedTextDocumentIdentifier.new(
85
+ uri: @uri.to_s,
86
+ version: nil
87
+ ),
88
+ edits: correctable? ? offense_replacements : []
89
+ )
90
+ ]
91
+ ),
92
+ is_preferred: true
93
+ )
94
+ end
95
+
96
+ def offense_replacements
97
+ @offense.corrector.as_replacements.map do |range, replacement|
98
+ Interface::TextEdit.new(
99
+ range: Interface::Range.new(
100
+ start: Interface::Position.new(line: range.line - 1, character: range.column),
101
+ end: Interface::Position.new(line: range.last_line - 1, character: range.last_column)
102
+ ),
103
+ new_text: replacement
104
+ )
105
+ end
106
+ end
107
+
108
+ def disable_line_action
109
+ Interface::CodeAction.new(
110
+ title: "Disable #{@offense.cop_name} for this line",
111
+ kind: Constant::CodeActionKind::QUICK_FIX,
112
+ edit: Interface::WorkspaceEdit.new(
113
+ document_changes: [
114
+ Interface::TextDocumentEdit.new(
115
+ text_document: Interface::OptionalVersionedTextDocumentIdentifier.new(
116
+ uri: @uri.to_s,
117
+ version: nil
118
+ ),
119
+ edits: line_disable_comment
120
+ )
121
+ ]
122
+ )
123
+ )
124
+ end
125
+
126
+ def line_disable_comment
127
+ new_text = if @offense.source_line.include?(" # standard:disable ")
128
+ ",#{@offense.cop_name}"
129
+ else
130
+ " # standard:disable #{@offense.cop_name}"
131
+ end
132
+
133
+ eol = Interface::Position.new(
134
+ line: @offense.line - 1,
135
+ character: length_of_line(@offense.source_line)
136
+ )
137
+
138
+ # TODO: fails for multiline strings - may be preferable to use block
139
+ # comments to disable some offenses
140
+ inline_comment = Interface::TextEdit.new(
141
+ range: Interface::Range.new(start: eol, end: eol),
142
+ new_text: new_text
143
+ )
144
+
145
+ [inline_comment]
146
+ end
147
+
148
+ def length_of_line(line)
149
+ if @document_encoding == Encoding::UTF_16LE
150
+ line_length = 0
151
+ line.codepoints.each do |codepoint|
152
+ line_length += 1
153
+ if codepoint > RubyLsp::Document::Scanner::SURROGATE_PAIR_START
154
+ line_length += 1
155
+ end
156
+ end
157
+ line_length
158
+ else
159
+ line.length
160
+ end
161
+ end
162
+
163
+ def correctable?
164
+ !@offense.corrector.nil?
165
+ end
166
+ end
167
+ end
168
+ end
@@ -1,12 +1,13 @@
1
1
  module Standard
2
2
  module Lsp
3
3
  class Logger
4
- def initialize
4
+ def initialize(prefix: "[server]")
5
+ @prefix = prefix
5
6
  @puts_onces = []
6
7
  end
7
8
 
8
9
  def puts(message)
9
- warn("[server] #{message}")
10
+ warn [@prefix, message].compact.join(" ")
10
11
  end
11
12
 
12
13
  def puts_once(message)
@@ -154,45 +154,12 @@ module Standard
154
154
 
155
155
  def diagnostic(file_uri, text)
156
156
  @text_cache[file_uri] = text
157
- offenses = @standardizer.offenses(uri_to_path(file_uri), text)
158
-
159
- lsp_diagnostics = offenses.map { |o|
160
- code = o[:cop_name]
161
-
162
- msg = o[:message].delete_prefix(code)
163
- loc = o[:location]
164
-
165
- severity = case o[:severity]
166
- when "error", "fatal"
167
- SEV::ERROR
168
- when "warning"
169
- SEV::WARNING
170
- when "convention"
171
- SEV::INFORMATION
172
- when "refactor", "info"
173
- SEV::HINT
174
- else # the above cases fully cover what RuboCop sends at this time
175
- logger.puts "Unknown severity: #{severity.inspect}"
176
- SEV::HINT
177
- end
178
-
179
- {
180
- code: code,
181
- message: msg,
182
- range: {
183
- start: {character: loc[:start_column] - 1, line: loc[:start_line] - 1},
184
- end: {character: loc[:last_column] - 1, line: loc[:last_line] - 1}
185
- },
186
- severity: severity,
187
- source: "standard"
188
- }
189
- }
190
157
 
191
158
  {
192
159
  method: "textDocument/publishDiagnostics",
193
160
  params: {
194
161
  uri: file_uri,
195
- diagnostics: lsp_diagnostics
162
+ diagnostics: @standardizer.offenses(uri_to_path(file_uri), text)
196
163
  }
197
164
  }
198
165
  end
@@ -13,11 +13,12 @@ module Standard
13
13
  @writer = Proto::Transport::Io::Writer.new($stdout)
14
14
  @reader = Proto::Transport::Io::Reader.new($stdin)
15
15
  @logger = Logger.new
16
- @standardizer = Standard::Lsp::Standardizer.new(config, @logger)
16
+ @standardizer = Standard::Lsp::Standardizer.new(config)
17
17
  @routes = Routes.new(@writer, @logger, @standardizer)
18
18
  end
19
19
 
20
20
  def start
21
+ RuboCop::LSP.enable
21
22
  @reader.read do |request|
22
23
  if !request.key?(:method)
23
24
  @routes.handle_method_missing(request)
@@ -1,68 +1,33 @@
1
- require_relative "../runners/rubocop"
1
+ require_relative "stdin_rubocop_runner"
2
+ require_relative "diagnostic"
2
3
 
3
4
  module Standard
4
5
  module Lsp
5
6
  class Standardizer
6
- def initialize(config, logger)
7
- @config = config
8
- @logger = logger
9
- @rubocop_runner = Standard::Runners::Rubocop.new
7
+ def initialize(config)
8
+ @diagnostic_runner = ::Standard::Lsp::StdinRubocopRunner.new(config)
9
+ @format_runner = ::Standard::Lsp::StdinRubocopRunner.new(config.dup.tap { |c|
10
+ c.rubocop_options[:autocorrect] = true
11
+ })
12
+ @cop_registry = RuboCop::Cop::Registry.global.to_h
10
13
  end
11
14
 
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
15
  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]
16
+ @format_runner.run(path, text)
17
+ @format_runner.formatted_source
27
18
  end
28
19
 
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
40
- end
41
-
42
- private
20
+ def offenses(path, text, document_encoding = nil)
21
+ @diagnostic_runner.run(path, text)
43
22
 
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, safe_autocorrect: true, formatters: []}
53
- else
54
- {stdin: text, autocorrect: false, safe_autocorrect: false, formatters: [["json"]], format: "json"}
23
+ @diagnostic_runner.offenses.map do |offense|
24
+ Diagnostic.new(
25
+ document_encoding,
26
+ offense,
27
+ path,
28
+ @cop_registry[offense.cop_name]&.first
29
+ ).to_lsp_diagnostic(@diagnostic_runner.config_for_working_directory)
55
30
  end
56
- Standard::Config.new(@config.runner, [path], BASE_OPTIONS.merge(options), @config.rubocop_config_store)
57
- end
58
-
59
- def capture_rubocop_stdout(config)
60
- redir = StringIO.new
61
- $stdout = redir
62
- @rubocop_runner.call(config)
63
- redir.string
64
- ensure
65
- $stdout = STDOUT
66
31
  end
67
32
  end
68
33
  end
@@ -0,0 +1,61 @@
1
+ module Standard
2
+ module Lsp
3
+ # Originally lifted from:
4
+ # https://github.com/Shopify/ruby-lsp/blob/8d4c17efce4e8ecc8e7c557ab2981db6b22c0b6d/lib/ruby_lsp/requests/support/rubocop_runner.rb#L20
5
+ class StdinRubocopRunner < ::RuboCop::Runner
6
+ class ConfigurationError < StandardError; end
7
+
8
+ attr_reader :offenses
9
+
10
+ attr_reader :config_for_working_directory
11
+
12
+ DEFAULT_RUBOCOP_OPTIONS = {
13
+ stderr: true,
14
+ force_exclusion: true,
15
+ format: "RuboCop::Formatter::BaseFormatter",
16
+ raise_cop_error: true
17
+ }.freeze
18
+
19
+ def initialize(config)
20
+ @options = {}
21
+ @offenses = []
22
+ @errors = []
23
+ @warnings = []
24
+
25
+ @config_for_working_directory = config.rubocop_config_store.for_pwd
26
+
27
+ super(
28
+ config.rubocop_options.merge(DEFAULT_RUBOCOP_OPTIONS),
29
+ config.rubocop_config_store
30
+ )
31
+ end
32
+
33
+ def run(path, contents)
34
+ @errors = []
35
+ @warnings = []
36
+ @offenses = []
37
+ @options[:stdin] = contents
38
+
39
+ super([path])
40
+
41
+ raise Interrupt if aborting?
42
+ rescue ::RuboCop::Runner::InfiniteCorrectionLoop => error
43
+ raise RubyLsp::Requests::Formatting::Erro, error.message
44
+ rescue ::RuboCop::ValidationError => error
45
+ raise ConfigurationError, error.message
46
+ rescue => error
47
+ raise ::RubyLsp::Requests::Support::InternalRuboCopError, error
48
+ end
49
+
50
+ def formatted_source
51
+ @options[:stdin]
52
+ end
53
+
54
+ private
55
+
56
+ def file_finished(_file, offenses)
57
+ @offenses = offenses
58
+ end
59
+ end
60
+ end
61
+ end
@@ -154,7 +154,7 @@ module Standard
154
154
  end
155
155
 
156
156
  def except(hash_or_config, keys)
157
- hash_or_config.to_h.reject { |key, _| keys.include?(key) }.to_h
157
+ hash_or_config.to_h.except(*keys).to_h
158
158
  end
159
159
 
160
160
  # Always deletes nil entries, always overwrites arrays
@@ -1,3 +1,3 @@
1
1
  module Standard
2
- VERSION = Gem::Version.new("1.37.0")
2
+ VERSION = Gem::Version.new("1.39.0")
3
3
  end
data/standard.gemspec CHANGED
@@ -7,7 +7,7 @@ Gem::Specification.new do |spec|
7
7
  spec.version = Standard::VERSION
8
8
  spec.authors = ["Justin Searls"]
9
9
  spec.email = ["searls@gmail.com"]
10
- spec.required_ruby_version = ">= 2.6.0"
10
+ spec.required_ruby_version = ">= 3.0.0"
11
11
 
12
12
  spec.summary = "Ruby Style Guide, with linter & automatic code fixer"
13
13
  spec.homepage = "https://github.com/standardrb/standard"
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.37.0
4
+ version: 1.39.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: 2024-06-11 00:00:00.000000000 Z
11
+ date: 2024-06-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rubocop
@@ -117,11 +117,14 @@ files:
117
117
  - config/ruby-3.0.yml
118
118
  - config/ruby-3.1.yml
119
119
  - config/ruby-3.2.yml
120
+ - config/ruby-3.3.yml
120
121
  - docs/ARCHITECTURE.md
121
122
  - docs/NEW_RUBIES.md
122
123
  - docs/RELEASE.md
123
124
  - docs/UPGRADING.md
124
125
  - exe/standardrb
126
+ - lib/ruby_lsp/standard/addon.rb
127
+ - lib/ruby_lsp/standard/wraps_built_in_lsp_standardizer.rb
125
128
  - lib/standard.rb
126
129
  - lib/standard/base.rb
127
130
  - lib/standard/base/plugin.rb
@@ -136,11 +139,13 @@ files:
136
139
  - lib/standard/formatter.rb
137
140
  - lib/standard/loads_runner.rb
138
141
  - lib/standard/loads_yaml_config.rb
142
+ - lib/standard/lsp/diagnostic.rb
139
143
  - lib/standard/lsp/kills_server.rb
140
144
  - lib/standard/lsp/logger.rb
141
145
  - lib/standard/lsp/routes.rb
142
146
  - lib/standard/lsp/server.rb
143
147
  - lib/standard/lsp/standardizer.rb
148
+ - lib/standard/lsp/stdin_rubocop_runner.rb
144
149
  - lib/standard/merges_settings.rb
145
150
  - lib/standard/plugin.rb
146
151
  - lib/standard/plugin/combines_plugin_configs.rb
@@ -176,14 +181,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
176
181
  requirements:
177
182
  - - ">="
178
183
  - !ruby/object:Gem::Version
179
- version: 2.6.0
184
+ version: 3.0.0
180
185
  required_rubygems_version: !ruby/object:Gem::Requirement
181
186
  requirements:
182
187
  - - ">="
183
188
  - !ruby/object:Gem::Version
184
189
  version: '0'
185
190
  requirements: []
186
- rubygems_version: 3.1.6
191
+ rubygems_version: 3.5.9
187
192
  signing_key:
188
193
  specification_version: 4
189
194
  summary: Ruby Style Guide, with linter & automatic code fixer