best-doctor / import_me

Python library to simplify importing data from xls/xlsx
MIT License
11 stars 12 forks source link

Add Column.header validator #20

Open yakovistomin opened 4 years ago

yakovistomin commented 4 years ago

Сейчас заголовок колонки проверяется на полное соответствие значению Column.header. Необходимо добавить возможность указания функции для валидации заголовка.

Пример1:

def test_validate_headers(column):
    class Parser(BaseXLSXParser):
        columns = [
            Column('column_name', header='№'),
        ]

    xlsx_file = xlsx_file_factory(header=['№'], data=[])
    parser = Parser(file_path=xlsx_file.file)

    parser()

    assert parser.has_errors is False

def test_validate_headers_with_validator(column):
    class Parser(BaseXLSXParser):
        columns = [
            Column('column_name', header='№', header_validator=lambda x: x in ['№', 'Номер', '№пп']),
        ]

    xlsx_file = xlsx_file_factory(header=['№пп'], data=[])
    parser = Parser(file_path=xlsx_file.file)

    parser()

    assert parser.has_errors is False

def test_validate_headers_error(header):
    class Parser(BaseXLSXParser):
        columns = [
            Column('column_name', header='№'),
        ]

    xlsx_file = xlsx_file_factory(header=['fail header'], data=[])
    parser = Parser(file_path=xlsx_file.file)

    parser()

    assert parser.has_errors is True
    assert parser.errors == (
        "Incorrect column names in the file. "
        "Columns in file: ['fail header']. "
        "Expected columns: ['№']."
    )

def test_validate_headers_with_validator_error(header):
    class Parser(BaseXLSXParser):
        columns = [
            Column('column_name', header='№', header_validator=lambda x: x in ['№', 'Номер', '№пп']),
        ]

    xlsx_file = xlsx_file_factory(header=['fail header'], data=[])
    parser = Parser(file_path=xlsx_file.file)

    parser()

    assert parser.has_errors is True
    assert parser.errors == (
        "Incorrect column names in the file. "
        "Columns in file: ['fail header']. "
        "Expected columns: ['№']."
    )
yakovistomin commented 4 years ago

Или можно дать возможность в качестве header использовать r строку

Column(“name”, header=“№”)

Column(“name”, header=r”№|№пп|порядковый номер”)