From 2bc6fe217aa29e4f1400df80749a090a48d08a14 Mon Sep 17 00:00:00 2001 From: mikolaj92 Date: Tue, 20 Oct 2026 23:54:13 +0200 Subject: [PATCH 1/6] lokay build --- src/datasource_kit/adapters/fala.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/datasource_kit/adapters/fala.py b/src/datasource_kit/adapters/fala.py index 87a4561..19b9310 100644 --- a/src/datasource_kit/adapters/fala.py +++ b/src/datasource_kit/adapters/fala.py @@ -77,8 +77,11 @@ def __init__(self, db_path: str | PathLike[str]) -> None: try: record_in_process = fala.record_in_process - except AttributeError as exc: - raise RuntimeError(_EXECUTION_CAPABILITY_ERROR) from exc + except AttributeError: + try: + from fala.host import record_in_process + except (ImportError, AttributeError) as exc: + raise RuntimeError(_EXECUTION_CAPABILITY_ERROR) from exc if not callable(record_in_process): raise RuntimeError(_EXECUTION_CAPABILITY_ERROR) # noqa: TRY004 From ee4afb9c9d8f36ed91f0e8d071ef5ba68257dbd3 Mon Sep 17 00:00:00 2001 From: mikolaj92 Date: Wed, 21 Oct 2026 00:38:09 +0200 Subject: [PATCH 2/6] Fix #114 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8b98912..588caf9 100644 --- a/README.md +++ b/README.md @@ -393,7 +393,7 @@ backend = FalaExecutionBackend("journal.sqlite") summary = backend.execute(request, perform_step) ``` -This is a thin adapter over Fala 0.7.28's public `record_in_process` API: +This is a thin adapter over Fala 0.7.28's public `fala.host.record_in_process` API: `run_id`, `execution_id` (as Fala's `process_id`), `inputs`, `metadata`, and the callback are forwarded unchanged. Fala owns validation, recording, exact-once callback invocation, and return/exception semantics. The caller still creates From 503ce604c975d92a6cdc68034746fb89a2494e77 Mon Sep 17 00:00:00 2001 From: mikolaj92 Date: Wed, 21 Oct 2026 05:49:02 +0200 Subject: [PATCH 3/6] lokay build --- README.md | 7 +++---- pyproject.toml | 9 +-------- tests/adapters/test_fala_extra_source.py | 16 ++++++++-------- uv.lock | 11 ++++++++--- 4 files changed, 20 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index 588caf9..e1a04e3 100644 --- a/README.md +++ b/README.md @@ -393,7 +393,7 @@ backend = FalaExecutionBackend("journal.sqlite") summary = backend.execute(request, perform_step) ``` -This is a thin adapter over Fala 0.7.28's public `fala.host.record_in_process` API: +This is a thin adapter over Fala 0.8.1's public `fala.host.record_in_process` API: `run_id`, `execution_id` (as Fala's `process_id`), `inputs`, `metadata`, and the callback are forwarded unchanged. Fala owns validation, recording, exact-once callback invocation, and return/exception semantics. The caller still creates @@ -423,9 +423,8 @@ pip install "datasource-kit[fastapi]" # FastAPI control-plane router ``` The `[fala]` extra installs [mikolaj92/Fala](https://github.com/mikolaj92/Fala) -from GitHub at the `v0.7.28` tag (`record_in_process`). Fala is not published -to PyPI; the extra carries a PEP 508 git URL so `pip` does not resolve the -unrelated PyPI project named `fala`. +from an HTTPS archive pinned to commit `27c179aee96daf6953ef36d6b1a007214d14a0db` (0.8.1). +The PEP 508 URL avoids git fetch and the unrelated PyPI project named `fala`. ## Minimal Batch Usage diff --git a/pyproject.toml b/pyproject.toml index 27da8f3..c54d8c8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -16,11 +16,7 @@ dependencies = [] datasource-kit = "datasource_kit.cli:main" [project.optional-dependencies] -# Blob/artifact resolution and in-process journal recording only. -# Fala is GitHub-only (name = "fala"); the PEP 508 URL keeps pip off the -# unrelated PyPI project of the same name. Adapter needs record_in_process -# (Fala 0.7.28+). -fala = ["fala @ git+https://github.com/mikolaj92/Fala.git@v0.7.28"] +fala = ["fala @ https://github.com/mikolaj92/Fala/archive/27c179aee96daf6953ef36d6b1a007214d14a0db.tar.gz"] # YAML profile loading only; JSON profiles are the dep-free default. profiles = ["pyyaml>=6.0"] # Optional FastAPI control-plane router; the core stays HTTP-framework-free. @@ -34,9 +30,6 @@ dev = ["pytest>=8.0", "fastapi>=0.141.1", "httpx2>=2.12.0"] [dependency-groups] dev = ["pytest>=8.0", "fastapi>=0.141.1", "httpx2>=2.12.0"] -[tool.uv.sources] -fala = { git = "https://github.com/mikolaj92/Fala", tag = "v0.7.28" } - [build-system] requires = ["hatchling"] build-backend = "hatchling.build" diff --git a/tests/adapters/test_fala_extra_source.py b/tests/adapters/test_fala_extra_source.py index 00ca593..49c1c66 100644 --- a/tests/adapters/test_fala_extra_source.py +++ b/tests/adapters/test_fala_extra_source.py @@ -5,22 +5,22 @@ from typing import Final _ROOT: Final = Path(__file__).resolve().parents[2] -_FALA_GIT: Final = "https://github.com/mikolaj92/Fala" -_FALA_TAG: Final = "v0.7.28" -_FALA_EXTRA: Final = f"fala @ git+{_FALA_GIT}.git@{_FALA_TAG}" +_FALA_URL: Final = "https://github.com/mikolaj92/Fala/archive/27c179aee96daf6953ef36d6b1a007214d14a0db.tar.gz" +_FALA_EXTRA: Final = f"fala @ {_FALA_URL}" def _pyproject() -> dict[str, object]: return tomllib.loads((_ROOT / "pyproject.toml").read_text(encoding="utf-8")) -def test_fala_extra_installs_mikolaj92_fala_from_git() -> None: +def test_fala_extra_installs_mikolaj92_fala_from_archive() -> None: extras = _pyproject()["project"]["optional-dependencies"]["fala"] assert extras == [_FALA_EXTRA] -def test_uv_sources_pin_fala_to_the_same_git_tag() -> None: - sources = _pyproject()["tool"]["uv"]["sources"]["fala"] - - assert sources == {"git": _FALA_GIT, "tag": _FALA_TAG} +def test_uv_sources_pin_fala_to_the_same_archive() -> None: + lock = tomllib.loads((_ROOT / "uv.lock").read_text(encoding="utf-8")) + package = next(p for p in lock["package"] if p["name"] == "fala") + assert package["version"] == "0.8.1" + assert package["source"] == {"url": _FALA_URL} diff --git a/uv.lock b/uv.lock index 5333090..3313321 100644 --- a/uv.lock +++ b/uv.lock @@ -72,7 +72,7 @@ dev = [ [package.metadata] requires-dist = [ - { name = "fala", marker = "extra == 'fala'", git = "https://github.com/mikolaj92/Fala?tag=v0.7.28" }, + { name = "fala", marker = "extra == 'fala'", url = "https://github.com/mikolaj92/Fala/archive/27c179aee96daf6953ef36d6b1a007214d14a0db.tar.gz" }, { name = "fastapi", marker = "extra == 'dev'", specifier = ">=0.141.1" }, { name = "fastapi", marker = "extra == 'fastapi'", specifier = ">=0.141.1" }, { name = "httpx2", marker = "extra == 'dev'", specifier = ">=2.12.0" }, @@ -90,8 +90,13 @@ dev = [ [[package]] name = "fala" -version = "0.7.28" -source = { git = "https://github.com/mikolaj92/Fala?tag=v0.7.28#36b98995f515766b867dd5e43c63799a6892aa48" } +version = "0.8.1" +source = { url = "https://github.com/mikolaj92/Fala/archive/27c179aee96daf6953ef36d6b1a007214d14a0db.tar.gz" } +sdist = { hash = "sha256:328563fd39dd551e6c3e4058741aed3edec0902c51dadb8952485d2c525c94ad" } + +[package.metadata] +requires-dist = [{ name = "pytest", marker = "extra == 'dev'", specifier = ">=8.0" }] +provides-extras = ["dev"] [[package]] name = "fastapi" From a31c242889cf72fdd6c11c55586639ebf0cbfbdd Mon Sep 17 00:00:00 2001 From: mikolaj92 Date: Wed, 21 Oct 2026 06:18:11 +0200 Subject: [PATCH 4/6] lokay build --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index e1a04e3..63254b5 100644 --- a/README.md +++ b/README.md @@ -423,8 +423,8 @@ pip install "datasource-kit[fastapi]" # FastAPI control-plane router ``` The `[fala]` extra installs [mikolaj92/Fala](https://github.com/mikolaj92/Fala) -from an HTTPS archive pinned to commit `27c179aee96daf6953ef36d6b1a007214d14a0db` (0.8.1). -The PEP 508 URL avoids git fetch and the unrelated PyPI project named `fala`. +from an HTTPS archive pinned to commit `27c179aee96daf6953ef36d6b1a007214d14a0db` (0.8.1), without git fetch or the unrelated PyPI `fala`. +Durable execution also requires Fala's native libraries and the Mojo toolchain; installing the extra alone does not provide them. ## Minimal Batch Usage From ba3c2e22c5e2dc49ebf585b3804161359c44e488 Mon Sep 17 00:00:00 2001 From: mikolaj92 Date: Wed, 21 Oct 2026 06:37:57 +0200 Subject: [PATCH 5/6] Fix #114 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 63254b5..2a052db 100644 --- a/README.md +++ b/README.md @@ -424,7 +424,7 @@ pip install "datasource-kit[fastapi]" # FastAPI control-plane router The `[fala]` extra installs [mikolaj92/Fala](https://github.com/mikolaj92/Fala) from an HTTPS archive pinned to commit `27c179aee96daf6953ef36d6b1a007214d14a0db` (0.8.1), without git fetch or the unrelated PyPI `fala`. -Durable execution also requires Fala's native libraries and the Mojo toolchain; installing the extra alone does not provide them. +Durable execution also requires Fala's Mojo sources (set `FALA_HOME` to a Fala checkout), native libraries, and the Mojo toolchain; installing the extra alone does not provide them. ## Minimal Batch Usage From ed47d94f6177d44a5535471bc739838c80c5558c Mon Sep 17 00:00:00 2001 From: mikolaj92 Date: Thu, 22 Oct 2026 06:00:31 +0200 Subject: [PATCH 6/6] lokay build --- README.md | 7 +++---- pyproject.toml | 9 +-------- tests/adapters/test_fala_extra_source.py | 13 ++++++------- uv.lock | 11 ++++++++--- 4 files changed, 18 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 8b98912..e1a04e3 100644 --- a/README.md +++ b/README.md @@ -393,7 +393,7 @@ backend = FalaExecutionBackend("journal.sqlite") summary = backend.execute(request, perform_step) ``` -This is a thin adapter over Fala 0.7.28's public `record_in_process` API: +This is a thin adapter over Fala 0.8.1's public `fala.host.record_in_process` API: `run_id`, `execution_id` (as Fala's `process_id`), `inputs`, `metadata`, and the callback are forwarded unchanged. Fala owns validation, recording, exact-once callback invocation, and return/exception semantics. The caller still creates @@ -423,9 +423,8 @@ pip install "datasource-kit[fastapi]" # FastAPI control-plane router ``` The `[fala]` extra installs [mikolaj92/Fala](https://github.com/mikolaj92/Fala) -from GitHub at the `v0.7.28` tag (`record_in_process`). Fala is not published -to PyPI; the extra carries a PEP 508 git URL so `pip` does not resolve the -unrelated PyPI project named `fala`. +from an HTTPS archive pinned to commit `27c179aee96daf6953ef36d6b1a007214d14a0db` (0.8.1). +The PEP 508 URL avoids git fetch and the unrelated PyPI project named `fala`. ## Minimal Batch Usage diff --git a/pyproject.toml b/pyproject.toml index 27da8f3..c54d8c8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -16,11 +16,7 @@ dependencies = [] datasource-kit = "datasource_kit.cli:main" [project.optional-dependencies] -# Blob/artifact resolution and in-process journal recording only. -# Fala is GitHub-only (name = "fala"); the PEP 508 URL keeps pip off the -# unrelated PyPI project of the same name. Adapter needs record_in_process -# (Fala 0.7.28+). -fala = ["fala @ git+https://github.com/mikolaj92/Fala.git@v0.7.28"] +fala = ["fala @ https://github.com/mikolaj92/Fala/archive/27c179aee96daf6953ef36d6b1a007214d14a0db.tar.gz"] # YAML profile loading only; JSON profiles are the dep-free default. profiles = ["pyyaml>=6.0"] # Optional FastAPI control-plane router; the core stays HTTP-framework-free. @@ -34,9 +30,6 @@ dev = ["pytest>=8.0", "fastapi>=0.141.1", "httpx2>=2.12.0"] [dependency-groups] dev = ["pytest>=8.0", "fastapi>=0.141.1", "httpx2>=2.12.0"] -[tool.uv.sources] -fala = { git = "https://github.com/mikolaj92/Fala", tag = "v0.7.28" } - [build-system] requires = ["hatchling"] build-backend = "hatchling.build" diff --git a/tests/adapters/test_fala_extra_source.py b/tests/adapters/test_fala_extra_source.py index 00ca593..55aaa94 100644 --- a/tests/adapters/test_fala_extra_source.py +++ b/tests/adapters/test_fala_extra_source.py @@ -5,22 +5,21 @@ from typing import Final _ROOT: Final = Path(__file__).resolve().parents[2] -_FALA_GIT: Final = "https://github.com/mikolaj92/Fala" -_FALA_TAG: Final = "v0.7.28" -_FALA_EXTRA: Final = f"fala @ git+{_FALA_GIT}.git@{_FALA_TAG}" +_FALA_ARCHIVE: Final = "https://github.com/mikolaj92/Fala/archive/27c179aee96daf6953ef36d6b1a007214d14a0db.tar.gz" +_FALA_EXTRA: Final = f"fala @ {_FALA_ARCHIVE}" def _pyproject() -> dict[str, object]: return tomllib.loads((_ROOT / "pyproject.toml").read_text(encoding="utf-8")) -def test_fala_extra_installs_mikolaj92_fala_from_git() -> None: +def test_fala_extra_installs_mikolaj92_fala_from_archive() -> None: extras = _pyproject()["project"]["optional-dependencies"]["fala"] assert extras == [_FALA_EXTRA] -def test_uv_sources_pin_fala_to_the_same_git_tag() -> None: - sources = _pyproject()["tool"]["uv"]["sources"]["fala"] +def test_uv_sources_do_not_override_fala_archive() -> None: + sources = _pyproject().get("tool", {}).get("uv", {}).get("sources", {}) - assert sources == {"git": _FALA_GIT, "tag": _FALA_TAG} + assert "fala" not in sources diff --git a/uv.lock b/uv.lock index 5333090..3313321 100644 --- a/uv.lock +++ b/uv.lock @@ -72,7 +72,7 @@ dev = [ [package.metadata] requires-dist = [ - { name = "fala", marker = "extra == 'fala'", git = "https://github.com/mikolaj92/Fala?tag=v0.7.28" }, + { name = "fala", marker = "extra == 'fala'", url = "https://github.com/mikolaj92/Fala/archive/27c179aee96daf6953ef36d6b1a007214d14a0db.tar.gz" }, { name = "fastapi", marker = "extra == 'dev'", specifier = ">=0.141.1" }, { name = "fastapi", marker = "extra == 'fastapi'", specifier = ">=0.141.1" }, { name = "httpx2", marker = "extra == 'dev'", specifier = ">=2.12.0" }, @@ -90,8 +90,13 @@ dev = [ [[package]] name = "fala" -version = "0.7.28" -source = { git = "https://github.com/mikolaj92/Fala?tag=v0.7.28#36b98995f515766b867dd5e43c63799a6892aa48" } +version = "0.8.1" +source = { url = "https://github.com/mikolaj92/Fala/archive/27c179aee96daf6953ef36d6b1a007214d14a0db.tar.gz" } +sdist = { hash = "sha256:328563fd39dd551e6c3e4058741aed3edec0902c51dadb8952485d2c525c94ad" } + +[package.metadata] +requires-dist = [{ name = "pytest", marker = "extra == 'dev'", specifier = ">=8.0" }] +provides-extras = ["dev"] [[package]] name = "fastapi"