**Full Changelog**: https://github.com/python-trio/trio/compare/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`. (https://github.com/python-trio/trio/issues/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. (https://github.com/python-trio/trio/issues/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. (https://github.com/python-trio/trio/issues/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. (https://github.com/python-trio/trio/issues/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. (https://github.com/python-trio/trio/issues/3081)
Bugfixes
---
- Allow sockets to bind any ``os.PathLike`` object. (https://github.com/python-trio/trio/issues/3041)
- Update ``trio.lowlevel.open_process``'s documentation to allow bytes. (https://github.com/python-trio/trio/issues/3076)
- Update `trio.sleep_forever` to be `NoReturn`. (https://github.com/python-trio/trio/issues/3095)
Improved documentation
---
- Add docstrings for memory channels' ``statistics()`` and ``aclose`` methods. (https://github.com/python-trio/trio/issues/3101)