Skip to content

Releases: python-trio/trio

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)

v0.24.0

10 Jan 03:33
Compare
Choose a tag to compare

Full Changelog: v0.23.2...v0.24.0

Features

  • New helper classes: testing.RaisesGroup and testing.Matcher.

    In preparation for changing the default of strict_exception_groups to True, we're introducing a set of helper classes that can be used in place of pytest.raises in tests, to check for an expected ExceptionGroup.
    These are provisional, and only planned to be supplied until there's a good solution in pytest. See pytest-dev/pytest#11538 (#2785)

Deprecations and removals

  • MultiError has been fully removed, and all relevant trio functions now raise ExceptionGroups instead. This should not affect end users that have transitioned to using except* or catching ExceptionGroup/BaseExceptionGroup. (#2891)

v0.23.2

14 Dec 04:25
Compare
Choose a tag to compare

Full Changelog: v0.23.1...v0.23.2

Features

  • TypeVarTuple is now used to fully type nursery.start_soon(), trio.run(), trio.to_thread.run_sync(), and other similar functions accepting (func, *args). This means type checkers will be able to verify types are used correctly. nursery.start() is not fully typed yet however. (#2881)

Bugfixes

  • Make pyright recognize open_memory_channel as generic. (#2873)

Miscellaneous internal changes

  • Moved the metadata into PEP621-compliant pyproject.toml. (#2860)
  • do not depend on exceptiongroup pre-release (#2861)
  • Move .coveragerc into pyproject.toml (#2867)

v0.23.1

04 Nov 05:59
Compare
Choose a tag to compare

Full Changelog: v0.23.0...v0.23.1

Bugfixes

  • Don't crash on import in Anaconda interpreters. (#2855)