Ejemplo n.º 1
0
def filter_names(inference_state, completion_names, stack, like_name, fuzzy):
    comp_dct = {}
    if settings.case_insensitive_completion:
        like_name = like_name.lower()
    for name in completion_names:
        string = name.string_name
        if settings.case_insensitive_completion:
            string = string.lower()
        if fuzzy:
            match = helpers.fuzzy_match(string, like_name)
        else:
            match = helpers.start_match(string, like_name)
        if match:
            new = classes.Completion(
                inference_state,
                name,
                stack,
                len(like_name),
                is_fuzzy=fuzzy,
            )
            k = (new.name, new.complete)  # key
            if k in comp_dct and settings.no_completion_duplicates:
                comp_dct[k]._same_name_completions.append(new)
            else:
                comp_dct[k] = new
                yield new
def filter_names(inference_state, completion_names, stack, like_name, fuzzy,
                 cached_name):
    comp_dct = set()
    if settings.case_insensitive_completion:
        like_name = like_name.lower()
    for name in completion_names:
        string = name.string_name
        if settings.case_insensitive_completion:
            string = string.lower()
        if fuzzy:
            match = helpers.fuzzy_match(string, like_name)
        else:
            match = helpers.start_match(string, like_name)
        if match:
            new = classes.Completion(
                inference_state,
                name,
                stack,
                len(like_name),
                is_fuzzy=fuzzy,
                cached_name=cached_name,
            )
            k = (new.name, new.complete)  # key
            if k not in comp_dct:
                comp_dct.add(k)
                tree_name = name.tree_name
                if tree_name is not None:
                    definition = tree_name.get_definition()
                    if definition is not None and definition.type == 'del_stmt':
                        continue
                yield new
Ejemplo n.º 3
0
def complete_file_name(inference_state, module_context, start_leaf, string,
                       like_name, signatures_callback, code_lines, position,
                       fuzzy):
    # First we want to find out what can actually be changed as a name.
    like_name_length = len(os.path.basename(string))

    addition = _get_string_additions(module_context, start_leaf)
    if addition is None:
        return
    string = addition + string

    # Here we use basename again, because if strings are added like
    # `'foo' + 'bar`, it should complete to `foobar/`.
    must_start_with = os.path.basename(string)
    string = os.path.dirname(string)

    sigs = signatures_callback(*position)
    is_in_os_path_join = sigs and all(s.full_name == 'os.path.join'
                                      for s in sigs)
    if is_in_os_path_join:
        to_be_added = _add_os_path_join(module_context, start_leaf,
                                        sigs[0].bracket_start)
        if to_be_added is None:
            is_in_os_path_join = False
        else:
            string = to_be_added + string
    base_path = os.path.join(inference_state.project._path, string)
    try:
        listed = sorted(scandir(base_path), key=lambda e: e.name)
        # OSError: [Errno 36] File name too long: '...'
    except (FileNotFoundError, OSError):
        return
    for entry in listed:
        name = entry.name
        if fuzzy:
            match = fuzzy_match(name, must_start_with)
        else:
            match = start_match(name, must_start_with)
        if match:
            if is_in_os_path_join or not entry.is_dir():
                name += get_quote_ending(start_leaf.value, code_lines,
                                         position)
            else:
                name += os.path.sep

            yield classes.Completion(
                inference_state,
                PathName(inference_state,
                         name[len(must_start_with) - like_name_length:]),
                stack=None,
                like_name_length=like_name_length,
                is_fuzzy=fuzzy,
            )
Ejemplo n.º 4
0
def test_fuzzy_match():
    assert fuzzy_match('Condition', 'i')
    assert not fuzzy_match('Condition', 'p')
    assert fuzzy_match('Condition', 'ii')
    assert not fuzzy_match('Condition', 'Ciito')
    assert fuzzy_match('Condition', 'Cdiio')