Пример #1
0
  def setUp( self ):
    self._filename_completer = FilenameCompleter(
      user_options_store.DefaultOptions() )

    # We cache include flags for test.cpp file for unit testing.
    self._filename_completer._flags.flags_for_file[ PATH_TO_TEST_FILE ] = [
      "-I", os.path.join( DATA_DIR, "include" ),
      "-I", os.path.join( DATA_DIR, "include", "Qt" ),
      "-I", os.path.join( DATA_DIR, "include", "QtGui" ),
    ]
 def __init__(self, user_options):
     super(GeneralCompleterStore, self).__init__(user_options)
     self._identifier_completer = IdentifierCompleter(user_options)
     self._filename_completer = FilenameCompleter(user_options)
     self._ultisnips_completer = UltiSnipsCompleter(user_options)
     self._non_filename_completers = [self._identifier_completer]
     if user_options.get('use_ultisnips_completer', True):
         self._non_filename_completers.append(self._ultisnips_completer)
     self._all_completers = [
         self._identifier_completer, self._filename_completer,
         self._ultisnips_completer
     ]
Пример #3
0
 def __init__(self, user_options):
     super().__init__(user_options)
     self._candidate = []
     self._raw_names = {}
     self._fn_compl = FilenameCompleter(user_options)
     for type in ['command', 'variable', 'property', 'module']:
         ret = subprocess.run(['cmake', '--help-{}-list'.format(type)], capture_output=True)
         if ret.returncode == 0:
             cmds = ret.stdout.decode().split()
             self._raw_names.update([(cmd, type) for cmd in cmds])
             self._candidate += [
                 responses.BuildCompletionData(
                     cmd, kind=type[0]) for cmd in cmds]
Пример #4
0
def WorkingDir_Use_Client_WD_test():
  # Store the working directory so we can return to it
  wd = os.getcwd()

  test_dir = os.path.join( DATA_DIR, 'include' )
  assert wd != test_dir, "Please run this test from a different directory"

  try:
    options = user_options_store.DefaultOptions()
    options.update( {
      'filepath_completion_use_working_dir': 1
    } )

    completer = FilenameCompleter( options )

    # We supply working_dir in the request, so we expect results to be relative
    # to the supplied path
    data = sorted( _CompletionResultsForLine( completer, 'ls ./', {
      'working_dir': os.path.join( DATA_DIR, 'include' )
    } ) )
    eq_( [
          ( 'Qt',       '[Dir]' ),
          ( 'QtGui',    '[Dir]' ),
        ], data )

  finally:
    os.chdir( wd )
Пример #5
0
def WorkingDir_Use_ycmd_WD_test():
  # Store the working directory so we can return to it
  wd = os.getcwd()

  test_dir = os.path.join( DATA_DIR, 'include' )
  assert wd != test_dir, "Please run this test from a different directory"

  try:
    options = user_options_store.DefaultOptions()
    options.update( {
      'filepath_completion_use_working_dir': 1
    } )

    completer = FilenameCompleter( options )

    # Change current directory to DATA_DIR/include (path to which we expect
    # results to be relative)
    os.chdir( test_dir )

    # We don't supply working_dir in the request, so the current working
    # directory is used.
    data = sorted( _CompletionResultsForLine( completer, 'ls ./' ) )
    eq_( [
          ( 'Qt',       '[Dir]' ),
          ( 'QtGui',    '[Dir]' ),
        ], data )

  finally:
    os.chdir( wd )
def WorkingDir_UseFilePath_test(app):
    ok_(GetCurrentDirectory() != DATA_DIR, ('Please run this test from a '
                                            'different directory'))

    completer = FilenameCompleter(user_options_store.GetAll())

    data = _CompletionResultsForLine(completer, 'ls ./include/')
    assert_that(data, contains_inanyorder(('Qt', '[Dir]'), ('QtGui', '[Dir]')))
Пример #7
0
def WorkingDir_UseFilePath_test(app):
    ok_(GetCurrentDirectory() != DATA_DIR, ('Please run this test from a '
                                            'different directory'))

    completer = FilenameCompleter(user_options_store.GetAll())

    data = sorted(_CompletionResultsForLine(completer, 'ls ./include/'))
    eq_([('Qt', '[Dir]'), ('QtGui', '[Dir]')], data)
Пример #8
0
def WorkingDir_UseFilePath_test():
    ok_(GetCurrentDirectory() != DATA_DIR, ('Please run this test from a '
                                            'different directory'))

    with UserOption('filepath_completion_use_working_dir', 0) as options:
        completer = FilenameCompleter(options)

        data = sorted(_CompletionResultsForLine(completer, 'ls ./include/'))
        eq_([('Qt', '[Dir]'), ('QtGui', '[Dir]')], data)
def WorkingDir_UseClientWorkingDirectory_test(app):
    test_dir = os.path.join(DATA_DIR, 'include')
    ok_(GetCurrentDirectory() != test_dir, ('Please run this test from a '
                                            'different directory'))

    completer = FilenameCompleter(user_options_store.GetAll())

    # We supply working_dir in the request, so we expect results to be
    # relative to the supplied path.
    data = _CompletionResultsForLine(completer, 'ls ./',
                                     {'working_dir': test_dir})
    assert_that(data, contains_inanyorder(('Qt', '[Dir]'), ('QtGui', '[Dir]')))
Пример #10
0
def WorkingDir_Use_File_Path_test():
    assert os.getcwd() != DATA_DIR, ("Please run this test from a different "
                                     "directory")

    options = user_options_store.DefaultOptions()
    options.update({'filepath_completion_use_working_dir': 0})
    completer = FilenameCompleter(options)

    data = sorted(_CompletionResultsForLine(completer, 'ls ./include/'))
    eq_([
        ('Qt', '[Dir]'),
        ('QtGui', '[Dir]'),
    ], data)
Пример #11
0
def WorkingDir_UseServerWorkingDirectory_test(app):
    test_dir = os.path.join(DATA_DIR, 'include')
    with CurrentWorkingDirectory(test_dir) as old_current_dir:
        ok_(old_current_dir != test_dir,
            ('Please run this test from a different '
             'directory'))

        completer = FilenameCompleter(user_options_store.GetAll())

        # We don't supply working_dir in the request, so the current working
        # directory is used.
        data = sorted(_CompletionResultsForLine(completer, 'ls ./'))
        eq_([('Qt', '[Dir]'), ('QtGui', '[Dir]')], data)
Пример #12
0
def WorkingDir_UseServerWorkingDirectory_Unicode_test(app):
    test_dir = os.path.join(TEST_DIR, 'testdata', 'filename_completer', '∂†∫')
    with CurrentWorkingDirectory(test_dir) as old_current_dir:
        ok_(old_current_dir != test_dir,
            ('Please run this test from a different '
             'directory'))

        completer = FilenameCompleter(user_options_store.GetAll())

        # We don't supply working_dir in the request, so the current working
        # directory is used.
        data = sorted(_CompletionResultsForLine(completer, 'ls ./'))
        eq_([('†es†.txt', '[File]')], data)
Пример #13
0
def WorkingDir_UseClientWorkingDirectory_test():
    test_dir = os.path.join(DATA_DIR, 'include')
    ok_(GetCurrentDirectory() != test_dir, ('Please run this test from a '
                                            'different directory'))

    with UserOption('filepath_completion_use_working_dir', 1) as options:
        completer = FilenameCompleter(options)

        # We supply working_dir in the request, so we expect results to be
        # relative to the supplied path.
        data = sorted(
            _CompletionResultsForLine(completer, 'ls ./',
                                      {'working_dir': test_dir}))
        eq_([('Qt', '[Dir]'), ('QtGui', '[Dir]')], data)
Пример #14
0
# 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/>.

import os
from nose.tools import eq_
from ycmd.completers.general.filename_completer import FilenameCompleter
from ycmd import user_options_store

test_dir = os.path.dirname(os.path.abspath(__file__))
data_dir = os.path.join(test_dir, "testdata", "filename_completer")
file_path = os.path.join(data_dir, "test.cpp")

fnc = FilenameCompleter(user_options_store.DefaultOptions())
# We cache include flags for test.cpp file for unit testing.
fnc._flags.flags_for_file[file_path] = [
    "-I",
    os.path.join(data_dir, "include"),
    "-I",
    os.path.join(data_dir, "include", "Qt"),
    "-I",
    os.path.join(data_dir, "include", "QtGui"),
]

request_data = {
    'filepath': file_path,
    'file_data': {
        file_path: {
            'filetypes': 'cpp'
Пример #15
0
 def setUp( self ):
   self._filename_completer = FilenameCompleter(
     user_options_store.DefaultOptions() )
Пример #16
0
class CMakeCompleter(Completer):
    """
    A cmake completer.
    """

    def __init__(self, user_options):
        super().__init__(user_options)
        self._candidate = []
        self._raw_names = {}
        self._fn_compl = FilenameCompleter(user_options)
        for type in ['command', 'variable', 'property', 'module']:
            ret = subprocess.run(['cmake', '--help-{}-list'.format(type)], capture_output=True)
            if ret.returncode == 0:
                cmds = ret.stdout.decode().split()
                self._raw_names.update([(cmd, type) for cmd in cmds])
                self._candidate += [
                    responses.BuildCompletionData(
                        cmd, kind=type[0]) for cmd in cmds]

    def ShouldUseNowInner(self, request_data):
        if len(self._candidate) == 0:
            return False
        # dont complete when is filename
        if self._fn_compl.ShouldUseNow(request_data):
            return False
        else:
            return self.QueryLengthAboveMinThreshold(request_data)

    def ComputeCandidates(self, request_data):
        if not self.ShouldUseNow(request_data):
            return []
        query = self._GetQueryWord(request_data)
        return self.FilterAndSortCandidates(self._candidate, query)

    def SupportedFiletypes(self):
        return ['cmake']

    def GetSubcommandsMap(self):
        return {
                'GetDoc': (lambda self, request_data, args:
                    self._GetDoc(request_data, args))
        }

    def _GetQueryWord(self, request_data):
        line = request_data['line_value']
        start_point = request_data['start_codepoint'] - 1
        line = line[start_point:]
        m = re.match(r'(\w+).*', line)
        if m is None:
            query = ''
        else:
            query = m.group(1)
        return query

    def _GetDoc(self, request_data, args):
        query = self._GetQueryWord(request_data)
        if query in self._raw_names: 
            type = self._raw_names[query]
            ret = subprocess.run(
                    ['cmake', '--help-{}'.format(type), query],
                    capture_output=True)
            if ret.returncode == 0:
                msg = ret.stdout.decode()
                return responses.BuildDetailedInfoResponse(str(request_data))

        msg = "Can't find doc for {}".format(query)
        return responses.BuildDisplayMessageResponse(msg)
class GeneralCompleterStore(Completer):
    """
  Holds a list of completers that can be used in all filetypes.

  It overrides all Completer API methods so that specific calls to
  GeneralCompleterStore are passed to all general completers.
  """
    def __init__(self, user_options):
        super(GeneralCompleterStore, self).__init__(user_options)
        self._identifier_completer = IdentifierCompleter(user_options)
        self._filename_completer = FilenameCompleter(user_options)
        self._ultisnips_completer = UltiSnipsCompleter(user_options)
        self._non_filename_completers = [self._identifier_completer]
        if user_options.get('use_ultisnips_completer', True):
            self._non_filename_completers.append(self._ultisnips_completer)
        self._all_completers = [
            self._identifier_completer, self._filename_completer,
            self._ultisnips_completer
        ]

    def SupportedFiletypes(self):
        return set()

    def GetIdentifierCompleter(self):
        return self._identifier_completer

    def ComputeCandidates(self, request_data):
        candidates = self._filename_completer.ComputeCandidates(request_data)
        if candidates:
            return candidates
        for completer in self._non_filename_completers:
            candidates += completer.ComputeCandidates(request_data)
        return candidates

    def OnFileReadyToParse(self, request_data):
        for completer in self._all_completers:
            completer.OnFileReadyToParse(request_data)

    def OnBufferVisit(self, request_data):
        for completer in self._all_completers:
            completer.OnBufferVisit(request_data)

    def OnBufferUnload(self, request_data):
        for completer in self._all_completers:
            completer.OnBufferUnload(request_data)

    def OnInsertLeave(self, request_data):
        for completer in self._all_completers:
            completer.OnInsertLeave(request_data)

    def OnCurrentIdentifierFinished(self, request_data):
        for completer in self._all_completers:
            completer.OnCurrentIdentifierFinished(request_data)

    def GettingCompletions(self):
        for completer in self._all_completers:
            completer.GettingCompletions()

    def Shutdown(self):
        for completer in self._all_completers:
            completer.Shutdown()
Пример #18
0
class FilenameCompleter_test(object):
    def setUp(self):
        self._filename_completer = FilenameCompleter(
            user_options_store.DefaultOptions())

        # We cache include flags for test.cpp file for unit testing.
        self._filename_completer._flags.flags_for_file[PATH_TO_TEST_FILE] = [
            "-I",
            os.path.join(DATA_DIR, "include"),
            "-I",
            os.path.join(DATA_DIR, "include", "Qt"),
            "-I",
            os.path.join(DATA_DIR, "include", "QtGui"),
        ]

    def _CompletionResultsForLine(self, contents):
        request = REQUEST_DATA.copy()
        request['column_num'] = len(contents) + 1
        request['file_data'][PATH_TO_TEST_FILE]['contents'] = contents
        request = RequestWrap(request)
        candidates = self._filename_completer.ComputeCandidatesInner(request)
        return [(c['insertion_text'], c['extra_menu_info'])
                for c in candidates]

    def QuotedIncludeCompletion_test(self):
        data = self._CompletionResultsForLine('#include "')
        eq_([
            (u'foo漢字.txt', '[File]'),
            ('include', '[Dir]'),
            ('Qt', '[Dir]'),
            ('QtGui', '[File&Dir]'),
            ('QDialog', '[File]'),
            ('QWidget', '[File]'),
            ('test.cpp', '[File]'),
            ('test.hpp', '[File]'),
        ], data)

        data = self._CompletionResultsForLine('#include "include/')
        eq_([
            ('Qt', '[Dir]'),
            ('QtGui', '[Dir]'),
        ], data)

    def IncludeCompletion_test(self):
        data = self._CompletionResultsForLine('#include <')
        eq_([
            ('Qt', '[Dir]'),
            ('QtGui', '[File&Dir]'),
            ('QDialog', '[File]'),
            ('QWidget', '[File]'),
        ], data)

        data = self._CompletionResultsForLine('#include <QtGui/')
        eq_([
            ('QDialog', '[File]'),
            ('QWidget', '[File]'),
        ], data)

    def SystemPathCompletion_test(self):
        # Order of system path completion entries may differ
        # on different systems
        data = sorted(self._CompletionResultsForLine('const char* c = "./'))
        eq_([
            (u'foo漢字.txt', '[File]'),
            ('include', '[Dir]'),
            ('test.cpp', '[File]'),
            ('test.hpp', '[File]'),
        ], data)

        data = sorted(
            self._CompletionResultsForLine('const char* c = "./include/'))
        eq_([
            ('Qt', '[Dir]'),
            ('QtGui', '[Dir]'),
        ], data)
Пример #19
0
class FilenameCompleter_test(object):
    def setUp(self):
        self._filename_completer = FilenameCompleter(
            user_options_store.DefaultOptions())

        # We cache include flags for test.cpp file for unit testing.
        self._filename_completer._flags.flags_for_file[PATH_TO_TEST_FILE] = [
            "-I",
            os.path.join(DATA_DIR, "include"),
            "-I",
            os.path.join(DATA_DIR, "include", "Qt"),
            "-I",
            os.path.join(DATA_DIR, "include", "QtGui"),
        ]

    def _CompletionResultsForLine(self, contents):
        request = REQUEST_DATA.copy()
        request['column_num'] = len(contents) + 1
        request['file_data'][PATH_TO_TEST_FILE]['contents'] = contents
        request = RequestWrap(request)
        candidates = self._filename_completer.ComputeCandidatesInner(request)
        return [(c['insertion_text'], c['extra_menu_info'])
                for c in candidates]

    def QuotedIncludeCompletion_test(self):
        data = self._CompletionResultsForLine('#include "')
        eq_([
            (u'foo漢字.txt', '[File]'),
            ('include', '[Dir]'),
            ('Qt', '[Dir]'),
            ('QtGui', '[File&Dir]'),
            ('QDialog', '[File]'),
            ('QWidget', '[File]'),
            ('test.cpp', '[File]'),
            ('test.hpp', '[File]'),
        ], data)

        data = self._CompletionResultsForLine('#include "include/')
        eq_([
            ('Qt', '[Dir]'),
            ('QtGui', '[Dir]'),
        ], data)

    def IncludeCompletion_test(self):
        data = self._CompletionResultsForLine('#include <')
        eq_([
            ('Qt', '[Dir]'),
            ('QtGui', '[File&Dir]'),
            ('QDialog', '[File]'),
            ('QWidget', '[File]'),
        ], data)

        data = self._CompletionResultsForLine('#include <QtGui/')
        eq_([
            ('QDialog', '[File]'),
            ('QWidget', '[File]'),
        ], data)

    def SystemPathCompletion_test(self):
        # Order of system path completion entries may differ
        # on different systems
        data = sorted(self._CompletionResultsForLine('const char* c = "./'))
        eq_([
            (u'foo漢字.txt', '[File]'),
            ('include', '[Dir]'),
            ('test.cpp', '[File]'),
            ('test.hpp', '[File]'),
        ], data)

        data = sorted(
            self._CompletionResultsForLine('const char* c = "./include/'))
        eq_([
            ('Qt', '[Dir]'),
            ('QtGui', '[Dir]'),
        ], data)

    def EnvVar_AtStart_File_test(self):
        os.environ['YCM_TEST_DATA_DIR'] = DATA_DIR
        data = sorted(
            self._CompletionResultsForLine(
                'set x = $YCM_TEST_DATA_DIR/include/QtGui/'))

        os.environ.pop('YCM_TEST_DATA_DIR')
        eq_([('QDialog', '[File]'), ('QWidget', '[File]')], data)

    def EnvVar_AtStart_File_Partial_test(self):
        # The reason all entries in the directory are returned is that the
        # RequestWrapper tells the completer to effectively return results for
        # $YCM_TEST_DIR/testdata/filename_completer/ and the client filters based
        # on the additional characters.
        os.environ['YCM_TEST_DIR'] = TEST_DIR
        data = sorted(
            self._CompletionResultsForLine(
                'set x = $YCM_TEST_DIR/testdata/filename_completer/te'))
        os.environ.pop('YCM_TEST_DIR')

        eq_([
            (u'foo漢字.txt', '[File]'),
            ('include', '[Dir]'),
            ('test.cpp', '[File]'),
            ('test.hpp', '[File]'),
        ], data)

    def EnvVar_AtStart_Dir_test(self):
        os.environ['YCMTESTDIR'] = TEST_DIR

        data = sorted(
            self._CompletionResultsForLine('set x = $YCMTESTDIR/testdata/'))

        os.environ.pop('YCMTESTDIR')

        eq_([('filename_completer', '[Dir]')], data)

    def EnvVar_AtStart_Dir_Partial_test(self):
        os.environ['ycm_test_dir'] = TEST_DIR
        data = sorted(
            self._CompletionResultsForLine(
                'set x = $ycm_test_dir/testdata/fil'))

        os.environ.pop('ycm_test_dir')
        eq_([('filename_completer', '[Dir]')], data)

    def EnvVar_InMiddle_File_test(self):
        os.environ['YCM_TEST_filename_completer'] = 'filename_completer'
        data = sorted(
            self._CompletionResultsForLine(
                'set x = ' + TEST_DIR +
                '/testdata/$YCM_TEST_filename_completer/'))
        os.environ.pop('YCM_TEST_filename_completer')
        eq_([
            (u'foo漢字.txt', '[File]'),
            ('include', '[Dir]'),
            ('test.cpp', '[File]'),
            ('test.hpp', '[File]'),
        ], data)

    def EnvVar_InMiddle_File_Partial_test(self):
        os.environ['YCM_TEST_filename_c0mpleter'] = 'filename_completer'
        data = sorted(
            self._CompletionResultsForLine(
                'set x = ' + TEST_DIR +
                '/testdata/$YCM_TEST_filename_c0mpleter/te'))
        os.environ.pop('YCM_TEST_filename_c0mpleter')
        eq_([
            (u'foo漢字.txt', '[File]'),
            ('include', '[Dir]'),
            ('test.cpp', '[File]'),
            ('test.hpp', '[File]'),
        ], data)

    def EnvVar_InMiddle_Dir_test(self):
        os.environ['YCM_TEST_td'] = 'testd'
        data = sorted(
            self._CompletionResultsForLine('set x = ' + TEST_DIR +
                                           '/${YCM_TEST_td}ata/'))

        os.environ.pop('YCM_TEST_td')
        eq_([('filename_completer', '[Dir]')], data)

    def EnvVar_InMiddle_Dir_Partial_test(self):
        os.environ['YCM_TEST_td'] = 'tdata'
        data = sorted(
            self._CompletionResultsForLine('set x = ' + TEST_DIR +
                                           '/tes${YCM_TEST_td}/'))
        os.environ.pop('YCM_TEST_td')

        eq_([('filename_completer', '[Dir]')], data)

    def EnvVar_Undefined_test(self):
        data = sorted(
            self._CompletionResultsForLine('set x = ' + TEST_DIR +
                                           '/testdata${YCM_TEST_td}/'))

        eq_([], data)

    def EnvVar_Empty_Matches_test(self):
        os.environ['YCM_empty_var'] = ''
        data = sorted(
            self._CompletionResultsForLine('set x = ' + TEST_DIR +
                                           '/testdata${YCM_empty_var}/'))
        os.environ.pop('YCM_empty_var')

        eq_([('filename_completer', '[Dir]')], data)

    def EnvVar_Undefined_Garbage_test(self):
        os.environ['YCM_TEST_td'] = 'testdata'
        data = sorted(
            self._CompletionResultsForLine('set x = ' + TEST_DIR +
                                           '/$YCM_TEST_td}/'))

        os.environ.pop('YCM_TEST_td')
        eq_([], data)

    def EnvVar_Undefined_Garbage_2_test(self):
        os.environ['YCM_TEST_td'] = 'testdata'
        data = sorted(
            self._CompletionResultsForLine('set x = ' + TEST_DIR +
                                           '/${YCM_TEST_td/'))

        os.environ.pop('YCM_TEST_td')
        eq_([], data)

    def EnvVar_Undefined_Garbage_3_test(self):
        os.environ['YCM_TEST_td'] = 'testdata'
        data = sorted(
            self._CompletionResultsForLine('set x = ' + TEST_DIR +
                                           '/$ YCM_TEST_td/'))

        os.environ.pop('YCM_TEST_td')
        eq_([], data)