diff options
Diffstat (limited to 'vim/bundle/YouCompleteMe/python/ycm/client')
13 files changed, 0 insertions, 1328 deletions
diff --git a/vim/bundle/YouCompleteMe b/vim/bundle/YouCompleteMe new file mode 160000 +Subproject 0de1c0c9bb13ce82172b472c676035cd47cf6a6 diff --git a/vim/bundle/YouCompleteMe/python/ycm/client/__init__.py b/vim/bundle/YouCompleteMe/python/ycm/client/__init__.py deleted file mode 100644 index e69de29..0000000 --- a/vim/bundle/YouCompleteMe/python/ycm/client/__init__.py +++ /dev/null diff --git a/vim/bundle/YouCompleteMe/python/ycm/client/base_request.py b/vim/bundle/YouCompleteMe/python/ycm/client/base_request.py deleted file mode 100644 index ffc3fac..0000000 --- a/vim/bundle/YouCompleteMe/python/ycm/client/base_request.py +++ /dev/null @@ -1,244 +0,0 @@ -# Copyright (C) 2013 Google Inc. -# -# This file is part of YouCompleteMe. -# -# YouCompleteMe is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# YouCompleteMe is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with YouCompleteMe. If not, see <http://www.gnu.org/licenses/>. - -from __future__ import unicode_literals -from __future__ import print_function -from __future__ import division -from __future__ import absolute_import -from future import standard_library -standard_library.install_aliases() -from builtins import * # noqa - -import requests -import urllib.parse -import json -from future.utils import native -from base64 import b64decode, b64encode -from retries import retries -from requests_futures.sessions import FuturesSession -from ycm.unsafe_thread_pool_executor import UnsafeThreadPoolExecutor -from ycm import vimsupport -from ycmd.utils import ToBytes -from ycmd.hmac_utils import CreateRequestHmac, CreateHmac, SecureBytesEqual -from ycmd.responses import ServerError, UnknownExtraConf - -_HEADERS = {'content-type': 'application/json'} -_EXECUTOR = UnsafeThreadPoolExecutor( max_workers = 30 ) -# Setting this to None seems to screw up the Requests/urllib3 libs. -_DEFAULT_TIMEOUT_SEC = 30 -_HMAC_HEADER = 'x-ycm-hmac' - - -class BaseRequest( object ): - - def __init__( self ): - pass - - - def Start( self ): - pass - - - def Done( self ): - return True - - - def Response( self ): - return {} - - # This method blocks - # |timeout| is num seconds to tolerate no response from server before giving - # up; see Requests docs for details (we just pass the param along). - @staticmethod - def GetDataFromHandler( handler, timeout = _DEFAULT_TIMEOUT_SEC ): - return JsonFromFuture( BaseRequest._TalkToHandlerAsync( '', - handler, - 'GET', - timeout ) ) - - - # This is the blocking version of the method. See below for async. - # |timeout| is num seconds to tolerate no response from server before giving - # up; see Requests docs for details (we just pass the param along). - @staticmethod - def PostDataToHandler( data, handler, timeout = _DEFAULT_TIMEOUT_SEC ): - return JsonFromFuture( BaseRequest.PostDataToHandlerAsync( data, - handler, - timeout ) ) - - - # This returns a future! Use JsonFromFuture to get the value. - # |timeout| is num seconds to tolerate no response from server before giving - # up; see Requests docs for details (we just pass the param along). - @staticmethod - def PostDataToHandlerAsync( data, handler, timeout = _DEFAULT_TIMEOUT_SEC ): - return BaseRequest._TalkToHandlerAsync( data, handler, 'POST', timeout ) - - - # This returns a future! Use JsonFromFuture to get the value. - # |method| is either 'POST' or 'GET'. - # |timeout| is num seconds to tolerate no response from server before giving - # up; see Requests docs for details (we just pass the param along). - @staticmethod - def _TalkToHandlerAsync( data, - handler, - method, - timeout = _DEFAULT_TIMEOUT_SEC ): - def SendRequest( data, handler, method, timeout ): - request_uri = _BuildUri( handler ) - if method == 'POST': - sent_data = _ToUtf8Json( data ) - return BaseRequest.session.post( - request_uri, - data = sent_data, - headers = BaseRequest._ExtraHeaders( method, - request_uri, - sent_data ), - timeout = timeout ) - if method == 'GET': - return BaseRequest.session.get( - request_uri, - headers = BaseRequest._ExtraHeaders( method, request_uri ), - timeout = timeout ) - - @retries( 5, delay = 0.5, backoff = 1.5 ) - def DelayedSendRequest( data, handler, method ): - request_uri = _BuildUri( handler ) - if method == 'POST': - sent_data = _ToUtf8Json( data ) - return requests.post( - request_uri, - data = sent_data, - headers = BaseRequest._ExtraHeaders( method, - request_uri, - sent_data ) ) - if method == 'GET': - return requests.get( - request_uri, - headers = BaseRequest._ExtraHeaders( method, request_uri ) ) - - if not _CheckServerIsHealthyWithCache(): - return _EXECUTOR.submit( DelayedSendRequest, data, handler, method ) - - return SendRequest( data, handler, method, timeout ) - - - @staticmethod - def _ExtraHeaders( method, request_uri, request_body = None ): - if not request_body: - request_body = bytes( b'' ) - headers = dict( _HEADERS ) - headers[ _HMAC_HEADER ] = b64encode( - CreateRequestHmac( ToBytes( method ), - ToBytes( urllib.parse.urlparse( request_uri ).path ), - request_body, - BaseRequest.hmac_secret ) ) - return headers - - session = FuturesSession( executor = _EXECUTOR ) - server_location = '' - hmac_secret = '' - - -def BuildRequestData( include_buffer_data = True ): - line, column = vimsupport.CurrentLineAndColumn() - filepath = vimsupport.GetCurrentBufferFilepath() - request_data = { - 'line_num': line + 1, - 'column_num': column + 1, - 'filepath': filepath - } - - if include_buffer_data: - request_data[ 'file_data' ] = vimsupport.GetUnsavedAndCurrentBufferData() - - return request_data - - -def JsonFromFuture( future ): - response = future.result() - _ValidateResponseObject( response ) - if response.status_code == requests.codes.server_error: - raise MakeServerException( response.json() ) - - # We let Requests handle the other status types, we only handle the 500 - # error code. - response.raise_for_status() - - if response.text: - return response.json() - return None - - -def HandleServerException( exception ): - serialized_exception = str( exception ) - - # We ignore the exception about the file already being parsed since it comes - # up often and isn't something that's actionable by the user. - if 'already being parsed' in serialized_exception: - return - vimsupport.PostMultiLineNotice( serialized_exception ) - - -def _ToUtf8Json( data ): - return ToBytes( json.dumps( data ) if data else None ) - - -def _ValidateResponseObject( response ): - our_hmac = CreateHmac( response.content, BaseRequest.hmac_secret ) - their_hmac = ToBytes( b64decode( response.headers[ _HMAC_HEADER ] ) ) - if not SecureBytesEqual( our_hmac, their_hmac ): - raise RuntimeError( 'Received invalid HMAC for response!' ) - return True - - -def _BuildUri( handler ): - return native( ToBytes( urllib.parse.urljoin( BaseRequest.server_location, - handler ) ) ) - - -SERVER_HEALTHY = False - - -def _CheckServerIsHealthyWithCache(): - global SERVER_HEALTHY - - def _ServerIsHealthy(): - request_uri = _BuildUri( 'healthy' ) - response = requests.get( request_uri, - headers = BaseRequest._ExtraHeaders( - 'GET', request_uri, bytes( b'' ) ) ) - _ValidateResponseObject( response ) - response.raise_for_status() - return response.json() - - if SERVER_HEALTHY: - return True - - try: - SERVER_HEALTHY = _ServerIsHealthy() - return SERVER_HEALTHY - except: - return False - - -def MakeServerException( data ): - if data[ 'exception' ][ 'TYPE' ] == UnknownExtraConf.__name__: - return UnknownExtraConf( data[ 'exception' ][ 'extra_conf_file' ] ) - - return ServerError( '{0}: {1}'.format( data[ 'exception' ][ 'TYPE' ], - data[ 'message' ] ) ) diff --git a/vim/bundle/YouCompleteMe/python/ycm/client/command_request.py b/vim/bundle/YouCompleteMe/python/ycm/client/command_request.py deleted file mode 100644 index 6c5bc66..0000000 --- a/vim/bundle/YouCompleteMe/python/ycm/client/command_request.py +++ /dev/null @@ -1,153 +0,0 @@ -# Copyright (C) 2013 Google Inc. -# -# This file is part of YouCompleteMe. -# -# YouCompleteMe is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# YouCompleteMe is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with YouCompleteMe. If not, see <http://www.gnu.org/licenses/>. - -from __future__ import unicode_literals -from __future__ import print_function -from __future__ import division -from __future__ import absolute_import -from future import standard_library -standard_library.install_aliases() -from builtins import * # noqa - -from requests.exceptions import ReadTimeout - -from ycmd.responses import ServerError -from ycm.client.base_request import ( BaseRequest, BuildRequestData, - HandleServerException ) -from ycm import vimsupport -from ycmd.utils import ToUnicode - - -def _EnsureBackwardsCompatibility( arguments ): - if arguments and arguments[ 0 ] == 'GoToDefinitionElseDeclaration': - arguments[ 0 ] = 'GoTo' - return arguments - - -class CommandRequest( BaseRequest ): - def __init__( self, arguments, completer_target = None ): - super( CommandRequest, self ).__init__() - self._arguments = _EnsureBackwardsCompatibility( arguments ) - self._completer_target = ( completer_target if completer_target - else 'filetype_default' ) - self._response = None - - - def Start( self ): - request_data = BuildRequestData() - request_data.update( { - 'completer_target': self._completer_target, - 'command_arguments': self._arguments - } ) - try: - self._response = self.PostDataToHandler( request_data, - 'run_completer_command' ) - except ( ServerError, ReadTimeout ) as e: - HandleServerException( e ) - - - def Response( self ): - return self._response - - - def RunPostCommandActionsIfNeeded( self ): - if not self.Done() or self._response is None: - return - - # If not a dictionary or a list, the response is necessarily a - # scalar: boolean, number, string, etc. In this case, we print - # it to the user. - if not isinstance( self._response, ( dict, list ) ): - return self._HandleBasicResponse() - - if 'fixits' in self._response: - return self._HandleFixitResponse() - - if 'message' in self._response: - return self._HandleMessageResponse() - - if 'detailed_info' in self._response: - return self._HandleDetailedInfoResponse() - - # The only other type of response we understand is GoTo, and that is the - # only one that we can't detect just by inspecting the response (it should - # either be a single location or a list) - return self._HandleGotoResponse() - - - def _HandleGotoResponse( self ): - if isinstance( self._response, list ): - vimsupport.SetQuickFixList( - [ _BuildQfListItem( x ) for x in self._response ], - focus = True, - autoclose = True ) - else: - vimsupport.JumpToLocation( self._response[ 'filepath' ], - self._response[ 'line_num' ], - self._response[ 'column_num' ] ) - - - def _HandleFixitResponse( self ): - if not len( self._response[ 'fixits' ] ): - vimsupport.EchoText( "No fixits found for current line" ) - else: - chunks = self._response[ 'fixits' ][ 0 ][ 'chunks' ] - try: - vimsupport.ReplaceChunks( chunks ) - except RuntimeError as e: - vimsupport.PostMultiLineNotice( str( e ) ) - - - def _HandleBasicResponse( self ): - vimsupport.EchoText( self._response ) - - - def _HandleMessageResponse( self ): - vimsupport.EchoText( self._response[ 'message' ] ) - - - def _HandleDetailedInfoResponse( self ): - vimsupport.WriteToPreviewWindow( self._response[ 'detailed_info' ] ) - - -def SendCommandRequest( arguments, completer ): - request = CommandRequest( arguments, completer ) - # This is a blocking call. - request.Start() - request.RunPostCommandActionsIfNeeded() - return request.Response() - - -def _BuildQfListItem( goto_data_item ): - qf_item = {} - if 'filepath' in goto_data_item: - qf_item[ 'filename' ] = ToUnicode( goto_data_item[ 'filepath' ] ) - if 'description' in goto_data_item: - qf_item[ 'text' ] = ToUnicode( goto_data_item[ 'description' ] ) - if 'line_num' in goto_data_item: - qf_item[ 'lnum' ] = goto_data_item[ 'line_num' ] - if 'column_num' in goto_data_item: - # ycmd returns columns 1-based, and QuickFix lists require "byte offsets". - # See :help getqflist and equivalent comment in - # vimsupport.ConvertDiagnosticsToQfList. - # - # When the Vim help says "byte index", it really means "1-based column - # number" (which is somewhat confusing). :help getqflist states "first - # column is 1". - qf_item[ 'col' ] = goto_data_item[ 'column_num' ] - - return qf_item diff --git a/vim/bundle/YouCompleteMe/python/ycm/client/completer_available_request.py b/vim/bundle/YouCompleteMe/python/ycm/client/completer_available_request.py deleted file mode 100644 index 3a480ca..0000000 --- a/vim/bundle/YouCompleteMe/python/ycm/client/completer_available_request.py +++ /dev/null @@ -1,58 +0,0 @@ -# Copyright (C) 2013 Google Inc. -# -# This file is part of YouCompleteMe. -# -# YouCompleteMe is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# YouCompleteMe is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with YouCompleteMe. If not, see <http://www.gnu.org/licenses/>. - -from __future__ import unicode_literals -from __future__ import print_function -from __future__ import division -from __future__ import absolute_import -from future import standard_library -standard_library.install_aliases() -from builtins import * # noqa - -from requests.exceptions import ReadTimeout - -from ycm.client.base_request import ( BaseRequest, BuildRequestData, - HandleServerException ) -from ycmd.responses import ServerError - - -class CompleterAvailableRequest( BaseRequest ): - def __init__( self, filetypes ): - super( CompleterAvailableRequest, self ).__init__() - self.filetypes = filetypes - self._response = None - - - def Start( self ): - request_data = BuildRequestData() - request_data.update( { 'filetypes': self.filetypes } ) - try: - self._response = self.PostDataToHandler( request_data, - 'semantic_completion_available' ) - except ( ServerError, ReadTimeout ) as e: - HandleServerException( e ) - - - def Response( self ): - return self._response - - -def SendCompleterAvailableRequest( filetypes ): - request = CompleterAvailableRequest( filetypes ) - # This is a blocking call. - request.Start() - return request.Response() diff --git a/vim/bundle/YouCompleteMe/python/ycm/client/completion_request.py b/vim/bundle/YouCompleteMe/python/ycm/client/completion_request.py deleted file mode 100644 index bf16912..0000000 --- a/vim/bundle/YouCompleteMe/python/ycm/client/completion_request.py +++ /dev/null @@ -1,109 +0,0 @@ -# Copyright (C) 2013 Google Inc. -# -# This file is part of YouCompleteMe. -# -# YouCompleteMe is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# YouCompleteMe is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with YouCompleteMe. If not, see <http://www.gnu.org/licenses/>. - -from __future__ import unicode_literals -from __future__ import print_function -from __future__ import division -from __future__ import absolute_import -from future import standard_library -standard_library.install_aliases() -from builtins import * # noqa - -from requests.exceptions import ReadTimeout - -from ycmd.utils import ToUnicode -from ycm.client.base_request import ( BaseRequest, JsonFromFuture, - HandleServerException, - MakeServerException ) -from ycmd.responses import ServerError - -TIMEOUT_SECONDS = 0.5 - - -class CompletionRequest( BaseRequest ): - def __init__( self, request_data ): - super( CompletionRequest, self ).__init__() - self.request_data = request_data - - - def Start( self ): - self._response_future = self.PostDataToHandlerAsync( self.request_data, - 'completions', - TIMEOUT_SECONDS ) - - - def Done( self ): - return self._response_future.done() - - - def RawResponse( self ): - if not self._response_future: - return [] - try: - response = JsonFromFuture( self._response_future ) - - errors = response[ 'errors' ] if 'errors' in response else [] - for e in errors: - HandleServerException( MakeServerException( e ) ) - - return JsonFromFuture( self._response_future )[ 'completions' ] - except ( ServerError, ReadTimeout ) as e: - HandleServerException( e ) - return [] - - - def Response( self ): - return _ConvertCompletionDatasToVimDatas( self.RawResponse() ) - - -def ConvertCompletionDataToVimData( completion_data ): - # see :h complete-items for a description of the dictionary fields - vim_data = { - 'word' : '', - 'dup' : 1, - 'empty' : 1, - } - - if ( 'extra_data' in completion_data and - 'doc_string' in completion_data[ 'extra_data' ] ): - doc_string = completion_data[ 'extra_data' ][ 'doc_string' ] - else: - doc_string = "" - - if 'insertion_text' in completion_data: - vim_data[ 'word' ] = completion_data[ 'insertion_text' ] - if 'menu_text' in completion_data: - vim_data[ 'abbr' ] = completion_data[ 'menu_text' ] - if 'extra_menu_info' in completion_data: - vim_data[ 'menu' ] = completion_data[ 'extra_menu_info' ] - if 'kind' in completion_data: - kind = ToUnicode( completion_data[ 'kind' ] ) - if kind: - vim_data[ 'kind' ] = kind[ 0 ].lower() - if 'detailed_info' in completion_data: - vim_data[ 'info' ] = completion_data[ 'detailed_info' ] - if doc_string: - vim_data[ 'info' ] += '\n' + doc_string - elif doc_string: - vim_data[ 'info' ] = doc_string - - return vim_data - - -def _ConvertCompletionDatasToVimDatas( response_data ): - return [ ConvertCompletionDataToVimData( x ) - for x in response_data ] diff --git a/vim/bundle/YouCompleteMe/python/ycm/client/event_notification.py b/vim/bundle/YouCompleteMe/python/ycm/client/event_notification.py deleted file mode 100644 index b9a60d1..0000000 --- a/vim/bundle/YouCompleteMe/python/ycm/client/event_notification.py +++ /dev/null @@ -1,89 +0,0 @@ -# Copyright (C) 2013 Google Inc. -# -# This file is part of YouCompleteMe. -# -# YouCompleteMe is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# YouCompleteMe is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with YouCompleteMe. If not, see <http://www.gnu.org/licenses/>. - -from __future__ import unicode_literals -from __future__ import print_function -from __future__ import division -from __future__ import absolute_import -from future import standard_library -standard_library.install_aliases() -from builtins import * # noqa - -from requests.exceptions import ReadTimeout - -from ycm import vimsupport -from ycmd.responses import UnknownExtraConf, ServerError -from ycm.client.base_request import ( BaseRequest, BuildRequestData, - JsonFromFuture, HandleServerException ) - - -class EventNotification( BaseRequest ): - def __init__( self, event_name, extra_data = None ): - super( EventNotification, self ).__init__() - self._event_name = event_name - self._extra_data = extra_data - self._cached_response = None - - - def Start( self ): - request_data = BuildRequestData() - if self._extra_data: - request_data.update( self._extra_data ) - request_data[ 'event_name' ] = self._event_name - - self._response_future = self.PostDataToHandlerAsync( request_data, - 'event_notification' ) - - - def Done( self ): - return self._response_future.done() - - - def Response( self ): - if self._cached_response: - return self._cached_response - - if not self._response_future or self._event_name != 'FileReadyToParse': - return [] - - try: - try: - self._cached_response = JsonFromFuture( self._response_future ) - except UnknownExtraConf as e: - if vimsupport.Confirm( str( e ) ): - _LoadExtraConfFile( e.extra_conf_file ) - else: - _IgnoreExtraConfFile( e.extra_conf_file ) - except ( ServerError, ReadTimeout ) as e: - HandleServerException( e ) - - return self._cached_response if self._cached_response else [] - - -def SendEventNotificationAsync( event_name, extra_data = None ): - event = EventNotification( event_name, extra_data ) - event.Start() - - -def _LoadExtraConfFile( filepath ): - BaseRequest.PostDataToHandler( { 'filepath': filepath }, - 'load_extra_conf_file' ) - - -def _IgnoreExtraConfFile( filepath ): - BaseRequest.PostDataToHandler( { 'filepath': filepath }, - 'ignore_extra_conf_file' ) diff --git a/vim/bundle/YouCompleteMe/python/ycm/client/omni_completion_request.py b/vim/bundle/YouCompleteMe/python/ycm/client/omni_completion_request.py deleted file mode 100644 index 2bcb291..0000000 --- a/vim/bundle/YouCompleteMe/python/ycm/client/omni_completion_request.py +++ /dev/null @@ -1,71 +0,0 @@ -# Copyright (C) 2013 Google Inc. -# -# This file is part of YouCompleteMe. -# -# YouCompleteMe is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# YouCompleteMe is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with YouCompleteMe. If not, see <http://www.gnu.org/licenses/>. - -from __future__ import unicode_literals -from __future__ import print_function -from __future__ import division -from __future__ import absolute_import -from future import standard_library -standard_library.install_aliases() -from builtins import * # noqa - -from ycm.client.completion_request import CompletionRequest - - -class OmniCompletionRequest( CompletionRequest ): - def __init__( self, omni_completer, request_data ): - super( OmniCompletionRequest, self ).__init__( request_data ) - self._omni_completer = omni_completer - - - def Start( self ): - self._results = self._omni_completer.ComputeCandidates( self.request_data ) - - - def Done( self ): - return True - - - def RawResponse( self ): - return _ConvertVimDatasToCompletionDatas( self._results ) - - - def Response( self ): - return self._results - - -def ConvertVimDataToCompletionData( vim_data ): - # see :h complete-items for a description of the dictionary fields - completion_data = {} - - if 'word' in vim_data: - completion_data[ 'insertion_text' ] = vim_data[ 'word' ] - if 'abbr' in vim_data: - completion_data[ 'menu_text' ] = vim_data[ 'abbr' ] - if 'menu' in vim_data: - completion_data[ 'extra_menu_info' ] = vim_data[ 'menu' ] - if 'kind' in vim_data: - completion_data[ 'kind' ] = [ vim_data[ 'kind' ] ] - if 'info' in vim_data: - completion_data[ 'detailed_info' ] = vim_data[ 'info' ] - - return completion_data - - -def _ConvertVimDatasToCompletionDatas( response_data ): - return [ ConvertVimDataToCompletionData( x ) - for x in response_data ] diff --git a/vim/bundle/YouCompleteMe/python/ycm/client/tests/__init__.py b/vim/bundle/YouCompleteMe/python/ycm/client/tests/__init__.py deleted file mode 100644 index e69de29..0000000 --- a/vim/bundle/YouCompleteMe/python/ycm/client/tests/__init__.py +++ /dev/null diff --git a/vim/bundle/YouCompleteMe/python/ycm/client/tests/command_request_test.py b/vim/bundle/YouCompleteMe/python/ycm/client/tests/command_request_test.py deleted file mode 100644 index dfc55e0..0000000 --- a/vim/bundle/YouCompleteMe/python/ycm/client/tests/command_request_test.py +++ /dev/null @@ -1,283 +0,0 @@ -# Copyright (C) 2016 YouCompleteMe Contributors -# -# This file is part of YouCompleteMe. -# -# YouCompleteMe is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# YouCompleteMe is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with YouCompleteMe. If not, see <http://www.gnu.org/licenses/>. - -from __future__ import unicode_literals -from __future__ import print_function -from __future__ import division -from __future__ import absolute_import -from future import standard_library -standard_library.install_aliases() -from builtins import * # noqa - -from ycm.test_utils import ExtendedMock, MockVimModule -MockVimModule() - -import json -from mock import patch, call -from nose.tools import ok_ -from ycm.client.command_request import CommandRequest - - -class GoToResponse_QuickFix_test( object ): - """This class tests the generation of QuickFix lists for GoTo responses which - return multiple locations, such as the Python completer and JavaScript - completer. It mostly proves that we use 1-based indexing for the column - number.""" - - def setUp( self ): - self._request = CommandRequest( [ 'GoToTest' ] ) - - - def tearDown( self ): - self._request = None - - - def GoTo_EmptyList_test( self ): - self._CheckGoToList( [], [] ) - - - def GoTo_SingleItem_List_test( self ): - self._CheckGoToList( [ { - 'filepath': 'dummy_file', - 'line_num': 10, - 'column_num': 1, - 'description': 'this is some text', - } ], [ { - 'filename': 'dummy_file', - 'text': 'this is some text', - 'lnum': 10, - 'col': 1 - } ] ) - - - def GoTo_MultiItem_List_test( self ): - self._CheckGoToList( [ { - 'filepath': 'dummy_file', - 'line_num': 10, - 'column_num': 1, - 'description': 'this is some other text', - }, { - 'filepath': 'dummy_file2', - 'line_num': 1, - 'column_num': 21, - 'description': 'this is some text', - } ], [ { - 'filename': 'dummy_file', - 'text': 'this is some other text', - 'lnum': 10, - 'col': 1 - }, { - 'filename': 'dummy_file2', - 'text': 'this is some text', - 'lnum': 1, - 'col': 21 - } ] ) - - - @patch( 'ycm.vimsupport.VariableExists', return_value = True ) - @patch( 'ycm.vimsupport.SetFittingHeightForCurrentWindow' ) - @patch( 'vim.command', new_callable = ExtendedMock ) - @patch( 'vim.eval', new_callable = ExtendedMock ) - def _CheckGoToList( self, - completer_response, - expected_qf_list, - vim_eval, - vim_command, - set_fitting_height, - variable_exists ): - self._request._response = completer_response - - self._request.RunPostCommandActionsIfNeeded() - - vim_eval.assert_has_exact_calls( [ - call( 'setqflist( {0} )'.format( json.dumps( expected_qf_list ) ) ) - ] ) - vim_command.assert_has_exact_calls( [ - call( 'botright copen' ), - call( 'au WinLeave <buffer> q' ), - call( 'doautocmd User YcmQuickFixOpened' ) - ] ) - set_fitting_height.assert_called_once_with() - - -class Response_Detection_test( object ): - - def BasicResponse_test( self ): - def _BasicResponseTest( command, response ): - with patch( 'vim.command' ) as vim_command: - request = CommandRequest( [ command ] ) - request._response = response - request.RunPostCommandActionsIfNeeded() - vim_command.assert_called_with( "echom '{0}'".format( response ) ) - - tests = [ - [ 'AnythingYouLike', True ], - [ 'GoToEvenWorks', 10 ], - [ 'FixItWorks', 'String!' ], - [ 'and8434fd andy garbag!', 10.3 ], - ] - - for test in tests: - yield _BasicResponseTest, test[ 0 ], test[ 1 ] - - - def FixIt_Response_Empty_test( self ): - # Ensures we recognise and handle fixit responses which indicate that there - # are no fixits available - def EmptyFixItTest( command ): - with patch( 'ycm.vimsupport.ReplaceChunks' ) as replace_chunks: - with patch( 'ycm.vimsupport.EchoText' ) as echo_text: - request = CommandRequest( [ command ] ) - request._response = { - 'fixits': [] - } - request.RunPostCommandActionsIfNeeded() - - echo_text.assert_called_with( 'No fixits found for current line' ) - replace_chunks.assert_not_called() - - for test in [ 'FixIt', 'Refactor', 'GoToHell', 'any_old_garbade!!!21' ]: - yield EmptyFixItTest, test - - - def FixIt_Response_test( self ): - # Ensures we recognise and handle fixit responses with some dummy chunk data - def FixItTest( command, response, chunks ): - with patch( 'ycm.vimsupport.ReplaceChunks' ) as replace_chunks: - with patch( 'ycm.vimsupport.EchoText' ) as echo_text: - request = CommandRequest( [ command ] ) - request._response = response - request.RunPostCommandActionsIfNeeded() - - replace_chunks.assert_called_with( chunks ) - echo_text.assert_not_called() - - basic_fixit = { - 'fixits': [ { - 'chunks': [ { - 'dummy chunk contents': True - } ] - } ] - } - basic_fixit_chunks = basic_fixit[ 'fixits' ][ 0 ][ 'chunks' ] - - multi_fixit = { - 'fixits': [ { - 'chunks': [ { - 'dummy chunk contents': True - } ] - }, { - 'additional fixits are ignored currently': True - } ] - } - multi_fixit_first_chunks = multi_fixit[ 'fixits' ][ 0 ][ 'chunks' ] - - tests = [ - [ 'AnythingYouLike', basic_fixit, basic_fixit_chunks ], - [ 'GoToEvenWorks', basic_fixit, basic_fixit_chunks ], - [ 'FixItWorks', basic_fixit, basic_fixit_chunks ], - [ 'and8434fd andy garbag!', basic_fixit, basic_fixit_chunks ], - [ 'additional fixits ignored', multi_fixit, multi_fixit_first_chunks ], - ] - - for test in tests: - yield FixItTest, test[ 0 ], test[ 1 ], test[ 2 ] - - - def Message_Response_test( self ): - # Ensures we correctly recognise and handle responses with a message to show - # to the user - - def MessageTest( command, message ): - with patch( 'ycm.vimsupport.EchoText' ) as echo_text: - request = CommandRequest( [ command ] ) - request._response = { 'message': message } - request.RunPostCommandActionsIfNeeded() - echo_text.assert_called_with( message ) - - tests = [ - [ '___________', 'This is a message' ], - [ '', 'this is also a message' ], - [ 'GetType', 'std::string' ], - ] - - for test in tests: - yield MessageTest, test[ 0 ], test[ 1 ] - - - def Detailed_Info_test( self ): - # Ensures we correctly detect and handle detailed_info responses which are - # used to display information in the preview window - - def DetailedInfoTest( command, info ): - with patch( 'ycm.vimsupport.WriteToPreviewWindow' ) as write_to_preview: - request = CommandRequest( [ command ] ) - request._response = { 'detailed_info': info } - request.RunPostCommandActionsIfNeeded() - write_to_preview.assert_called_with( info ) - - tests = [ - [ '___________', 'This is a message' ], - [ '', 'this is also a message' ], - [ 'GetDoc', 'std::string\netc\netc' ], - ] - - for test in tests: - yield DetailedInfoTest, test[ 0 ], test[ 1 ] - - - def GoTo_Single_test( self ): - # Ensures we handle any unknown type of response as a GoTo response - - def GoToTest( command, response ): - with patch( 'ycm.vimsupport.JumpToLocation' ) as jump_to_location: - request = CommandRequest( [ command ] ) - request._response = response - request.RunPostCommandActionsIfNeeded() - jump_to_location.assert_called_with( - response[ 'filepath' ], - response[ 'line_num' ], - response[ 'column_num' ] ) - - def GoToListTest( command, response ): - # Note: the detail of these called are tested by - # GoToResponse_QuickFix_test, so here we just check that the right call is - # made - with patch( 'ycm.vimsupport.SetQuickFixList' ) as set_qf_list: - request = CommandRequest( [ command ] ) - request._response = response - request.RunPostCommandActionsIfNeeded() - ok_( set_qf_list.called ) - - basic_goto = { - 'filepath': 'test', - 'line_num': 10, - 'column_num': 100, - } - - tests = [ - [ GoToTest, 'AnythingYouLike', basic_goto ], - [ GoToTest, 'GoTo', basic_goto ], - [ GoToTest, 'FindAThing', basic_goto ], - [ GoToTest, 'FixItGoto', basic_goto ], - [ GoToListTest, 'AnythingYouLike', [ basic_goto ] ], - [ GoToListTest, 'GoTo', [] ], - [ GoToListTest, 'FixItGoto', [ basic_goto, basic_goto ] ], - ] - - for test in tests: - yield test[ 0 ], test[ 1 ], test[ 2 ] diff --git a/vim/bundle/YouCompleteMe/python/ycm/client/tests/completion_request_test.py b/vim/bundle/YouCompleteMe/python/ycm/client/tests/completion_request_test.py deleted file mode 100644 index acf0252..0000000 --- a/vim/bundle/YouCompleteMe/python/ycm/client/tests/completion_request_test.py +++ /dev/null @@ -1,186 +0,0 @@ -# Copyright (C) 2015 YouCompleteMe Contributors -# -# This file is part of YouCompleteMe. -# -# YouCompleteMe is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# YouCompleteMe is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with YouCompleteMe. If not, see <http://www.gnu.org/licenses/>. - -from __future__ import unicode_literals -from __future__ import print_function -from __future__ import division -from __future__ import absolute_import -from future import standard_library -standard_library.install_aliases() -from builtins import * # noqa - -from nose.tools import eq_ -from ycm.test_utils import MockVimModule -vim_mock = MockVimModule() - -from .. import completion_request - - -class ConvertCompletionResponseToVimDatas_test( object ): - """ This class tests the - completion_request._ConvertCompletionResponseToVimDatas method """ - - def _Check( self, completion_data, expected_vim_data ): - vim_data = completion_request.ConvertCompletionDataToVimData( - completion_data ) - - try: - eq_( expected_vim_data, vim_data ) - except: - print( "Expected:\n'{0}'\nwhen parsing:\n'{1}'\nBut found:\n'{2}'".format( - expected_vim_data, - completion_data, - vim_data ) ) - raise - - - def All_Fields_test( self ): - self._Check( { - 'insertion_text': 'INSERTION TEXT', - 'menu_text': 'MENU TEXT', - 'extra_menu_info': 'EXTRA MENU INFO', - 'kind': 'K', - 'detailed_info': 'DETAILED INFO', - 'extra_data': { - 'doc_string': 'DOC STRING', - }, - }, { - 'word' : 'INSERTION TEXT', - 'abbr' : 'MENU TEXT', - 'menu' : 'EXTRA MENU INFO', - 'kind' : 'k', - 'info' : 'DETAILED INFO\nDOC STRING', - 'dup' : 1, - 'empty': 1, - } ) - - - def Just_Detailed_Info_test( self ): - self._Check( { - 'insertion_text': 'INSERTION TEXT', - 'menu_text': 'MENU TEXT', - 'extra_menu_info': 'EXTRA MENU INFO', - 'kind': 'K', - 'detailed_info': 'DETAILED INFO', - }, { - 'word' : 'INSERTION TEXT', - 'abbr' : 'MENU TEXT', - 'menu' : 'EXTRA MENU INFO', - 'kind' : 'k', - 'info' : 'DETAILED INFO', - 'dup' : 1, - 'empty': 1, - } ) - - - def Just_Doc_String_test( self ): - self._Check( { - 'insertion_text': 'INSERTION TEXT', - 'menu_text': 'MENU TEXT', - 'extra_menu_info': 'EXTRA MENU INFO', - 'kind': 'K', - 'extra_data': { - 'doc_string': 'DOC STRING', - }, - }, { - 'word' : 'INSERTION TEXT', - 'abbr' : 'MENU TEXT', - 'menu' : 'EXTRA MENU INFO', - 'kind' : 'k', - 'info' : 'DOC STRING', - 'dup' : 1, - 'empty': 1, - } ) - - - def Extra_Info_No_Doc_String_test( self ): - self._Check( { - 'insertion_text': 'INSERTION TEXT', - 'menu_text': 'MENU TEXT', - 'extra_menu_info': 'EXTRA MENU INFO', - 'kind': 'K', - 'extra_data': { - }, - }, { - 'word' : 'INSERTION TEXT', - 'abbr' : 'MENU TEXT', - 'menu' : 'EXTRA MENU INFO', - 'kind' : 'k', - 'dup' : 1, - 'empty': 1, - } ) - - - def Extra_Info_No_Doc_String_With_Detailed_Info_test( self ): - self._Check( { - 'insertion_text': 'INSERTION TEXT', - 'menu_text': 'MENU TEXT', - 'extra_menu_info': 'EXTRA MENU INFO', - 'kind': 'K', - 'detailed_info': 'DETAILED INFO', - 'extra_data': { - }, - }, { - 'word' : 'INSERTION TEXT', - 'abbr' : 'MENU TEXT', - 'menu' : 'EXTRA MENU INFO', - 'kind' : 'k', - 'info' : 'DETAILED INFO', - 'dup' : 1, - 'empty': 1, - } ) - - - def Empty_Insertion_Text_test( self ): - self._Check( { - 'insertion_text': '', - 'menu_text': 'MENU TEXT', - 'extra_menu_info': 'EXTRA MENU INFO', - 'kind': 'K', - 'detailed_info': 'DETAILED INFO', - 'extra_data': { - 'doc_string': 'DOC STRING', - }, - }, { - 'word' : '', - 'abbr' : 'MENU TEXT', - 'menu' : 'EXTRA MENU INFO', - 'kind' : 'k', - 'info' : 'DETAILED INFO\nDOC STRING', - 'dup' : 1, - 'empty': 1, - } ) - - - def No_Insertion_Text_test( self ): - self._Check( { - 'menu_text': 'MENU TEXT', - 'extra_menu_info': 'EXTRA MENU INFO', - 'kind': 'K', - 'detailed_info': 'DETAILED INFO', - 'extra_data': { - 'doc_string': 'DOC STRING', - }, - }, { - 'word' : '', - 'abbr' : 'MENU TEXT', - 'menu' : 'EXTRA MENU INFO', - 'kind' : 'k', - 'info' : 'DETAILED INFO\nDOC STRING', - 'dup' : 1, - 'empty': 1, - } ) diff --git a/vim/bundle/YouCompleteMe/python/ycm/client/tests/omni_completion_request_tests.py b/vim/bundle/YouCompleteMe/python/ycm/client/tests/omni_completion_request_tests.py deleted file mode 100644 index 02fb2e9..0000000 --- a/vim/bundle/YouCompleteMe/python/ycm/client/tests/omni_completion_request_tests.py +++ /dev/null @@ -1,81 +0,0 @@ -# Copyright (C) 2016 YouCompleteMe contributors -# -# This file is part of YouCompleteMe. -# -# YouCompleteMe is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# YouCompleteMe is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with YouCompleteMe. If not, see <http://www.gnu.org/licenses/>. - -from __future__ import unicode_literals -from __future__ import print_function -from __future__ import division -from __future__ import absolute_import -from future import standard_library -standard_library.install_aliases() -from builtins import * # noqa - -from mock import MagicMock -from nose.tools import eq_ -from hamcrest import assert_that, has_entries - -from ycm.client.omni_completion_request import OmniCompletionRequest - - -def BuildOmnicompletionRequest( results ): - omni_completer = MagicMock() - omni_completer.ComputeCandidates = MagicMock( return_value = results ) - - request = OmniCompletionRequest( omni_completer, None ) - request.Start() - - return request - - -def Done_AlwaysTrue_test(): - request = BuildOmnicompletionRequest( [] ) - - eq_( request.Done(), True ) - - -def Response_FromOmniCompleter_test(): - results = [ { "word": "test" } ] - request = BuildOmnicompletionRequest( results ) - - eq_( request.Response(), results ) - - -def RawResponse_ConvertedFromOmniCompleter_test(): - vim_results = [ - { "word": "WORD", "abbr": "ABBR", "menu": "MENU", - "kind": "KIND", "info": "INFO" }, - { "word": "WORD2", "abbr": "ABBR2", "menu": "MENU2", - "kind": "KIND2", "info": "INFO" }, - { "word": "WORD", "abbr": "ABBR", }, - { }, - ] - expected_results = [ - has_entries( { "insertion_text": "WORD", "menu_text": "ABBR", - "extra_menu_info": "MENU", "kind": [ "KIND" ], - "detailed_info": "INFO" } ), - has_entries( { "insertion_text": "WORD2", "menu_text": "ABBR2", - "extra_menu_info": "MENU2", "kind": [ "KIND2" ], - "detailed_info": "INFO" } ), - has_entries( { "insertion_text": "WORD", "menu_text": "ABBR", } ), - has_entries( { } ), - ] - request = BuildOmnicompletionRequest( vim_results ) - - results = request.RawResponse() - - eq_( len( results ), len( expected_results ) ) - for result, expected_result in zip( results, expected_results ): - assert_that( result, expected_result ) diff --git a/vim/bundle/YouCompleteMe/python/ycm/client/ycmd_keepalive.py b/vim/bundle/YouCompleteMe/python/ycm/client/ycmd_keepalive.py deleted file mode 100644 index fca59f4..0000000 --- a/vim/bundle/YouCompleteMe/python/ycm/client/ycmd_keepalive.py +++ /dev/null @@ -1,54 +0,0 @@ -# Copyright (C) 2013 Google Inc. -# -# This file is part of YouCompleteMe. -# -# YouCompleteMe is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# YouCompleteMe is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with YouCompleteMe. If not, see <http://www.gnu.org/licenses/>. - -from __future__ import unicode_literals -from __future__ import print_function -from __future__ import division -from __future__ import absolute_import -from future import standard_library -standard_library.install_aliases() -from builtins import * # noqa - -import time -from threading import Thread -from ycm.client.base_request import BaseRequest - - -# This class can be used to keep the ycmd server alive for the duration of the -# life of the client. By default, ycmd shuts down if it doesn't see a request in -# a while. -class YcmdKeepalive( object ): - def __init__( self, ping_interval_seconds = 60 * 10 ): - self._keepalive_thread = Thread( target = self._ThreadMain ) - self._keepalive_thread.daemon = True - self._ping_interval_seconds = ping_interval_seconds - - - def Start( self ): - self._keepalive_thread.start() - - - def _ThreadMain( self ): - while True: - time.sleep( self._ping_interval_seconds ) - - # We don't care if there's an intermittent problem in contacting the - # server; it's fine to just skip this ping. - try: - BaseRequest.GetDataFromHandler( 'healthy' ) - except: - pass |