def test_of_lines(self) -> None:
        lines = [
            'import os  # tailing comment',
            '# comment above',
            'import sys',
            'from pprint import ('
            '    pprint as pp,',
            '    pformat,',
            ')',
            'from typing import (',
            '    List as L,  # tailing comment 1',
            '    Dict as D,# tailing comment 2',
            ')',
            '',
            '# multi-line comment 1',
            '# multi-line comment 2',
            'import tensorflow as tf',
        ]
        actuals = ImportStatement.of_lines(lines)
        expecteds: List[ImportStatement] = [
            ImportStatement(
                '',
                [
                    ImportAsPart('os', '', 'tailing comment'),
                ],
            ),
            ImportStatement(
                '',
                [
                    ImportAsPart('sys', '', 'comment above'),
                ],
            ),
            ImportStatement(
                'pprint',
                [
                    ImportAsPart('pprint', 'pp'),
                    ImportAsPart('pformat', ''),
                ],
            ),
            ImportStatement(
                'typing',
                [
                    ImportAsPart('List', 'L', 'tailing comment 1'),
                    ImportAsPart('Dict', 'D', 'tailing comment 2'),
                ],
            ),
            ImportStatement(
                '',
                [
                    ImportAsPart('tensorflow', 'tf', ('multi-line comment 1 '
                                                      'multi-line comment 2')),
                ],
            ),
        ]

        assert actuals is not None
        assert len(actuals) == len(expecteds)
        assert all([str(a) == str(e)
                    for a, e in zip(actuals, expecteds)]) is True
        return
Exemple #2
0
def auto_import(snip: Any, statement: str, level: int) -> None:
    """ Hookable funciton for auto-importing when snippet expansion
    """
    lines = buf2lines(snip.buffer)

    # get import blocks
    begin_end_indices = get_import_block_indices(lines)

    # get import_statements for each block
    maybe_import_statements_lst = [
        ImportStatement.of_lines(lines[begin_index:end_index])
        for begin_index, end_index in begin_end_indices
    ]

    import_statements_lst = []
    for maybe in maybe_import_statements_lst:
        if maybe is not None:
            import_statements_lst.append(maybe)

    # Constructing import sentence should be added.
    import_stmt_to_add = ImportStatement.of(statement)
    if import_stmt_to_add is None:
        return None

    # constructing import import statements
    if len(import_statements_lst) <= level:
        import_statements_lst.append([import_stmt_to_add])
    else:
        import_statements_lst[level].append(import_stmt_to_add)

    # Merge the imports
    merged_import_statements = [
        ImportStatement.merge_list(import_statements)
        for import_statements in import_statements_lst
    ]

    # Make organized import blocks
    import_lines: List[str] = []
    for i, merged_import_statement in enumerate(merged_import_statements):
        for import_statement in merged_import_statement:
            import_lines += import_statement.to_lines()
        if i < len(merged_import_statements) - 1:
            import_lines.append('')

    if not begin_end_indices:
        fitst_line_num = get_first_line_num(lines)
        snip.buffer[fitst_line_num:fitst_line_num] = import_lines
    else:
        snip.buffer[
            begin_end_indices[0][0]:begin_end_indices[-1][-1]] = import_lines
    return
Exemple #3
0
def nayvy_import_stmt(statement: str, level: int) -> None:
    lines = vim.current.buffer[:]

    # get import blocks
    begin_end_indices = get_import_block_indices(lines)

    # get import_statements for each block
    maybe_import_statements_lst = [
        ImportStatement.of_lines(lines[begin_index:end_index])
        for begin_index, end_index in begin_end_indices
    ]

    import_statements_lst = []
    for maybe in maybe_import_statements_lst:
        if maybe is not None:
            import_statements_lst.append(maybe)

    # Constructing import sentence should be added.
    import_stmt_to_add = ImportStatement.of(statement)
    if import_stmt_to_add is None:
        return None

    # constructing import import statements
    if len(import_statements_lst) <= level:
        import_statements_lst.append([import_stmt_to_add])
    else:
        import_statements_lst[level].append(import_stmt_to_add)

    # Merge the imports
    merged_import_statements = [
        ImportStatement.merge_list(import_statements)
        for import_statements in import_statements_lst
    ]

    # Make organized import blocks
    import_lines: List[str] = []
    for i, merged_import_statement in enumerate(merged_import_statements):
        for import_statement in merged_import_statement:
            import_lines += import_statement.to_lines()
        if i < len(merged_import_statements) - 1:
            import_lines.append('')

    if not begin_end_indices:
        fitst_line_num = get_first_line_num(lines)
        vim.current.buffer[fitst_line_num:fitst_line_num] = import_lines
    else:
        block_begin_index = begin_end_indices[0][0]
        block_end_index = begin_end_indices[-1][-1]
        vim.current.buffer[block_begin_index:block_end_index] = import_lines
    return