Skip to content

Releases: python-trio/trio

v0.31.0

09 Sep 15:50
Compare
Choose a tag to compare

Full Changelog: v0.30.0...v0.31.0

Features

  • Cancelled strings can now display the source and reason for a cancellation. Trio-internal sources of cancellation will set this string, and CancelScope.cancel now has a reason string parameter that can be used to attach info to any Cancelled to help in debugging. (#3232)

Bugfixes

  • Make ctrl+c work in more situations in the Trio REPL (python -m trio). (#3007)
  • Allow pickling trio.Cancelled, as they can show up when you want to pickle something else. This does not rule out pickling other NoPublicConstructor objects -- create an issue if necessary. (#3248)
  • Decrease import time on Windows by around 10%. (#3263)
  • Handle unwrapping SystemExit/KeyboardInterrupt exception gracefully in utility function raise_single_exception_from_group that reraises last exception from group. (#3275)
  • Ensure that the DTLS server does not mutate SSL context. (#3277)
  • Avoid having trio.as_safe_channel raise if closing the generator wrapped
    GeneratorExit in a BaseExceptionGroup. (#3324)

Deprecations and removals

  • Implement bool(trio.Event) and have it raise a DeprecationWarning and tell users to use trio.Event.is_set instead. This is an alternative to mypy --enable-error-code=truthy-bool for users who don't use type checking. (#3322)

Miscellaneous internal changes

  • When misnesting nurseries you now get a helpful RuntimeError instead of a catastrophic TrioInternalError. (#3307)

v0.30.0

21 Apr 01:10
Compare
Choose a tag to compare

Full Changelog: v0.29.0...v0.30.0

Features

  • Add @trio.as_safe_channel, a wrapper that can be used to make async generators safe.
    This will be the suggested fix for the flake8-async lint rule ASYNC900. (#3197)

Bugfixes

  • Allow trio to be a types.ModuleType and still have deprecated attributes. (#2135)
  • Fixed socket module for some older systems which lack socket.AI_NUMERICSERV.
    Now trio works on legacy (pre-Lion) macOS. (#3133)
  • Update type hints for trio.run_process and trio.lowlevel.open_process. (#3183)
  • Don't mutate the global runner when MockClock is created. (#3205)
  • Fix incorrect return type hint for Nursery.start(). (#3224)

Improved documentation

  • Update wording in documentation to more accurately reflect Trio's maturity. (#3216)

v0.29.0

14 Feb 07:19
Compare
Choose a tag to compare

Full Changelog: v0.28.0...v0.29.0

Features

  • Add trio.lowlevel.in_trio_run and trio.lowlevel.in_trio_task and document the semantics (and differences) thereof. (#2757)
  • If trio.testing.RaisesGroup does not get the expected exceptions it now raises an AssertionError with a helpful message, instead of letting the raised exception/group fall through. The raised exception is available in the __context__ of the AssertionError and can be seen in the traceback. (#3145)

Bugfixes

  • Clear Trio's cache of worker threads upon os.fork. (#2764)

Miscellaneous internal changes

  • Stop using ctypes to mutate tracebacks for strict_exception_groups=False's exception collapsing. (#405)

  • Fixed spelling error in Windows error code enum for ERROR_INVALID_PARAMETER. (#3166)

  • Publicly re-export __version__ for type checking purposes. (#3186)

  • The typing of trio.abc.HostnameResolver.getaddrinfo has been corrected to match that of the stdlib socket.getaddrinfo, which was updated in mypy 1.15 (via a typeshed update) to include the possibility of tuple[int, bytes] for the sockaddr field of the result. This happens in situations where Python was compiled with --disable-ipv6.

    Additionally, the static typing of trio.to_thread.run_sync, trio.from_thread.run and trio.from_thread.run_sync has been improved and should reflect the underlying function being run. (#3201)

v0.28.0

25 Dec 17:04
Compare
Choose a tag to compare

Full Changelog: v0.27.0...v0.28.0

Bugfixes

  • :func:inspect.iscoroutinefunction and the like now give correct answers when
    called on KI-protected functions. (#2670)

  • Rework KeyboardInterrupt protection to track code objects, rather than frames,
    as protected or not. The new implementation no longer needs to access
    frame.f_locals dictionaries, so it won't artificially extend the lifetime of
    local variables. Since KeyboardInterrupt protection is now imposed statically
    (when a protected function is defined) rather than each time the function runs,
    its previously-noticeable performance overhead should now be near zero.
    The lack of a call-time wrapper has some other benefits as well:

    • :func:inspect.iscoroutinefunction and the like now give correct answers when
      called on KI-protected functions.

    • Calling a synchronous KI-protected function no longer pushes an additional stack
      frame, so tracebacks are clearer.

    • A synchronous KI-protected function invoked from C code (such as a weakref
      finalizer) is now guaranteed to start executing; previously there would be a brief
      window in which KeyboardInterrupt could be raised before the protection was
      established.

    One minor drawback of the new approach is that multiple instances of the same
    closure share a single KeyboardInterrupt protection state (because they share a
    single code object). That means that if you apply
    trio.lowlevel.enable_ki_protection to some of them
    and not others, you won't get the protection semantics you asked for. See the
    documentation of trio.lowlevel.enable_ki_protection
    for more details and a workaround. (#3108)

  • Rework foreign async generator finalization to track async generator
    ids rather than mutating ag_frame.f_locals. This fixes an issue
    with the previous implementation: locals' lifetimes will no longer be
    extended by materialization in the ag_frame.f_locals dictionary that
    the previous finalization dispatcher logic needed to access to do its work. (#3112)

  • Ensure that Pyright recognizes our underscore prefixed attributes for attrs classes. (#3114)

  • Fix trio.testing.RaisesGroup's typing. (#3141)

Improved documentation

  • Improve error message when run after gevent's monkey patching. (#3087)
  • Document that trio.sleep_forever is guaranteed to raise an exception now. (#3113)

Removals without deprecations

  • Remove workaround for OpenSSL 1.1.1 DTLS ClientHello bug. (#3097)
  • Drop support for Python 3.8. (#3104) (#3106)

Miscellaneous internal changes

  • Switch to using PEP570 for positional-only arguments for trio.socket.SocketType's methods. (#3094)
  • Improve type annotations in several places by removing Any usage. (#3121)
  • Get and enforce 100% coverage (#3159)

v0.27.0

16 Oct 23:34
Compare
Choose a tag to compare

Full Changelog: v0.26.2...v0.27.0

Breaking changes

  • trio.move_on_after and trio.fail_after previously set the deadline relative to initialization time, instead of more intuitively upon entering the context manager. This might change timeouts if a program relied on this behavior. If you want to restore previous behavior you should instead use trio.move_on_at(trio.current_time() + ...).
    flake8-async has a new rule to catch this, in case you're supporting older trio versions. See ASYNC122. (#2512)

Features

  • CancelScope.relative_deadline and CancelScope.is_relative added, as well as a relative_deadline parameter to __init__. This allows initializing scopes ahead of time, but where the specified relative deadline doesn't count down until the scope is entered. (#2512)
  • trio.Lock and trio.StrictFIFOLock will now raise trio.BrokenResourceError when trio.Lock.acquire would previously stall due to the owner of the lock exiting without releasing the lock. (#3035)
  • trio.move_on_at, trio.move_on_after, trio.fail_at and trio.fail_after now accept shield as a keyword argument. If specified, it provides an initial value for the ~trio.CancelScope.shield attribute of the trio.CancelScope object created by the context manager. (#3052)
  • Added trio.lowlevel.add_parking_lot_breaker and trio.lowlevel.remove_parking_lot_breaker to allow creating custom lock/semaphore implementations that will break their underlying parking lot if a task exits unexpectedly. trio.lowlevel.ParkingLot.break_lot is also added, to allow breaking a parking lot intentionally. (#3081)

Bugfixes

  • Allow sockets to bind any os.PathLike object. (#3041)
  • Update trio.lowlevel.open_process's documentation to allow bytes. (#3076)
  • Update trio.sleep_forever to be NoReturn. (#3095)

Improved documentation

  • Add docstrings for memory channels' statistics() and aclose methods. (#3101)

v0.26.2

08 Aug 00:49
Compare
Choose a tag to compare

Full Changelog: v0.26.1...v0.26.2

Bugfixes

  • Remove remaining hash usage and fix test configuration issue that prevented it from being caught. (#3053)

v0.26.1

05 Aug 01:09
Compare
Choose a tag to compare

Full Changelog: v0.26.0...v0.26.1

Bugfixes

  • Switched attrs usage off of hash, which is now deprecated. (#3053)

Miscellaneous internal changes

  • Use PyPI's Trusted Publishers to make releases. (#2980)

v0.26.0

05 Jul 04:32
Compare
Choose a tag to compare

Full Changelog: v0.25.1...v0.26.0

Features

  • Added an interactive interpreter python -m trio.

    This makes it easier to try things and experiment with trio in the a Python repl.
    Use the await keyword without needing to call trio.run()

$ python -m trio
Trio 0.26.0, Python 3.10.6
Use "await" directly instead of "trio.run()".
Type "help", "copyright", "credits" or "license" for more information.
>>> import trio
>>> await trio.sleep(1); print("hi")  # prints after one second
hi

See interactive debugging for further detail. (#2972)

  • trio.testing.RaisesGroup can now catch an unwrapped exception with unwrapped=True. This means that the behaviour of except* can be fully replicated in combination with flatten_subgroups=True (formerly strict=False). (#2989)

Bugfixes

  • Fixed a bug where trio.testing.RaisesGroup(..., strict=False) would check the number of exceptions in the raised ExceptionGroup before flattening subgroups, leading to incorrectly failed matches.
    It now properly supports end ($) regex markers in the match message, by no longer including " (x sub-exceptions)" in the string it matches against. (#2989)

Deprecations and removals

  • Deprecated strict parameter from trio.testing.RaisesGroup, previous functionality of strict=False is now in flatten_subgroups=True. (#2989)

v0.25.1

16 May 06:34
Compare
Choose a tag to compare

Full Changelog: v0.25.0...v0.25.1

Bugfixes

  • Fix crash when importing trio in embedded Python on Windows, and other installs that remove docstrings. (#2987)

v0.25.0

17 Mar 02:59
Compare
Choose a tag to compare

Full Changelog: v0.24.0...v0.25.0

Breaking changes

  • The strict_exception_groups parameter now defaults to True in trio.run and trio.lowlevel.start_guest_run. trio.open_nursery still defaults to the same value as was specified in trio.run/trio.lowlevel.start_guest_run, but if you didn't specify it there then all subsequent calls to trio.open_nursery will change.
    This is unfortunately very tricky to change with a deprecation period, as raising a DeprecationWarning whenever strict_exception_groups is not specified would raise a lot of unnecessary warnings.

    Notable side effects of changing code to run with strict_exception_groups==True

    • If an iterator raises StopAsyncIteration or StopIteration inside a nursery, then python will not recognize wrapped instances of those for stopping iteration.

    • trio.run_process is now documented that it can raise an ExceptionGroup. It previously could do this in very rare circumstances, but with strict_exception_groups set to True it will now do so whenever exceptions occur in deliver_cancel or with problems communicating with the subprocess.

      • Errors in opening the process is now done outside the internal nursery, so if code previously ran with strict_exception_groups=True there are cases now where an ExceptionGroup is no longer added.
    • trio.TrioInternalError .__cause__ might be wrapped in one or more ExceptionGroups <ExceptionGroup> (#2786)

Features

  • Add trio.testing.wait_all_threads_completed, which blocks until no threads are running tasks. This is intended to be used in the same way as trio.testing.wait_all_tasks_blocked. (#2937)

  • Path is now a subclass of pathlib.PurePath, allowing it to interoperate with other standard
    pathlib types.

    Instantiating Path now returns a concrete platform-specific subclass, one of PosixPath or
    WindowsPath, matching the behavior of pathlib.Path. (#2959)

Bugfixes

  • The pthread functions are now correctly found on systems using vanilla versions of musl libc. (#2939)

Miscellaneous internal changes

  • use the regular readme for the PyPI long_description (#2866)