# Multilint (for Python)
[![Actions Test Workflow Widget](https://github.com/gkze/multilint/workflows/CI/badge.svg)](https://github.com/gkze/multilint/actions?query=workflow%3ACI)
[![PyPI Version](https://img.shields.io/pypi/v/pymultilint)](https://pypi.org/project/pymultilint/)
[![Pdoc Documentation](https://img.shields.io/badge/pdoc-docs-green)](https://gkze.github.io/multilint/multilint.html)
A utility tying together multiple linting and other code quality tools
## Intro
Multilint allows running several code quality tools under the same interface.
This is convenient as it saves time on writing multiple linter / formatter /
checker invocations every time in a project.
## Installation
Since there is an existing project called
[`multilint`](https://pypi.org/project/multilint/), this Multilint can be
installed as `pymultilint`:
```bash
$ pip3 install pymultilint
```
## Usage
Multilint exposes a CLI entry point:
```bash
$ multilint [paths ...]
```
It can optionally take a set of starting paths. There are no CLI options,
as Multilint strives to have all of its configuration codified (see
[Configurability](#configurability)).
Alternatively, Multilint is also usable via its API - either the
[`main`](multilint.py#L570) method, or the
[`Multilint`](multilint.py#L488) class.
## Supported Tools
Currently, Multilint integrates the following code quality tools:
* [Autoflake](https://github.com/myint/autoflake) - removes unused imports and
unused variables as identified by [Pyflakes](https://github.com/PyCQA/pyflakes)
* [Isort](https://pycqa.github.io/isort/) - sorts imports according to specified
orders
* [Black](https://black.readthedocs.io/en/stable/) - the self-proclaimed
"uncompromising code formatter" - formats Python source with an opinionated
style
* [Mypy](http://mypy-lang.org) - static type checker for Python
* [Pylint](https://www.pylint.org) - general best practices linter
* [Pydocstyle](http://www.pydocstyle.org/en/stable/) - in-source documentation
best practices linter
* [Pyupgrade](https://github.com/asottile/pyupgrade) - upgrades Python syntax to
the latest for the specified version
## Configurability
Additionally, for tools that do not currently support configuration via
`pyproject.toml`([PEP-621](https://www.python.org/dev/peps/pep-0621/)),
Multilint exposes a configuration interface for them. This allows for
centralized codification of configuration of all code quality tools being used
in a project.
Example relevant sections from a `pyproject.toml`:
```toml
[tool.autoflake]
recursive = true
in_place = true
ignore_init_module_imports = true
remove_all_unused_imports = true
remove_unused_variables = true
verbose = true
srcs_paths = ["somepackage"]
[tool.mypy]
src_paths = ["someotherpackage"]
[tool.multilint]
tool_order = [
"autoflake",
"isort",
"pyupgrade",
"black",
"mypy",
"pylint",
"pydocstyle"
]
src_paths = ["."]
```
At the time of writing of this README (2020-01-31), neither
[Autoflake](https://github.com/myint/autoflake/issues/59) nor
[Mypy](https://github.com/python/mypy/issues/5205https://github.com/python/mypy/issues/5205)
support configuration via `pyproject.toml`. While support for each may or may
not be added at some point in the future, with multilint configuring these tools
is possible **today**.
Currently, the only two supported configuration option for Multilint are:
* `tool_order`, which defines the execution order of supported tools, and
* `src_paths`, which specifies the source paths (can be files and directories)
for Multilint to operate on.
Each integrated tool additionally supports `src_dirs` as an override, in case
it is desired to target a specific tool at a different set of files
/ directories.
## Extending Multilint
Support for more tools may be added by subclassing the
[`ToolRunner`](multilint.py#L128) class and overriding the
[`.run(...)`](multilint.py#L160) method.
There are some utilities provided, such as:
* A logger that masquerades as a TextIO object to allow capturing tool output
from within and wrapping it with preferred logging
* A dictionary for tool configuration that is automatically available in the
`ToolRunner` class, as long as the tool is registered in
* The [`Tool`](multilint.py#L48) enum,
* The [`TOOL_RUNNERS`](multilint.py#L480) mapping, and declared
* The [`DEFAULT_TOOL_ORDER`](multilint.py#L500) class variable of `Multilint`.
Documentation about adding support for more tools to Multilint may be added in
the future.
Raw data
{
"_id": null,
"home_page": "https://github.com/gkze/multilint",
"name": "pymultilint",
"maintainer": "",
"docs_url": null,
"requires_python": ">=3.8,<4.0",
"maintainer_email": "",
"keywords": "lint,code-quality,tools",
"author": "George Kontridze",
"author_email": "george.kontridze@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/af/1d/7889ff20466a373d9934de560f924d38eb1d60132182b60095cbab0ed876/pymultilint-1.1.0.tar.gz",
"platform": null,
"description": "# Multilint (for Python)\n\n[![Actions Test Workflow Widget](https://github.com/gkze/multilint/workflows/CI/badge.svg)](https://github.com/gkze/multilint/actions?query=workflow%3ACI)\n[![PyPI Version](https://img.shields.io/pypi/v/pymultilint)](https://pypi.org/project/pymultilint/)\n[![Pdoc Documentation](https://img.shields.io/badge/pdoc-docs-green)](https://gkze.github.io/multilint/multilint.html)\n\nA utility tying together multiple linting and other code quality tools\n\n## Intro\n\nMultilint allows running several code quality tools under the same interface.\nThis is convenient as it saves time on writing multiple linter / formatter /\nchecker invocations every time in a project.\n\n## Installation\n\nSince there is an existing project called\n[`multilint`](https://pypi.org/project/multilint/), this Multilint can be\ninstalled as `pymultilint`:\n\n```bash\n$ pip3 install pymultilint\n```\n\n## Usage\n\nMultilint exposes a CLI entry point:\n\n```bash\n$ multilint [paths ...]\n```\n\nIt can optionally take a set of starting paths. There are no CLI options,\nas Multilint strives to have all of its configuration codified (see\n[Configurability](#configurability)).\n\nAlternatively, Multilint is also usable via its API - either the\n[`main`](multilint.py#L570) method, or the\n[`Multilint`](multilint.py#L488) class.\n\n## Supported Tools\n\nCurrently, Multilint integrates the following code quality tools:\n\n* [Autoflake](https://github.com/myint/autoflake) - removes unused imports and\n unused variables as identified by [Pyflakes](https://github.com/PyCQA/pyflakes)\n* [Isort](https://pycqa.github.io/isort/) - sorts imports according to specified\n orders\n* [Black](https://black.readthedocs.io/en/stable/) - the self-proclaimed\n \"uncompromising code formatter\" - formats Python source with an opinionated\n style\n* [Mypy](http://mypy-lang.org) - static type checker for Python\n* [Pylint](https://www.pylint.org) - general best practices linter\n* [Pydocstyle](http://www.pydocstyle.org/en/stable/) - in-source documentation\n best practices linter\n* [Pyupgrade](https://github.com/asottile/pyupgrade) - upgrades Python syntax to\n the latest for the specified version\n\n## Configurability\n\nAdditionally, for tools that do not currently support configuration via\n`pyproject.toml`([PEP-621](https://www.python.org/dev/peps/pep-0621/)),\nMultilint exposes a configuration interface for them. This allows for\ncentralized codification of configuration of all code quality tools being used\nin a project.\n\nExample relevant sections from a `pyproject.toml`:\n\n```toml\n[tool.autoflake]\nrecursive = true\nin_place = true\nignore_init_module_imports = true\nremove_all_unused_imports = true\nremove_unused_variables = true\nverbose = true\nsrcs_paths = [\"somepackage\"]\n\n[tool.mypy]\nsrc_paths = [\"someotherpackage\"]\n\n[tool.multilint]\ntool_order = [\n \"autoflake\",\n \"isort\",\n \"pyupgrade\",\n \"black\",\n \"mypy\",\n \"pylint\",\n \"pydocstyle\"\n]\nsrc_paths = [\".\"]\n```\n\nAt the time of writing of this README (2020-01-31), neither\n[Autoflake](https://github.com/myint/autoflake/issues/59) nor\n[Mypy](https://github.com/python/mypy/issues/5205https://github.com/python/mypy/issues/5205)\nsupport configuration via `pyproject.toml`. While support for each may or may\nnot be added at some point in the future, with multilint configuring these tools\nis possible **today**.\n\nCurrently, the only two supported configuration option for Multilint are:\n\n* `tool_order`, which defines the execution order of supported tools, and\n* `src_paths`, which specifies the source paths (can be files and directories)\n for Multilint to operate on.\n\nEach integrated tool additionally supports `src_dirs` as an override, in case\nit is desired to target a specific tool at a different set of files\n/ directories.\n\n## Extending Multilint\n\nSupport for more tools may be added by subclassing the\n[`ToolRunner`](multilint.py#L128) class and overriding the\n[`.run(...)`](multilint.py#L160) method.\n\nThere are some utilities provided, such as:\n\n* A logger that masquerades as a TextIO object to allow capturing tool output\n from within and wrapping it with preferred logging\n* A dictionary for tool configuration that is automatically available in the\n `ToolRunner` class, as long as the tool is registered in\n * The [`Tool`](multilint.py#L48) enum,\n * The [`TOOL_RUNNERS`](multilint.py#L480) mapping, and declared\n * The [`DEFAULT_TOOL_ORDER`](multilint.py#L500) class variable of `Multilint`.\n\nDocumentation about adding support for more tools to Multilint may be added in\nthe future.\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Utility tying multiple code quality tools together",
"version": "1.1.0",
"project_urls": {
"Documentation": "https://gkze.github.io/multilint/multilint.html",
"Homepage": "https://github.com/gkze/multilint",
"Repository": "https://github.com/gkze/multilint"
},
"split_keywords": [
"lint",
"code-quality",
"tools"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "dee6acd617bc9c6b8faf9fd4825900f6d1559456c3b1c3b1d5a86c9b53b941ce",
"md5": "0648105f2c173e88999f4d2aa0721979",
"sha256": "7ee30214a98b7eb359b184b49938e15f56500b89f6b730637572940285bc20c1"
},
"downloads": -1,
"filename": "pymultilint-1.1.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "0648105f2c173e88999f4d2aa0721979",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8,<4.0",
"size": 9431,
"upload_time": "2023-06-07T20:14:23",
"upload_time_iso_8601": "2023-06-07T20:14:23.035619Z",
"url": "https://files.pythonhosted.org/packages/de/e6/acd617bc9c6b8faf9fd4825900f6d1559456c3b1c3b1d5a86c9b53b941ce/pymultilint-1.1.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "af1d7889ff20466a373d9934de560f924d38eb1d60132182b60095cbab0ed876",
"md5": "c0b3fdc29679af0d5c950049d2b749fa",
"sha256": "1414fdc861fc7e0e3a22d0491c61b0af427bb5d99d5921b21fa8fea6bf77ff37"
},
"downloads": -1,
"filename": "pymultilint-1.1.0.tar.gz",
"has_sig": false,
"md5_digest": "c0b3fdc29679af0d5c950049d2b749fa",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8,<4.0",
"size": 8750,
"upload_time": "2023-06-07T20:14:24",
"upload_time_iso_8601": "2023-06-07T20:14:24.180113Z",
"url": "https://files.pythonhosted.org/packages/af/1d/7889ff20466a373d9934de560f924d38eb1d60132182b60095cbab0ed876/pymultilint-1.1.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2023-06-07 20:14:24",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "gkze",
"github_project": "multilint",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "pymultilint"
}