def start_client(self, language): """Start an LSP client for a given language.""" # To keep track if the client was started. started = False if language in self.clients: language_client = self.clients[language] queue = self.register_queue[language] # Don't start LSP services when testing unless we demand # them. if running_under_pytest(): if not os.environ.get('SPY_TEST_USE_INTROSPECTION'): return started started = language_client['status'] == self.RUNNING # Start client heartbeat timer = QTimer(self) self.clients_hearbeat[language] = timer timer.setInterval(self.TIME_HEARTBEAT) timer.timeout.connect(lambda: self.check_heartbeat(language)) timer.start() if language_client['status'] == self.STOPPED: config = language_client['config'] # If we're trying to connect to an external server, # verify that it's listening before creating a # client for it. if config['external']: host = config['host'] port = config['port'] response = check_connection_port(host, port) if not response: if self.show_no_external_server_warning: self.report_no_external_server( host, port, language) self.set_status(language, _("down")) return False language_client['instance'] = LSPClient( parent=self, server_settings=config, folder=self.get_root_path(language), language=language) self.register_client_instance(language_client['instance']) # Register that a client was started. logger.info("Starting LSP client for {}...".format(language)) language_client['instance'].start() language_client['status'] = self.RUNNING started = True for entry in queue: language_client['instance'].register_file(*entry) self.register_queue[language] = [] return started
def is_valid(self): """Check if config options are valid.""" host = self.advanced_host.textbox.text() # If host is not local, the server must be external # and we need to automatically check the corresponding # option if host not in ['127.0.0.1', 'localhost']: self.external_server.setChecked(True) # Checks for external PyLS if self.external_server.isChecked(): port = int(self.advanced_port.spinbox.text()) # Check that host and port of the current server are # different from the new ones provided to connect to # an external server. lsp = self.main.completions.get_client('lsp') pyclient = lsp.clients.get('python') if pyclient is not None: instance = pyclient['instance'] if (instance is not None and not pyclient['config']['external']): if (instance.server_host == host and instance.server_port == port): self.report_no_address_change() return False # Check connection to LSP server using a TCP socket response = check_connection_port(host, port) if not response: self.report_no_external_server(host, port, 'python') return False return super(GeneralConfigPage, self).is_valid()
def validate(self): host_text = self.host_input.text() cmd_text = self.cmd_input.text() if host_text not in ['127.0.0.1', 'localhost']: self.external = True self.external_cb.setChecked(True) if not self.HOST_REGEX.match(host_text): self.button_ok.setEnabled(False) self.host_input.setStyleSheet(self.INVALID_CSS) if bool(host_text): self.host_input.setToolTip(_('Hostname must be valid')) else: self.host_input.setToolTip( _('Hostname or IP address of the host on which the server ' 'is running. Must be non empty.')) else: self.host_input.setStyleSheet(self.VALID_CSS) self.host_input.setToolTip(_('Hostname is valid')) self.button_ok.setEnabled(True) if not self.external: if not self.NON_EMPTY_REGEX.match(cmd_text): self.button_ok.setEnabled(False) self.cmd_input.setStyleSheet(self.INVALID_CSS) self.cmd_input.setToolTip( _('Command used to start the LSP server locally. Must be ' 'non empty')) return if find_program(cmd_text) is None: self.button_ok.setEnabled(False) self.cmd_input.setStyleSheet(self.INVALID_CSS) self.cmd_input.setToolTip(_('Program was not found ' 'on your system')) else: self.cmd_input.setStyleSheet(self.VALID_CSS) self.cmd_input.setToolTip(_('Program was found on your ' 'system')) self.button_ok.setEnabled(True) else: port = int(self.port_spinner.text()) response = check_connection_port(host_text, port) if not response: self.button_ok.setEnabled(False) try: json.loads(self.conf_input.toPlainText()) try: self.json_label.setText(self.JSON_VALID) except Exception: pass except ValueError: try: self.json_label.setText(self.JSON_INVALID) self.button_ok.setEnabled(False) except Exception: pass
def start_client(self, language): """Start an LSP client for a given language.""" started = False if language in self.clients: language_client = self.clients[language] queue = self.register_queue[language] # Don't start LSP services when testing unless we demand # them. if running_under_pytest(): if not os.environ.get('SPY_TEST_USE_INTROSPECTION'): return started # Start client started = language_client['status'] == self.RUNNING if language_client['status'] == self.STOPPED: config = language_client['config'] # If we're trying to connect to an external server, # verify that it's listening before creating a # client for it. if config['external']: host = config['host'] port = config['port'] response = check_connection_port(host, port) if not response: self.report_no_external_server(host, port, language) return False language_client['instance'] = LSPClient( parent=self, server_settings=config, folder=self.get_root_path(language), language=language) self.register_client_instance(language_client['instance']) logger.info("Starting LSP client for {}...".format(language)) language_client['instance'].start() language_client['status'] = self.RUNNING for entry in queue: language_client['instance'].register_file(*entry) self.register_queue[language] = [] return started