Change Log
3.0.0 (2026-05-06)
Breaking changes:
- drop curio backend entirely — anyio is the sole async backend
- remove
BTreeRunner(disable_curio=)parameter, replaced byBTreeRunner(backend=) - remove
has_curio()utility function - remove
[curio]optional dependency group - remove old
run(kernel, target, *args)curio helper — replaced byrun(target, *args, backend=...) - fix
paralleleparameter typo:succes_threshold→success_threshold - fix
sequenceparameter typo:succes_threshold→success_threshold - rename
ControlFlowException.instanciate→ControlFlowException.instantiate(typo fix) - rename
repeat_until→repeat_while(old behavior: loop while condition is truthy) - add
repeat_untilwith correct standard BT semantics (loop until condition becomes truthy) BTreeRunner.run()context isolation: each call starts from the__enter__snapshot; mutations no longer accumulate across ticks (was a side-effect of the oldasyncio.Runnerpersistent loop)
Changes:
- add
Backend = Literal["asyncio", "trio", "asyncio+uvloop"]type and export it from public API BTreeRunner(backend=)supports"asyncio"(default),"trio","asyncio+uvloop"run(target, *args, backend="asyncio", **kwargs)— one-shot convenience wrapper aroundBTreeRunnerparallelerewrites withanyio.create_task_group()— runs children concurrently across all backends- full test suite parametrized over asyncio, trio, and asyncio+uvloop via
pytest-anyio - add
timeout_after(child, delay)decorator — returnsFAILUREif child exceeds deadline (usesanyio.move_on_after) - add
condition_guard(condition, child)— alias fordecisionwithout failure tree; skips child and returnsSUCCESSwhen condition is falsy - add
cooldown(child, delay, throttled_value=SUCCESS)— skips child if called beforedelayseconds have elapsed; returnsthrottled_value(defaultSUCCESS) when throttled - add
delay(child, seconds)— waitssecondsbefore running child - add
do_while(child, condition)— runs child at least once, then repeats while condition is truthy - add
repeat_n(child, n)— runs child exactlyntimes regardless of result - add
random_selector(children)— fallback with children shuffled on every tick - add
parallel_race(children)— runs children concurrently; first to finish wins, all others are cancelled - add
switch(condition, cases, default=None)— routes to a child based on the return value ofcondition; falls back todefaultorFAILUREif no case matches - add tutorials: context var isolation (tutorial 3), exception handling (tutorial 4)
- add migration guides:
docs/migration/curio-to-anyio.md,docs/migration/asyncio-to-anyio.md - minimum Python version unchanged: 3.11
2.0.1 (2026-05-05)
Changes:
- update pytest version
- add mkdocs-gen-files and mkdocs-literate-nav to auto-generate API reference from docstrings
- add make docs-serve target for local documentation preview
- update mkdocs.yml: explicit docs_dir/site_dir, labeled nav titles, mkdocstrings Google docstring style
- update contributing guide with documentation workflow, repository layout, and release process
2.0.0 (2026-05-05)
Breaking changes:
- drop Python 3.9 and 3.10 support, minimum is now Python 3.11
- remove
poethepoetdependency, all tasks now driven bymake
Changes:
- migrate from
poetasks to Makefile targets - add
make install-curiotarget for curio backend development - add asyncio test suite alongside curio test suite
- add
@pytest.mark.all_backendsmarker to run tests under both backends - set
pytest asyncio_mode = "strict" - extend ruff rules:
UP,B,C4,A,N,TCH,RUF - update pyright constraint to
~= 1.1 - fix
runner.py: remove dead Python version guard
1.4.1 (2025-01-21)
- change poetry to uv as dependencies manager
- support python 3.12
1.4.0 (2025-01-06)
- remove support of python 3.8
- update poetry usage with poet plugin
- update pyproject.toml declaration
- update dependencies management
- fix few type error
- extends test to 3.9, 3.11
- remove usage of black and isort for rust
- use pyright as sucessor or mypy
1.3.0 (2023-10-07)
- add default parallel asyncio implementation if curio is not present.
- add run_once decorator
- bunp pytest dependency
- Deprecation notice on
async_btree.utils.run - Add BTreeRunner context manager to drive multiple independant btree execution.
This implementation works with curio and asyncio.
asynciosupport only for python >= 3.11. - remove
__version__package attribute. Single source of true is pyproject.toml and git.
1.2.0 (2023-05-11)
Features, from #24 :
- Removing inner exception handling, in order to code like usual, catch what we want and manage exception as needed
- add function failure_on_exception : avoid raising and manage it in btree with a false meaning
- add function ignore_exception : ignore specific exception
Fix: - mypy cast issue on decorated function. - name attribute on operator - add test about metadata node name and properties - function name access compliant with mypi
Technical Update:
- use local .venv directory for virtual env -> better integration with visual studio
- update development dependencies
- use ruff as replacement of flake8, flakehell,...
- use mkdocs as replacement of sphinx
- simplify Makefile
- change 'master' branch for 'main'
1.1.1 (2020-11-21)
- simplify
analyzefunction - fix parallele implementation
1.1.0 (2020-11-20)
- remove falsy evaluation of exception
- add ignore_exception decorator
- use sync or async function in parameters operator
- decision control return Success per default rather than act as a failure if no failure tree dependency is set.
- add test on python 3.8
1.0.2 (2020-11-15)
- update curio version > 1
- add pytest-curio and rewrote test unit
1.0.1 (2020-01-31)
- update from template-python
- use poetry 1.0.x
1.0.0 (2019-09-01)
- rework documentation build process (see mkdocs folder)
- configure github page under master/docs
- configure documentation site on pypi
- add doc style on all function
- standardize parameter name
- fix dev documentation dependency
0.1.2 (2019-07-05)
- Stable version flag
- Remove alpha note
0.1.1 (2019-07-05)
Removed version due to configuration error.
0.1.0 (2019-07-05)
- Added Project Management:
- initial project structure based on jacebrowning/template-python
- initial project configuration
- follow Semantic Versioning
- configure travis-ci
- publish alpha version (not functional) on pypi
- configure coverage
- configure scrutinizer
- remove pylint.ini to a simple .pylintrc (add ide support)
- disable pylint bad-continuation (bug with pep8 formater)
- declare extra dependency
- configure black and isort
- refactorise makefile poetry run
- introduce flake8 as linter
- Documentation:
- replace mkdocs with pydoc-markdown
- Code:
- define 'definition' module to declare all common definiton of btree
- define 'utils' module to declare few async function like afilter, amap
- fix flake8 syntax error
- fix mypy typing error
- add basic test unit
- fix typing declaration
- complete code coverage