Skip to content

Commit 05f8b5b

Browse files
committed
(maint) Refactor server services to common namespace
In order to add a Debug Server, parts of the Language Server need to be extacted into a common namespace so they can be shared between them; Mainly the logging, TCP Server, and version detection. This commit: - Moves the TCP Server, logging and version detection from PuppetLanguageServer to PuppetVSCode namespace. - All relevant calls in the language server were modified for the new names - Updated the spec tests for the new names
1 parent 3264179 commit 05f8b5b

File tree

9 files changed

+101
-80
lines changed

9 files changed

+101
-80
lines changed

server/lib/languageserver/puppet_version.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ def self.create(options)
2121
result['functionsLoaded'] = options['functionsLoaded'] unless options['functionsLoaded'].nil?
2222
result['typesLoaded'] = options['typesLoaded'] unless options['typesLoaded'].nil?
2323

24-
result['languageServerVersion'] = PuppetLanguageServer.version
24+
result['languageServerVersion'] = PuppetVSCode.version
2525

2626
result
2727
end

server/lib/puppet-languageserver.rb

Lines changed: 8 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
require 'languageserver/languageserver'
2+
require 'puppet-vscode'
23

3-
%w[version simple_tcp_server json_rpc_handler message_router server_capabilities document_validator
4+
%w[json_rpc_handler message_router server_capabilities document_validator
45
puppet_parser_helper puppet_helper facter_helper completion_provider hover_provider].each do |lib|
56
begin
67
require "puppet-languageserver/#{lib}"
@@ -80,34 +81,12 @@ def self.parse(options)
8081
end
8182

8283
def self.log_message(severity, message)
83-
return if @logger.nil?
84-
85-
case severity
86-
when :debug
87-
@logger.debug(message)
88-
when :info
89-
@logger.info(message)
90-
when :warn
91-
@logger.info(message)
92-
when :error
93-
@logger.error(message)
94-
when :fatal
95-
@logger.fatal(message)
96-
else
97-
@logger.unknown(message)
98-
end
84+
PuppetVSCode::log_message(severity, message)
9985
end
10086

10187
def self.init_puppet(options)
102-
if options[:debug].nil?
103-
@logger = nil
104-
elsif options[:debug].casecmp 'stdout'
105-
@logger = Logger.new($stdout)
106-
elsif !options[:debug].to_s.empty?
107-
# Log to file
108-
@logger = Logger.new(options[:debug])
109-
end
110-
log_message(:info, "Language Server is v#{PuppetLanguageServer.version}")
88+
PuppetVSCode::init_logging(options)
89+
log_message(:info, "Language Server is v#{PuppetVSCode.version}")
11190
log_message(:info, "Using Puppet v#{Puppet.version}")
11291

11392
log_message(:info, 'Initializing settings...')
@@ -143,7 +122,9 @@ def self.init_puppet_worker(options)
143122
def self.rpc_server(options)
144123
log_message(:info, 'Starting RPC Server...')
145124

146-
server = PuppetLanguageServer::SimpleTCPServer.new
125+
server = PuppetVSCode::SimpleTCPServer.new
126+
127+
options[:servicename] = 'LANGUAGE SERVER'
147128

148129
server.add_service(options[:ipaddress], options[:port])
149130
trap('INT') { server.stop }

server/lib/puppet-languageserver/json_rpc_handler.rb

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ module PuppetLanguageServer
3737
KEY_CODE = 'code'.freeze
3838
KEY_MESSAGE = 'message'.freeze
3939

40-
class JSONRPCHandler < PuppetLanguageServer::SimpleTCPServerConnection
40+
class JSONRPCHandler < PuppetVSCode::SimpleTCPServerConnection
4141
def initialize(*_options)
4242
@key_jsonrpc = KEY_JSONRPC
4343
@key_id = KEY_ID
@@ -110,14 +110,14 @@ def receive_data(data)
110110
end
111111

112112
def send_response(response)
113-
PuppetLanguageServer.log_message(:debug, "--- OUTBOUND\n#{response}\n---")
113+
PuppetVSCode.log_message(:debug, "--- OUTBOUND\n#{response}\n---")
114114

115115
size = response.bytesize if response.respond_to?(:bytesize)
116116
send_data "Content-Length: #{size}\r\n\r\n" + response
117117
end
118118

119119
def parse_data(data)
120-
PuppetLanguageServer.log_message(:debug, "--- INBOUND\n#{data}\n---")
120+
PuppetVSCode.log_message(:debug, "--- INBOUND\n#{data}\n---")
121121

122122
result = JSON.parse(data)
123123
received_parsed_object(result)
@@ -179,12 +179,12 @@ def process(obj)
179179

180180
# This method must be overriden in the user's inherited class.
181181
def receive_request(request)
182-
PuppetLanguageServer.log_message(:debug, "request received:\n#{request.inspect}")
182+
PuppetVSCode.log_message(:debug, "request received:\n#{request.inspect}")
183183
end
184184

185185
# This method must be overriden in the user's inherited class.
186186
def receive_notification(method, params)
187-
PuppetLanguageServer.log_message(:debug, "notification received (method: #{method.inspect}, params: #{params.inspect})")
187+
PuppetVSCode.log_message(:debug, "notification received (method: #{method.inspect}, params: #{params.inspect})")
188188
end
189189

190190
def encode_json(data)
@@ -226,17 +226,17 @@ def send_show_message_notification(msg_type, message)
226226

227227
# This method could be overriden in the user's inherited class.
228228
def parsing_error(_data, exception)
229-
PuppetLanguageServer.log_message(:error, "parsing error:\n#{exception.message}")
229+
PuppetVSCode.log_message(:error, "parsing error:\n#{exception.message}")
230230
end
231231

232232
# This method could be overriden in the user's inherited class.
233233
def batch_not_supported_error(_obj)
234-
PuppetLanguageServer.log_message(:error, 'batch request received but not implemented')
234+
PuppetVSCode.log_message(:error, 'batch request received but not implemented')
235235
end
236236

237237
# This method could be overriden in the user's inherited class.
238238
def invalid_request(_obj, code, message = nil)
239-
PuppetLanguageServer.log_message(:error, "error #{code}: #{message}")
239+
PuppetVSCode.log_message(:error, "error #{code}: #{message}")
240240
end
241241

242242
class Request

server/lib/puppet-vscode.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
%w[logging version simple_tcp_server].each do |lib|
2+
begin
3+
require "puppet-vscode/#{lib}"
4+
rescue LoadError
5+
require File.expand_path(File.join(File.dirname(__FILE__), 'puppet-vscode', 'lib', lib))
6+
end
7+
end
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
module PuppetVSCode
2+
def self.log_message(severity, message)
3+
return if @logger.nil?
4+
5+
case severity
6+
when :debug
7+
@logger.debug(message)
8+
when :info
9+
@logger.info(message)
10+
when :warn
11+
@logger.info(message)
12+
when :error
13+
@logger.error(message)
14+
when :fatal
15+
@logger.fatal(message)
16+
else
17+
@logger.unknown(message)
18+
end
19+
end
20+
21+
def self.init_logging(options)
22+
if options[:debug].nil?
23+
@logger = nil
24+
elsif options[:debug].casecmp 'stdout'
25+
@logger = Logger.new($stdout)
26+
elsif !options[:debug].to_s.empty?
27+
# Log to file
28+
@logger = Logger.new(options[:debug])
29+
end
30+
end
31+
end

server/lib/puppet-languageserver/simple_tcp_server.rb renamed to server/lib/puppet-vscode/simple_tcp_server.rb

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,25 @@
33
# Based on code from
44
# http://stackoverflow.com/questions/29858113/unable-to-make-socket-accept-non-blocking-ruby-2-2
55

6-
module PuppetLanguageServer
6+
module PuppetVSCode
77
class SimpleTCPServerConnection
88
attr_accessor :socket
99
attr_accessor :simple_tcp_server
1010

1111
# Methods to override
1212
def post_init
1313
# Override this to recieve events after a client is connected
14-
PuppetLanguageServer.log_message(:debug, 'TCPSRV: Client has connected')
14+
PuppetVSCode.log_message(:debug, 'TCPSRV: Client has connected')
1515
end
1616

1717
def unbind
1818
# Override this to recieve events after a client is disconnected
19-
PuppetLanguageServer.log_message(:debug, 'TCPSRV: Client has disconnected')
19+
PuppetVSCode.log_message(:debug, 'TCPSRV: Client has disconnected')
2020
end
2121

2222
def receive_data(data)
2323
# Override this to recieve data
24-
PuppetLanguageServer.log_message(:debug, "TCPSRV: Received #{data.length} characters")
24+
PuppetVSCode.log_message(:debug, "TCPSRV: Received #{data.length} characters")
2525
end
2626

2727
# @api public
@@ -67,8 +67,7 @@ class << self
6767
@c_locker = Mutex.new
6868

6969
def log(message)
70-
# Override this to recieve log messages
71-
PuppetLanguageServer.log_message(:debug, "TCPSRV: #{message}")
70+
PuppetVSCode.log_message(:debug, "TCPSRV: #{message}")
7271
end
7372

7473
####
@@ -95,7 +94,9 @@ def get_data(io, connection_data)
9594
@handler_start_options = nil
9695
@server_options = nil
9796

98-
def start(handler = PuppetLanguageServer::SimpleTCPServerConnection, connection_options = {}, max_threads = 2)
97+
def start(handler = PuppetVSCode::SimpleTCPServerConnection, connection_options = {}, max_threads = 2)
98+
connection_options[:servicename] = 'LANGUAGE SERVER' if connection_options[:servicename].nil?
99+
99100
# prepare threads
100101
exit_flag = false
101102
threads = []
@@ -121,10 +122,10 @@ def start(handler = PuppetLanguageServer::SimpleTCPServerConnection, connection_
121122
log("Will stop the server in #{connection_options[:connection_timeout]} seconds if no connection is made.") if kill_timer > 0
122123
log('Will stop the server when client disconnects') if !@server_options[:stop_on_client_exit].nil? && @server_options[:stop_on_client_exit]
123124

124-
# Output to STDOUT. This is required by Langugage Client so it knows the server is now running
125+
# Output to STDOUT. This is required by clients so it knows the server is now running
125126
self.class.s_locker.synchronize do
126-
self.class.services.each_value do |options|
127-
$stdout.write("LANGUAGE SERVER RUNNING #{options[:hostname]}:#{options[:port]}\n")
127+
self.class.services.each do |_service, options|
128+
$stdout.write("#{@handler_start_options[:servicename]} RUNNING #{options[:hostname]}:#{options[:port]}\n")
128129
end
129130
end
130131
$stdout.flush

server/lib/puppet-languageserver/version.rb renamed to server/lib/puppet-vscode/version.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
module PuppetLanguageServer
2-
PUPPETLANGUAGESERVERVERSION = '0.0.1'.freeze unless defined? PUPPETLANGUAGESERVERVERSION
1+
module PuppetVSCode
2+
PUPPETVSCODEVERSION = '0.0.1'.freeze unless defined? PUPPETVSCODEVERSION
33

44
# @api public
55
#
@@ -10,7 +10,7 @@ def self.version
1010
version_file = File.join(File.dirname(__FILE__), 'VERSION')
1111
version = read_version_file(version_file)
1212

13-
@lang_server_version = version ? version : PUPPETLANGUAGESERVERVERSION
13+
@lang_server_version = version ? version : PUPPETVSCODEVERSION
1414
end
1515

1616
# Sets the langauge server version

server/spec/unit/puppet-languageserver/version_spec.rb

Lines changed: 0 additions & 31 deletions
This file was deleted.
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
require 'spec_helper'
2+
require 'puppet-vscode'
3+
4+
describe "version" do
5+
before :each do
6+
PuppetVSCode.instance_eval do
7+
@lang_server_version = nil if @lang_server_version
8+
end
9+
end
10+
11+
context "without a VERSION file" do
12+
before :each do
13+
expect(PuppetVSCode).to receive(:read_version_file).and_return(nil)
14+
end
15+
16+
it "is PuppetVSCode::PUPPETVSCODEVERSION" do
17+
expect(PuppetVSCode.version).to eq(PuppetVSCode::PUPPETVSCODEVERSION)
18+
end
19+
end
20+
21+
context "with a VERSION file" do
22+
let (:file_version) { '1.2.3' }
23+
24+
before :each do
25+
expect(PuppetVSCode).to receive(:read_version_file).with(/VERSION$/).and_return(file_version)
26+
end
27+
28+
it "is the content of the file" do
29+
expect(PuppetVSCode.version).to eq(file_version)
30+
end
31+
end
32+
end

0 commit comments

Comments
 (0)