Skip to main content

A highly opinionated flake8 plugin for Trio-related problems.

Project description

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

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 awaiting 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.
  • TRIO113: using nursery.start_soon in __aenter__ doesn't wait for the task to begin. Consider replacing with nursery.start.
  • TRIO114: Startable function (i.e. has a task_status parameter) not in --startable-in-context-manager parameter list, please add it so TRIO113 can catch errors when using it.

Configuration

no-checkpoint-warning-decorators

Specify a list of decorators to disable checkpointing checks for, turning off TRIO107 and TRIO108 warnings for functions decorated with any decorator matching any in the list. Matching is done with fnmatch. Defaults to disabling for asynccontextmanager.

Decorators-to-match must be identifiers or dotted names only (not PEP-614 expressions), and will match against the name only - e.g. foo.bar matches foo.bar, foo.bar(), and foo.bar(args, here), etc.

You can configure flake8 with command-line options, but we prefer using a config file. For example:

[flake8]
no-checkpoint-warning-decorators =
  mydecorator,
  mydecoratorpackage.checkpointing_decorators.*,
  ign*,
  *.ignore,

startable-in-context-manager

Comma-separated list of methods which should be used with .start() when opening a context manager, in addition to the default trio.run_process, trio.serve_tcp, trio.serve_ssl_over_tcp, and trio.serve_listeners. Uses fnmatch, like no-checkpoint-warning-decorators. For example:

[flake8]
startable-methods-in-context-manager =
  mylib.myfun,
  myfun2,mypackage.myfunlib.*,

Changelog

CalVer, YY.month.patch

22.11.4

  • Add TRIO114 Startable function not in --startable-in-context-manager parameter list.

22.11.3

  • Add TRIO113, prefer await nursery.start(...) to nursery.start_soon() for compatible functions when opening a context manager

22.11.2

  • TRIO105 now also checks that you awaited nursery.start().

22.11.1

  • TRIO102 is no longer skipped in (async) context managers, since it's not a missing-checkpoint warning.

22.9.2

  • Fix a crash on nontrivial decorator expressions (calls, PEP-614) and document behavior.

22.9.1

  • Add --no-checkpoint-warning-decorators option, to disable missing-checkpoint warnings for certain decorated functions.

22.8.8

  • Fix false alarm on TRIO107 with checkpointing try and empty finally
  • Fix false alarm on TRIO107&108 with infinite loops

22.8.7

  • TRIO107+108 now ignores asynccontextmanagers, 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 awaiting 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

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

flake8-trio-22.11.4.tar.gz (34.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

flake8_trio-22.11.4-py3-none-any.whl (16.4 kB view details)

Uploaded Python 3

File details

Details for the file flake8-trio-22.11.4.tar.gz.

File metadata

  • Download URL: flake8-trio-22.11.4.tar.gz
  • Upload date:
  • Size: 34.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.11.0

File hashes

Hashes for flake8-trio-22.11.4.tar.gz
Algorithm Hash digest
SHA256 6f04d6167b9ebf3a6977bbcea8437d6aab53c87ac067e7287e9b0f5bbd59a005
MD5 8cca612e7fb1e073cb347f4897e48a7e
BLAKE2b-256 4821fe54052b24f5b7590754ca7aa68d6b6cc596c681171c293d3c628fc23a68

See more details on using hashes here.

File details

Details for the file flake8_trio-22.11.4-py3-none-any.whl.

File metadata

  • Download URL: flake8_trio-22.11.4-py3-none-any.whl
  • Upload date:
  • Size: 16.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.11.0

File hashes

Hashes for flake8_trio-22.11.4-py3-none-any.whl
Algorithm Hash digest
SHA256 82de3db3a1a3a6a74e32ee2c53eaf9c58f333b0ac65f1e4d5ca9a7ca84b48acf
MD5 1a3e3539d11633fce627d042f012008e
BLAKE2b-256 97ef301b48ef3f7bac49874df401d32d45ad8e62083c5539323456b2be846f1d

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page