flake8-trio


Nameflake8-trio JSON
Version 22.8.7 PyPI version JSON
download
home_pagehttps://github.com/Zac-HD/flake8-trio
SummaryA highly opinionated flake8 plugin for Trio-related problems.
upload_time2022-08-17 18:30:11
maintainer
docs_urlNone
authorZac Hatfield-Dodds and Contributors
requires_python>=3.8
licenseMIT
keywords
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # flake8-trio

A highly opinionated flake8 plugin for Trio-related problems.

This can include anything from outright bugs, to pointless/dead code,
to likely performance issues, to minor points of idiom that might signal
a misunderstanding.

It may well be too noisy for anyone with different opinions, that's OK.

Pairs well with flake8-async and flake8-bugbear.

## Installation

```console
pip install flake8-trio
```

## List of warnings

- **TRIO100**: a `with trio.fail_after(...):` or `with trio.move_on_after(...):`
  context does not contain any `await` statements.  This makes it pointless, as
  the timeout can only be triggered by a checkpoint.
- **TRIO101**: `yield` inside a nursery or cancel scope is only safe when implementing a context manager - otherwise, it breaks exception handling.
- **TRIO102**: it's unsafe to await inside `finally:` or `except BaseException/trio.Cancelled` unless you use a shielded
  cancel scope with a timeout.
- **TRIO103**: `except BaseException` and `except trio.Cancelled` with a code path that doesn't re-raise.
- **TRIO104**: `Cancelled` and `BaseException` must be re-raised - when a user tries to `return` or `raise` a different exception.
- **TRIO105**: Calling a trio async function without immediately `await`ing it.
- **TRIO106**: trio must be imported with `import trio` for the linter to work.
- **TRIO107**: exit or `return` from async function with no guaranteed checkpoint or exception since function definition.
- **TRIO108**: exit, yield or return from async iterable with no guaranteed checkpoint since possible function entry (yield or function definition)
  Checkpoints are `await`, `async for`, and `async with` (on one of enter/exit).
- **TRIO109**: Async function definition with a `timeout` parameter - use `trio.[fail/move_on]_[after/at]` instead
- **TRIO110**: `while <condition>: await trio.sleep()` should be replaced by a `trio.Event`.
- **TRIO111**: Variable, from context manager opened inside nursery, passed to `start[_soon]` might be invalidly accesed while in use, due to context manager closing before the nursery. This is usually a bug, and nurseries should generally be the inner-most context manager.
- **TRIO112**: nursery body with only a call to `nursery.start[_soon]` and not passing itself as a parameter can be replaced with a regular function call.


# Changelog
*[CalVer, YY.month.patch](https://calver.org/)*

## 22.8.7
- TRIO107+108 now ignores `asynccontextmanager`s, since both `__aenter__` and `__aexit__` should checkpoint. `async with` is also treated as checkpointing on both enter and exit.
- TRIO107 now completely ignores any function whose body consists solely of ellipsis, pass, or string constants.
- TRIO103, 107 and 108 now inspects `while` conditions and `for` iterables to avoid false alarms on a couple cases where the loop body is guaranteed to run at least once.

## 22.8.6
- TRIO103 now correctly handles raises in loops, i.e. `raise` in else is guaranteed to run unless there's a `break` in the body.

## 22.8.5
- Add TRIO111: Variable, from context manager opened inside nursery, passed to `start[_soon]` might be invalidly accesed while in use, due to context manager closing before the nursery. This is usually a bug, and nurseries should generally be the inner-most context manager.
- Add TRIO112: this single-task nursery could be replaced by awaiting the function call directly.

## 22.8.4
- Fix TRIO108 raising errors on yields in some sync code.
- TRIO109 now skips all decorated functions to avoid false alarms

## 22.8.3
- TRIO108 now gives multiple error messages; one for each path lacking a guaranteed checkpoint

## 22.8.2
- Merged TRIO108 into TRIO107
- TRIO108 now handles checkpointing in async iterators

## 22.8.1
- Added TRIO109: Async definitions should not have a `timeout` parameter. Use `trio.[fail/move_on]_[at/after]`
- Added TRIO110: `while <condition>: await trio.sleep()` should be replaced by a `trio.Event`.

## 22.7.6
- Extend TRIO102 to also check inside `except BaseException` and `except trio.Cancelled`
- Extend TRIO104 to also check for `yield`
- Update error messages on TRIO102 and TRIO103

## 22.7.5
- Add TRIO103: `except BaseException` or `except trio.Cancelled` with a code path that doesn't re-raise
- Add TRIO104: "Cancelled and BaseException must be re-raised" if user tries to return or raise a different exception.
- Added TRIO107: Async functions must have at least one checkpoint on every code path, unless an exception is raised
- Added TRIO108: Early return from async function must have at least one checkpoint on every code path before it.

## 22.7.4
- Added TRIO105 check for not immediately `await`ing async trio functions.
- Added TRIO106 check that trio is imported in a form that the plugin can easily parse.

## 22.7.3
- Added TRIO102 check for unsafe checkpoints inside `finally:` blocks

## 22.7.2
- Avoid `TRIO100` false-alarms on cancel scopes containing `async for` or `async with`.

## 22.7.1
- Initial release with TRIO100 and TRIO101

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/Zac-HD/flake8-trio",
    "name": "flake8-trio",
    "maintainer": "",
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": "",
    "keywords": "",
    "author": "Zac Hatfield-Dodds and Contributors",
    "author_email": "me@cooperlees.com",
    "download_url": "https://files.pythonhosted.org/packages/61/30/aa8c478cc6b907e19cbc4069abad41c7e046958875c5f204c3ade828c6e8/flake8-trio-22.8.7.tar.gz",
    "platform": null,
    "description": "# flake8-trio\n\nA highly opinionated flake8 plugin for Trio-related problems.\n\nThis can include anything from outright bugs, to pointless/dead code,\nto likely performance issues, to minor points of idiom that might signal\na misunderstanding.\n\nIt may well be too noisy for anyone with different opinions, that's OK.\n\nPairs well with flake8-async and flake8-bugbear.\n\n## Installation\n\n```console\npip install flake8-trio\n```\n\n## List of warnings\n\n- **TRIO100**: a `with trio.fail_after(...):` or `with trio.move_on_after(...):`\n  context does not contain any `await` statements.  This makes it pointless, as\n  the timeout can only be triggered by a checkpoint.\n- **TRIO101**: `yield` inside a nursery or cancel scope is only safe when implementing a context manager - otherwise, it breaks exception handling.\n- **TRIO102**: it's unsafe to await inside `finally:` or `except BaseException/trio.Cancelled` unless you use a shielded\n  cancel scope with a timeout.\n- **TRIO103**: `except BaseException` and `except trio.Cancelled` with a code path that doesn't re-raise.\n- **TRIO104**: `Cancelled` and `BaseException` must be re-raised - when a user tries to `return` or `raise` a different exception.\n- **TRIO105**: Calling a trio async function without immediately `await`ing it.\n- **TRIO106**: trio must be imported with `import trio` for the linter to work.\n- **TRIO107**: exit or `return` from async function with no guaranteed checkpoint or exception since function definition.\n- **TRIO108**: exit, yield or return from async iterable with no guaranteed checkpoint since possible function entry (yield or function definition)\n  Checkpoints are `await`, `async for`, and `async with` (on one of enter/exit).\n- **TRIO109**: Async function definition with a `timeout` parameter - use `trio.[fail/move_on]_[after/at]` instead\n- **TRIO110**: `while <condition>: await trio.sleep()` should be replaced by a `trio.Event`.\n- **TRIO111**: Variable, from context manager opened inside nursery, passed to `start[_soon]` might be invalidly accesed while in use, due to context manager closing before the nursery. This is usually a bug, and nurseries should generally be the inner-most context manager.\n- **TRIO112**: nursery body with only a call to `nursery.start[_soon]` and not passing itself as a parameter can be replaced with a regular function call.\n\n\n# Changelog\n*[CalVer, YY.month.patch](https://calver.org/)*\n\n## 22.8.7\n- TRIO107+108 now ignores `asynccontextmanager`s, since both `__aenter__` and `__aexit__` should checkpoint. `async with` is also treated as checkpointing on both enter and exit.\n- TRIO107 now completely ignores any function whose body consists solely of ellipsis, pass, or string constants.\n- TRIO103, 107 and 108 now inspects `while` conditions and `for` iterables to avoid false alarms on a couple cases where the loop body is guaranteed to run at least once.\n\n## 22.8.6\n- TRIO103 now correctly handles raises in loops, i.e. `raise` in else is guaranteed to run unless there's a `break` in the body.\n\n## 22.8.5\n- Add TRIO111: Variable, from context manager opened inside nursery, passed to `start[_soon]` might be invalidly accesed while in use, due to context manager closing before the nursery. This is usually a bug, and nurseries should generally be the inner-most context manager.\n- Add TRIO112: this single-task nursery could be replaced by awaiting the function call directly.\n\n## 22.8.4\n- Fix TRIO108 raising errors on yields in some sync code.\n- TRIO109 now skips all decorated functions to avoid false alarms\n\n## 22.8.3\n- TRIO108 now gives multiple error messages; one for each path lacking a guaranteed checkpoint\n\n## 22.8.2\n- Merged TRIO108 into TRIO107\n- TRIO108 now handles checkpointing in async iterators\n\n## 22.8.1\n- Added TRIO109: Async definitions should not have a `timeout` parameter. Use `trio.[fail/move_on]_[at/after]`\n- Added TRIO110: `while <condition>: await trio.sleep()` should be replaced by a `trio.Event`.\n\n## 22.7.6\n- Extend TRIO102 to also check inside `except BaseException` and `except trio.Cancelled`\n- Extend TRIO104 to also check for `yield`\n- Update error messages on TRIO102 and TRIO103\n\n## 22.7.5\n- Add TRIO103: `except BaseException` or `except trio.Cancelled` with a code path that doesn't re-raise\n- Add TRIO104: \"Cancelled and BaseException must be re-raised\" if user tries to return or raise a different exception.\n- Added TRIO107: Async functions must have at least one checkpoint on every code path, unless an exception is raised\n- Added TRIO108: Early return from async function must have at least one checkpoint on every code path before it.\n\n## 22.7.4\n- Added TRIO105 check for not immediately `await`ing async trio functions.\n- Added TRIO106 check that trio is imported in a form that the plugin can easily parse.\n\n## 22.7.3\n- Added TRIO102 check for unsafe checkpoints inside `finally:` blocks\n\n## 22.7.2\n- Avoid `TRIO100` false-alarms on cancel scopes containing `async for` or `async with`.\n\n## 22.7.1\n- Initial release with TRIO100 and TRIO101\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "A highly opinionated flake8 plugin for Trio-related problems.",
    "version": "22.8.7",
    "split_keywords": [],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "md5": "629dd2e09f38006a2bba57572268c3b3",
                "sha256": "5b90f00cdb7cfb363fa6ab84d5d65f978c7af0f82ed21605c9e6d5c561808925"
            },
            "downloads": -1,
            "filename": "flake8_trio-22.8.7-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "629dd2e09f38006a2bba57572268c3b3",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 13811,
            "upload_time": "2022-08-17T18:30:10",
            "upload_time_iso_8601": "2022-08-17T18:30:10.303312Z",
            "url": "https://files.pythonhosted.org/packages/32/f7/300b93d60d57e5000b23ae226ae358e567147cd3a8756d8cbaec22310d32/flake8_trio-22.8.7-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "md5": "0f790945eec6b452f3acf625a129be3e",
                "sha256": "13a851c1c6c6794cd78af710eef12add2d5830101f5b6d85db6e97edea487bf1"
            },
            "downloads": -1,
            "filename": "flake8-trio-22.8.7.tar.gz",
            "has_sig": false,
            "md5_digest": "0f790945eec6b452f3acf625a129be3e",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 28672,
            "upload_time": "2022-08-17T18:30:11",
            "upload_time_iso_8601": "2022-08-17T18:30:11.554322Z",
            "url": "https://files.pythonhosted.org/packages/61/30/aa8c478cc6b907e19cbc4069abad41c7e046958875c5f204c3ade828c6e8/flake8-trio-22.8.7.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2022-08-17 18:30:11",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "github_user": "Zac-HD",
    "github_project": "flake8-trio",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "tox": true,
    "lcname": "flake8-trio"
}
        
Elapsed time: 0.55084s