Flake8-plugin-utils

Afonasev Evgeniy

Зачем писать свои плагины?

1. Нет готовых на то, что вам нужно.

2. Мэйнтейнеры не принимают новые фичи, даже если вам кажется, что их можно добавить в имеющиеся плагины.

2. Нужно проверять какие-то внутренние договоренности или  устоявшиеся в команде правила

Какие проблемы есть?

1. Шаблоный код, который копируется из проекта в проект.

2. Нет нужных готовых утилит для тестирования, проверки noqa etc.

3. Организацию кода плагина (ошибки, парсеры, etc.) каждый раз переизобретают заново

Error

from flake8_plugin_utils import Error

class BadVariableNameError(Error):
    code = 'V100'
    message = 'Bad variable name: {name}'

Visitor

from flake8_plugin_utils import Visitor

BAD_NAMES = ['var']

class BadVariableNameChecker(Visitor):
    def visit_Assign(self, node):
        for target in node.targets:
            if target.id not in BAD_NAMES:
                continue
            
            self.error_from_node(
                BadVariableNameError, 
                node, 
                name=target.id
            )

Plugin

from flake8_plugin_utils import Plugin

class BadVariableNamePlugin(Plugin):
    name = 'BadVariableNamePlugin'
    version = '1.0'
    visitors = [BadVariableNameChecker]

setup.py

V10 = 'flake8_bad_variable_name:BadVariableNamePlugin'

setup(
    ...
    entry_points={
        'flake8.extension': [
            'V10 = flake8_bad_variable_name:BadVariableNamePlugin',
        ],
    },
    ...
)

pyproject.toml

[tool.poetry.plugins."flake8.extension"]
V10 = 'flake8_bad_variable_name:BadVariableNamePlugin'

Tests

from flake8_plugin_utils import assert_error, assert_not_error

@pytest.mark.parametrize(
    'src',
    [
        'var = 1',
    ],
)
def test_code_with_error(src):
    assert_error(BadVariableNameChecker, src, BadVariableNameError, name='var')


@pytest.mark.parametrize(
    'src',
    [
        'good_name = 1',
    ],
)
def test_code_without_error(src):
    assert_not_error(BadVariableNameChecker, src)

Afonasev Evgeniy

ea.afonasev@gmail.com

https://github.com/Afonasev

https://github.com/Afonasev/flake8-plugin-utils

Вопросы?

Flake8-plugin-utils (pytup 2019.07.17)

By Afonasev Evgeniy

Flake8-plugin-utils (pytup 2019.07.17)

  • 465