Flake8-plugin-utils
Afonasev Evgeniy
![](https://s3.amazonaws.com/media-p.slid.es/uploads/995652/images/6367258/pasted-from-clipboard.png)
Зачем писать свои плагины?
1. Нет готовых на то, что вам нужно.
2. Мэйнтейнеры не принимают новые фичи, даже если вам кажется, что их можно добавить в имеющиеся плагины.
2. Нужно проверять какие-то внутренние договоренности или устоявшиеся в команде правила
Какие проблемы есть?
1. Шаблоный код, который копируется из проекта в проект.
2. Нет нужных готовых утилит для тестирования, проверки noqa etc.
3. Организацию кода плагина (ошибки, парсеры, etc.) каждый раз переизобретают заново
![](https://s3.amazonaws.com/media-p.slid.es/uploads/995652/images/6367296/pasted-from-clipboard.png)
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'
![](https://s3.amazonaws.com/media-p.slid.es/uploads/995652/images/6367341/pasted-from-clipboard.png)
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)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/995652/images/6367450/pasted-from-clipboard.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/995652/images/6367452/pasted-from-clipboard.png)
Afonasev Evgeniy
ea.afonasev@gmail.com
https://github.com/Afonasev
Вопросы?
Flake8-plugin-utils (pytup 2019.07.17)
By Afonasev Evgeniy
Flake8-plugin-utils (pytup 2019.07.17)
- 465