ruby-lsp-rails 0.3.16 → 0.3.17
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +5 -5
- data/lib/ruby_lsp/ruby_lsp_rails/addon.rb +22 -5
- data/lib/ruby_lsp/ruby_lsp_rails/code_lens.rb +5 -1
- data/lib/ruby_lsp/ruby_lsp_rails/indexing_enhancement.rb +2 -0
- data/lib/ruby_lsp/ruby_lsp_rails/runner_client.rb +8 -0
- data/lib/ruby_lsp/ruby_lsp_rails/server.rb +52 -0
- data/lib/ruby_lsp_rails/version.rb +1 -1
- metadata +8 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ba36df033667789339419a3ed19740d35ad9b91a3463cf2438bd390c4580aeb4
|
4
|
+
data.tar.gz: 7aa58db6217944f945ca3bb9bcdefeb4f018759acf8673e222ae8fb3b5c523ee
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a4ddf589e0065c32ee9087a4cfd0347d4e3dbdf5d1d667f1ca6a440ac1c6b2d1c18f41acfa2264f72114ecc4bfafec4c3c40748a3f6639a80c86093ca8e51cef
|
7
|
+
data.tar.gz: 2dbb86bd0f701865f3d833fb13079cfd9bd27310cdca2410664c7112db73e9915c9b633de1f527220a64055d3956009a738c367c956c3c08cd5c3ae71e04d7f1
|
data/README.md
CHANGED
@@ -1,20 +1,20 @@
|
|
1
1
|
[![Ruby DX Slack](https://img.shields.io/badge/Slack-Ruby%20DX-success?logo=slack)](https://join.slack.com/t/ruby-dx/shared_invite/zt-2c8zjlir6-uUDJl8oIwcen_FS_aA~b6Q)
|
2
2
|
|
3
|
-
# Rails
|
3
|
+
# Rails add-on
|
4
4
|
|
5
|
-
The Rails
|
5
|
+
The Rails add-on is a [Ruby LSP](https://github.com/Shopify/ruby-lsp) [add-on](https://shopify.github.io/ruby-lsp/add-ons.html) for extra [Rails editor features](https://shopify.github.io/ruby-lsp/rails-add-on.html).
|
6
6
|
|
7
7
|
## Installation
|
8
8
|
|
9
9
|
If you haven't already done so, you'll need to first [set up Ruby LSP](https://shopify.github.io/ruby-lsp/#usage).
|
10
10
|
|
11
|
-
As of v0.3.0, Ruby LSP will automatically include the Ruby LSP Rails
|
11
|
+
As of v0.3.0, Ruby LSP will automatically include the Ruby LSP Rails add-on in its custom bundle when a Rails app is detected.
|
12
12
|
There is no need to add the gem to your bundle.
|
13
13
|
|
14
14
|
## Documentation
|
15
15
|
|
16
|
-
See the [documentation](https://shopify.github.io/ruby-lsp/rails-
|
17
|
-
[supported features](https://shopify.github.io/ruby-lsp/rails-
|
16
|
+
See the [documentation](https://shopify.github.io/ruby-lsp/rails-add-on.html) for more in-depth details about the
|
17
|
+
[supported features](https://shopify.github.io/ruby-lsp/rails-add-on.html#features).
|
18
18
|
|
19
19
|
## Contributing
|
20
20
|
|
@@ -28,20 +28,32 @@ module RubyLsp
|
|
28
28
|
# the real client is initialized, features that depend on it will not be blocked by using the NullClient
|
29
29
|
@rails_runner_client = T.let(NullClient.new, RunnerClient)
|
30
30
|
@global_state = T.let(nil, T.nilable(GlobalState))
|
31
|
+
@addon_mutex = T.let(Mutex.new, Mutex)
|
32
|
+
@client_mutex = T.let(Mutex.new, Mutex)
|
33
|
+
@client_mutex.lock
|
34
|
+
|
35
|
+
Thread.new do
|
36
|
+
@addon_mutex.synchronize do
|
37
|
+
# We need to ensure the Rails client is fully loaded before we activate the server addons
|
38
|
+
@client_mutex.synchronize { @rails_runner_client = RunnerClient.create_client }
|
39
|
+
end
|
40
|
+
end
|
31
41
|
end
|
32
42
|
|
33
43
|
sig { returns(RunnerClient) }
|
34
|
-
|
44
|
+
def rails_runner_client
|
45
|
+
@addon_mutex.synchronize { @rails_runner_client }
|
46
|
+
end
|
35
47
|
|
36
48
|
sig { override.params(global_state: GlobalState, message_queue: Thread::Queue).void }
|
37
49
|
def activate(global_state, message_queue)
|
38
50
|
@global_state = global_state
|
39
|
-
$stderr.puts("Activating Ruby LSP Rails
|
40
|
-
# Start booting the real client in a background thread. Until this completes, the client will be a NullClient
|
41
|
-
Thread.new { @rails_runner_client = RunnerClient.create_client }
|
51
|
+
$stderr.puts("Activating Ruby LSP Rails add-on v#{version}")
|
42
52
|
register_additional_file_watchers(global_state: global_state, message_queue: message_queue)
|
43
|
-
|
44
53
|
@global_state.index.register_enhancement(IndexingEnhancement.new)
|
54
|
+
|
55
|
+
# Start booting the real client in a background thread. Until this completes, the client will be a NullClient
|
56
|
+
@client_mutex.unlock
|
45
57
|
end
|
46
58
|
|
47
59
|
sig { override.void }
|
@@ -49,6 +61,11 @@ module RubyLsp
|
|
49
61
|
@rails_runner_client.shutdown
|
50
62
|
end
|
51
63
|
|
64
|
+
sig { override.returns(String) }
|
65
|
+
def version
|
66
|
+
VERSION
|
67
|
+
end
|
68
|
+
|
52
69
|
# Creates a new CodeLens listener. This method is invoked on every CodeLens request
|
53
70
|
sig do
|
54
71
|
override.params(
|
@@ -198,9 +198,13 @@ module RubyLsp
|
|
198
198
|
.gsub("::", "/")
|
199
199
|
.downcase
|
200
200
|
|
201
|
-
view_uris = Dir.glob("#{@client.rails_root}/app/views/#{controller_name}/#{action_name}*").
|
201
|
+
view_uris = Dir.glob("#{@client.rails_root}/app/views/#{controller_name}/#{action_name}*").filter_map do |path|
|
202
|
+
# it's possible we could have a directory with the same name as the action, so we need to skip those
|
203
|
+
next if File.directory?(path)
|
204
|
+
|
202
205
|
URI::Generic.from_path(path: path).to_s
|
203
206
|
end
|
207
|
+
|
204
208
|
return if view_uris.empty?
|
205
209
|
|
206
210
|
@response_builder << create_code_lens(
|
@@ -60,6 +60,7 @@ module RubyLsp
|
|
60
60
|
name_arg.location,
|
61
61
|
name_arg.location,
|
62
62
|
nil,
|
63
|
+
index.configuration.encoding,
|
63
64
|
[RubyIndexer::Entry::Signature.new([])],
|
64
65
|
RubyIndexer::Entry::Visibility::PUBLIC,
|
65
66
|
owner,
|
@@ -72,6 +73,7 @@ module RubyLsp
|
|
72
73
|
name_arg.location,
|
73
74
|
name_arg.location,
|
74
75
|
nil,
|
76
|
+
index.configuration.encoding,
|
75
77
|
[RubyIndexer::Entry::Signature.new([RubyIndexer::Entry::RequiredParameter.new(name: name.to_sym)])],
|
76
78
|
RubyIndexer::Entry::Visibility::PUBLIC,
|
77
79
|
owner,
|
@@ -96,6 +96,14 @@ module RubyLsp
|
|
96
96
|
raise InitializationError, @stderr.read
|
97
97
|
end
|
98
98
|
|
99
|
+
sig { params(server_addon_path: String).void }
|
100
|
+
def register_server_addon(server_addon_path)
|
101
|
+
send_notification("server_addon/register", server_addon_path: server_addon_path)
|
102
|
+
rescue IncompleteMessageError
|
103
|
+
$stderr.puts("Ruby LSP Rails failed to register server addon #{server_addon_path}")
|
104
|
+
nil
|
105
|
+
end
|
106
|
+
|
99
107
|
sig { params(name: String).returns(T.nilable(T::Hash[Symbol, T.untyped])) }
|
100
108
|
def model(name)
|
101
109
|
make_request("model", name: name)
|
@@ -8,6 +8,51 @@ require "json"
|
|
8
8
|
|
9
9
|
module RubyLsp
|
10
10
|
module Rails
|
11
|
+
class ServerAddon
|
12
|
+
@server_addon_classes = []
|
13
|
+
@server_addons = {}
|
14
|
+
|
15
|
+
class << self
|
16
|
+
# We keep track of runtime server add-ons the same way we track other add-ons, by storing classes that inherit
|
17
|
+
# from the base one
|
18
|
+
def inherited(child)
|
19
|
+
@server_addon_classes << child
|
20
|
+
super
|
21
|
+
end
|
22
|
+
|
23
|
+
# Delegate `request` with `params` to the server add-on with the given `name`
|
24
|
+
def delegate(name, request, params)
|
25
|
+
@server_addons[name]&.execute(request, params)
|
26
|
+
end
|
27
|
+
|
28
|
+
# Instantiate all server addons and store them in a hash for easy access after we have discovered the classes
|
29
|
+
def finalize_registrations!(stdout)
|
30
|
+
until @server_addon_classes.empty?
|
31
|
+
addon = @server_addon_classes.shift.new(stdout)
|
32
|
+
@server_addons[addon.name] = addon
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def initialize(stdout)
|
38
|
+
@stdout = stdout
|
39
|
+
end
|
40
|
+
|
41
|
+
# Write a response back. Can be used for sending notifications to the editor
|
42
|
+
def write_response(response)
|
43
|
+
json_response = response.to_json
|
44
|
+
@stdout.write("Content-Length: #{json_response.length}\r\n\r\n#{json_response}")
|
45
|
+
end
|
46
|
+
|
47
|
+
def name
|
48
|
+
raise NotImplementedError, "Not implemented!"
|
49
|
+
end
|
50
|
+
|
51
|
+
def execute(request, params)
|
52
|
+
raise NotImplementedError, "Not implemented!"
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
11
56
|
class Server
|
12
57
|
def initialize(stdout: $stdout, override_default_output_device: true)
|
13
58
|
# Grab references to the original pipes so that we can change the default output device further down
|
@@ -60,6 +105,13 @@ module RubyLsp
|
|
60
105
|
write_response(route_location(params.fetch(:name)))
|
61
106
|
when "route_info"
|
62
107
|
write_response(resolve_route_info(params))
|
108
|
+
when "server_addon/register"
|
109
|
+
require params[:server_addon_path]
|
110
|
+
ServerAddon.finalize_registrations!(@stdout)
|
111
|
+
when "server_addon/delegate"
|
112
|
+
server_addon_name = params.delete(:server_addon_name)
|
113
|
+
request_name = params.delete(:request_name)
|
114
|
+
ServerAddon.delegate(server_addon_name, request_name, params)
|
63
115
|
end
|
64
116
|
rescue => e
|
65
117
|
write_response({ error: e.full_message(highlight: false) })
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-lsp-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.17
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shopify
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-10-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ruby-lsp
|
@@ -16,20 +16,20 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.
|
19
|
+
version: 0.19.0
|
20
20
|
- - "<"
|
21
21
|
- !ruby/object:Gem::Version
|
22
|
-
version: 0.
|
22
|
+
version: 0.20.0
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
26
26
|
requirements:
|
27
27
|
- - ">="
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version: 0.
|
29
|
+
version: 0.19.0
|
30
30
|
- - "<"
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
version: 0.
|
32
|
+
version: 0.20.0
|
33
33
|
description: A Ruby LSP addon that adds extra editor functionality for Rails applications
|
34
34
|
email:
|
35
35
|
- ruby@shopify.com
|
@@ -65,7 +65,7 @@ metadata:
|
|
65
65
|
homepage_uri: https://github.com/Shopify/ruby-lsp-rails
|
66
66
|
source_code_uri: https://github.com/Shopify/ruby-lsp-rails
|
67
67
|
changelog_uri: https://github.com/Shopify/ruby-lsp-rails/releases
|
68
|
-
documentation_uri: https://shopify.github.io/ruby-lsp/rails-
|
68
|
+
documentation_uri: https://shopify.github.io/ruby-lsp/rails-add-on.html
|
69
69
|
post_install_message:
|
70
70
|
rdoc_options: []
|
71
71
|
require_paths:
|
@@ -81,7 +81,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
83
|
requirements: []
|
84
|
-
rubygems_version: 3.5.
|
84
|
+
rubygems_version: 3.5.20
|
85
85
|
signing_key:
|
86
86
|
specification_version: 4
|
87
87
|
summary: A Ruby LSP addon for Rails
|