The package provides base classes and utils for flake8 plugin writing
Project description
flake8-plugin-utils
The package provides base classes and utils for flake8 plugin writing.
Installation
pip install flake8-plugin-utils
Example
Write simple plugin
from flake8_plugin_utils import Error, Visitor, Plugin
class MyError(Error):
code = 'X100'
message = 'my error'
class MyVisitor(Visitor):
def visit_ClassDef(self, node):
self.error_from_node(MyError, node)
class MyPlugin(Plugin):
name = 'MyPlugin'
version = '0.1.0'
visitors = [MyVisitor]
and test it with pytest
from flake8_plugin_utils import assert_error, assert_not_error
def test_code_with_error():
assert_error(MyVisitor, 'class Y: pass', MyError)
def test_code_without_error():
assert_not_error(MyVisitor, 'x = 1')
Configuration
To add configuration to a plugin, do the following:
- Implement classmethod
add_options
in your plugin class, as per the flake8 docs. - Override classmethod
parse_options_to_config
in your plugin class to return any object holding the options you need. - If you need a custom
__init__
for your visitor, make sure it accepts a keyword argument namedconfig
and pass it tosuper().__init__
- Use
self.config
in visitor code.
Example:
from flake8_plugin_utils import Error, Visitor, Plugin, assert_error
class MyError(Error):
code = 'X100'
message = 'my error with {thing}'
class MyConfig:
def __init__(self, config_option):
self.config_option = config_option
class MyVisitorWithConfig(Visitor):
def visit_ClassDef(self, node):
self.error_from_node(
MyError, node, thing=f'{node.name} {self.config.config_option}'
)
class MyPluginWithConfig(Plugin):
name = 'MyPluginWithConfig'
version = '0.0.1'
visitors = [MyVisitorWithConfig]
@classmethod
def add_options(cls, options_manager):
options_manager.add_option('--config_option', ...)
@classmethod
def parse_options_to_config(cls, option_manager, options, args):
return MyConfig(config_option=options.config_option)
def test_code_with_error():
assert_error(
MyVisitorWithConfig,
'class Y: pass',
MyError,
config=MyConfig(config_option='123'),
thing='Y 123',
)
Formatting
Your Error
s can take formatting arguments in their message
:
from flake8_plugin_utils import Error, Visitor, assert_error
class MyFormattedError(Error):
code = 'X101'
message = 'my error with {thing}'
class MyFormattedVisitor(Visitor):
def visit_ClassDef(self, node):
self.error_from_node(MyFormattedError, node, thing=node.name)
def test_code_with_error():
assert_error(
MyFormattedVisitor,
'class Y: pass',
MyFormattedError,
thing='Y',
)
Usage with typing/mypy
The Plugin
and Visitor
classes are generic with the config class as type
parameter. If your plugin does not have any config, inherit it from
Plugin[None]
and the visitors from Visitor[None]
. Otherwise, use the
config class as the type parameter (e.g. Plugin[MyConfig]
and
Visitor[MyConfig]
in the above example).
Utility functions
-
assert_error
,assert_not_error
Utilities for testing visitors (see examples above). -
is_true
,is_false
,is_none
Convenience functions to check if an AST node represents aTrue
/False
/None
value. -
check_equivalent_nodes
Checks if two given AST nodes are equivalent. The nodes are considered equivalent in the following cases:- dicts -- if they contain same key-value pairs, possibly in different order,
with duplicates and
**expansions
taken into account - sets -- if they contain same elements, possibly in different order, with duplicates taken into account
- anything else -- if they represent the same AST, regardless of formatting (with any dicts in sets inside checked according to the rules above)
- dicts -- if they contain same key-value pairs, possibly in different order,
with duplicates and
License
MIT
Change Log
Unreleased
- ...
1.3.0 - 2020-03-26
- add
check_equivalent_nodes
utility function
1.2.0 - 2020-03-06
- add
config
argument toassert_error
andassert_not_error
1.1.1 - 2020-03-02
- ignore encoding errors when reading strings for noqa validation
1.1.0 - 2020-03-01
- add ability for plugins to parse and use configuration
NB: this change breaks type-checking if you use typing/mypy. Change your code to inherit fromPlugin[None]
andVisitor[None]
to fix.
1.0.0 - 2019-05-23
- add message formatting to Error
0.2.1 - 2019-04-01
- don`t strip before src dedent in _error_from_src
- add is_none, is_true, is_false util functions
0.2.0 - 2019.02.21
- add assert methods
0.1.0 - 2019.02.09
- initial
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for flake8-plugin-utils-1.3.0.tar.gz
Algorithm | Hash digest | |
---|---|---|
SHA256 | 965931e7c17a760915e38bb10dc60516b414ef8210e987252a8d73dcb196a5f5 |
|
MD5 | e6e71ef1fde699a3b455102f676f26b7 |
|
BLAKE2b-256 | 978e8b183d3f72199b22e4fe1002a7aab183fec397cbb7208f1fbceabed728f0 |
Hashes for flake8_plugin_utils-1.3.0-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 305461c4fbf94877bcc9ccf435771b135d72a40eefd92e70a4b5f761ca43b1c8 |
|
MD5 | eb5c0af8f1835d28a9e9876db2c27a62 |
|
BLAKE2b-256 | 9c1418c70b9ef54fc81ee926a434af81ce831ebff99636c5004921f42a90939a |