ruby-lsp-rails 0.2.6 → 0.2.8

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: 70557479de3e98dce68fda3bf76ee6ee6a547ee2d123b7e26bf687306bdd1879
4
- data.tar.gz: 1c4560bc452b582ef4c40f793977ef4854cb4e8877bbd3850dbc1aa34b9e4f4a
3
+ metadata.gz: c3d8b40085e6c7ca1e23283423a0966da489180e36e4fb50415f41b1a37f5294
4
+ data.tar.gz: e98455cb80f6c386e9aa1c3fa516a29cbf0027826aed8c5af029cc1de61aaa05
5
5
  SHA512:
6
- metadata.gz: 01c4c4e000f1d0fb7996ed31a9474bc36a0ddabebdfe3d71dc276572172f0421be818037fb5d001bb77a8bd48cfd58466d1c3431595b8aad071466011f4e4d02
7
- data.tar.gz: 937340398445803a2413513a739c771bc9e21ae41813bd5529c3c68c654a2714803a0a9cf3d6d850df279188d8ef2d565767f1f157481091e5c8be891e3c0af5
6
+ metadata.gz: ff23cfda2194b449136438eee3475801c4568d7efa9dea08c9c60bd11f732af31c10a30b95014c7d366fbf5ad86dd7471dd3419ef4ef2808f031307d1ffc841e
7
+ data.tar.gz: 4a776b1c73b4c2683ba6db906afc3dccd2221f0dd4943a56d1a7fd1f0b4c43f92a789231d82e85aec2ba664fd505013c3c3a594a7b57d6931b35bfd433998ca0
@@ -17,8 +17,8 @@ module RubyLsp
17
17
  @client ||= T.let(RailsClient.new, T.nilable(RailsClient))
18
18
  end
19
19
 
20
- sig { override.void }
21
- def activate
20
+ sig { override.params(message_queue: Thread::Queue).void }
21
+ def activate(message_queue)
22
22
  client.check_if_server_is_running!
23
23
  end
24
24
 
@@ -29,24 +29,22 @@ module RubyLsp
29
29
  sig do
30
30
  override.params(
31
31
  uri: URI::Generic,
32
- emitter: EventEmitter,
33
- message_queue: Thread::Queue,
32
+ dispatcher: Prism::Dispatcher,
34
33
  ).returns(T.nilable(Listener[T::Array[Interface::CodeLens]]))
35
34
  end
36
- def create_code_lens_listener(uri, emitter, message_queue)
37
- CodeLens.new(uri, emitter, message_queue)
35
+ def create_code_lens_listener(uri, dispatcher)
36
+ CodeLens.new(uri, dispatcher)
38
37
  end
39
38
 
40
39
  sig do
41
40
  override.params(
42
41
  nesting: T::Array[String],
43
42
  index: RubyIndexer::Index,
44
- emitter: EventEmitter,
45
- message_queue: Thread::Queue,
43
+ dispatcher: Prism::Dispatcher,
46
44
  ).returns(T.nilable(Listener[T.nilable(Interface::Hover)]))
47
45
  end
48
- def create_hover_listener(nesting, index, emitter, message_queue)
49
- Hover.new(client, emitter, message_queue)
46
+ def create_hover_listener(nesting, index, dispatcher)
47
+ Hover.new(client, nesting, index, dispatcher)
50
48
  end
51
49
 
52
50
  sig { override.returns(String) }
@@ -42,17 +42,20 @@ module RubyLsp
42
42
  sig { override.returns(ResponseType) }
43
43
  attr_reader :_response
44
44
 
45
- sig { params(uri: URI::Generic, emitter: EventEmitter, message_queue: Thread::Queue).void }
46
- def initialize(uri, emitter, message_queue)
45
+ sig { params(uri: URI::Generic, dispatcher: Prism::Dispatcher).void }
46
+ def initialize(uri, dispatcher)
47
47
  @_response = T.let([], ResponseType)
48
48
  @path = T.let(uri.to_standardized_path, T.nilable(String))
49
- emitter.register(self, :on_call, :on_class, :on_def)
49
+ @group_id = T.let(1, Integer)
50
+ @group_id_stack = T.let([], T::Array[Integer])
50
51
 
51
- super(emitter, message_queue)
52
+ dispatcher.register(self, :on_call_node_enter, :on_class_node_enter, :on_def_node_enter, :on_class_node_leave)
53
+
54
+ super(dispatcher)
52
55
  end
53
56
 
54
- sig { params(node: YARP::CallNode).void }
55
- def on_call(node)
57
+ sig { params(node: Prism::CallNode).void }
58
+ def on_call_node_enter(node)
56
59
  message_value = node.message
57
60
  return unless message_value == "test"
58
61
 
@@ -62,15 +65,13 @@ module RubyLsp
62
65
  first_argument = arguments.first
63
66
 
64
67
  content = case first_argument
65
- when YARP::StringConcatNode
66
- left = first_argument.left
67
- right = first_argument.right
68
- # We only support two lines of concatenation on test names
69
- if left.is_a?(YARP::StringNode) &&
70
- right.is_a?(YARP::StringNode)
71
- left.content + right.content
68
+ when Prism::InterpolatedStringNode
69
+ parts = first_argument.parts
70
+
71
+ if parts.all? { |part| part.is_a?(Prism::StringNode) }
72
+ T.cast(parts, T::Array[Prism::StringNode]).map(&:content).join
72
73
  end
73
- when YARP::StringNode
74
+ when Prism::StringNode
74
75
  first_argument.content
75
76
  end
76
77
 
@@ -82,8 +83,8 @@ module RubyLsp
82
83
  end
83
84
 
84
85
  # Although uncommon, Rails tests can be written with the classic "def test_name" syntax.
85
- sig { params(node: YARP::DefNode).void }
86
- def on_def(node)
86
+ sig { params(node: Prism::DefNode).void }
87
+ def on_def_node_enter(node)
87
88
  method_name = node.name.to_s
88
89
  if method_name.start_with?("test_")
89
90
  line_number = node.location.start_line
@@ -92,18 +93,26 @@ module RubyLsp
92
93
  end
93
94
  end
94
95
 
95
- sig { params(node: YARP::ClassNode).void }
96
- def on_class(node)
96
+ sig { params(node: Prism::ClassNode).void }
97
+ def on_class_node_enter(node)
97
98
  class_name = node.constant_path.slice
98
99
  if class_name.end_with?("Test")
99
100
  command = "#{BASE_COMMAND} #{@path}"
100
101
  add_test_code_lens(node, name: class_name, command: command, kind: :group)
101
102
  end
103
+
104
+ @group_id_stack.push(@group_id)
105
+ @group_id += 1
106
+ end
107
+
108
+ sig { params(node: Prism::ClassNode).void }
109
+ def on_class_node_leave(node)
110
+ @group_id_stack.pop
102
111
  end
103
112
 
104
113
  private
105
114
 
106
- sig { params(node: YARP::Node, name: String, command: String, kind: Symbol).void }
115
+ sig { params(node: Prism::Node, name: String, command: String, kind: Symbol).void }
107
116
  def add_test_code_lens(node, name:, command:, kind:)
108
117
  return unless @path
109
118
 
@@ -119,12 +128,15 @@ module RubyLsp
119
128
  },
120
129
  ]
121
130
 
131
+ grouping_data = { group_id: @group_id_stack.last, kind: kind }
132
+ grouping_data[:id] = @group_id if kind == :group
133
+
122
134
  @_response << create_code_lens(
123
135
  node,
124
136
  title: "Run",
125
137
  command_name: "rubyLsp.runTest",
126
138
  arguments: arguments,
127
- data: { type: "test", kind: kind },
139
+ data: { type: "test", **grouping_data },
128
140
  )
129
141
 
130
142
  @_response << create_code_lens(
@@ -132,7 +144,7 @@ module RubyLsp
132
144
  title: "Run In Terminal",
133
145
  command_name: "rubyLsp.runTestInTerminal",
134
146
  arguments: arguments,
135
- data: { type: "test_in_terminal", kind: kind },
147
+ data: { type: "test_in_terminal", **grouping_data },
136
148
  )
137
149
 
138
150
  @_response << create_code_lens(
@@ -140,7 +152,7 @@ module RubyLsp
140
152
  title: "Debug",
141
153
  command_name: "rubyLsp.debugTest",
142
154
  arguments: arguments,
143
- data: { type: "debug", kind: kind },
155
+ data: { type: "debug", **grouping_data },
144
156
  )
145
157
  end
146
158
  end
@@ -25,37 +25,56 @@ module RubyLsp
25
25
  sig { override.returns(ResponseType) }
26
26
  attr_reader :_response
27
27
 
28
- sig { params(client: RailsClient, emitter: RubyLsp::EventEmitter, message_queue: Thread::Queue).void }
29
- def initialize(client, emitter, message_queue)
30
- super(emitter, message_queue)
28
+ sig do
29
+ params(
30
+ client: RailsClient,
31
+ nesting: T::Array[String],
32
+ index: RubyIndexer::Index,
33
+ dispatcher: Prism::Dispatcher,
34
+ ).void
35
+ end
36
+ def initialize(client, nesting, index, dispatcher)
37
+ super(dispatcher)
31
38
 
32
39
  @_response = T.let(nil, ResponseType)
33
40
  @client = client
34
- emitter.register(self, :on_constant_path, :on_constant_read, :on_call)
41
+ @nesting = nesting
42
+ @index = index
43
+ dispatcher.register(self, :on_constant_path_node_enter, :on_constant_read_node_enter, :on_call_node_enter)
35
44
  end
36
45
 
37
- sig { params(node: YARP::ConstantPathNode).void }
38
- def on_constant_path(node)
39
- @_response = generate_rails_document_link_hover(node.slice, node.location)
46
+ sig { params(node: Prism::ConstantPathNode).void }
47
+ def on_constant_path_node_enter(node)
48
+ entries = @index.resolve(node.slice, @nesting)
49
+ return unless entries
50
+
51
+ name = T.must(entries.first).name
52
+ content = +""
53
+ column_info = generate_column_content(name)
54
+ content << column_info if column_info
55
+
56
+ urls = Support::RailsDocumentClient.generate_rails_document_urls(name)
57
+ content << urls.join("\n\n") unless urls.empty?
58
+ return if content.empty?
59
+
60
+ contents = RubyLsp::Interface::MarkupContent.new(kind: "markdown", value: content)
61
+ @_response = RubyLsp::Interface::Hover.new(range: range_from_location(node.location), contents: contents)
40
62
  end
41
63
 
42
- sig { params(node: YARP::ConstantReadNode).void }
43
- def on_constant_read(node)
44
- model = @client.model(node.name.to_s)
45
- return if model.nil?
64
+ sig { params(node: Prism::ConstantReadNode).void }
65
+ def on_constant_read_node_enter(node)
66
+ entries = @index.resolve(node.name.to_s, @nesting)
67
+ return unless entries
68
+
69
+ content = generate_column_content(T.must(entries.first).name)
70
+ return unless content
46
71
 
47
- schema_file = model[:schema_file]
48
- content = +""
49
- if schema_file
50
- content << "[Schema](#{URI::Generic.build(scheme: "file", path: schema_file)})\n\n"
51
- end
52
- content << model[:columns].map { |name, type| "**#{name}**: #{type}\n" }.join("\n")
53
72
  contents = RubyLsp::Interface::MarkupContent.new(kind: "markdown", value: content)
54
- @_response = RubyLsp::Interface::Hover.new(range: range_from_node(node), contents: contents)
73
+ @_response = RubyLsp::Interface::Hover.new(range: range_from_location(node.location), contents: contents)
55
74
  end
56
75
 
57
- sig { params(node: YARP::CallNode).void }
58
- def on_call(node)
76
+ sig { params(node: Prism::CallNode).void }
77
+ def on_call_node_enter(node)
59
78
  message_value = node.message
60
79
  message_loc = node.message_loc
61
80
 
@@ -66,7 +85,19 @@ module RubyLsp
66
85
 
67
86
  private
68
87
 
69
- sig { params(name: String, location: YARP::Location).returns(T.nilable(Interface::Hover)) }
88
+ sig { params(name: String).returns(T.nilable(String)) }
89
+ def generate_column_content(name)
90
+ model = @client.model(name)
91
+ return if model.nil?
92
+
93
+ schema_file = model[:schema_file]
94
+ content = +""
95
+ content << "[Schema](#{URI::Generic.build(scheme: "file", path: schema_file)})\n\n" if schema_file
96
+ content << model[:columns].map { |name, type| "**#{name}**: #{type}\n" }.join("\n")
97
+ content
98
+ end
99
+
100
+ sig { params(name: String, location: Prism::Location).returns(T.nilable(Interface::Hover)) }
70
101
  def generate_rails_document_link_hover(name, location)
71
102
  urls = Support::RailsDocumentClient.generate_rails_document_urls(name)
72
103
  return if urls.empty?
@@ -3,6 +3,6 @@
3
3
 
4
4
  module RubyLsp
5
5
  module Rails
6
- VERSION = "0.2.6"
6
+ VERSION = "0.2.8"
7
7
  end
8
8
  end
metadata CHANGED
@@ -1,17 +1,45 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-lsp-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.6
4
+ version: 0.2.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shopify
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-10-04 00:00:00.000000000 Z
11
+ date: 2023-12-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: rails
14
+ name: actionpack
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '6.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '6.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: activerecord
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '6.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '6.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: railties
15
43
  requirement: !ruby/object:Gem::Requirement
16
44
  requirements:
17
45
  - - ">="
@@ -30,20 +58,20 @@ dependencies:
30
58
  requirements:
31
59
  - - ">="
32
60
  - !ruby/object:Gem::Version
33
- version: 0.11.0
61
+ version: 0.13.0
34
62
  - - "<"
35
63
  - !ruby/object:Gem::Version
36
- version: 0.12.0
64
+ version: 0.14.0
37
65
  type: :runtime
38
66
  prerelease: false
39
67
  version_requirements: !ruby/object:Gem::Requirement
40
68
  requirements:
41
69
  - - ">="
42
70
  - !ruby/object:Gem::Version
43
- version: 0.11.0
71
+ version: 0.13.0
44
72
  - - "<"
45
73
  - !ruby/object:Gem::Version
46
- version: 0.12.0
74
+ version: 0.14.0
47
75
  - !ruby/object:Gem::Dependency
48
76
  name: sorbet-runtime
49
77
  requirement: !ruby/object:Gem::Requirement
@@ -101,7 +129,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
101
129
  - !ruby/object:Gem::Version
102
130
  version: '0'
103
131
  requirements: []
104
- rubygems_version: 3.4.20
132
+ rubygems_version: 3.4.21
105
133
  signing_key:
106
134
  specification_version: 4
107
135
  summary: A Ruby LSP addon for Rails