Skip to content

Commit 9362435

Browse files
committed
(GH-177) Refactor message_router as property of Language Client
Previously the message router was passed in as a method parameter however as almost all methods require the message router, this commit changes the initializer to pass in the message router at object create time.
1 parent 9168a19 commit 9362435

File tree

4 files changed

+42
-39
lines changed

4 files changed

+42
-39
lines changed

lib/puppet-languageserver/language_client.rb

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@
22

33
module PuppetLanguageServer
44
class LanguageClient
5-
def initialize
5+
attr_reader :message_router
6+
7+
def initialize(message_router)
8+
@message_router = message_router
69
@client_capabilites = {}
710

811
# Internal registry of dynamic registrations and their current state
@@ -20,7 +23,7 @@ def client_capability(*names)
2023
safe_hash_traverse(@client_capabilites, *names)
2124
end
2225

23-
def send_configuration_request(message_router)
26+
def send_configuration_request
2427
params = LSP::ConfigurationParams.new.from_h!('items' => [])
2528
params.items << LSP::ConfigurationItem.new.from_h!('section' => 'puppet')
2629

@@ -45,7 +48,7 @@ def capability_registrations(method)
4548
@registrations[method].dup
4649
end
4750

48-
def register_capability(message_router, method, options = {})
51+
def register_capability(method, options = {})
4952
id = new_request_id
5053

5154
PuppetLanguageServer.log_message(:info, "Attempting to dynamically register the #{method} method with id #{id}")
@@ -67,7 +70,7 @@ def register_capability(message_router, method, options = {})
6770
true
6871
end
6972

70-
def parse_register_capability_response!(message_router, response, original_request)
73+
def parse_register_capability_response!(response, original_request)
7174
raise 'Response is not from client/registerCapability request' unless original_request['method'] == 'client/registerCapability'
7275

7376
unless response.key?('result')
@@ -88,7 +91,7 @@ def parse_register_capability_response!(message_router, response, original_reque
8891

8992
# If we just registered the workspace/didChangeConfiguration method then
9093
# also trigger a configuration request to get the initial state
91-
send_configuration_request(message_router) if reg.method__lsp == 'workspace/didChangeConfiguration'
94+
send_configuration_request if reg.method__lsp == 'workspace/didChangeConfiguration'
9295
end
9396

9497
true

lib/puppet-languageserver/message_router.rb

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ class MessageRouter < BaseMessageRouter
3434
def initialize(options = {})
3535
super
3636
@server_options = options.nil? ? {} : options
37-
@client = LanguageClient.new
37+
@client = LanguageClient.new(self)
3838
end
3939

4040
def documents
@@ -254,7 +254,7 @@ def receive_notification(method, params)
254254
when 'initialized'
255255
PuppetLanguageServer.log_message(:info, 'Client has received initialization')
256256
if client.client_capability('workspace', 'didChangeConfiguration', 'dynamicRegistration') == true
257-
client.register_capability(self, 'workspace/didChangeConfiguration')
257+
client.register_capability('workspace/didChangeConfiguration')
258258
else
259259
PuppetLanguageServer.log_message(:debug, 'Client does not support didChangeConfiguration dynamic registration. Using push method for configuration change detection.')
260260
end
@@ -300,7 +300,7 @@ def receive_notification(method, params)
300300
if params.key?('settings') && params['settings'].nil?
301301
# This is a notification from a dynamic registration. Need to send a workspace/configuration
302302
# request to get the actual configuration
303-
client.send_configuration_request(self)
303+
client.send_configuration_request
304304
else
305305
client.parse_lsp_configuration_settings!(params['settings'])
306306
end
@@ -314,13 +314,13 @@ def receive_notification(method, params)
314314
end
315315

316316
def receive_response(response, original_request)
317-
unless receive_response_succesful?(response) # rubocop:disable Style/IfUnlessModifier Too long
317+
unless receive_response_succesful?(response) # rubocop:disable Style/IfUnlessModifier Line is too long otherwise
318318
PuppetLanguageServer.log_message(:error, "Response for method '#{original_request['method']}' with id '#{original_request['id']}' failed with #{response['error']}")
319319
end
320320
# Error responses still need to be processed so process messages even if it failed
321321
case original_request['method']
322322
when 'client/registerCapability'
323-
client.parse_register_capability_response!(self, response, original_request)
323+
client.parse_register_capability_response!(response, original_request)
324324
when 'workspace/configuration'
325325
return unless receive_response_succesful?(response)
326326
client.parse_lsp_configuration_settings!(response['result'])

spec/languageserver/unit/puppet-languageserver/language_client_spec.rb

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
require 'spec_helper'
22

33
describe 'PuppetLanguageServer::LanguageClient' do
4+
let(:json_rpc_handler) { MockJSONRPCHandler.new }
5+
let(:message_router) { MockMessageRouter.new.tap { |i| i.json_rpc_handler = json_rpc_handler } }
46
let(:subject_options) {}
5-
let(:subject) { PuppetLanguageServer::LanguageClient.new }
7+
let(:subject) { PuppetLanguageServer::LanguageClient.new(message_router) }
68
let(:initialize_params) do
79
# Example capabilities from VS Code
810
{
@@ -139,8 +141,6 @@
139141
}
140142
}
141143
end
142-
let(:json_rpc_handler) { MockJSONRPCHandler.new }
143-
let(:message_router) { MockMessageRouter.new.tap { |i| i.json_rpc_handler = json_rpc_handler } }
144144

145145
before(:each) do
146146
allow(PuppetLanguageServer).to receive(:log_message)
@@ -167,11 +167,11 @@
167167
describe '#send_configuration_request' do
168168
it 'should send a client request and return true' do
169169
expect(json_rpc_handler).to receive(:send_client_request).with('workspace/configuration', Object)
170-
expect(subject.send_configuration_request(message_router)).to eq(true)
170+
expect(subject.send_configuration_request).to eq(true)
171171
end
172172

173173
it 'should include the puppet settings' do
174-
subject.send_configuration_request(message_router)
174+
subject.send_configuration_request
175175
expect(json_rpc_handler.connection.buffer).to include('{"section":"puppet"}')
176176
end
177177
end
@@ -207,13 +207,13 @@
207207
# Should start out not registered
208208
expect(subject.capability_registrations(method_name)).to eq([{:registered => false, :state => :complete}])
209209
# Send as registration request
210-
subject.register_capability(message_router, method_name, method_options)
210+
subject.register_capability(method_name, method_options)
211211
# Should show as in progress
212212
expect(subject.capability_registrations(method_name)).to eq([{:registered => false, :state => :pending, :id => request_id}])
213213
# Mock a valid response
214214
response = { 'jsonrpc'=>'2.0', 'id'=> 0, 'result' => nil }
215215
original_request = { 'jsonrpc'=>'2.0', 'id' => 0, 'method' => req_method_name, 'params' => req_method_params }
216-
subject.parse_register_capability_response!(message_router, response, original_request)
216+
subject.parse_register_capability_response!(response, original_request)
217217
# Should show registered
218218
expect(subject.capability_registrations(method_name)).to eq([{:registered => true, :state => :complete, :id => request_id}])
219219
end
@@ -232,13 +232,13 @@
232232
# Should start out not registered
233233
expect(subject.capability_registrations(method_name)).to eq([{:registered => false, :state => :complete}])
234234
# Send as registration request
235-
subject.register_capability(message_router, method_name, method_options)
235+
subject.register_capability(method_name, method_options)
236236
# Should show as in progress
237237
expect(subject.capability_registrations(method_name)).to eq([{:registered => false, :state => :pending, :id => request_id}])
238238
# Mock an error response
239239
response = { 'jsonrpc'=>'2.0', 'id'=> 0, 'error' => { 'code' => -1, 'message' => 'mock message' } }
240240
original_request = { 'jsonrpc'=>'2.0', 'id' => 0, 'method' => req_method_name, 'params' => req_method_params }
241-
subject.parse_register_capability_response!(message_router, response, original_request)
241+
subject.parse_register_capability_response!(response, original_request)
242242
# Should show registered
243243
expect(subject.capability_registrations(method_name)).to eq([{:registered => false, :state => :complete, :id => request_id}])
244244
end
@@ -258,15 +258,15 @@
258258
# Should start out not registered
259259
expect(subject.capability_registrations(method_name)).to eq([{:registered => false, :state => :complete}])
260260
# Send as registration request
261-
subject.register_capability(message_router, method_name, method_options)
261+
subject.register_capability(method_name, method_options)
262262
# Mock a valid response
263263
response = { 'jsonrpc'=>'2.0', 'id'=> 0, 'result' => nil }
264264
original_request = { 'jsonrpc'=>'2.0', 'id' => 0, 'method' => req_method_name, 'params' => req_method_params }
265-
subject.parse_register_capability_response!(message_router, response, original_request)
265+
subject.parse_register_capability_response!(response, original_request)
266266
# Should show registered
267267
expect(subject.capability_registrations(method_name)).to eq([{:registered => true, :state => :complete, :id => request_id}])
268268
# Send another registration request
269-
subject.register_capability(message_router, method_name, method_options)
269+
subject.register_capability(method_name, method_options)
270270
# Should show as in progress
271271
expect(subject.capability_registrations(method_name)).to eq([
272272
{:registered => true, :state => :complete, :id => request_id},
@@ -275,7 +275,7 @@
275275
# Mock an error response
276276
response = { 'jsonrpc'=>'2.0', 'id'=> 0, 'error' => { 'code' => -1, 'message' => 'mock message' } }
277277
original_request = { 'jsonrpc'=>'2.0', 'id' => 0, 'method' => req_method_name, 'params' => req_method_params }
278-
subject.parse_register_capability_response!(message_router, response, original_request)
278+
subject.parse_register_capability_response!(response, original_request)
279279
# Should still show registered
280280
expect(subject.capability_registrations(method_name)).to eq([
281281
{:registered => true, :state => :complete, :id => request_id},
@@ -290,25 +290,25 @@
290290

291291
it 'should send a client request and return true' do
292292
expect(json_rpc_handler).to receive(:send_client_request).with('client/registerCapability', Object)
293-
expect(subject.register_capability(message_router, method_name, method_options)).to eq(true)
293+
expect(subject.register_capability(method_name, method_options)).to eq(true)
294294
end
295295

296296
it 'should include the method to register' do
297-
subject.register_capability(message_router, method_name, method_options)
297+
subject.register_capability(method_name, method_options)
298298
expect(json_rpc_handler.connection.buffer).to include("\"method\":\"#{method_name}\"")
299299
end
300300

301301
it 'should include the parameters to register' do
302-
subject.register_capability(message_router, method_name, method_options)
302+
subject.register_capability(method_name, method_options)
303303
expect(json_rpc_handler.connection.buffer).to include('"registerOptions":{}')
304304
end
305305

306306
it 'should log a message if a registration is already in progress' do
307307
allow(json_rpc_handler).to receive(:send_client_request)
308308
expect(PuppetLanguageServer).to receive(:log_message).with(:warn, /#{method_name}/)
309309

310-
subject.register_capability(message_router, method_name, method_options)
311-
subject.register_capability(message_router, method_name, method_options)
310+
subject.register_capability(method_name, method_options)
311+
subject.register_capability(method_name, method_options)
312312
end
313313

314314
it 'should not log a message if a previous registration completed' do
@@ -321,13 +321,13 @@
321321
end
322322
expect(PuppetLanguageServer).to_not receive(:log_message).with(:warn, /#{method_name}/)
323323
# Send as registration request
324-
subject.register_capability(message_router, method_name, method_options)
324+
subject.register_capability(method_name, method_options)
325325
# Mock a valid response
326326
response = { 'jsonrpc'=>'2.0', 'id'=> 0, 'result' => nil }
327327
original_request = { 'jsonrpc'=>'2.0', 'id' => 0, 'method' => method_name, 'params' => method_params }
328-
subject.parse_register_capability_response!(message_router, response, original_request)
328+
subject.parse_register_capability_response!(response, original_request)
329329

330-
subject.register_capability(message_router, method_name, method_options)
330+
subject.register_capability(method_name, method_options)
331331
end
332332
end
333333

@@ -342,7 +342,7 @@
342342
let(:request_params) { {} }
343343

344344
it 'should raise an error if the original request was not a registration' do
345-
expect{ subject.parse_register_capability_response!(message_router, response, original_request) }.to raise_error(/client\/registerCapability/)
345+
expect{ subject.parse_register_capability_response!(response, original_request) }.to raise_error(/client\/registerCapability/)
346346
end
347347
end
348348

@@ -355,8 +355,8 @@
355355
end
356356

357357
it 'should send a configuration request' do
358-
expect(subject).to receive(:send_configuration_request).with(message_router)
359-
subject.parse_register_capability_response!(message_router, response, original_request)
358+
expect(subject).to receive(:send_configuration_request)
359+
subject.parse_register_capability_response!(response, original_request)
360360
end
361361
end
362362

@@ -377,15 +377,15 @@
377377
it 'should not log the registration' do
378378
expect(PuppetLanguageServer).to_not receive(:log_message).with(:info, /validMethod/)
379379

380-
subject.parse_register_capability_response!(message_router, response, original_request)
380+
subject.parse_register_capability_response!(response, original_request)
381381
end
382382
end
383383

384384
context 'that succeeded' do
385385
it 'should log the registration' do
386386
expect(PuppetLanguageServer).to receive(:log_message).with(:info, /validMethod/)
387387

388-
subject.parse_register_capability_response!(message_router, response, original_request)
388+
subject.parse_register_capability_response!(response, original_request)
389389
end
390390
end
391391
end

spec/languageserver/unit/puppet-languageserver/message_router_spec.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -858,7 +858,7 @@
858858
end
859859

860860
it 'should attempt to register workspace/didChangeConfiguration' do
861-
expect(subject.client).to receive(:register_capability).with(Object, 'workspace/didChangeConfiguration')
861+
expect(subject.client).to receive(:register_capability).with('workspace/didChangeConfiguration')
862862

863863
subject.receive_notification(notification_method, notification_params)
864864
end
@@ -1037,7 +1037,7 @@
10371037
let(:config_settings) { nil }
10381038

10391039
it 'should send a configuration request' do
1040-
expect(subject.client).to receive(:send_configuration_request).with(Object)
1040+
expect(subject.client).to receive(:send_configuration_request).with(no_args)
10411041

10421042
subject.receive_notification(notification_method, notification_params)
10431043
end
@@ -1116,7 +1116,7 @@
11161116
let(:request_params) { {} }
11171117

11181118
it 'should call client.parse_register_capability_response!' do
1119-
expect(subject.client).to receive(:parse_register_capability_response!).with(Object, response, original_request)
1119+
expect(subject.client).to receive(:parse_register_capability_response!).with(response, original_request)
11201120

11211121
subject.receive_response(response, original_request)
11221122
end

0 commit comments

Comments
 (0)