# 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"
}