From a65f0eb84a3d02b39e9d89b18cc152010c2eb692 Mon Sep 17 00:00:00 2001 From: Ryan Galloway Date: Mon, 28 Sep 2026 20:37:54 -0700 Subject: [PATCH 01/14] Scaffold subfork Python API client and package checks --- .github/workflows/tests.yml | 19 +++++++ .gitignore | 9 ++++ README.md | 101 ++++++++++++++++++++++++++++++++++- pyproject.toml | 29 ++++++++++ src/subfork/__init__.py | 8 +++ src/subfork/client.py | 61 +++++++++++++++++++++ src/subfork/errors.py | 48 +++++++++++++++++ src/subfork/py.typed | 0 src/subfork/resources.py | 95 +++++++++++++++++++++++++++++++++ tests/test_client.py | 103 ++++++++++++++++++++++++++++++++++++ 10 files changed, 472 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/tests.yml create mode 100644 .gitignore create mode 100644 pyproject.toml create mode 100644 src/subfork/__init__.py create mode 100644 src/subfork/client.py create mode 100644 src/subfork/errors.py create mode 100644 src/subfork/py.typed create mode 100644 src/subfork/resources.py create mode 100644 tests/test_client.py diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 0000000..f849f81 --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,19 @@ +name: Test and package +on: [push, pull_request] +permissions: + contents: read +jobs: + test: + runs-on: ubuntu-latest + strategy: + matrix: + python: ['3.10', '3.12', '3.13'] + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python }} + - run: python -m pip install '.[dev]' + - run: python -m pytest + - run: python -m build + - run: python -m twine check dist/* diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fe604a5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +__pycache__/ +*.py[cod] +.pytest_cache/ +.venv/ +.env +.env.* +build/ +dist/ +*.egg-info/ diff --git a/README.md b/README.md index 3b18e51..e7f8c62 100644 --- a/README.md +++ b/README.md @@ -1 +1,100 @@ -hello world +# subfork + +Python API client for Subfork graph authoring, publication and execution. +**Alpha scaffold; not yet published to PyPI.** Distribution and import name: `subfork`. +BYO workers belong in the separate worker package, not this client. + +## Development install + +Requires Python 3.10+. + +```bash +python -m venv .venv +source .venv/bin/activate +pip install -e '.[dev]' +pytest +python -m build +python -m twine check dist/* +``` + +A package license must be selected before the first public release. CI builds and +checks distributions but does not publish them. + +## Usage + +Create an API key under Account → API keys on a deployment with API-key support. +Set `SUBFORK_API_KEY` in your process environment; never put it in source files, +URLs, graph definitions, notebooks committed to git, or agent transcripts. + +```python +from subfork import Subfork + +with Subfork() as client: # Reads SUBFORK_API_KEY; defaults to https://subfork.com + nodes = client.nodes.list(include_all_versions=True) + graphs = client.graphs.list() +``` + +For a local deployment: + +```python +with Subfork(base_url="http://subfork.localhost") as client: + nodes = client.nodes.list() +``` + +`base_url` is an origin, without `/api/v1`. HTTPS is required except for loopback +and `.localhost` hosts. Credentials are sent in the Authorization bearer header. +Redirects are not followed. Use a context manager or call `client.close()`. + +## Author, publish, execute + +The following deliberately creates and publishes a public graph and consumes +execution quota. Grant read/write/run/publish scopes only when needed. +Responses are dictionaries preserving the server's JSON shape. + +```python +from subfork import Subfork + +name = "Python greeting" +definition = { + "name": name, + "nodes": [{ + "node_instance_id": "hello", "node_id": "n_text_value", + "node_version": "1.0.0", "title": "Hello", + "params": {"text": "Hello from Python"}, + }], + "edges": [], + "graph_outputs": {"text": {"node_instance_id": "hello", "output_name": "text"}}, +} +with Subfork() as client: + client.graphs.validate(definition) + graph = client.graphs.create(name=name, definition=definition) + client.graphs.publish(graph["id"], version="v1") + execution = client.graphs.execute(graph["id"], version="v1") + result = client.executions.wait(execution["id"], timeout=120) + print(result["status"], result.get("outputs")) +``` + +Discover published blocks with `graphs.published()` and retrieve their exact +interfaces with `graphs.published_version(graph_id, version)`. Compose their +returned node IDs with `composite_graph` parameters and explicit pinned versions. +`graphs.interface(graph_id)` previews the server-inferred interface. +`graphs.update()` replaces the submitted draft fields, including description; +pass the description to preserve it. Existing server ownership and quotas apply. + +## Errors and limits + +Catch `AuthenticationError`, `PermissionDeniedError`, `ValidationError`, +`RateLimitError`, or the base `APIError`; HTTP errors expose `status_code` and +`retry_after`. Messages intentionally do not echo raw response bodies or secrets. +`TransportError` means the outcome of a write may be unknown. There are no automatic +retries: inspect remote state before retrying create, publish or execute operations. + +`executions.wait()` polls until a terminal status and returns failed executions +as results too. `ExecutionTimeout` does **not** cancel the remote execution; +use `executions.cancel(id)` explicitly. Polling uses a monotonic deadline and caps +individual HTTP timeout settings by remaining time. HTTPX timeouts apply per I/O +phase, not a strict wall-clock deadline for the entire network exchange. + +The first scaffold is synchronous. Async support, rich response models, artifact +streaming, idempotent write retries and worker support are not included. Mock HTTP +tests do not certify any particular server deployment. diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..6cd4620 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,29 @@ +[build-system] +requires = ["setuptools>=77", "wheel"] +build-backend = "setuptools.build_meta" + +[project] +name = "subfork" +version = "0.1.0a1" +description = "Python API client for Subfork graph authoring and execution" +readme = "README.md" +requires-python = ">=3.10" +dependencies = ["httpx>=0.28,<1"] +classifiers = [ + "Development Status :: 3 - Alpha", + "Intended Audience :: Developers", + "Programming Language :: Python :: 3", + "Typing :: Typed", +] + +[project.optional-dependencies] +dev = ["pytest>=8,<10", "build>=1,<2", "twine>=6,<7"] + +[tool.setuptools.packages.find] +where = ["src"] + +[tool.setuptools.package-data] +subfork = ["py.typed"] + +[tool.pytest.ini_options] +testpaths = ["tests"] diff --git a/src/subfork/__init__.py b/src/subfork/__init__.py new file mode 100644 index 0000000..f3b0f04 --- /dev/null +++ b/src/subfork/__init__.py @@ -0,0 +1,8 @@ +"""Subfork's Python API client. BYO worker support is a separate distribution.""" +from .client import Subfork +from .errors import APIError, AuthenticationError, ExecutionTimeout, InvalidResponseError, NotFoundError, PermissionDeniedError, RateLimitError, SubforkError, TransportError, ValidationError + +__version__ = '0.1.0a1' +__all__ = ['Subfork', 'SubforkError', 'APIError', 'AuthenticationError', 'PermissionDeniedError', + 'NotFoundError', 'ValidationError', 'RateLimitError', 'TransportError', + 'InvalidResponseError', 'ExecutionTimeout'] diff --git a/src/subfork/client.py b/src/subfork/client.py new file mode 100644 index 0000000..d5f0511 --- /dev/null +++ b/src/subfork/client.py @@ -0,0 +1,61 @@ +"""Synchronous, explicitly closed HTTP client. No automatic write retries.""" +from __future__ import annotations + +import math +import os +from typing import Any + +import httpx + +from .errors import APIError, AuthenticationError, InvalidResponseError, NotFoundError, PermissionDeniedError, RateLimitError, TransportError, ValidationError +from .resources import Executions, Graphs, Nodes + + +class Subfork: + def __init__(self, api_key: str | None = None, *, base_url: str = 'https://subfork.com', + timeout: float = 30, transport: httpx.BaseTransport | None = None): + key = os.environ.get('SUBFORK_API_KEY') if api_key is None else api_key + if not key or any(char.isspace() for char in key): + raise ValueError('Provide an API key or set SUBFORK_API_KEY; keys cannot contain whitespace.') + if not math.isfinite(timeout) or timeout <= 0: + raise ValueError('timeout must be a positive finite number.') + origin = httpx.URL(base_url) + if not origin.host or origin.userinfo or origin.query or origin.fragment or origin.path not in {'', '/'}: + raise ValueError('base_url must be an origin without credentials, path, query or fragment.') + if origin.scheme != 'https' and not (origin.scheme == 'http' and (origin.host in {'localhost', '127.0.0.1', '::1'} or origin.host.endswith('.localhost'))): + raise ValueError('Use HTTPS; HTTP is allowed only for localhost.') + self.timeout = timeout + self._client = httpx.Client(base_url=str(origin).rstrip('/') + '/api/v1/', timeout=timeout, + headers={'Authorization': 'Bearer ' + key, 'Accept': 'application/json'}, + follow_redirects=False, transport=transport) + self.nodes = Nodes(self) + self.graphs = Graphs(self) + self.executions = Executions(self) + + def _request(self, method: str, path: str, **kwargs: Any) -> Any: + try: + response = self._client.request(method, path.lstrip('/'), **kwargs) + except httpx.TransportError: + raise TransportError('API request could not be completed; inspect remote state before retrying a write.') from None + if not response.is_success: + errors = {401: AuthenticationError, 403: PermissionDeniedError, 404: NotFoundError, + 422: ValidationError, 429: RateLimitError} + # Fixed messages avoid reflecting secrets from an untrusted response. + raise errors.get(response.status_code, APIError)( + 'Subfork API returned HTTP %s.' % response.status_code, status_code=response.status_code, + retry_after=response.headers.get('retry-after')) + if response.status_code == 204: + return None + try: + return response.json() + except ValueError: + raise InvalidResponseError('API returned invalid JSON.') from None + + def close(self) -> None: + self._client.close() + + def __enter__(self) -> Subfork: + return self + + def __exit__(self, *_args: Any) -> None: + self.close() diff --git a/src/subfork/errors.py b/src/subfork/errors.py new file mode 100644 index 0000000..e63fe59 --- /dev/null +++ b/src/subfork/errors.py @@ -0,0 +1,48 @@ +"""Public client errors; credentials and raw responses are never attached.""" + + +class SubforkError(Exception): + """Base class for client errors.""" + + +class TransportError(SubforkError): + """The request could not be completed; a write's outcome may be unknown.""" + + +class APIError(SubforkError): + def __init__(self, message: str, *, status_code: int, retry_after: str | None = None): + super().__init__(message) + self.status_code = status_code + self.retry_after = retry_after + + +class AuthenticationError(APIError): + pass + + +class PermissionDeniedError(APIError): + pass + + +class NotFoundError(APIError): + pass + + +class ValidationError(APIError): + pass + + +class RateLimitError(APIError): + pass + + +class InvalidResponseError(SubforkError): + pass + + +class ExecutionTimeout(SubforkError): + """Polling expired. The remote execution was not cancelled.""" + + def __init__(self, execution_id: str): + super().__init__("Execution polling timed out; the remote execution may still be running.") + self.execution_id = execution_id diff --git a/src/subfork/py.typed b/src/subfork/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/src/subfork/resources.py b/src/subfork/resources.py new file mode 100644 index 0000000..86745f4 --- /dev/null +++ b/src/subfork/resources.py @@ -0,0 +1,95 @@ +"""Small resource wrappers over the existing versioned HTTP API.""" +from __future__ import annotations + +import math +import time +from typing import TYPE_CHECKING, Any +from urllib.parse import quote + +from .errors import ExecutionTimeout + +if TYPE_CHECKING: + from .client import Subfork + + +def segment(value: str) -> str: + if not value or value in {'.', '..'}: + raise ValueError('Resource identifiers must be non-empty and cannot be dot segments.') + return quote(value, safe='') + + +class Resource: + def __init__(self, client: Subfork): + self._client = client + + +class Nodes(Resource): + def list(self, *, include_all_versions: bool = False) -> list[dict[str, Any]]: + return self._client._request('GET', '/nodes', params={'include_all_versions': include_all_versions}) + + def get(self, node_id: str) -> dict[str, Any]: + return self._client._request('GET', '/nodes/' + segment(node_id)) + + +class Graphs(Resource): + def list(self) -> list[dict[str, Any]]: + return self._client._request('GET', '/graphs') + + def get(self, graph_id: str) -> dict[str, Any]: + return self._client._request('GET', '/graphs/' + segment(graph_id)) + + def validate(self, definition: dict[str, Any], *, name: str | None = None) -> dict[str, Any]: + return self._client._request('POST', '/graphs/validate', json={ + 'name': name if name is not None else definition.get('name', 'Untitled Graph'), 'definition': definition}) + + def create(self, *, name: str, definition: dict[str, Any], description: str = '', tags: list[str] | None = None) -> dict[str, Any]: + return self._client._request('POST', '/graphs', json={ + 'name': name, 'description': description, 'definition': definition, 'tags': tags or []}) + + def update(self, graph_id: str, *, name: str, definition: dict[str, Any], description: str = '') -> dict[str, Any]: + return self._client._request('PUT', '/graphs/' + segment(graph_id), json={ + 'name': name, 'description': description, 'definition': definition}) + + def published(self) -> list[dict[str, Any]]: + return self._client._request('GET', '/graphs/published') + + def versions(self, graph_id: str) -> list[dict[str, Any]]: + return self._client._request('GET', '/graphs/' + segment(graph_id) + '/versions') + + def published_version(self, graph_id: str, version: str) -> dict[str, Any]: + return self._client._request('GET', '/graphs/published/' + segment(graph_id) + '/versions/' + segment(version)) + + def interface(self, graph_id: str) -> dict[str, Any]: + return self._client._request('GET', '/graphs/' + segment(graph_id) + '/interface-preview') + + def publish(self, graph_id: str, *, version: str, interface: dict[str, Any] | None = None, comment: str = '') -> dict[str, Any]: + payload: dict[str, Any] = {'version': version, 'comment': comment} + if interface is not None: + payload['interface'] = interface + return self._client._request('POST', '/graphs/' + segment(graph_id) + '/versions', json=payload) + + def execute(self, graph_id: str, *, version: str = 'draft', inputs: dict[str, Any] | None = None) -> dict[str, Any]: + return self._client._request('POST', '/graphs/' + segment(graph_id) + '/execute', + params={'version': version}, json={'inputs': inputs or {}}) + + +class Executions(Resource): + def get(self, execution_id: str) -> dict[str, Any]: + return self._client._request('GET', '/executions/' + segment(execution_id)) + + def cancel(self, execution_id: str) -> dict[str, Any]: + return self._client._request('POST', '/executions/' + segment(execution_id) + '/cancel') + + def wait(self, execution_id: str, *, timeout: float = 120, poll_interval: float = 2) -> dict[str, Any]: + if not math.isfinite(timeout) or timeout <= 0 or not math.isfinite(poll_interval) or poll_interval <= 0: + raise ValueError('timeout and poll_interval must be positive finite numbers.') + deadline = time.monotonic() + timeout + while True: + remaining = deadline - time.monotonic() + if remaining <= 0: + raise ExecutionTimeout(execution_id) + result = self._client._request('GET', '/executions/' + segment(execution_id), + timeout=min(self._client.timeout, remaining)) + if result['status'] in {'completed', 'failed', 'canceled', 'cancelled', 'outcome_unknown'}: + return result + time.sleep(min(poll_interval, max(0, deadline - time.monotonic()))) diff --git a/tests/test_client.py b/tests/test_client.py new file mode 100644 index 0000000..c0f9f07 --- /dev/null +++ b/tests/test_client.py @@ -0,0 +1,103 @@ +import json + +import httpx +import pytest + +from subfork import Subfork, APIError, AuthenticationError, ExecutionTimeout, PermissionDeniedError, RateLimitError, TransportError, ValidationError + +KEY = 'synthetic-test-key' + + +def test_bearer_auth_base_url_and_environment(monkeypatch): + monkeypatch.setenv('SUBFORK_API_KEY', KEY) + seen = [] + def handle(request): + seen.append(request) + return httpx.Response(200, json=[]) + with Subfork(base_url='http://subfork.localhost', transport=httpx.MockTransport(handle)) as client: + assert client.nodes.list(include_all_versions=True) == [] + assert str(seen[0].url) == 'http://subfork.localhost/api/v1/nodes?include_all_versions=true' + assert seen[0].headers['authorization'] == 'Bearer ' + KEY + assert KEY not in str(seen[0].url) + + +@pytest.mark.parametrize('url', ['http://example.com', 'https://user:pass@example.com', + 'https://example.com/api/v1', 'https://example.com?key=x', + 'http://localhost.evil.example', 'https://example.com#fragment']) +def test_reject_unsafe_or_ambiguous_origins(url): + with pytest.raises(ValueError): + Subfork(KEY, base_url=url) + + +def test_credentials_required(monkeypatch): + monkeypatch.delenv('SUBFORK_API_KEY', raising=False) + with pytest.raises(ValueError): Subfork() + + +@pytest.mark.parametrize('status,error', [(401, AuthenticationError), (403, PermissionDeniedError), + (422, ValidationError), (429, RateLimitError), (503, APIError)]) +def test_errors_do_not_echo_response_secrets(status, error): + with Subfork(KEY, transport=httpx.MockTransport(lambda request: httpx.Response(status, json={'detail': KEY}, headers={'Retry-After': '12'}))) as client: + with pytest.raises(error) as caught: client.graphs.list() + assert caught.value.status_code == status + assert caught.value.retry_after == '12' + assert KEY not in str(caught.value) + + +def test_redirects_and_failed_writes_are_not_retried(): + requests = [] + def handle(request): + requests.append(request) + return httpx.Response(307, headers={'Location': 'https://other.example'}) + with Subfork(KEY, transport=httpx.MockTransport(handle)) as client: + with pytest.raises(APIError): client.graphs.create(name='Test', definition={'name': 'Test'}) + assert len(requests) == 1 + + +def test_authoring_requests_match_server_contract(): + seen = [] + def handle(request): + seen.append((request.method, request.url.path, dict(request.url.params), json.loads(request.content) if request.content else None)) + return httpx.Response(200, json={'id': 'g_test'}) + with Subfork(KEY, transport=httpx.MockTransport(handle)) as client: + definition = {'name': 'Demo', 'nodes': [], 'edges': []} + client.graphs.validate(definition) + client.graphs.create(name='Demo', definition=definition) + client.graphs.update('g_test', name='Demo', definition=definition) + client.graphs.publish('g_test', version='v1', interface={'inputs': {}, 'outputs': {}}) + client.graphs.execute('g_test', version='v1', inputs={'value': 3}) + assert [row[:2] for row in seen] == [('POST', '/api/v1/graphs/validate'), ('POST', '/api/v1/graphs'), + ('PUT', '/api/v1/graphs/g_test'), ('POST', '/api/v1/graphs/g_test/versions'), ('POST', '/api/v1/graphs/g_test/execute')] + assert seen[0][3] == {'name': 'Demo', 'definition': definition} + assert seen[-2][3]['interface'] == {'inputs': {}, 'outputs': {}} + assert seen[-1][2:] == ({'version': 'v1'}, {'inputs': {'value': 3}}) + + +def test_transport_failure_is_not_retried(): + seen = [] + def handle(request): + seen.append(request) + raise httpx.ReadTimeout(KEY) + with Subfork(KEY, transport=httpx.MockTransport(handle)) as client: + with pytest.raises(TransportError) as caught: client.graphs.execute('g_test') + assert len(seen) == 1 and KEY not in str(caught.value) + + +@pytest.mark.parametrize('status', ['completed', 'failed', 'canceled', 'outcome_unknown']) +def test_wait_returns_terminal_result(status): + with Subfork(KEY, transport=httpx.MockTransport(lambda request: httpx.Response(200, json={'id': 'e_test', 'status': status}))) as client: + assert client.executions.wait('e_test')['status'] == status + + +def test_wait_timeout_does_not_cancel(monkeypatch): + from subfork import resources + ticks = iter([0, 0, 1, 2]) + monkeypatch.setattr(resources.time, 'monotonic', lambda: next(ticks)) + monkeypatch.setattr(resources.time, 'sleep', lambda seconds: None) + seen = [] + def handle(request): + seen.append(request) + return httpx.Response(200, json={'status': 'running'}) + with Subfork(KEY, transport=httpx.MockTransport(handle)) as client: + with pytest.raises(ExecutionTimeout): client.executions.wait('e_test', timeout=1) + assert len(seen) == 1 and seen[0].method == 'GET' From 00bdbec5769cd6df2fa074291d97a2e022f67b7d Mon Sep 17 00:00:00 2001 From: Ryan Galloway Date: Mon, 28 Sep 2026 21:21:28 -0700 Subject: [PATCH 02/14] Add BSD-3-Clause license and clarify modern editable installs --- .github/workflows/tests.yml | 1 + .gitignore | 2 +- LICENSE | 29 +++++++++++++++++++++++++++++ README.md | 27 ++++++++++++++++++++++----- pyproject.toml | 2 ++ 5 files changed, 55 insertions(+), 6 deletions(-) create mode 100644 LICENSE diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index f849f81..5977410 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -13,6 +13,7 @@ jobs: - uses: actions/setup-python@v5 with: python-version: ${{ matrix.python }} + - run: python -m pip install --upgrade pip - run: python -m pip install '.[dev]' - run: python -m pytest - run: python -m build diff --git a/.gitignore b/.gitignore index fe604a5..f38abdf 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,7 @@ __pycache__/ *.py[cod] .pytest_cache/ -.venv/ +.venv*/ .env .env.* build/ diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..5520dd3 --- /dev/null +++ b/LICENSE @@ -0,0 +1,29 @@ +BSD 3-Clause License + +Copyright (c) 2026, Ryan Galloway +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/README.md b/README.md index e7f8c62..434eab3 100644 --- a/README.md +++ b/README.md @@ -6,19 +6,36 @@ BYO workers belong in the separate worker package, not this client. ## Development install -Requires Python 3.10+. +Requires Python 3.10+ and a modern pip (21.3+ for editable installs). +Use a supported interpreter explicitly; the system `python3` may be older. ```bash -python -m venv .venv +python3.12 -m venv .venv source .venv/bin/activate -pip install -e '.[dev]' +python -m pip install --upgrade pip +python -m pip install -e '.[dev]' pytest python -m build python -m twine check dist/* ``` -A package license must be selected before the first public release. CI builds and -checks distributions but does not publish them. +If pip reports that editable mode requires `setup.py`, check `python --version` +and `python -m pip --version`. Python 3.8 is unsupported. Create a new environment +with Python 3.10+ and upgrade pip there; upgrading pip alone cannot change its +Python interpreter. A `setup.py` compatibility shim is not needed. + +With [uv](https://docs.astral.sh/uv/), a supported Python can also be provisioned +without changing the system Python. Preserve an existing environment by using a +new directory: + +```bash +uv venv --python 3.12 .venv312 +source .venv312/bin/activate +uv pip install -e '.[dev]' +``` + +Licensed under [BSD-3-Clause](LICENSE). CI builds and checks distributions but does +not publish them. ## Usage diff --git a/pyproject.toml b/pyproject.toml index 6cd4620..cac671e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,6 +7,8 @@ name = "subfork" version = "0.1.0a1" description = "Python API client for Subfork graph authoring and execution" readme = "README.md" +license = "BSD-3-Clause" +license-files = ["LICENSE"] requires-python = ">=3.10" dependencies = ["httpx>=0.28,<1"] classifiers = [ From 3a77919f5fb2a2e1dccf601df6ba2fa3377ad784 Mon Sep 17 00:00:00 2001 From: Ryan Galloway Date: Tue, 29 Sep 2026 04:59:21 -0700 Subject: [PATCH 03/14] Support Python 3.8 and compatible editable packaging --- .github/workflows/tests.yml | 2 +- README.md | 11 ++++++----- pyproject.toml | 10 ++++++---- src/subfork/client.py | 6 +++--- src/subfork/errors.py | 3 ++- src/subfork/resources.py | 36 ++++++++++++++++++------------------ 6 files changed, 36 insertions(+), 32 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 5977410..ea9b5e6 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -7,7 +7,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python: ['3.10', '3.12', '3.13'] + python: ['3.8', '3.10', '3.12', '3.13'] steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 diff --git a/README.md b/README.md index 434eab3..5299454 100644 --- a/README.md +++ b/README.md @@ -6,11 +6,11 @@ BYO workers belong in the separate worker package, not this client. ## Development install -Requires Python 3.10+ and a modern pip (21.3+ for editable installs). +Requires Python 3.8+ and a modern pip (21.3+ for editable installs). Use a supported interpreter explicitly; the system `python3` may be older. ```bash -python3.12 -m venv .venv +python3 -m venv .venv source .venv/bin/activate python -m pip install --upgrade pip python -m pip install -e '.[dev]' @@ -20,9 +20,10 @@ python -m twine check dist/* ``` If pip reports that editable mode requires `setup.py`, check `python --version` -and `python -m pip --version`. Python 3.8 is unsupported. Create a new environment -with Python 3.10+ and upgrade pip there; upgrading pip alone cannot change its -Python interpreter. A `setup.py` compatibility shim is not needed. +and `python -m pip --version`. Upgrade pip inside the active environment: +`python -m pip install --upgrade pip`. Python 3.8 is supported; pip will select +the latest pip and dependencies compatible with that interpreter. A `setup.py` +compatibility shim is not needed. With [uv](https://docs.astral.sh/uv/), a supported Python can also be provisioned without changing the system Python. Preserve an existing environment by using a diff --git a/pyproject.toml b/pyproject.toml index cac671e..11739b6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,5 +1,5 @@ [build-system] -requires = ["setuptools>=77", "wheel"] +requires = ["setuptools>=61", "wheel"] build-backend = "setuptools.build_meta" [project] @@ -7,9 +7,8 @@ name = "subfork" version = "0.1.0a1" description = "Python API client for Subfork graph authoring and execution" readme = "README.md" -license = "BSD-3-Clause" -license-files = ["LICENSE"] -requires-python = ">=3.10" +license = {file = "LICENSE"} +requires-python = ">=3.8" dependencies = ["httpx>=0.28,<1"] classifiers = [ "Development Status :: 3 - Alpha", @@ -21,6 +20,9 @@ classifiers = [ [project.optional-dependencies] dev = ["pytest>=8,<10", "build>=1,<2", "twine>=6,<7"] +[tool.setuptools] +license-files = ["LICENSE"] + [tool.setuptools.packages.find] where = ["src"] diff --git a/src/subfork/client.py b/src/subfork/client.py index d5f0511..0a07821 100644 --- a/src/subfork/client.py +++ b/src/subfork/client.py @@ -3,7 +3,7 @@ import math import os -from typing import Any +from typing import Any, Optional import httpx @@ -12,8 +12,8 @@ class Subfork: - def __init__(self, api_key: str | None = None, *, base_url: str = 'https://subfork.com', - timeout: float = 30, transport: httpx.BaseTransport | None = None): + def __init__(self, api_key: Optional[str] = None, *, base_url: str = 'https://subfork.com', + timeout: float = 30, transport: Optional[httpx.BaseTransport] = None): key = os.environ.get('SUBFORK_API_KEY') if api_key is None else api_key if not key or any(char.isspace() for char in key): raise ValueError('Provide an API key or set SUBFORK_API_KEY; keys cannot contain whitespace.') diff --git a/src/subfork/errors.py b/src/subfork/errors.py index e63fe59..d910556 100644 --- a/src/subfork/errors.py +++ b/src/subfork/errors.py @@ -1,4 +1,5 @@ """Public client errors; credentials and raw responses are never attached.""" +from typing import Optional class SubforkError(Exception): @@ -10,7 +11,7 @@ class TransportError(SubforkError): class APIError(SubforkError): - def __init__(self, message: str, *, status_code: int, retry_after: str | None = None): + def __init__(self, message: str, *, status_code: int, retry_after: Optional[str] = None): super().__init__(message) self.status_code = status_code self.retry_after = retry_after diff --git a/src/subfork/resources.py b/src/subfork/resources.py index 86745f4..7465f32 100644 --- a/src/subfork/resources.py +++ b/src/subfork/resources.py @@ -3,7 +3,7 @@ import math import time -from typing import TYPE_CHECKING, Any +from typing import TYPE_CHECKING, Any, Dict, List, Optional from urllib.parse import quote from .errors import ExecutionTimeout @@ -24,63 +24,63 @@ def __init__(self, client: Subfork): class Nodes(Resource): - def list(self, *, include_all_versions: bool = False) -> list[dict[str, Any]]: + def list(self, *, include_all_versions: bool = False) -> List[Dict[str, Any]]: return self._client._request('GET', '/nodes', params={'include_all_versions': include_all_versions}) - def get(self, node_id: str) -> dict[str, Any]: + def get(self, node_id: str) -> Dict[str, Any]: return self._client._request('GET', '/nodes/' + segment(node_id)) class Graphs(Resource): - def list(self) -> list[dict[str, Any]]: + def list(self) -> List[Dict[str, Any]]: return self._client._request('GET', '/graphs') - def get(self, graph_id: str) -> dict[str, Any]: + def get(self, graph_id: str) -> Dict[str, Any]: return self._client._request('GET', '/graphs/' + segment(graph_id)) - def validate(self, definition: dict[str, Any], *, name: str | None = None) -> dict[str, Any]: + def validate(self, definition: Dict[str, Any], *, name: Optional[str] = None) -> Dict[str, Any]: return self._client._request('POST', '/graphs/validate', json={ 'name': name if name is not None else definition.get('name', 'Untitled Graph'), 'definition': definition}) - def create(self, *, name: str, definition: dict[str, Any], description: str = '', tags: list[str] | None = None) -> dict[str, Any]: + def create(self, *, name: str, definition: Dict[str, Any], description: str = '', tags: Optional[List[str]] = None) -> Dict[str, Any]: return self._client._request('POST', '/graphs', json={ 'name': name, 'description': description, 'definition': definition, 'tags': tags or []}) - def update(self, graph_id: str, *, name: str, definition: dict[str, Any], description: str = '') -> dict[str, Any]: + def update(self, graph_id: str, *, name: str, definition: Dict[str, Any], description: str = '') -> Dict[str, Any]: return self._client._request('PUT', '/graphs/' + segment(graph_id), json={ 'name': name, 'description': description, 'definition': definition}) - def published(self) -> list[dict[str, Any]]: + def published(self) -> List[Dict[str, Any]]: return self._client._request('GET', '/graphs/published') - def versions(self, graph_id: str) -> list[dict[str, Any]]: + def versions(self, graph_id: str) -> List[Dict[str, Any]]: return self._client._request('GET', '/graphs/' + segment(graph_id) + '/versions') - def published_version(self, graph_id: str, version: str) -> dict[str, Any]: + def published_version(self, graph_id: str, version: str) -> Dict[str, Any]: return self._client._request('GET', '/graphs/published/' + segment(graph_id) + '/versions/' + segment(version)) - def interface(self, graph_id: str) -> dict[str, Any]: + def interface(self, graph_id: str) -> Dict[str, Any]: return self._client._request('GET', '/graphs/' + segment(graph_id) + '/interface-preview') - def publish(self, graph_id: str, *, version: str, interface: dict[str, Any] | None = None, comment: str = '') -> dict[str, Any]: - payload: dict[str, Any] = {'version': version, 'comment': comment} + def publish(self, graph_id: str, *, version: str, interface: Optional[Dict[str, Any]] = None, comment: str = '') -> Dict[str, Any]: + payload: Dict[str, Any] = {'version': version, 'comment': comment} if interface is not None: payload['interface'] = interface return self._client._request('POST', '/graphs/' + segment(graph_id) + '/versions', json=payload) - def execute(self, graph_id: str, *, version: str = 'draft', inputs: dict[str, Any] | None = None) -> dict[str, Any]: + def execute(self, graph_id: str, *, version: str = 'draft', inputs: Optional[Dict[str, Any]] = None) -> Dict[str, Any]: return self._client._request('POST', '/graphs/' + segment(graph_id) + '/execute', params={'version': version}, json={'inputs': inputs or {}}) class Executions(Resource): - def get(self, execution_id: str) -> dict[str, Any]: + def get(self, execution_id: str) -> Dict[str, Any]: return self._client._request('GET', '/executions/' + segment(execution_id)) - def cancel(self, execution_id: str) -> dict[str, Any]: + def cancel(self, execution_id: str) -> Dict[str, Any]: return self._client._request('POST', '/executions/' + segment(execution_id) + '/cancel') - def wait(self, execution_id: str, *, timeout: float = 120, poll_interval: float = 2) -> dict[str, Any]: + def wait(self, execution_id: str, *, timeout: float = 120, poll_interval: float = 2) -> Dict[str, Any]: if not math.isfinite(timeout) or timeout <= 0 or not math.isfinite(poll_interval) or poll_interval <= 0: raise ValueError('timeout and poll_interval must be positive finite numbers.') deadline = time.monotonic() + timeout From 6f27355226c8728e09713a4cb017f88bfb897806 Mon Sep 17 00:00:00 2001 From: Ryan Galloway Date: Tue, 29 Sep 2026 05:10:56 -0700 Subject: [PATCH 04/14] Add client documentation, typing, and code quality tooling --- .editorconfig | 15 +++ .flake8 | 7 ++ .gitattributes | 3 + .github/workflows/lint.yml | 18 ++++ .github/workflows/tests.yml | 2 +- .gitignore | 50 ++++++++- Makefile | 23 ++++ README.md | 28 +++++ pyproject.toml | 38 ++++++- src/subfork/__init__.py | 32 +++++- src/subfork/client.py | 121 +++++++++++++++++---- src/subfork/errors.py | 23 +++- src/subfork/resources.py | 204 +++++++++++++++++++++++++++++------- tests/test_client.py | 198 ++++++++++++++++++++++++---------- 14 files changed, 630 insertions(+), 132 deletions(-) create mode 100644 .editorconfig create mode 100644 .flake8 create mode 100644 .gitattributes create mode 100644 .github/workflows/lint.yml create mode 100644 Makefile diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..61312b9 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,15 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true +indent_style = space +indent_size = 4 + +[*.{yml,yaml,toml}] +indent_size = 2 + +[Makefile] +indent_style = tab diff --git a/.flake8 b/.flake8 new file mode 100644 index 0000000..f210cfd --- /dev/null +++ b/.flake8 @@ -0,0 +1,7 @@ +[flake8] +max-line-length = 100 +max-complexity = 35 +exclude = .git,__pycache__,.venv*,venv,build,dist,*.egg-info +extend-ignore = E203,E501,W503 +# Enforce documentation for modules, classes, functions, methods, and constructors. +docstring-convention = google diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..e3e4309 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,3 @@ +# Normalize text to LF in the repository and on checkout, on every platform. +# Git detects binary files and leaves their contents unchanged. +* text=auto eol=lf diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 0000000..e9f0d3d --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,18 @@ +name: Lint and type check + +on: [push, pull_request] + +permissions: + contents: read + +jobs: + lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: '3.12' + - run: python -m pip install --upgrade pip + - run: python -m pip install -e '.[dev]' + - run: make lint typecheck diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index ea9b5e6..7b17a63 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -7,7 +7,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python: ['3.8', '3.10', '3.12', '3.13'] + python: ['3.8', '3.10', '3.12', '3.13', '3.14'] steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 diff --git a/.gitignore b/.gitignore index f38abdf..f16f15a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,51 @@ +# Python bytecode and compiled extensions __pycache__/ *.py[cod] -.pytest_cache/ -.venv*/ -.env -.env.* +*$py.class +*.so + +# Packaging and build output build/ dist/ +.eggs/ *.egg-info/ +*.egg +MANIFEST + +# Virtual environments and local credentials +.venv*/ +venv*/ +.env +.env.* +!.env.example +!.env.*.example + +# Test, coverage, type-checker, and linter caches +.pytest_cache/ +.mypy_cache/ +.ruff_cache/ +.tox/ +.nox/ +.coverage +.coverage.* +htmlcov/ +coverage.xml +junit.xml +.hypothesis/ + +# Local scratch data and notebook checkpoints +/tmp/ +/logs/ +.ipynb_checkpoints/ + +# Editor, OS, and agent-local settings +.vscode/ +.idea/ +*.swp +*.swo +*~ +.DS_Store +Thumbs.db +Desktop.ini +.codex/ +.agents/ diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..f488839 --- /dev/null +++ b/Makefile @@ -0,0 +1,23 @@ +PYTHON ?= python + +.PHONY: format lint typecheck test check build +format: + $(PYTHON) -m isort src tests + $(PYTHON) -m black src tests + +lint: + $(PYTHON) -m black --check src tests + $(PYTHON) -m isort --check-only src tests + $(PYTHON) -m flake8 src tests + +typecheck: + $(PYTHON) -m mypy + +test: + $(PYTHON) -m pytest + +check: lint typecheck test + +build: + $(PYTHON) -m build + $(PYTHON) -m twine check dist/* diff --git a/README.md b/README.md index 5299454..b290d4b 100644 --- a/README.md +++ b/README.md @@ -116,3 +116,31 @@ phase, not a strict wall-clock deadline for the entire network exchange. The first scaffold is synchronous. Async support, rich response models, artifact streaming, idempotent write retries and worker support are not included. Mock HTTP tests do not certify any particular server deployment. + +## Code quality + +Install `.[dev]` to get the pinned development tools. Black 24.8.0, isort 5.13.2, +and Flake8 7.1.1 follow the conventions used in the sibling envstack and pyseq +projects: 100-column formatting, isort's Black profile, and a Python 3.8 target. +The tool versions also support running locally under Python 3.8. + +```bash +make format # Sort imports and apply Black to src/ and tests/ +make lint # Check formatting, imports, Flake8 and Google-style docstrings +make typecheck # Check annotated library code with mypy +make test # Run the HTTP contract tests +make check # Run lint, type checking and tests +make build # Build distributions and check their metadata +``` + +Activate your environment first, or specify it explicitly, for example: +`make check PYTHON=.venv/bin/python`. The CI lint job uses the same commands. +EditorConfig defines whitespace and newline conventions for supporting editors. + +Add annotations and docstrings to new functions, methods and classes, including +constructors and test helpers. Public docstrings should explain side effects, +permissions, return values and failure behavior where useful. JSON dictionaries +retain `Any` values because node parameters and server response fields are dynamic; +this release does not pretend to provide complete generated response models. +Mypy checks library signatures and bodies; Flake8 and formatting cover both the +library and tests. Runtime tests continue to cover Python 3.8 in CI. diff --git a/pyproject.toml b/pyproject.toml index 11739b6..2da8cb4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -18,7 +18,17 @@ classifiers = [ ] [project.optional-dependencies] -dev = ["pytest>=8,<10", "build>=1,<2", "twine>=6,<7"] +dev = [ + "pytest>=8,<10", + "build>=1,<2", + "twine>=6,<7", + "flake8==7.1.1", + "flake8-docstrings==1.7.0", + "mccabe==0.7.0", + "isort==5.13.2", + "black==24.8.0", + "mypy==1.14.1", +] [tool.setuptools] license-files = ["LICENSE"] @@ -31,3 +41,29 @@ subfork = ["py.typed"] [tool.pytest.ini_options] testpaths = ["tests"] + +[tool.isort] +profile = "black" +line_length = 100 +skip_gitignore = true + +[tool.black] +line-length = 100 +target-version = ["py38"] +extend-exclude = '/\.venv[^/]*/' + +[tool.mypy] +python_version = "3.8" +files = ["src/subfork"] +disallow_untyped_defs = true +check_untyped_defs = true +no_implicit_optional = true +warn_unused_ignores = true +warn_redundant_casts = true +show_error_codes = true + +# Newer environments install CLI/async dependency internals with newer syntax. +# Skip those internals while retaining HTTPX's client types and our 3.8 target. +[[tool.mypy.overrides]] +module = ["httpx._main", "anyio", "anyio.*"] +follow_imports = "skip" diff --git a/src/subfork/__init__.py b/src/subfork/__init__.py index f3b0f04..6c44599 100644 --- a/src/subfork/__init__.py +++ b/src/subfork/__init__.py @@ -1,8 +1,30 @@ """Subfork's Python API client. BYO worker support is a separate distribution.""" + from .client import Subfork -from .errors import APIError, AuthenticationError, ExecutionTimeout, InvalidResponseError, NotFoundError, PermissionDeniedError, RateLimitError, SubforkError, TransportError, ValidationError +from .errors import ( + APIError, + AuthenticationError, + ExecutionTimeout, + InvalidResponseError, + NotFoundError, + PermissionDeniedError, + RateLimitError, + SubforkError, + TransportError, + ValidationError, +) -__version__ = '0.1.0a1' -__all__ = ['Subfork', 'SubforkError', 'APIError', 'AuthenticationError', 'PermissionDeniedError', - 'NotFoundError', 'ValidationError', 'RateLimitError', 'TransportError', - 'InvalidResponseError', 'ExecutionTimeout'] +__version__ = "0.1.0a1" +__all__ = [ + "Subfork", + "SubforkError", + "APIError", + "AuthenticationError", + "PermissionDeniedError", + "NotFoundError", + "ValidationError", + "RateLimitError", + "TransportError", + "InvalidResponseError", + "ExecutionTimeout", +] diff --git a/src/subfork/client.py b/src/subfork/client.py index 0a07821..51704a7 100644 --- a/src/subfork/client.py +++ b/src/subfork/client.py @@ -1,61 +1,138 @@ """Synchronous, explicitly closed HTTP client. No automatic write retries.""" + from __future__ import annotations import math import os -from typing import Any, Optional +from types import TracebackType +from typing import Any, Optional, Type import httpx -from .errors import APIError, AuthenticationError, InvalidResponseError, NotFoundError, PermissionDeniedError, RateLimitError, TransportError, ValidationError +from .errors import ( + APIError, + AuthenticationError, + InvalidResponseError, + NotFoundError, + PermissionDeniedError, + RateLimitError, + TransportError, + ValidationError, +) from .resources import Executions, Graphs, Nodes class Subfork: - def __init__(self, api_key: Optional[str] = None, *, base_url: str = 'https://subfork.com', - timeout: float = 30, transport: Optional[httpx.BaseTransport] = None): - key = os.environ.get('SUBFORK_API_KEY') if api_key is None else api_key + """Manage authenticated HTTP requests and graph resources. + + The client owns its connection pool. Use a context manager or close() to + release it. Writes are never automatically retried. + """ + + def __init__( + self, + api_key: Optional[str] = None, + *, + base_url: str = "https://subfork.com", + timeout: float = 30, + transport: Optional[httpx.BaseTransport] = None, + ) -> None: + """Create a client for an HTTPS origin or a local development server. + + Args: + api_key: Bearer secret, or None to read SUBFORK_API_KEY. + base_url: Origin without an API path, query, or credentials. + timeout: Positive per-I/O-phase HTTP timeout in seconds. + transport: Optional HTTPX transport, primarily for testing. + + Raises: + ValueError: Credentials, origin, or timeout are invalid. + """ + key = os.environ.get("SUBFORK_API_KEY") if api_key is None else api_key if not key or any(char.isspace() for char in key): - raise ValueError('Provide an API key or set SUBFORK_API_KEY; keys cannot contain whitespace.') + raise ValueError( + "Provide an API key or set SUBFORK_API_KEY; keys cannot contain whitespace." + ) if not math.isfinite(timeout) or timeout <= 0: - raise ValueError('timeout must be a positive finite number.') + raise ValueError("timeout must be a positive finite number.") origin = httpx.URL(base_url) - if not origin.host or origin.userinfo or origin.query or origin.fragment or origin.path not in {'', '/'}: - raise ValueError('base_url must be an origin without credentials, path, query or fragment.') - if origin.scheme != 'https' and not (origin.scheme == 'http' and (origin.host in {'localhost', '127.0.0.1', '::1'} or origin.host.endswith('.localhost'))): - raise ValueError('Use HTTPS; HTTP is allowed only for localhost.') + if ( + not origin.host + or origin.userinfo + or origin.query + or origin.fragment + or origin.path not in {"", "/"} + ): + raise ValueError( + "base_url must be an origin without credentials, path, query or fragment." + ) + if origin.scheme != "https" and not ( + origin.scheme == "http" + and ( + origin.host in {"localhost", "127.0.0.1", "::1"} + or origin.host.endswith(".localhost") + ) + ): + raise ValueError("Use HTTPS; HTTP is allowed only for localhost.") self.timeout = timeout - self._client = httpx.Client(base_url=str(origin).rstrip('/') + '/api/v1/', timeout=timeout, - headers={'Authorization': 'Bearer ' + key, 'Accept': 'application/json'}, - follow_redirects=False, transport=transport) + self._client = httpx.Client( + base_url=str(origin).rstrip("/") + "/api/v1/", + timeout=timeout, + headers={"Authorization": "Bearer " + key, "Accept": "application/json"}, + follow_redirects=False, + transport=transport, + ) self.nodes = Nodes(self) self.graphs = Graphs(self) self.executions = Executions(self) def _request(self, method: str, path: str, **kwargs: Any) -> Any: + """Send one request and decode JSON, returning None for HTTP 204. + + Raise APIError subclasses for HTTP failures, TransportError for network + failures, and InvalidResponseError for invalid JSON. Error messages + never include response bodies or credentials. + """ try: - response = self._client.request(method, path.lstrip('/'), **kwargs) + response = self._client.request(method, path.lstrip("/"), **kwargs) except httpx.TransportError: - raise TransportError('API request could not be completed; inspect remote state before retrying a write.') from None + raise TransportError( + "API request could not be completed; inspect remote state before retrying a write." + ) from None if not response.is_success: - errors = {401: AuthenticationError, 403: PermissionDeniedError, 404: NotFoundError, - 422: ValidationError, 429: RateLimitError} + errors = { + 401: AuthenticationError, + 403: PermissionDeniedError, + 404: NotFoundError, + 422: ValidationError, + 429: RateLimitError, + } # Fixed messages avoid reflecting secrets from an untrusted response. raise errors.get(response.status_code, APIError)( - 'Subfork API returned HTTP %s.' % response.status_code, status_code=response.status_code, - retry_after=response.headers.get('retry-after')) + "Subfork API returned HTTP %s." % response.status_code, + status_code=response.status_code, + retry_after=response.headers.get("retry-after"), + ) if response.status_code == 204: return None try: return response.json() except ValueError: - raise InvalidResponseError('API returned invalid JSON.') from None + raise InvalidResponseError("API returned invalid JSON.") from None def close(self) -> None: + """Release the HTTP connection pool.""" self._client.close() def __enter__(self) -> Subfork: + """Return this client for use in a with statement.""" return self - def __exit__(self, *_args: Any) -> None: + def __exit__( + self, + exc_type: Optional[Type[BaseException]], + exc_value: Optional[BaseException], + traceback: Optional[TracebackType], + ) -> None: + """Close the client without suppressing exceptions.""" self.close() diff --git a/src/subfork/errors.py b/src/subfork/errors.py index d910556..c446f15 100644 --- a/src/subfork/errors.py +++ b/src/subfork/errors.py @@ -1,4 +1,5 @@ """Public client errors; credentials and raw responses are never attached.""" + from typing import Optional @@ -11,39 +12,57 @@ class TransportError(SubforkError): class APIError(SubforkError): - def __init__(self, message: str, *, status_code: int, retry_after: Optional[str] = None): + """Represent an HTTP failure without retaining a raw request or response.""" + + def __init__( + self, message: str, *, status_code: int, retry_after: Optional[str] = None + ) -> None: + """Store a safe message, HTTP status, and optional Retry-After header.""" super().__init__(message) self.status_code = status_code self.retry_after = retry_after class AuthenticationError(APIError): + """Report HTTP 401 for missing, expired, or invalid credentials.""" + pass class PermissionDeniedError(APIError): + """Report HTTP 403 when the credential cannot perform an operation.""" + pass class NotFoundError(APIError): + """Report HTTP 404 for a missing or inaccessible resource.""" + pass class ValidationError(APIError): + """Report HTTP 422 when server request validation fails.""" + pass class RateLimitError(APIError): + """Report HTTP 429, with an optional Retry-After header.""" + pass class InvalidResponseError(SubforkError): + """Report a successful HTTP response containing invalid JSON.""" + pass class ExecutionTimeout(SubforkError): """Polling expired. The remote execution was not cancelled.""" - def __init__(self, execution_id: str): + def __init__(self, execution_id: str) -> None: + """Identify the execution whose polling deadline expired.""" super().__init__("Execution polling timed out; the remote execution may still be running.") self.execution_id = execution_id diff --git a/src/subfork/resources.py b/src/subfork/resources.py index 7465f32..660246b 100644 --- a/src/subfork/resources.py +++ b/src/subfork/resources.py @@ -1,4 +1,5 @@ """Small resource wrappers over the existing versioned HTTP API.""" + from __future__ import annotations import math @@ -13,83 +14,206 @@ def segment(value: str) -> str: - if not value or value in {'.', '..'}: - raise ValueError('Resource identifiers must be non-empty and cannot be dot segments.') - return quote(value, safe='') + """Encode an identifier as a path segment, rejecting empty or dot segments.""" + if not value or value in {".", ".."}: + raise ValueError("Resource identifiers must be non-empty and cannot be dot segments.") + return quote(value, safe="") class Resource: - def __init__(self, client: Subfork): + """Share a client connection with a resource-specific wrapper.""" + + def __init__(self, client: Subfork) -> None: + """Bind this wrapper to its owning client.""" self._client = client class Nodes(Resource): + """Discover available node implementations and manifests.""" + def list(self, *, include_all_versions: bool = False) -> List[Dict[str, Any]]: - return self._client._request('GET', '/nodes', params={'include_all_versions': include_all_versions}) + """Return node manifests, optionally including older published versions.""" + return self._client._request( + "GET", "/nodes", params={"include_all_versions": include_all_versions} + ) def get(self, node_id: str) -> Dict[str, Any]: - return self._client._request('GET', '/nodes/' + segment(node_id)) + """Return the current public manifest for a node ID.""" + return self._client._request("GET", "/nodes/" + segment(node_id)) class Graphs(Resource): + """Author drafts and discover or publish reusable graph versions.""" + def list(self) -> List[Dict[str, Any]]: - return self._client._request('GET', '/graphs') + """Return the account graph listing.""" + return self._client._request("GET", "/graphs") def get(self, graph_id: str) -> Dict[str, Any]: - return self._client._request('GET', '/graphs/' + segment(graph_id)) + """Return an accessible graph by ID.""" + return self._client._request("GET", "/graphs/" + segment(graph_id)) def validate(self, definition: Dict[str, Any], *, name: Optional[str] = None) -> Dict[str, Any]: - return self._client._request('POST', '/graphs/validate', json={ - 'name': name if name is not None else definition.get('name', 'Untitled Graph'), 'definition': definition}) - - def create(self, *, name: str, definition: Dict[str, Any], description: str = '', tags: Optional[List[str]] = None) -> Dict[str, Any]: - return self._client._request('POST', '/graphs', json={ - 'name': name, 'description': description, 'definition': definition, 'tags': tags or []}) - - def update(self, graph_id: str, *, name: str, definition: Dict[str, Any], description: str = '') -> Dict[str, Any]: - return self._client._request('PUT', '/graphs/' + segment(graph_id), json={ - 'name': name, 'description': description, 'definition': definition}) + """Validate a candidate without saving it or executing nodes. + + An omitted name defaults to the definition name or Untitled Graph. + Validation does not guarantee that runtime execution will succeed. + """ + return self._client._request( + "POST", + "/graphs/validate", + json={ + "name": name if name is not None else definition.get("name", "Untitled Graph"), + "definition": definition, + }, + ) + + def create( + self, + *, + name: str, + definition: Dict[str, Any], + description: str = "", + tags: Optional[List[str]] = None, + ) -> Dict[str, Any]: + """Create a public draft and return its server representation. + + Requires graphs:write. Inspect remote state before retrying a request + with an uncertain outcome to avoid creating duplicate graphs. + """ + return self._client._request( + "POST", + "/graphs", + json={ + "name": name, + "description": description, + "definition": definition, + "tags": tags or [], + }, + ) + + def update( + self, graph_id: str, *, name: str, definition: Dict[str, Any], description: str = "" + ) -> Dict[str, Any]: + """Replace the submitted draft fields of an owned graph. + + Requires graphs:write. Pass description to preserve its value; the + default empty string clears it. + """ + return self._client._request( + "PUT", + "/graphs/" + segment(graph_id), + json={"name": name, "description": description, "definition": definition}, + ) def published(self) -> List[Dict[str, Any]]: - return self._client._request('GET', '/graphs/published') + """Return the published reusable graph catalog.""" + return self._client._request("GET", "/graphs/published") def versions(self, graph_id: str) -> List[Dict[str, Any]]: - return self._client._request('GET', '/graphs/' + segment(graph_id) + '/versions') + """Return stored versions of an owned graph.""" + return self._client._request("GET", "/graphs/" + segment(graph_id) + "/versions") def published_version(self, graph_id: str, version: str) -> Dict[str, Any]: - return self._client._request('GET', '/graphs/published/' + segment(graph_id) + '/versions/' + segment(version)) + """Return a published definition, interface, and composite node manifest.""" + return self._client._request( + "GET", "/graphs/published/" + segment(graph_id) + "/versions/" + segment(version) + ) def interface(self, graph_id: str) -> Dict[str, Any]: - return self._client._request('GET', '/graphs/' + segment(graph_id) + '/interface-preview') - - def publish(self, graph_id: str, *, version: str, interface: Optional[Dict[str, Any]] = None, comment: str = '') -> Dict[str, Any]: - payload: Dict[str, Any] = {'version': version, 'comment': comment} + """Preview the server-inferred interface of an owned graph draft.""" + return self._client._request("GET", "/graphs/" + segment(graph_id) + "/interface-preview") + + def publish( + self, + graph_id: str, + *, + version: str, + interface: Optional[Dict[str, Any]] = None, + comment: str = "", + ) -> Dict[str, Any]: + """Publish an immutable version of an owned graph. + + Requires graphs:publish. The server infers the interface if omitted. + This creates public content and is not automatically retried. + """ + payload: Dict[str, Any] = {"version": version, "comment": comment} if interface is not None: - payload['interface'] = interface - return self._client._request('POST', '/graphs/' + segment(graph_id) + '/versions', json=payload) - - def execute(self, graph_id: str, *, version: str = 'draft', inputs: Optional[Dict[str, Any]] = None) -> Dict[str, Any]: - return self._client._request('POST', '/graphs/' + segment(graph_id) + '/execute', - params={'version': version}, json={'inputs': inputs or {}}) + payload["interface"] = interface + return self._client._request( + "POST", "/graphs/" + segment(graph_id) + "/versions", json=payload + ) + + def execute( + self, graph_id: str, *, version: str = "draft", inputs: Optional[Dict[str, Any]] = None + ) -> Dict[str, Any]: + """Submit an owned graph and return its initial execution state. + + Requires graphs:run and consumes account quota. Select draft, published, + or an explicit version, and pass graph inputs as a dictionary. This + method does not wait for completion or retry failed submissions. + """ + return self._client._request( + "POST", + "/graphs/" + segment(graph_id) + "/execute", + params={"version": version}, + json={"inputs": inputs or {}}, + ) class Executions(Resource): + """Inspect, cancel, and poll account-owned executions.""" + def get(self, execution_id: str) -> Dict[str, Any]: - return self._client._request('GET', '/executions/' + segment(execution_id)) + """Return an owned execution snapshot, including status and outputs.""" + return self._client._request("GET", "/executions/" + segment(execution_id)) def cancel(self, execution_id: str) -> Dict[str, Any]: - return self._client._request('POST', '/executions/' + segment(execution_id) + '/cancel') - - def wait(self, execution_id: str, *, timeout: float = 120, poll_interval: float = 2) -> Dict[str, Any]: - if not math.isfinite(timeout) or timeout <= 0 or not math.isfinite(poll_interval) or poll_interval <= 0: - raise ValueError('timeout and poll_interval must be positive finite numbers.') + """Request cancellation and return the execution snapshot.""" + return self._client._request("POST", "/executions/" + segment(execution_id) + "/cancel") + + def wait( + self, execution_id: str, *, timeout: float = 120, poll_interval: float = 2 + ) -> Dict[str, Any]: + """Poll until a terminal status or the polling deadline. + + Args: + execution_id: Identifier of the execution to observe. + timeout: Positive deadline in seconds. Remaining time caps HTTP + timeouts, which apply per I/O phase, not to the entire request. + poll_interval: Positive delay in seconds between status requests. + + Returns: + The terminal snapshot, including failed or canceled executions. + + Raises: + ValueError: A timing argument is nonpositive or nonfinite. + ExecutionTimeout: Polling expired; the remote run is not canceled. + SubforkError: A status request failed; it is not retried. + """ + if ( + not math.isfinite(timeout) + or timeout <= 0 + or not math.isfinite(poll_interval) + or poll_interval <= 0 + ): + raise ValueError("timeout and poll_interval must be positive finite numbers.") deadline = time.monotonic() + timeout while True: remaining = deadline - time.monotonic() if remaining <= 0: raise ExecutionTimeout(execution_id) - result = self._client._request('GET', '/executions/' + segment(execution_id), - timeout=min(self._client.timeout, remaining)) - if result['status'] in {'completed', 'failed', 'canceled', 'cancelled', 'outcome_unknown'}: + result = self._client._request( + "GET", + "/executions/" + segment(execution_id), + timeout=min(self._client.timeout, remaining), + ) + if result["status"] in { + "completed", + "failed", + "canceled", + "cancelled", + "outcome_unknown", + }: return result time.sleep(min(poll_interval, max(0, deadline - time.monotonic()))) diff --git a/tests/test_client.py b/tests/test_client.py index c0f9f07..973f807 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -1,103 +1,187 @@ +"""Exercise client contracts without network access or real credentials.""" + import json +from typing import Type import httpx import pytest -from subfork import Subfork, APIError, AuthenticationError, ExecutionTimeout, PermissionDeniedError, RateLimitError, TransportError, ValidationError +from subfork import ( + APIError, + AuthenticationError, + ExecutionTimeout, + PermissionDeniedError, + RateLimitError, + Subfork, + TransportError, + ValidationError, +) -KEY = 'synthetic-test-key' +KEY = "synthetic-test-key" -def test_bearer_auth_base_url_and_environment(monkeypatch): - monkeypatch.setenv('SUBFORK_API_KEY', KEY) +def test_bearer_auth_base_url_and_environment(monkeypatch: pytest.MonkeyPatch) -> None: + """Verify bearer auth base url and environment.""" + monkeypatch.setenv("SUBFORK_API_KEY", KEY) seen = [] - def handle(request): + + def handle(request: httpx.Request) -> httpx.Response: + """Handle a mocked HTTP request for this scenario.""" seen.append(request) return httpx.Response(200, json=[]) - with Subfork(base_url='http://subfork.localhost', transport=httpx.MockTransport(handle)) as client: + + with Subfork( + base_url="http://subfork.localhost", transport=httpx.MockTransport(handle) + ) as client: assert client.nodes.list(include_all_versions=True) == [] - assert str(seen[0].url) == 'http://subfork.localhost/api/v1/nodes?include_all_versions=true' - assert seen[0].headers['authorization'] == 'Bearer ' + KEY + assert str(seen[0].url) == "http://subfork.localhost/api/v1/nodes?include_all_versions=true" + assert seen[0].headers["authorization"] == "Bearer " + KEY assert KEY not in str(seen[0].url) -@pytest.mark.parametrize('url', ['http://example.com', 'https://user:pass@example.com', - 'https://example.com/api/v1', 'https://example.com?key=x', - 'http://localhost.evil.example', 'https://example.com#fragment']) -def test_reject_unsafe_or_ambiguous_origins(url): +@pytest.mark.parametrize( + "url", + [ + "http://example.com", + "https://user:pass@example.com", + "https://example.com/api/v1", + "https://example.com?key=x", + "http://localhost.evil.example", + "https://example.com#fragment", + ], +) +def test_reject_unsafe_or_ambiguous_origins(url: str) -> None: + """Verify reject unsafe or ambiguous origins.""" with pytest.raises(ValueError): Subfork(KEY, base_url=url) -def test_credentials_required(monkeypatch): - monkeypatch.delenv('SUBFORK_API_KEY', raising=False) - with pytest.raises(ValueError): Subfork() - - -@pytest.mark.parametrize('status,error', [(401, AuthenticationError), (403, PermissionDeniedError), - (422, ValidationError), (429, RateLimitError), (503, APIError)]) -def test_errors_do_not_echo_response_secrets(status, error): - with Subfork(KEY, transport=httpx.MockTransport(lambda request: httpx.Response(status, json={'detail': KEY}, headers={'Retry-After': '12'}))) as client: - with pytest.raises(error) as caught: client.graphs.list() +def test_credentials_required(monkeypatch: pytest.MonkeyPatch) -> None: + """Verify credentials required.""" + monkeypatch.delenv("SUBFORK_API_KEY", raising=False) + with pytest.raises(ValueError): + Subfork() + + +@pytest.mark.parametrize( + "status,error", + [ + (401, AuthenticationError), + (403, PermissionDeniedError), + (422, ValidationError), + (429, RateLimitError), + (503, APIError), + ], +) +def test_errors_do_not_echo_response_secrets(status: int, error: Type[APIError]) -> None: + """Verify errors do not echo response secrets.""" + with Subfork( + KEY, + transport=httpx.MockTransport( + lambda request: httpx.Response( + status, json={"detail": KEY}, headers={"Retry-After": "12"} + ) + ), + ) as client: + with pytest.raises(error) as caught: + client.graphs.list() assert caught.value.status_code == status - assert caught.value.retry_after == '12' + assert caught.value.retry_after == "12" assert KEY not in str(caught.value) -def test_redirects_and_failed_writes_are_not_retried(): +def test_redirects_and_failed_writes_are_not_retried() -> None: + """Verify redirects and failed writes are not retried.""" requests = [] - def handle(request): + + def handle(request: httpx.Request) -> httpx.Response: + """Handle a mocked HTTP request for this scenario.""" requests.append(request) - return httpx.Response(307, headers={'Location': 'https://other.example'}) + return httpx.Response(307, headers={"Location": "https://other.example"}) + with Subfork(KEY, transport=httpx.MockTransport(handle)) as client: - with pytest.raises(APIError): client.graphs.create(name='Test', definition={'name': 'Test'}) + with pytest.raises(APIError): + client.graphs.create(name="Test", definition={"name": "Test"}) assert len(requests) == 1 -def test_authoring_requests_match_server_contract(): +def test_authoring_requests_match_server_contract() -> None: + """Verify authoring requests match server contract.""" seen = [] - def handle(request): - seen.append((request.method, request.url.path, dict(request.url.params), json.loads(request.content) if request.content else None)) - return httpx.Response(200, json={'id': 'g_test'}) + + def handle(request: httpx.Request) -> httpx.Response: + """Handle a mocked HTTP request for this scenario.""" + seen.append( + ( + request.method, + request.url.path, + dict(request.url.params), + json.loads(request.content) if request.content else None, + ) + ) + return httpx.Response(200, json={"id": "g_test"}) + with Subfork(KEY, transport=httpx.MockTransport(handle)) as client: - definition = {'name': 'Demo', 'nodes': [], 'edges': []} + definition = {"name": "Demo", "nodes": [], "edges": []} client.graphs.validate(definition) - client.graphs.create(name='Demo', definition=definition) - client.graphs.update('g_test', name='Demo', definition=definition) - client.graphs.publish('g_test', version='v1', interface={'inputs': {}, 'outputs': {}}) - client.graphs.execute('g_test', version='v1', inputs={'value': 3}) - assert [row[:2] for row in seen] == [('POST', '/api/v1/graphs/validate'), ('POST', '/api/v1/graphs'), - ('PUT', '/api/v1/graphs/g_test'), ('POST', '/api/v1/graphs/g_test/versions'), ('POST', '/api/v1/graphs/g_test/execute')] - assert seen[0][3] == {'name': 'Demo', 'definition': definition} - assert seen[-2][3]['interface'] == {'inputs': {}, 'outputs': {}} - assert seen[-1][2:] == ({'version': 'v1'}, {'inputs': {'value': 3}}) - - -def test_transport_failure_is_not_retried(): + client.graphs.create(name="Demo", definition=definition) + client.graphs.update("g_test", name="Demo", definition=definition) + client.graphs.publish("g_test", version="v1", interface={"inputs": {}, "outputs": {}}) + client.graphs.execute("g_test", version="v1", inputs={"value": 3}) + assert [row[:2] for row in seen] == [ + ("POST", "/api/v1/graphs/validate"), + ("POST", "/api/v1/graphs"), + ("PUT", "/api/v1/graphs/g_test"), + ("POST", "/api/v1/graphs/g_test/versions"), + ("POST", "/api/v1/graphs/g_test/execute"), + ] + assert seen[0][3] == {"name": "Demo", "definition": definition} + assert seen[-2][3]["interface"] == {"inputs": {}, "outputs": {}} + assert seen[-1][2:] == ({"version": "v1"}, {"inputs": {"value": 3}}) + + +def test_transport_failure_is_not_retried() -> None: + """Verify transport failure is not retried.""" seen = [] - def handle(request): + + def handle(request: httpx.Request) -> httpx.Response: + """Handle a mocked HTTP request for this scenario.""" seen.append(request) raise httpx.ReadTimeout(KEY) + with Subfork(KEY, transport=httpx.MockTransport(handle)) as client: - with pytest.raises(TransportError) as caught: client.graphs.execute('g_test') + with pytest.raises(TransportError) as caught: + client.graphs.execute("g_test") assert len(seen) == 1 and KEY not in str(caught.value) -@pytest.mark.parametrize('status', ['completed', 'failed', 'canceled', 'outcome_unknown']) -def test_wait_returns_terminal_result(status): - with Subfork(KEY, transport=httpx.MockTransport(lambda request: httpx.Response(200, json={'id': 'e_test', 'status': status}))) as client: - assert client.executions.wait('e_test')['status'] == status +@pytest.mark.parametrize("status", ["completed", "failed", "canceled", "outcome_unknown"]) +def test_wait_returns_terminal_result(status: str) -> None: + """Verify wait returns terminal result.""" + with Subfork( + KEY, + transport=httpx.MockTransport( + lambda request: httpx.Response(200, json={"id": "e_test", "status": status}) + ), + ) as client: + assert client.executions.wait("e_test")["status"] == status -def test_wait_timeout_does_not_cancel(monkeypatch): +def test_wait_timeout_does_not_cancel(monkeypatch: pytest.MonkeyPatch) -> None: + """Verify wait timeout does not cancel.""" from subfork import resources + ticks = iter([0, 0, 1, 2]) - monkeypatch.setattr(resources.time, 'monotonic', lambda: next(ticks)) - monkeypatch.setattr(resources.time, 'sleep', lambda seconds: None) + monkeypatch.setattr(resources.time, "monotonic", lambda: next(ticks)) + monkeypatch.setattr(resources.time, "sleep", lambda seconds: None) seen = [] - def handle(request): + + def handle(request: httpx.Request) -> httpx.Response: + """Handle a mocked HTTP request for this scenario.""" seen.append(request) - return httpx.Response(200, json={'status': 'running'}) + return httpx.Response(200, json={"status": "running"}) + with Subfork(KEY, transport=httpx.MockTransport(handle)) as client: - with pytest.raises(ExecutionTimeout): client.executions.wait('e_test', timeout=1) - assert len(seen) == 1 and seen[0].method == 'GET' + with pytest.raises(ExecutionTimeout): + client.executions.wait("e_test", timeout=1) + assert len(seen) == 1 and seen[0].method == "GET" From 18794a779a656436626f48ef35a9f8090a2a6bc8 Mon Sep 17 00:00:00 2001 From: Ryan Galloway Date: Tue, 29 Sep 2026 05:21:52 -0700 Subject: [PATCH 05/14] Refocus README on client usage and add Subfork banner --- CONTRIBUTING.md | 37 +++++++++ README.md | 159 ++++++++++++++++---------------------- assets/subfork-banner.png | Bin 0 -> 216016 bytes 3 files changed, 102 insertions(+), 94 deletions(-) create mode 100644 CONTRIBUTING.md create mode 100644 assets/subfork-banner.png diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..d7b7bec --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,37 @@ +# Contributing + +Install the development dependencies using Python 3.8+ and a modern pip: + +```bash +python -m pip install --upgrade pip +python -m pip install -e '.[dev]' +``` + +## Code quality + + +Install `.[dev]` to get the pinned development tools. Black 24.8.0, isort 5.13.2, +and Flake8 7.1.1 follow the conventions used in the sibling envstack and pyseq +projects: 100-column formatting, isort's Black profile, and a Python 3.8 target. +The tool versions also support running locally under Python 3.8. + +```bash +make format # Sort imports and apply Black to src/ and tests/ +make lint # Check formatting, imports, Flake8 and Google-style docstrings +make typecheck # Check annotated library code with mypy +make test # Run the HTTP contract tests +make check # Run lint, type checking and tests +make build # Build distributions and check their metadata +``` + +Activate your environment first, or specify it explicitly, for example: +`make check PYTHON=.venv/bin/python`. The CI lint job uses the same commands. +EditorConfig defines whitespace and newline conventions for supporting editors. + +Add annotations and docstrings to new functions, methods and classes, including +constructors and test helpers. Public docstrings should explain side effects, +permissions, return values and failure behavior where useful. JSON dictionaries +retain `Any` values because node parameters and server response fields are dynamic; +this release does not pretend to provide complete generated response models. +Mypy checks library signatures and bodies; Flake8 and formatting cover both the +library and tests. Runtime tests continue to cover Python 3.8 in CI. diff --git a/README.md b/README.md index b290d4b..f2c8786 100644 --- a/README.md +++ b/README.md @@ -1,73 +1,52 @@ -# subfork +
+ + Subfork + +

Create, publish, and run graphs from Python.

+
-Python API client for Subfork graph authoring, publication and execution. -**Alpha scaffold; not yet published to PyPI.** Distribution and import name: `subfork`. -BYO workers belong in the separate worker package, not this client. +# Subfork Python -## Development install +The Python client for [Subfork](https://subfork.com). Discover nodes, build reusable +graphs, publish versions, and run them from your scripts, applications, or agents. -Requires Python 3.8+ and a modern pip (21.3+ for editable installs). -Use a supported interpreter explicitly; the system `python3` may be older. +## Install -```bash -python3 -m venv .venv -source .venv/bin/activate -python -m pip install --upgrade pip -python -m pip install -e '.[dev]' -pytest -python -m build -python -m twine check dist/* -``` - -If pip reports that editable mode requires `setup.py`, check `python --version` -and `python -m pip --version`. Upgrade pip inside the active environment: -`python -m pip install --upgrade pip`. Python 3.8 is supported; pip will select -the latest pip and dependencies compatible with that interpreter. A `setup.py` -compatibility shim is not needed. - -With [uv](https://docs.astral.sh/uv/), a supported Python can also be provisioned -without changing the system Python. Preserve an existing environment by using a -new directory: +Requires Python 3.8+. ```bash -uv venv --python 3.12 .venv312 -source .venv312/bin/activate -uv pip install -e '.[dev]' +pip install subfork ``` -Licensed under [BSD-3-Clause](LICENSE). CI builds and checks distributions but does -not publish them. - -## Usage +## Connect -Create an API key under Account → API keys on a deployment with API-key support. -Set `SUBFORK_API_KEY` in your process environment; never put it in source files, -URLs, graph definitions, notebooks committed to git, or agent transcripts. +Create a key under **Account → API keys** in Subfork and set `SUBFORK_API_KEY` in +your environment. Grant the permissions your application needs: read, write, run, +and/or publish. Keep the key out of source files and graph definitions. ```python from subfork import Subfork -with Subfork() as client: # Reads SUBFORK_API_KEY; defaults to https://subfork.com - nodes = client.nodes.list(include_all_versions=True) +with Subfork() as client: + nodes = client.nodes.list() graphs = client.graphs.list() ``` -For a local deployment: +The client reads `SUBFORK_API_KEY` and connects to `https://subfork.com` by default. +Responses are dictionaries and lists matching the API's JSON responses. + +For another deployment, pass its origin without `/api/v1`: ```python with Subfork(base_url="http://subfork.localhost") as client: nodes = client.nodes.list() ``` -`base_url` is an origin, without `/api/v1`. HTTPS is required except for loopback -and `.localhost` hosts. Credentials are sent in the Authorization bearer header. -Redirects are not followed. Use a context manager or call `client.close()`. +## Create and run a graph -## Author, publish, execute - -The following deliberately creates and publishes a public graph and consumes -execution quota. Grant read/write/run/publish scopes only when needed. -Responses are dictionaries preserving the server's JSON shape. +This example creates a text-producing graph, publishes `v1`, and runs that version. +It requires read, write, publish, and run permissions. Graphs are public, and runs +use your account's execution quota. ```python from subfork import Subfork @@ -76,71 +55,63 @@ name = "Python greeting" definition = { "name": name, "nodes": [{ - "node_instance_id": "hello", "node_id": "n_text_value", - "node_version": "1.0.0", "title": "Hello", + "node_instance_id": "hello", + "node_id": "n_text_value", + "node_version": "1.0.0", + "title": "Hello", "params": {"text": "Hello from Python"}, }], "edges": [], - "graph_outputs": {"text": {"node_instance_id": "hello", "output_name": "text"}}, + "graph_outputs": { + "text": {"node_instance_id": "hello", "output_name": "text"}, + }, } + with Subfork() as client: client.graphs.validate(definition) graph = client.graphs.create(name=name, definition=definition) client.graphs.publish(graph["id"], version="v1") + execution = client.graphs.execute(graph["id"], version="v1") result = client.executions.wait(execution["id"], timeout=120) print(result["status"], result.get("outputs")) ``` -Discover published blocks with `graphs.published()` and retrieve their exact -interfaces with `graphs.published_version(graph_id, version)`. Compose their -returned node IDs with `composite_graph` parameters and explicit pinned versions. -`graphs.interface(graph_id)` previews the server-inferred interface. -`graphs.update()` replaces the submitted draft fields, including description; -pass the description to preserve it. Existing server ownership and quotas apply. +To test a draft before publishing, call `graphs.execute(graph_id)` without a +version. To update a draft, use `graphs.update()` with its name, definition, and +description; omitting the description clears it. -## Errors and limits +## Reuse building blocks -Catch `AuthenticationError`, `PermissionDeniedError`, `ValidationError`, -`RateLimitError`, or the base `APIError`; HTTP errors expose `status_code` and -`retry_after`. Messages intentionally do not echo raw response bodies or secrets. -`TransportError` means the outcome of a write may be unknown. There are no automatic -retries: inspect remote state before retrying create, publish or execute operations. +Explore published graphs and inspect their versioned interfaces: -`executions.wait()` polls until a terminal status and returns failed executions -as results too. `ExecutionTimeout` does **not** cancel the remote execution; -use `executions.cancel(id)` explicitly. Polling uses a monotonic deadline and caps -individual HTTP timeout settings by remaining time. HTTPX timeouts apply per I/O -phase, not a strict wall-clock deadline for the entire network exchange. +```python +with Subfork() as client: + blocks = client.graphs.published() + block = client.graphs.published_version(graph_id, "v1") +``` -The first scaffold is synchronous. Async support, rich response models, artifact -streaming, idempotent write retries and worker support are not included. Mock HTTP -tests do not certify any particular server deployment. +Replace `graph_id` with the ID of a graph you want to use. Published graph versions +can be composed into larger graphs using the returned composite node manifest. +Pin child versions so later publications do not change your graph's behavior. -## Code quality +## Handle failures -Install `.[dev]` to get the pinned development tools. Black 24.8.0, isort 5.13.2, -and Flake8 7.1.1 follow the conventions used in the sibling envstack and pyseq -projects: 100-column formatting, isort's Black profile, and a Python 3.8 target. -The tool versions also support running locally under Python 3.8. +HTTP failures raise `APIError` subclasses, including `AuthenticationError`, +`PermissionDeniedError`, `ValidationError`, and `RateLimitError`. These expose +`status_code` and an optional `retry_after` header. -```bash -make format # Sort imports and apply Black to src/ and tests/ -make lint # Check formatting, imports, Flake8 and Google-style docstrings -make typecheck # Check annotated library code with mypy -make test # Run the HTTP contract tests -make check # Run lint, type checking and tests -make build # Build distributions and check their metadata -``` +`executions.wait()` returns failed and canceled runs as well as successful ones, +so check the returned status. An `ExecutionTimeout` stops polling but does not +cancel the remote run; use `executions.cancel(execution_id)` to request cancellation. + +The client does not automatically retry requests. After a `TransportError`, check +remote state before repeating a create, publish, or execute request. + +## Contributing + +See [CONTRIBUTING.md](CONTRIBUTING.md) for development and code-quality checks. + +## License -Activate your environment first, or specify it explicitly, for example: -`make check PYTHON=.venv/bin/python`. The CI lint job uses the same commands. -EditorConfig defines whitespace and newline conventions for supporting editors. - -Add annotations and docstrings to new functions, methods and classes, including -constructors and test helpers. Public docstrings should explain side effects, -permissions, return values and failure behavior where useful. JSON dictionaries -retain `Any` values because node parameters and server response fields are dynamic; -this release does not pretend to provide complete generated response models. -Mypy checks library signatures and bodies; Flake8 and formatting cover both the -library and tests. Runtime tests continue to cover Python 3.8 in CI. +[BSD-3-Clause](LICENSE). diff --git a/assets/subfork-banner.png b/assets/subfork-banner.png new file mode 100644 index 0000000000000000000000000000000000000000..2172a9c7e9541616dcfce6821b543dbd317165f4 GIT binary patch literal 216016 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%0A=bdP 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 literal 0 HcmV?d00001 From 22ca1a4ee4d3d1b47345b5081af49bbc86e6ebca Mon Sep 17 00:00:00 2001 From: Ryan Galloway Date: Tue, 29 Sep 2026 05:48:50 -0700 Subject: [PATCH 06/14] Add graph CLI with export and execution output handling --- CONTRIBUTING.md | 9 +- README.md | 37 ++++++-- pyproject.toml | 3 + src/subfork/__main__.py | 6 ++ src/subfork/cli.py | 204 ++++++++++++++++++++++++++++++++++++++++ src/subfork/client.py | 5 +- tests/test_cli.py | 183 +++++++++++++++++++++++++++++++++++ 7 files changed, 433 insertions(+), 14 deletions(-) create mode 100644 src/subfork/__main__.py create mode 100644 src/subfork/cli.py create mode 100644 tests/test_cli.py diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d7b7bec..e9d18d7 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,6 +1,7 @@ # Contributing -Install the development dependencies using Python 3.8+ and a modern pip: +To contribute to this Python client, install its development dependencies using +Python 3.8+ and a modern pip: ```bash python -m pip install --upgrade pip @@ -9,11 +10,9 @@ python -m pip install -e '.[dev]' ## Code quality - Install `.[dev]` to get the pinned development tools. Black 24.8.0, isort 5.13.2, -and Flake8 7.1.1 follow the conventions used in the sibling envstack and pyseq -projects: 100-column formatting, isort's Black profile, and a Python 3.8 target. -The tool versions also support running locally under Python 3.8. +and Flake8 7.1.1 use 100-column formatting, isort's Black profile, and a Python +3.8 target. ```bash make format # Sort imports and apply Black to src/ and tests/ diff --git a/README.md b/README.md index f2c8786..479b9b3 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,6 @@ Subfork -

Create, publish, and run graphs from Python.

# Subfork Python @@ -32,16 +31,40 @@ with Subfork() as client: graphs = client.graphs.list() ``` -The client reads `SUBFORK_API_KEY` and connects to `https://subfork.com` by default. -Responses are dictionaries and lists matching the API's JSON responses. +The client reads `SUBFORK_API_KEY` and connects to [subfork.com](https://subfork.com). -For another deployment, pass its origin without `/api/v1`: +## Command line -```python -with Subfork(base_url="http://subfork.localhost") as client: - nodes = client.nodes.list() +The package also installs `subfork` (or use `python -m subfork`). It reads +`SUBFORK_API_KEY` from your environment and prints JSON for use in scripts. + +```bash +subfork list +subfork export GRAPH_ID --output graph.json +subfork validate graph.json +subfork create graph.json --name "My new graph" +subfork interface GRAPH_ID +subfork publish GRAPH_ID --version v1 +subfork execute GRAPH_ID --version v1 --inputs inputs.json ``` +Export writes a graph's draft definition, which can be passed directly to create. +It refuses to overwrite an existing file; omit `--output` to print to stdout. +Descriptions, tags, and published versions are not included in the export. +JSON input files must contain an object; use `-` to read from stdin. +Create makes a public draft, publish creates an immutable version, and execute +waits for completion and prints the graph outputs. Runs consume account quota. +Use `execute --no-wait` for a submission summary or `execute --raw` for the full +execution snapshot. Waiting requires read and run scopes; submission alone requires +run scope. `--wait-timeout` (default 120) and `--poll-interval` (default 2) are in +seconds. A timeout stops waiting without canceling the remote run. + +Other commands include `get`, `published`, and `versions`. Use `--help` on any +command. Node discovery and execution monitoring are available through the Python API. + +Errors go to stderr. Operational errors and failed validation return exit code 1; +usage errors return 2. Failed executions and wait timeouts also return exit code 1. + ## Create and run a graph This example creates a text-producing graph, publishes `v1`, and runs that version. diff --git a/pyproject.toml b/pyproject.toml index 2da8cb4..6288916 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -17,6 +17,9 @@ classifiers = [ "Typing :: Typed", ] +[project.scripts] +subfork = "subfork.cli:main" + [project.optional-dependencies] dev = [ "pytest>=8,<10", diff --git a/src/subfork/__main__.py b/src/subfork/__main__.py new file mode 100644 index 0000000..ffa012f --- /dev/null +++ b/src/subfork/__main__.py @@ -0,0 +1,6 @@ +"""Support invocation with python -m subfork.""" + +from .cli import main + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/src/subfork/cli.py b/src/subfork/cli.py new file mode 100644 index 0000000..48ba644 --- /dev/null +++ b/src/subfork/cli.py @@ -0,0 +1,204 @@ +"""Command-line graph authoring and execution with JSON input and output.""" + +import argparse +import json +import math +import os +import sys +from pathlib import Path +from typing import Any, Dict, Optional, Sequence + +from . import AuthenticationError, ExecutionTimeout, Subfork, SubforkError, __version__ + + +def build_parser() -> argparse.ArgumentParser: + """Build the public command tree without opening a connection.""" + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--version", action="version", version=__version__) + parser.add_argument("--base-url", default=os.getenv("SUBFORK_BASE_URL", "https://subfork.com")) + parser.add_argument("--timeout", type=float, default=30, help="HTTP timeout in seconds") + commands = parser.add_subparsers(dest="command", required=True) + commands.add_parser("list", help="List account graphs") + commands.add_parser("published", help="List published building blocks") + for command in ("get", "versions", "interface", "export", "publish", "execute"): + child = commands.add_parser(command) + child.add_argument("graph_id") + if command == "export": + child.add_argument( + "--output", default="-", help="Definition JSON path, or - for stdout" + ) + elif command == "publish": + child.add_argument("--version", required=True, help="New immutable version, e.g. v1") + child.add_argument("--interface", help="Optional interface JSON file") + child.add_argument("--comment", default="") + elif command == "execute": + child.add_argument("--version", default="draft") + child.add_argument( + "--no-wait", action="store_true", help="Return submission status immediately" + ) + child.add_argument( + "--raw", action="store_true", help="Print the full execution snapshot" + ) + child.add_argument( + "--wait-timeout", + type=float, + default=120, + help="Maximum wait in seconds (default: 120)", + ) + child.add_argument( + "--poll-interval", + type=float, + default=2, + help="Seconds between status checks (default: 2)", + ) + child.add_argument("--inputs", help="Inputs JSON file, or - for stdin") + for command in ("validate", "create"): + child = commands.add_parser(command) + child.add_argument("file", help="Graph definition JSON file, or - for stdin") + child.add_argument("--name", help="Override the definition's name") + if command == "create": + child.add_argument("--description", default="") + child.add_argument("--tag", action="append", default=[]) + return parser + + +def read_object(filename: str) -> Dict[str, Any]: + """Read a JSON object from a UTF-8 file or standard input.""" + try: + content = ( + sys.stdin.read() if filename == "-" else Path(filename).read_text(encoding="utf-8") + ) + value = json.loads(content) + except (ValueError, UnicodeError) as exc: + raise ValueError("Input must contain valid UTF-8 JSON.") from exc + if not isinstance(value, dict): + raise ValueError("Input JSON must be an object.") + return value + + +def graph_command(client: Subfork, args: argparse.Namespace) -> Any: + """Dispatch graph operations through the same SDK used by Python callers.""" + graphs = client.graphs + if args.command == "list": + return graphs.list() + if args.command == "published": + return graphs.published() + if args.command in {"create", "validate"}: + definition = read_object(args.file) + name = args.name if args.name is not None else definition.get("name", "Untitled Graph") + if not isinstance(name, str) or not name.strip(): + raise ValueError("Graph name must be a nonempty string.") + if args.command == "validate": + return graphs.validate(definition, name=name) + return graphs.create( + name=name, definition=definition, description=args.description, tags=args.tag + ) + if args.command == "get": + return graphs.get(args.graph_id) + if args.command == "export": + graph = graphs.get(args.graph_id) + exported = graph.get("definition") + if not isinstance(exported, dict): + raise ValueError("Graph response does not contain a definition object.") + return exported + if args.command == "versions": + return graphs.versions(args.graph_id) + if args.command == "interface": + return graphs.interface(args.graph_id) + if args.command == "publish": + interface = read_object(args.interface) if args.interface else None + return graphs.publish( + args.graph_id, version=args.version, interface=interface, comment=args.comment + ) + inputs = read_object(args.inputs) if args.inputs else None + if any( + not math.isfinite(value) or value <= 0 for value in (args.wait_timeout, args.poll_interval) + ): + raise ValueError("Wait timeout and poll interval must be positive finite numbers.") + result = graphs.execute(args.graph_id, version=args.version, inputs=inputs) + if not args.no_wait and result.get("status") not in { + "completed", + "failed", + "canceled", + "cancelled", + "outcome_unknown", + }: + execution_id = result.get("id") or result.get("execution_id") + if not isinstance(execution_id, str) or not execution_id: + raise ValueError( + "Submission returned no execution ID; inspect remote state before retrying." + ) + print("subfork: waiting for execution {}".format(execution_id), file=sys.stderr) + result = client.executions.wait( + execution_id, timeout=args.wait_timeout, poll_interval=args.poll_interval + ) + return result + + +def main(argv: Optional[Sequence[str]] = None) -> int: + """Run the CLI; return zero on success and one on operational failure. + + Argparse reports usage errors with exit code two. Failed validation returns + one, retaining its JSON diagnostics on stdout. + """ + args = build_parser().parse_args(argv) + try: + with Subfork(base_url=args.base_url, timeout=args.timeout) as client: + result = graph_command(client, args) + failed = args.command == "execute" and result.get("status") in { + "failed", + "canceled", + "cancelled", + "outcome_unknown", + } + display = result + if args.command == "execute" and not args.raw: + if args.no_wait or failed: + display = { + "execution_id": result.get("id") or result.get("execution_id"), + "status": result.get("status"), + } + else: + display = result.get("outputs", {}) + rendered = json.dumps(display, indent=2, ensure_ascii=False) + "\n" + output = getattr(args, "output", "-") + if output == "-": + sys.stdout.write(rendered) + else: + # Exclusive creation avoids silently overwriting a local definition. + with Path(output).open("x", encoding="utf-8", newline="\n") as stream: + stream.write(rendered) + if failed: + print( + "subfork: execution did not complete successfully; use --raw for details", + file=sys.stderr, + ) + return 1 + if args.command == "validate" and result.get("valid") is False: + return 1 + return 0 + except ExecutionTimeout as exc: + print( + "subfork: execution {} timed out while waiting; the remote run is not canceled".format( + exc.execution_id + ), + file=sys.stderr, + ) + return 1 + except AuthenticationError: + print( + "subfork: authentication failed (HTTP 401). Check that SUBFORK_API_KEY " + "is an active key issued by the service selected with --base-url or " + "SUBFORK_BASE_URL (default: https://subfork.com). " + "The CLI reads exported environment variables; it does not load .env files.", + file=sys.stderr, + ) + return 1 + except (SubforkError, ValueError, OSError) as exc: + print("subfork: {}".format(exc), file=sys.stderr) + return 1 + except KeyboardInterrupt: + print( + "subfork: interrupted; remote execution is not canceled automatically", file=sys.stderr + ) + return 130 diff --git a/src/subfork/client.py b/src/subfork/client.py index 51704a7..79aa0b5 100644 --- a/src/subfork/client.py +++ b/src/subfork/client.py @@ -37,11 +37,12 @@ def __init__( timeout: float = 30, transport: Optional[httpx.BaseTransport] = None, ) -> None: - """Create a client for an HTTPS origin or a local development server. + """Create an authenticated client for the Subfork API. Args: api_key: Bearer secret, or None to read SUBFORK_API_KEY. - base_url: Origin without an API path, query, or credentials. + base_url: API origin, defaulting to https://subfork.com, without + an API path, query, or credentials. timeout: Positive per-I/O-phase HTTP timeout in seconds. transport: Optional HTTPX transport, primarily for testing. diff --git a/tests/test_cli.py b/tests/test_cli.py new file mode 100644 index 0000000..fe4eba0 --- /dev/null +++ b/tests/test_cli.py @@ -0,0 +1,183 @@ +"""Verify CLI contracts using the real SDK with an isolated HTTP transport.""" + +import io +import json +from pathlib import Path +from typing import Any + +import httpx +import pytest + +from subfork import Subfork, cli + + +@pytest.fixture +def requests(monkeypatch: pytest.MonkeyPatch) -> list: + """Capture requests and provide representative API responses.""" + seen = [] + + def handle(request: httpx.Request) -> httpx.Response: + """Return a graph or execution response for each request.""" + seen.append(request) + if request.url.path.endswith("/graphs/g_test"): + return httpx.Response( + 200, json={"definition": {"name": "Greeting", "nodes": [], "edges": []}} + ) + if request.url.path.endswith("/graphs/validate"): + return httpx.Response(200, json={"valid": False, "errors": ["No output"]}) + return httpx.Response(200, json={"id": "test", "status": "completed"}) + + def factory(**kwargs: Any) -> Subfork: + """Construct a real client without network access.""" + return Subfork("synthetic-key", transport=httpx.MockTransport(handle), **kwargs) + + monkeypatch.setattr(cli, "Subfork", factory) + return seen + + +def test_export_create_roundtrip(requests: list, tmp_path: Path, capsys: Any) -> None: + """Export definitions that create accepts, without leaking response metadata.""" + output = tmp_path / "graph.json" + assert cli.main(["export", "g_test", "--output", str(output)]) == 0 + definition = json.loads(output.read_text()) + assert definition == {"name": "Greeting", "nodes": [], "edges": []} + assert capsys.readouterr().out == "" + assert cli.main(["create", str(output), "--name", "Copy", "--tag", "demo"]) == 0 + assert json.loads(requests[-1].content) == { + "name": "Copy", + "definition": definition, + "description": "", + "tags": ["demo"], + } + assert json.loads(capsys.readouterr().out)["id"] == "test" + assert cli.main(["export", "g_test", "--output", str(output)]) == 1 + assert json.loads(output.read_text()) == definition + + +@pytest.mark.parametrize("content", ["[]", "invalid", '{"name":']) +def test_invalid_input_never_sends( + requests: list, monkeypatch: pytest.MonkeyPatch, content: str, capsys: Any +) -> None: + """Reject malformed or non-object definitions before any HTTP request.""" + monkeypatch.setattr("sys.stdin", io.StringIO(content)) + assert cli.main(["create", "-"]) == 1 + assert requests == [] + assert capsys.readouterr().err.startswith("subfork:") + + +def test_publish_and_execute(requests: list, tmp_path: Path) -> None: + """Dispatch publication and execution input submission correctly.""" + assert cli.main(["publish", "g_test", "--version", "v1"]) == 0 + assert json.loads(requests[-1].content) == {"version": "v1", "comment": ""} + inputs = tmp_path / "inputs.json" + inputs.write_text('{"greeting": "hello"}') + assert cli.main(["execute", "g_test", "--version", "v1", "--inputs", str(inputs)]) == 0 + assert requests[-1].url.params["version"] == "v1" + assert json.loads(requests[-1].content) == {"inputs": {"greeting": "hello"}} + + +def test_validation_failure(requests: list, monkeypatch: pytest.MonkeyPatch, capsys: Any) -> None: + """Return a failing exit status while retaining validation diagnostics as JSON.""" + monkeypatch.setattr("sys.stdin", io.StringIO('{"nodes": []}')) + assert cli.main(["validate", "-"]) == 1 + assert json.loads(capsys.readouterr().out)["valid"] is False + + +def test_help_without_credentials(monkeypatch: pytest.MonkeyPatch) -> None: + """Allow help without constructing an authenticated client.""" + monkeypatch.delenv("SUBFORK_API_KEY", raising=False) + with pytest.raises(SystemExit) as result: + cli.main(["--help"]) + assert result.value.code == 0 + + +@pytest.mark.parametrize("status", [401, 403]) +def test_api_error_is_safe(monkeypatch: pytest.MonkeyPatch, capsys: Any, status: int) -> None: + """Report failed API calls without echoing server bodies or credentials.""" + + def factory(**kwargs: Any) -> Subfork: + """Create a client whose server returns a sensitive error body.""" + return Subfork( + "synthetic-key", + transport=httpx.MockTransport( + lambda request: httpx.Response(status, text="sensitive body") + ), + **kwargs, + ) + + monkeypatch.setattr(cli, "Subfork", factory) + assert cli.main(["list"]) == 1 + captured = capsys.readouterr() + assert captured.out == "" + assert str(status) in captured.err + if status == 401: + assert "SUBFORK_API_KEY" in captured.err + assert "does not load .env" in captured.err + assert "sensitive" not in captured.err + assert "synthetic-key" not in captured.err + + +@pytest.mark.parametrize("command", ["graphs", "nodes", "executions"]) +def test_removed_groups(command: str) -> None: + """Reject removed resource groups as usage errors.""" + with pytest.raises(SystemExit) as result: + cli.main([command]) + assert result.value.code == 2 + + +@pytest.mark.parametrize("mode", ["default", "raw", "no-wait", "failed", "timeout"]) +def test_execution_output_modes(monkeypatch: pytest.MonkeyPatch, capsys: Any, mode: str) -> None: + """Wait for results by default and preserve explicit diagnostic output modes.""" + seen = [] + completed = { + "id": "e_test", + "status": "completed", + "outputs": {"response": ["https://example.com"]}, + "definition": {"nodes": []}, + } + if mode == "failed": + completed["status"] = "failed" + + def handle(request: httpx.Request) -> httpx.Response: + """Simulate asynchronous submission followed by completion.""" + seen.append(request) + if request.method == "POST": + return httpx.Response(201, json={"id": "e_test", "status": "running", "outputs": {}}) + return httpx.Response(200, json=completed) + + def factory(**kwargs: Any) -> Subfork: + """Construct a client with mocked transport and optional wait timeout.""" + client = Subfork("synthetic-key", transport=httpx.MockTransport(handle), **kwargs) + if mode == "timeout": + + def timeout(*args: Any, **kwargs: Any) -> dict: + """Simulate reaching the waiting deadline without canceling.""" + from subfork import ExecutionTimeout + + raise ExecutionTimeout("e_test") + + monkeypatch.setattr(client.executions, "wait", timeout) + return client + + monkeypatch.setattr(cli, "Subfork", factory) + arguments = ["execute", "g_test"] + if mode in {"raw", "no-wait"}: + arguments.append("--" + mode) + assert cli.main(arguments) == (1 if mode in {"failed", "timeout"} else 0) + captured = capsys.readouterr() + assert sum(request.method == "POST" for request in seen) == 1 + if mode == "timeout": + assert captured.out == "" + assert "e_test" in captured.err and "not canceled" in captured.err + return + output = json.loads(captured.out) + if mode == "raw": + assert output == completed + elif mode == "default": + assert output == completed["outputs"] + else: + assert output == { + "execution_id": "e_test", + "status": "failed" if mode == "failed" else "running", + } + assert len(seen) == (1 if mode == "no-wait" else 2) From d9e93ca46991467442a0abaeafbee1c2820e83a5 Mon Sep 17 00:00:00 2001 From: Ryan Galloway Date: Tue, 29 Sep 2026 05:58:10 -0700 Subject: [PATCH 07/14] Add animated execution progress with active node names --- README.md | 5 ++ src/subfork/cli.py | 107 +++++++++++++++++++++++++++++++++++++-- src/subfork/resources.py | 13 ++++- tests/test_cli.py | 79 +++++++++++++++++++++++++++++ tests/test_client.py | 15 ++++++ 5 files changed, 213 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 479b9b3..c44d140 100644 --- a/README.md +++ b/README.md @@ -58,6 +58,11 @@ Use `execute --no-wait` for a submission summary or `execute --raw` for the full execution snapshot. Waiting requires read and run scopes; submission alone requires run scope. `--wait-timeout` (default 120) and `--poll-interval` (default 2) are in seconds. A timeout stops waiting without canceling the remote run. +A yellow spinner precedes `Graph .......... Running`, with `Running` in +green. As status snapshots arrive, the line shows the currently running node titles +(or multiple titles for parallel nodes). Short-lived nodes may finish between polls. +Set `NO_COLOR` to disable colors. Progress goes to stderr; stdout remains JSON. +Redirected progress uses a single plain-text line. Other commands include `get`, `published`, and `versions`. Use `--help` on any command. Node discovery and execution monitoring are available through the Python API. diff --git a/src/subfork/cli.py b/src/subfork/cli.py index 48ba644..bdd5a68 100644 --- a/src/subfork/cli.py +++ b/src/subfork/cli.py @@ -4,13 +4,102 @@ import json import math import os +import shutil import sys +import threading +from contextlib import contextmanager from pathlib import Path -from typing import Any, Dict, Optional, Sequence +from typing import Any, Callable, Dict, Iterator, Optional, Sequence from . import AuthenticationError, ExecutionTimeout, Subfork, SubforkError, __version__ +@contextmanager +def execution_status(graph_name: str) -> Iterator[Callable[[Dict[str, Any]], None]]: + """Animate the active nodes on terminal stderr while preserving JSON stdout.""" + stream = sys.stderr + terminal = stream.isatty() and os.environ.get("TERM") != "dumb" + lock = threading.Lock() + label = "Graph " + graph_name + status = "Running" + titles: Dict[str, str] = {} + stopped = threading.Event() + frames = "⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏" + try: + frames.encode(stream.encoding or "ascii") + except UnicodeError: + frames = "|/-\\" + + def update(snapshot: Dict[str, Any]) -> None: + """Replace the display state with active node titles from a snapshot.""" + nonlocal label, status + definition = snapshot.get("definition") or {} + for node in definition.get("nodes", []): + titles[node["node_instance_id"]] = node.get("title") or node["node_instance_id"] + nodes = snapshot.get("node_executions") or {} + active = [ + titles.get(key, key) for key, node in nodes.items() if node.get("status") == "running" + ] + with lock: + label = ( + ("Node " if len(active) == 1 else "Nodes ") + ", ".join(active) + if active + else "Graph " + graph_name + ) + status = ( + "Running" + if active + else str(snapshot.get("status", "running")).replace("_", " ").title() + ) + + def render(index: int) -> None: + """Draw one width-limited line with a yellow spinner and green run status.""" + with lock: + name = "".join(char if char.isprintable() else " " for char in label) + state = "".join(char if char.isprintable() else " " for char in status) + width = max(1, shutil.get_terminal_size().columns - 1) + name = name[: max(0, width - len(state) - 7)] + dots = "." * max(3, min(10, width - len(name) - len(state) - 4)) + frame = frames[index % len(frames)] + plain = "{} {} {} {}".format(frame, name, dots, state) + if len(plain) > width: + line = plain[:width] + elif os.environ.get("NO_COLOR"): + line = plain + else: + colored_state = "\033[32m" + state + "\033[0m" if state == "Running" else state + line = "\033[33m{}\033[0m {} {} {}".format(frame, name, dots, colored_state) + stream.write("\r\033[2K" + line) + stream.flush() + + def animate() -> None: + """Refresh the spinner independently of network requests and polling.""" + index = 1 + while not stopped.wait(0.1): + try: + render(index) + except (OSError, ValueError): + return + index += 1 + + if not terminal: + safe_name = "".join(char if char.isprintable() else " " for char in graph_name) + print("Graph {} .......... Running".format(safe_name), file=stream) + yield update + return + worker = threading.Thread(target=animate, name="subfork-spinner", daemon=True) + try: + render(0) + worker.start() + yield update + finally: + stopped.set() + if worker.ident is not None: + worker.join() + stream.write("\r\033[2K") + stream.flush() + + def build_parser() -> argparse.ArgumentParser: """Build the public command tree without opening a connection.""" parser = argparse.ArgumentParser(description=__doc__) @@ -128,10 +217,20 @@ def graph_command(client: Subfork, args: argparse.Namespace) -> Any: raise ValueError( "Submission returned no execution ID; inspect remote state before retrying." ) - print("subfork: waiting for execution {}".format(execution_id), file=sys.stderr) - result = client.executions.wait( - execution_id, timeout=args.wait_timeout, poll_interval=args.poll_interval + snapshot_definition = result.get("definition") + graph_name = ( + snapshot_definition.get("name") if isinstance(snapshot_definition, dict) else None ) + with execution_status( + graph_name if isinstance(graph_name, str) else args.graph_id + ) as update: + update(result) + result = client.executions.wait( + execution_id, + timeout=args.wait_timeout, + poll_interval=args.poll_interval, + on_update=update, + ) return result diff --git a/src/subfork/resources.py b/src/subfork/resources.py index 660246b..4cd1349 100644 --- a/src/subfork/resources.py +++ b/src/subfork/resources.py @@ -4,7 +4,7 @@ import math import time -from typing import TYPE_CHECKING, Any, Dict, List, Optional +from typing import TYPE_CHECKING, Any, Callable, Dict, List, Optional from urllib.parse import quote from .errors import ExecutionTimeout @@ -173,7 +173,12 @@ def cancel(self, execution_id: str) -> Dict[str, Any]: return self._client._request("POST", "/executions/" + segment(execution_id) + "/cancel") def wait( - self, execution_id: str, *, timeout: float = 120, poll_interval: float = 2 + self, + execution_id: str, + *, + timeout: float = 120, + poll_interval: float = 2, + on_update: Optional[Callable[[Dict[str, Any]], None]] = None, ) -> Dict[str, Any]: """Poll until a terminal status or the polling deadline. @@ -182,6 +187,8 @@ def wait( timeout: Positive deadline in seconds. Remaining time caps HTTP timeouts, which apply per I/O phase, not to the entire request. poll_interval: Positive delay in seconds between status requests. + on_update: Optional synchronous callback for each retrieved snapshot. + Callback exceptions propagate to the caller without canceling the run. Returns: The terminal snapshot, including failed or canceled executions. @@ -208,6 +215,8 @@ def wait( "/executions/" + segment(execution_id), timeout=min(self._client.timeout, remaining), ) + if on_update is not None: + on_update(result) if result["status"] in { "completed", "failed", diff --git a/tests/test_cli.py b/tests/test_cli.py index fe4eba0..71750c4 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -181,3 +181,82 @@ def timeout(*args: Any, **kwargs: Any) -> dict: "status": "failed" if mode == "failed" else "running", } assert len(seen) == (1 if mode == "no-wait" else 2) + + +@pytest.mark.parametrize("interrupted", [False, True]) +@pytest.mark.parametrize("no_color", [False, True]) +def test_status_cleanup(monkeypatch: pytest.MonkeyPatch, interrupted: bool, no_color: bool) -> None: + """Show the graph name and restore terminal output on success or interruption.""" + + class Terminal(io.StringIO): + """Capture writes as an interactive terminal.""" + + def isatty(self) -> bool: + """Identify this stream as a terminal.""" + return True + + terminal = Terminal() + monkeypatch.setattr("sys.stderr", terminal) + monkeypatch.setenv("TERM", "xterm") + monkeypatch.setenv("NO_COLOR", "1" if no_color else "") + try: + with cli.execution_status("URL Extract Pipe"): + expected = "Running" if no_color else "\033[32mRunning\033[0m" + assert "Graph URL Extract Pipe .......... " + expected in terminal.getvalue() + if interrupted: + raise KeyboardInterrupt + except KeyboardInterrupt: + assert interrupted + assert terminal.getvalue().endswith("\r\033[2K") + + +def test_status_redirected_stderr(monkeypatch: pytest.MonkeyPatch) -> None: + """Keep redirected progress plain and sanitize control characters in names.""" + stream = io.StringIO() + monkeypatch.setattr("sys.stderr", stream) + with cli.execution_status("Greeting\nGraph"): + pass + assert stream.getvalue() == "Graph Greeting Graph .......... Running\n" + + +def test_active_node_progress(monkeypatch: pytest.MonkeyPatch) -> None: + """Animate named parallel nodes and clean up the rendering thread.""" + import threading + + refreshed = threading.Event() + + class Terminal(io.StringIO): + """Capture animated frames and signal when node titles appear.""" + + def isatty(self) -> bool: + """Enable interactive progress rendering.""" + return True + + def write(self, value: str) -> int: + """Signal a node frame without timing-dependent sleeps.""" + count = super().write(value) + if "Nodes Fetch, Parse" in value: + refreshed.set() + return count + + terminal = Terminal() + monkeypatch.setattr("sys.stderr", terminal) + monkeypatch.setenv("TERM", "xterm") + monkeypatch.delenv("NO_COLOR", raising=False) + with cli.execution_status("Pipeline") as update: + update( + { + "status": "running", + "definition": { + "nodes": [ + {"node_instance_id": "a", "title": "Fetch"}, + {"node_instance_id": "b", "title": "Parse"}, + ] + }, + "node_executions": {"a": {"status": "running"}, "b": {"status": "running"}}, + } + ) + assert refreshed.wait(2) + assert "\033[33m" in terminal.getvalue() + assert "\033[32mRunning\033[0m" in terminal.getvalue() + assert not any(thread.name == "subfork-spinner" for thread in threading.enumerate()) diff --git a/tests/test_client.py b/tests/test_client.py index 973f807..6617216 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -185,3 +185,18 @@ def handle(request: httpx.Request) -> httpx.Response: with pytest.raises(ExecutionTimeout): client.executions.wait("e_test", timeout=1) assert len(seen) == 1 and seen[0].method == "GET" + + +def test_wait_reports_snapshots() -> None: + """Deliver both active and terminal snapshots to an optional progress callback.""" + snapshots = [] + statuses = iter(["running", "completed"]) + with Subfork( + "synthetic-key", + transport=httpx.MockTransport( + lambda request: httpx.Response(200, json={"status": next(statuses)}) + ), + ) as client: + result = client.executions.wait("e_test", poll_interval=0.001, on_update=snapshots.append) + assert [snapshot["status"] for snapshot in snapshots] == ["running", "completed"] + assert result == snapshots[-1] From afd5a60173e52dd55d38e7f270c0508ee548a8fb Mon Sep 17 00:00:00 2001 From: Ryan Galloway Date: Tue, 29 Sep 2026 06:05:04 -0700 Subject: [PATCH 08/14] Retain node progress and support execution result files --- README.md | 6 ++- src/subfork/cli.py | 115 ++++++++++++++++++++++++++++++++++----------- tests/test_cli.py | 89 +++++++++++++++++++++++++++++++++++ 3 files changed, 181 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index c44d140..c17cb70 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,7 @@ subfork create graph.json --name "My new graph" subfork interface GRAPH_ID subfork publish GRAPH_ID --version v1 subfork execute GRAPH_ID --version v1 --inputs inputs.json +subfork execute GRAPH_ID -o results.json ``` Export writes a graph's draft definition, which can be passed directly to create. @@ -54,6 +55,8 @@ Descriptions, tags, and published versions are not included in the export. JSON input files must contain an object; use `-` to read from stdin. Create makes a public draft, publish creates an immutable version, and execute waits for completion and prints the graph outputs. Runs consume account quota. +Use `-o results.json` or `--out results.json` to write result JSON to a new file +instead of stdout. Progress still goes to stderr. Existing files are not overwritten. Use `execute --no-wait` for a submission summary or `execute --raw` for the full execution snapshot. Waiting requires read and run scopes; submission alone requires run scope. `--wait-timeout` (default 120) and `--poll-interval` (default 2) are in @@ -62,7 +65,8 @@ A yellow spinner precedes `Graph .......... Running`, with `Running` in green. As status snapshots arrive, the line shows the currently running node titles (or multiple titles for parallel nodes). Short-lived nodes may finish between polls. Set `NO_COLOR` to disable colors. Progress goes to stderr; stdout remains JSON. -Redirected progress uses a single plain-text line. +Finished nodes remain on separate stderr lines with their final status before +the JSON results appear. Redirected progress uses plain text without animation. Other commands include `get`, `published`, and `versions`. Use `--help` on any command. Node discovery and execution monitoring are available through the Python API. diff --git a/src/subfork/cli.py b/src/subfork/cli.py index bdd5a68..70168b4 100644 --- a/src/subfork/cli.py +++ b/src/subfork/cli.py @@ -23,7 +23,14 @@ def execution_status(graph_name: str) -> Iterator[Callable[[Dict[str, Any]], Non label = "Graph " + graph_name status = "Running" titles: Dict[str, str] = {} + reported: Dict[str, str] = {} + name_width = len(label) stopped = threading.Event() + completed_marker = "✓" + try: + completed_marker.encode(stream.encoding or "ascii") + except UnicodeError: + completed_marker = "+" frames = "⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏" try: frames.encode(stream.encoding or "ascii") @@ -32,7 +39,7 @@ def execution_status(graph_name: str) -> Iterator[Callable[[Dict[str, Any]], Non def update(snapshot: Dict[str, Any]) -> None: """Replace the display state with active node titles from a snapshot.""" - nonlocal label, status + nonlocal label, status, name_width definition = snapshot.get("definition") or {} for node in definition.get("nodes", []): titles[node["node_instance_id"]] = node.get("title") or node["node_instance_id"] @@ -41,6 +48,43 @@ def update(snapshot: Dict[str, Any]) -> None: titles.get(key, key) for key, node in nodes.items() if node.get("status") == "running" ] with lock: + name_width = max( + [name_width] + + [len("Node " + title) for title in titles.values()] + + [len("Node " + key) for key in nodes if key not in titles] + ) + for key, node in nodes.items(): + outcome = node.get("status") + if outcome not in { + "completed", + "failed", + "canceled", + "cancelled", + "skipped", + "outcome_unknown", + }: + continue + if reported.get(key) == outcome: + continue + reported[key] = outcome + state = "Canceled" if outcome == "cancelled" else outcome.replace("_", " ").title() + name = "Node " + titles.get(key, key) + if terminal: + stream.write( + "\r\033[2K" + + format_line( + completed_marker if outcome == "completed" else "-", name, state + ) + + "\n" + ) + else: + stream.write( + format_line( + completed_marker if outcome == "completed" else "-", name, state + ) + + "\n" + ) + stream.flush() label = ( ("Node " if len(active) == 1 else "Nodes ") + ", ".join(active) if active @@ -52,25 +96,30 @@ def update(snapshot: Dict[str, Any]) -> None: else str(snapshot.get("status", "running")).replace("_", " ").title() ) - def render(index: int) -> None: - """Draw one width-limited line with a yellow spinner and green run status.""" - with lock: - name = "".join(char if char.isprintable() else " " for char in label) - state = "".join(char if char.isprintable() else " " for char in status) + def format_line(frame: str, name: str, state: str) -> str: + """Format a width-limited progress row without splitting color escapes.""" + name = "".join(char if char.isprintable() else " " for char in name) + state = "".join(char if char.isprintable() else " " for char in state) width = max(1, shutil.get_terminal_size().columns - 1) - name = name[: max(0, width - len(state) - 7)] - dots = "." * max(3, min(10, width - len(name) - len(state) - 4)) - frame = frames[index % len(frames)] + # Reserve space for the longest status so different outcomes align too. + status_column = min(name_width + 14, max(7, width - len("Outcome Unknown"))) + name = name[: max(0, status_column - 7)] + dots = "." * max(3, status_column - len(name) - 4) plain = "{} {} {} {}".format(frame, name, dots, state) if len(plain) > width: - line = plain[:width] - elif os.environ.get("NO_COLOR"): - line = plain - else: - colored_state = "\033[32m" + state + "\033[0m" if state == "Running" else state - line = "\033[33m{}\033[0m {} {} {}".format(frame, name, dots, colored_state) - stream.write("\r\033[2K" + line) - stream.flush() + return plain[:width] + if not terminal or os.environ.get("NO_COLOR"): + return plain + color = "32" if state in {"Running", "Completed"} else "31" if state == "Failed" else "33" + colored_state = "\033[" + color + "m" + state + "\033[0m" + marker_color = "32" if state == "Completed" else "33" + return "\033[{}m{}\033[0m {} {} {}".format(marker_color, frame, name, dots, colored_state) + + def render(index: int) -> None: + """Draw the active row without interleaving retained completion lines.""" + with lock: + stream.write("\r\033[2K" + format_line(frames[index % len(frames)], label, status)) + stream.flush() def animate() -> None: """Refresh the spinner independently of network requests and polling.""" @@ -122,6 +171,9 @@ def build_parser() -> argparse.ArgumentParser: child.add_argument("--comment", default="") elif command == "execute": child.add_argument("--version", default="draft") + child.add_argument( + "-o", "--out", help="Write result JSON to a new file instead of stdout" + ) child.add_argument( "--no-wait", action="store_true", help="Return submission status immediately" ) @@ -205,13 +257,14 @@ def graph_command(client: Subfork, args: argparse.Namespace) -> Any: ): raise ValueError("Wait timeout and poll interval must be positive finite numbers.") result = graphs.execute(args.graph_id, version=args.version, inputs=inputs) - if not args.no_wait and result.get("status") not in { + terminal_statuses = { "completed", "failed", "canceled", "cancelled", "outcome_unknown", - }: + } + if not args.no_wait: execution_id = result.get("id") or result.get("execution_id") if not isinstance(execution_id, str) or not execution_id: raise ValueError( @@ -225,12 +278,13 @@ def graph_command(client: Subfork, args: argparse.Namespace) -> Any: graph_name if isinstance(graph_name, str) else args.graph_id ) as update: update(result) - result = client.executions.wait( - execution_id, - timeout=args.wait_timeout, - poll_interval=args.poll_interval, - on_update=update, - ) + if result.get("status") not in terminal_statuses: + result = client.executions.wait( + execution_id, + timeout=args.wait_timeout, + poll_interval=args.poll_interval, + on_update=update, + ) return result @@ -242,6 +296,9 @@ def main(argv: Optional[Sequence[str]] = None) -> int: """ args = build_parser().parse_args(argv) try: + result_file = getattr(args, "out", None) + if result_file is not None and Path(result_file).exists(): + raise ValueError("Output file already exists; choose a new path.") with Subfork(base_url=args.base_url, timeout=args.timeout) as client: result = graph_command(client, args) failed = args.command == "execute" and result.get("status") in { @@ -261,11 +318,13 @@ def main(argv: Optional[Sequence[str]] = None) -> int: display = result.get("outputs", {}) rendered = json.dumps(display, indent=2, ensure_ascii=False) + "\n" output = getattr(args, "output", "-") - if output == "-": + if result_file is None and output == "-": sys.stdout.write(rendered) else: - # Exclusive creation avoids silently overwriting a local definition. - with Path(output).open("x", encoding="utf-8", newline="\n") as stream: + # Exclusive creation avoids silently overwriting an existing file. + with Path(result_file if result_file is not None else output).open( + "x", encoding="utf-8", newline="\n" + ) as stream: stream.write(rendered) if failed: print( diff --git a/tests/test_cli.py b/tests/test_cli.py index 71750c4..943c4a1 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -2,6 +2,7 @@ import io import json +import re from pathlib import Path from typing import Any @@ -260,3 +261,91 @@ def write(self, value: str) -> int: assert "\033[33m" in terminal.getvalue() assert "\033[32mRunning\033[0m" in terminal.getvalue() assert not any(thread.name == "subfork-spinner" for thread in threading.enumerate()) + + +@pytest.mark.parametrize("terminal", [False, True]) +def test_retained_node_outcomes( + monkeypatch: pytest.MonkeyPatch, capsys: Any, terminal: bool +) -> None: + """Retain each terminal node once, including nodes that finish between polls.""" + + class ProgressStream(io.StringIO): + """Capture either terminal or redirected progress.""" + + def isatty(self) -> bool: + """Select the requested output mode.""" + return terminal + + stream = ProgressStream() + monkeypatch.setattr("sys.stderr", stream) + monkeypatch.setenv("TERM", "xterm") + monkeypatch.setenv("NO_COLOR", "1") + snapshot = { + "status": "failed", + "definition": { + "nodes": [ + {"node_instance_id": "a", "title": "Fetch"}, + {"node_instance_id": "b", "title": "Parse"}, + {"node_instance_id": "c", "title": "Save"}, + ] + }, + "node_executions": { + "a": {"status": "completed"}, + "b": {"status": "failed"}, + "c": {"status": "canceled"}, + }, + } + with cli.execution_status("Pipeline") as update: + update(snapshot) + update(snapshot) + output = stream.getvalue() + for name, outcome in (("Fetch", "Completed"), ("Parse", "Failed"), ("Save", "Canceled")): + assert len(re.findall(r"Node " + name + r" \.+ " + outcome + r"\n", output)) == 1 + assert capsys.readouterr().out == "" + + +def test_node_status_columns_align(monkeypatch: pytest.MonkeyPatch) -> None: + """Pad different node names so terminal outcomes start in the same column.""" + stream = io.StringIO() + monkeypatch.setattr("sys.stderr", stream) + with cli.execution_status("Demo") as update: + update( + { + "node_executions": { + "A": {"status": "completed"}, + "Longer node name": {"status": "failed"}, + "Mid": {"status": "canceled"}, + } + } + ) + lines = stream.getvalue().splitlines()[1:] + columns = [line.index(state) for line, state in zip(lines, ["Completed", "Failed", "Canceled"])] + assert len(columns) == 3 + assert len(set(columns)) == 1 + + +@pytest.mark.parametrize("flag", ["-o", "--out"]) +@pytest.mark.parametrize("mode", [None, "--raw", "--no-wait"]) +def test_execute_result_file( + requests: list, tmp_path: Path, capsys: Any, flag: str, mode: Any +) -> None: + """Route results exclusively to a file and reject overwrites before submission.""" + output = tmp_path / "result.json" + arguments = ["execute", "g_test", flag, str(output)] + if mode: + arguments.append(mode) + assert cli.main(arguments) == 0 + value = json.loads(output.read_text()) + assert value == ( + {"id": "test", "status": "completed"} + if mode == "--raw" + else {"execution_id": "test", "status": "completed"} if mode == "--no-wait" else {} + ) + assert capsys.readouterr().out == "" + count = len(requests) + assert cli.main(arguments) == 1 + assert len(requests) == count + assert json.loads(output.read_text()) == value + captured = capsys.readouterr() + assert captured.out == "" + assert "already exists" in captured.err From 94a8a99c762c96a7cbd78861ec8ff487dfa252b3 Mon Sep 17 00:00:00 2001 From: Ryan Galloway Date: Tue, 29 Sep 2026 06:16:14 -0700 Subject: [PATCH 09/14] Clarify API errors and add explicit output overwrite support --- README.md | 34 ++++----------------- src/subfork/cli.py | 46 ++++++++++++++++++++++------- src/subfork/client.py | 26 +++++++++++++++- tests/test_cli.py | 69 +++++++++++++++++++++++++++++++++++++++++++ tests/test_client.py | 31 ++++++++++++++++++- 5 files changed, 165 insertions(+), 41 deletions(-) diff --git a/README.md b/README.md index c17cb70..0207dd8 100644 --- a/README.md +++ b/README.md @@ -35,44 +35,22 @@ The client reads `SUBFORK_API_KEY` and connects to [subfork.com](https://subfork ## Command line -The package also installs `subfork` (or use `python -m subfork`). It reads -`SUBFORK_API_KEY` from your environment and prints JSON for use in scripts. +The package includes a `subfork` CLI that uses your `SUBFORK_API_KEY`. ```bash subfork list subfork export GRAPH_ID --output graph.json subfork validate graph.json subfork create graph.json --name "My new graph" -subfork interface GRAPH_ID subfork publish GRAPH_ID --version v1 -subfork execute GRAPH_ID --version v1 --inputs inputs.json +subfork execute GRAPH_ID --version v1 subfork execute GRAPH_ID -o results.json ``` -Export writes a graph's draft definition, which can be passed directly to create. -It refuses to overwrite an existing file; omit `--output` to print to stdout. -Descriptions, tags, and published versions are not included in the export. -JSON input files must contain an object; use `-` to read from stdin. -Create makes a public draft, publish creates an immutable version, and execute -waits for completion and prints the graph outputs. Runs consume account quota. -Use `-o results.json` or `--out results.json` to write result JSON to a new file -instead of stdout. Progress still goes to stderr. Existing files are not overwritten. -Use `execute --no-wait` for a submission summary or `execute --raw` for the full -execution snapshot. Waiting requires read and run scopes; submission alone requires -run scope. `--wait-timeout` (default 120) and `--poll-interval` (default 2) are in -seconds. A timeout stops waiting without canceling the remote run. -A yellow spinner precedes `Graph .......... Running`, with `Running` in -green. As status snapshots arrive, the line shows the currently running node titles -(or multiple titles for parallel nodes). Short-lived nodes may finish between polls. -Set `NO_COLOR` to disable colors. Progress goes to stderr; stdout remains JSON. -Finished nodes remain on separate stderr lines with their final status before -the JSON results appear. Redirected progress uses plain text without animation. - -Other commands include `get`, `published`, and `versions`. Use `--help` on any -command. Node discovery and execution monitoring are available through the Python API. - -Errors go to stderr. Operational errors and failed validation return exit code 1; -usage errors return 2. Failed executions and wait timeouts also return exit code 1. +`execute` waits for completion and returns JSON. Use `-o` to save results to a +file; progress stays on stderr. Add `-f` / `--force` to overwrite existing output +files with `execute` or `export`. Run `subfork --help` or `subfork execute --help` +for more options. ## Create and run a graph diff --git a/src/subfork/cli.py b/src/subfork/cli.py index 70168b4..e982bc0 100644 --- a/src/subfork/cli.py +++ b/src/subfork/cli.py @@ -11,7 +11,15 @@ from pathlib import Path from typing import Any, Callable, Dict, Iterator, Optional, Sequence -from . import AuthenticationError, ExecutionTimeout, Subfork, SubforkError, __version__ +from . import APIError, AuthenticationError, ExecutionTimeout, Subfork, SubforkError, __version__ + + +def print_api_error(status_code: int, message: str) -> None: + """Write a concise API diagnostic, coloring only the status code on terminals.""" + code = str(status_code) + if sys.stderr.isatty() and os.environ.get("TERM") != "dumb" and not os.environ.get("NO_COLOR"): + code = "\033[33m" + code + "\033[0m" + print("{}: {}".format(code, message), file=sys.stderr) @contextmanager @@ -161,6 +169,10 @@ def build_parser() -> argparse.ArgumentParser: for command in ("get", "versions", "interface", "export", "publish", "execute"): child = commands.add_parser(command) child.add_argument("graph_id") + if command in {"export", "execute"}: + child.add_argument( + "-f", "--force", action="store_true", help="Overwrite an existing output file" + ) if command == "export": child.add_argument( "--output", default="-", help="Definition JSON path, or - for stdout" @@ -171,9 +183,7 @@ def build_parser() -> argparse.ArgumentParser: child.add_argument("--comment", default="") elif command == "execute": child.add_argument("--version", default="draft") - child.add_argument( - "-o", "--out", help="Write result JSON to a new file instead of stdout" - ) + child.add_argument("-o", "--out", help="Write result JSON to a file instead of stdout") child.add_argument( "--no-wait", action="store_true", help="Return submission status immediately" ) @@ -297,8 +307,15 @@ def main(argv: Optional[Sequence[str]] = None) -> int: args = build_parser().parse_args(argv) try: result_file = getattr(args, "out", None) - if result_file is not None and Path(result_file).exists(): - raise ValueError("Output file already exists; choose a new path.") + force = getattr(args, "force", False) + export_file = getattr(args, "output", "-") + destination = ( + result_file + if result_file is not None + else (export_file if export_file != "-" else None) + ) + if destination is not None and Path(destination).exists() and not force: + raise ValueError("Output file already exists; use --force to overwrite.") with Subfork(base_url=args.base_url, timeout=args.timeout) as client: result = graph_command(client, args) failed = args.command == "execute" and result.get("status") in { @@ -321,9 +338,9 @@ def main(argv: Optional[Sequence[str]] = None) -> int: if result_file is None and output == "-": sys.stdout.write(rendered) else: - # Exclusive creation avoids silently overwriting an existing file. + # Open only after the request and serialization succeed. with Path(result_file if result_file is not None else output).open( - "x", encoding="utf-8", newline="\n" + "w" if force else "x", encoding="utf-8", newline="\n" ) as stream: stream.write(rendered) if failed: @@ -344,14 +361,21 @@ def main(argv: Optional[Sequence[str]] = None) -> int: ) return 1 except AuthenticationError: - print( - "subfork: authentication failed (HTTP 401). Check that SUBFORK_API_KEY " + print_api_error( + 401, + "Authentication failed. Check that SUBFORK_API_KEY " "is an active key issued by the service selected with --base-url or " "SUBFORK_BASE_URL (default: https://subfork.com). " "The CLI reads exported environment variables; it does not load .env files.", - file=sys.stderr, ) return 1 + except APIError as exc: + message = str(exc) + prefix = "Subfork API returned HTTP {}.".format(exc.status_code) + if message.startswith(prefix): + message = message[len(prefix) :].strip() or "API request failed." + print_api_error(exc.status_code, message) + return 1 except (SubforkError, ValueError, OSError) as exc: print("subfork: {}".format(exc), file=sys.stderr) return 1 diff --git a/src/subfork/client.py b/src/subfork/client.py index 79aa0b5..d3209a3 100644 --- a/src/subfork/client.py +++ b/src/subfork/client.py @@ -4,6 +4,7 @@ import math import os +import re from types import TracebackType from typing import Any, Optional, Type @@ -22,6 +23,29 @@ from .resources import Executions, Graphs, Nodes +def _error_message(response: httpx.Response) -> str: + """Translate recognized server errors into fixed, credential-safe guidance.""" + message = "Subfork API returned HTTP %s." % response.status_code + if response.status_code != 409: + return message + try: + payload = response.json() + except ValueError: + return message + detail = payload.get("detail") if isinstance(payload, dict) else None + if isinstance(detail, str) and re.fullmatch( + r"Graph secret '[^\r\n]*' could not be decrypted\. The server encryption " + r"key may have changed; re-enter this secret in Graph Settings\.", + detail, + ): + return ( + message + " A stored graph secret could not be decrypted. " + "The server encryption key may have changed. " + "Re-enter and save the affected secret in Graph Settings > Secrets, then retry." + ) + return message + + class Subfork: """Manage authenticated HTTP requests and graph resources. @@ -110,7 +134,7 @@ def _request(self, method: str, path: str, **kwargs: Any) -> Any: } # Fixed messages avoid reflecting secrets from an untrusted response. raise errors.get(response.status_code, APIError)( - "Subfork API returned HTTP %s." % response.status_code, + _error_message(response), status_code=response.status_code, retry_after=response.headers.get("retry-after"), ) diff --git a/tests/test_cli.py b/tests/test_cli.py index 943c4a1..58dd78e 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -349,3 +349,72 @@ def test_execute_result_file( captured = capsys.readouterr() assert captured.out == "" assert "already exists" in captured.err + + +@pytest.mark.parametrize( + "terminal,no_color,colored", [(True, False, True), (True, True, False), (False, False, False)] +) +def test_api_error_display( + monkeypatch: pytest.MonkeyPatch, terminal: bool, no_color: bool, colored: bool +) -> None: + """Color only the error code and omit redundant API and program prefixes.""" + + class ErrorStream(io.StringIO): + """Capture diagnostics with configurable terminal detection.""" + + def isatty(self) -> bool: + """Return the selected terminal mode.""" + return terminal + + def factory(**kwargs: Any) -> Subfork: + """Raise the SDK's safe conflict explanation.""" + from subfork import APIError + + raise APIError( + "Subfork API returned HTTP 409. A stored graph secret could not be decrypted.", + status_code=409, + ) + + stream = ErrorStream() + monkeypatch.setattr("sys.stderr", stream) + monkeypatch.setattr(cli, "Subfork", factory) + monkeypatch.setenv("TERM", "xterm") + monkeypatch.setenv("NO_COLOR", "1" if no_color else "") + assert cli.main(["list"]) == 1 + code = "\033[33m409\033[0m" if colored else "409" + assert stream.getvalue() == code + ": A stored graph secret could not be decrypted.\n" + + +@pytest.mark.parametrize("flag", ["-f", "--force"]) +@pytest.mark.parametrize("command,option", [("execute", "-o"), ("export", "--output")]) +def test_force_output( + requests: list, tmp_path: Path, capsys: Any, flag: str, command: str, option: str +) -> None: + """Replace the whole output file only when explicitly requested.""" + output = tmp_path / "existing.json" + output.write_text("previous result with extra trailing content") + assert cli.main([command, "g_test", option, str(output), flag]) == 0 + assert json.loads(output.read_text()) == ( + {} if command == "execute" else {"name": "Greeting", "nodes": [], "edges": []} + ) + assert capsys.readouterr().out == "" + + +def test_force_preserves_output_on_api_failure( + monkeypatch: pytest.MonkeyPatch, tmp_path: Path +) -> None: + """Keep the previous result if execution submission fails.""" + + def factory(**kwargs: Any) -> Subfork: + """Construct a client that receives a server conflict.""" + return Subfork( + "synthetic-key", + transport=httpx.MockTransport(lambda request: httpx.Response(409)), + **kwargs, + ) + + monkeypatch.setattr(cli, "Subfork", factory) + output = tmp_path / "existing.json" + output.write_text("previous result") + assert cli.main(["execute", "g_test", "-o", str(output), "--force"]) == 1 + assert output.read_text() == "previous result" diff --git a/tests/test_client.py b/tests/test_client.py index 6617216..49b0737 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -1,7 +1,7 @@ """Exercise client contracts without network access or real credentials.""" import json -from typing import Type +from typing import Any, Type import httpx import pytest @@ -68,6 +68,7 @@ def test_credentials_required(monkeypatch: pytest.MonkeyPatch) -> None: [ (401, AuthenticationError), (403, PermissionDeniedError), + (409, APIError), (422, ValidationError), (429, RateLimitError), (503, APIError), @@ -200,3 +201,31 @@ def test_wait_reports_snapshots() -> None: result = client.executions.wait("e_test", poll_interval=0.001, on_update=snapshots.append) assert [snapshot["status"] for snapshot in snapshots] == ["running", "completed"] assert result == snapshots[-1] + + +@pytest.mark.parametrize( + "detail,recognized", + [ + ( + "Graph secret '" + + KEY + + "' could not be decrypted. The server encryption key may have changed; re-enter this secret in Graph Settings.", + True, + ), + (KEY, False), + ({"secret": KEY}, False), + (None, False), + ], +) +def test_decryption_error_guidance(detail: Any, recognized: bool) -> None: + """Explain known conflicts without echoing even the server-provided secret name.""" + with Subfork( + KEY, + transport=httpx.MockTransport(lambda request: httpx.Response(409, json={"detail": detail})), + ) as client: + with pytest.raises(APIError) as caught: + client.graphs.execute("g_test") + message = str(caught.value) + assert caught.value.status_code == 409 + assert KEY not in message + assert ("Graph Settings > Secrets" in message) is recognized From e722d3785c4db6306ec38da2be44fdb982f323cb Mon Sep 17 00:00:00 2001 From: Ryan Galloway Date: Tue, 29 Sep 2026 06:26:51 -0700 Subject: [PATCH 10/14] Add public documentation and MkPages deployment workflow --- .github/workflows/pages.yml | 59 ++++++++++++++++++++++ .gitignore | 5 ++ CONTRIBUTING.md | 17 +++++++ README.md | 7 +++ docs/assets/subfork-banner.png | Bin 0 -> 216016 bytes docs/cli.md | 71 ++++++++++++++++++++++++++ docs/examples.md | 71 ++++++++++++++++++++++++++ docs/index.md | 25 +++++++++ docs/installation.md | 47 +++++++++++++++++ docs/mkpages.yml | 20 ++++++++ docs/troubleshooting.md | 41 +++++++++++++++ docs/usage.md | 89 +++++++++++++++++++++++++++++++++ requirements-docs.txt | 1 + 13 files changed, 453 insertions(+) create mode 100644 .github/workflows/pages.yml create mode 100644 docs/assets/subfork-banner.png create mode 100644 docs/cli.md create mode 100644 docs/examples.md create mode 100644 docs/index.md create mode 100644 docs/installation.md create mode 100644 docs/mkpages.yml create mode 100644 docs/troubleshooting.md create mode 100644 docs/usage.md create mode 100644 requirements-docs.txt diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml new file mode 100644 index 0000000..0d835ba --- /dev/null +++ b/.github/workflows/pages.yml @@ -0,0 +1,59 @@ +name: Pages + +on: + push: + branches: [master] + pull_request: + workflow_dispatch: + +permissions: + contents: read + +concurrency: + group: pages-${{ github.ref }} + cancel-in-progress: true + +jobs: + build: + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: "3.12" + cache: pip + cache-dependency-path: requirements-docs.txt + - name: Install MkPages + run: python -m pip install --requirement requirements-docs.txt + - name: Generate Jekyll source + run: >- + mkpages build docs --output .mkpages + --url "https://subforkdev.github.io" + --baseurl "/subfork-python" + - name: Build site + uses: actions/jekyll-build-pages@v1 + with: + source: ./.mkpages + destination: ./_site + - name: Upload Pages artifact + uses: actions/upload-pages-artifact@v3 + with: + path: ./_site + + deploy: + if: github.event_name != 'pull_request' && github.ref == 'refs/heads/master' + needs: build + runs-on: ubuntu-latest + permissions: + pages: write + id-token: write + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + - name: Configure Pages + uses: actions/configure-pages@v5 + - name: Deploy Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/.gitignore b/.gitignore index f16f15a..5a6ccce 100644 --- a/.gitignore +++ b/.gitignore @@ -49,3 +49,8 @@ Thumbs.db Desktop.ini .codex/ .agents/ + +# Generated documentation site +.mkpages/ +_site/ +.jekyll-cache/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e9d18d7..ac65a6f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -34,3 +34,20 @@ retain `Any` values because node parameters and server response fields are dynam this release does not pretend to provide complete generated response models. Mypy checks library signatures and bodies; Flake8 and formatting cover both the library and tests. Runtime tests continue to cover Python 3.8 in CI. + +## Documentation site + +Public documentation lives in `docs/`. Its `mkpages.yml` selects the dark theme. +To generate the Jekyll source with Python 3.12: + +```bash +python -m pip install -r requirements-docs.txt +mkpages build docs --output .mkpages +mkpages preview docs/ +``` + +The Pages workflow builds pull requests and deploys `master`. In repository +**Settings → Pages**, select **GitHub Actions** as the source. The initial site +URL is `https://subforkdev.github.io/subfork-python/`; the workflow supplies its +`--url` and `--baseurl` options. Update those if a custom domain is configured. +Preview serves the documentation at `http://127.0.0.1:4000/`. diff --git a/README.md b/README.md index 0207dd8..79a0713 100644 --- a/README.md +++ b/README.md @@ -118,6 +118,13 @@ cancel the remote run; use `executions.cancel(execution_id)` to request cancella The client does not automatically retry requests. After a `TransportError`, check remote state before repeating a create, publish, or execute request. +## Documentation + +See the [documentation](docs/index.md) for installation, Python usage, CLI options, +and examples. Browse [Subfork Examples](https://examples.subfork.com) and the +[subfork-examples repository](https://github.com/subforkdev/subfork-examples) for +graphs to learn from and reuse. + ## Contributing See [CONTRIBUTING.md](CONTRIBUTING.md) for development and code-quality checks. diff --git a/docs/assets/subfork-banner.png b/docs/assets/subfork-banner.png new file mode 100644 index 0000000000000000000000000000000000000000..2172a9c7e9541616dcfce6821b543dbd317165f4 GIT binary patch literal 216016 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%0A=bdP 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 literal 0 HcmV?d00001 diff --git a/docs/cli.md b/docs/cli.md new file mode 100644 index 0000000..077144e --- /dev/null +++ b/docs/cli.md @@ -0,0 +1,71 @@ +# Command line + +The `subfork` command uses the same `SUBFORK_API_KEY` as the Python client. +You can also invoke it with `python -m subfork`. + +## Find and reuse graphs + +```bash +subfork list +subfork get GRAPH_ID +subfork published +subfork versions GRAPH_ID +subfork interface GRAPH_ID +subfork export GRAPH_ID --output graph.json +``` + +Export writes the draft definition, ready for `create`. It does not include +published versions, tags, or the separate graph description. + +## Create and publish + +```bash +subfork validate graph.json +subfork create graph.json --name "My graph" +subfork publish GRAPH_ID --version v1 +``` + +Replace `GRAPH_ID` with the ID returned by `create`. Definitions must be JSON +objects; use `-` instead of a filename to read from stdin. For example files from +the community repository, see [loading an example](examples.md#load-a-community-example). + +## Execute + +```bash +subfork execute GRAPH_ID +subfork execute GRAPH_ID --version v1 --inputs inputs.json +subfork execute GRAPH_ID -o results.json +subfork execute GRAPH_ID -o results.json --force +``` + +Execution waits for completion and prints JSON outputs. `-o` / `--out` writes +results to a file instead of stdout. Use `-f` / `--force` to overwrite an existing +file; this flag also works with `export`. + +A yellow spinner shows active nodes. Finished nodes remain on stderr with their +final status. JSON results stay on stdout, so piping works normally: + +```bash +subfork execute GRAPH_ID > results.json +``` + +| Option | Behavior | +| --- | --- | +| `--no-wait` | Return the submission ID and status immediately | +| `--raw` | Return the full execution snapshot | +| `--wait-timeout 300` | Wait up to 300 seconds; the default is 120 | +| `--poll-interval 1` | Poll every second; the default is 2 | + +A timeout or interruption does not cancel the remote run. Set `NO_COLOR=1` to +disable colors. Redirected stderr uses plain text without animation. + +## Help and exit codes + +```bash +subfork --help +subfork execute --help +``` + +Exit code `0` means success, `1` means an operational error, failed validation, +unsuccessful execution, or wait timeout, and `2` means invalid command usage. +Interrupted execution returns `130`. diff --git a/docs/examples.md b/docs/examples.md new file mode 100644 index 0000000..e0a81a1 --- /dev/null +++ b/docs/examples.md @@ -0,0 +1,71 @@ +# Examples + +Explore [examples.subfork.com](https://examples.subfork.com) for graphs covering +AI, data pipelines, dashboards, media, and more. Download definitions and read +their notes in the [subfork-examples repository](https://github.com/subforkdev/subfork-examples). +It's also the place to contribute examples for other builders. + +## Hello from Python + +This graph returns a string. It requires read, write, and run scopes. + +```python +from subfork import Subfork + +name = "Python greeting" +definition = { + "name": name, + "nodes": [{ + "node_instance_id": "hello", + "node_id": "n_text_value", + "node_version": "1.0.0", + "title": "Hello", + "params": {"text": "Hello from Python"}, + }], + "edges": [], + "graph_outputs": { + "text": {"node_instance_id": "hello", "output_name": "text"}, + }, +} + +with Subfork() as client: + graph = client.graphs.create(name=name, definition=definition) + execution = client.graphs.execute(graph["id"]) + result = client.executions.wait(execution["id"]) + print(result["status"], result.get("outputs")) +``` + +This creates a public graph and uses execution quota. To publish a reusable +version, call `client.graphs.publish(graph["id"], version="v1")` with publish scope. + +## Load a community example + +Download a `*.subfork.json` file from the examples repository and read its +adjacent `*.notes.md` file for required inputs, secrets, and provider setup. +These exports wrap the graph definition in a `definition` field: + +```python +import json +from subfork import Subfork + +with open("example.subfork.json", encoding="utf-8") as stream: + exported = json.load(stream) +definition = exported["definition"] + +with Subfork() as client: + validation = client.graphs.validate(definition) + if not validation.get("valid", False): + raise ValueError(validation) + graph = client.graphs.create( + name=definition.get("name", "Imported example"), + description=definition.get("description", ""), + definition=definition, + ) + print(graph["id"]) +``` + +Configure any required secrets in the graph's settings before executing it. +The CLI accepts a raw definition, so extract `exported["definition"]` to a JSON +file before using `subfork create`. CLI exports already use that raw format. + +Browse the [example catalog](https://examples.subfork.com) to choose your next graph. diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..f9eed20 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,25 @@ +![Subfork](assets/subfork-banner.png) + +# Subfork Python + +Create, publish, and run [Subfork](https://subfork.com) graphs from Python or your terminal. + +```bash +pip install subfork +``` + +Start with [installation and authentication](installation.md), then follow the +[Python guide](usage.md) or [command-line guide](cli.md). + +## Find your next graph + +Browse [Subfork Examples](https://examples.subfork.com) for ready-made graphs covering +data pipelines, dashboards, AI, media, and more. The +[subfork-examples repository](https://github.com/subforkdev/subfork-examples) contains +the graph files and notes you can learn from, adapt, and contribute to. + +Our [examples guide](examples.md) shows how to run your first graph and load a +community example with Python. + +[Source code](https://github.com/subforkdev/subfork-python) · +[Report an issue](https://github.com/subforkdev/subfork-python/issues) diff --git a/docs/installation.md b/docs/installation.md new file mode 100644 index 0000000..c8da813 --- /dev/null +++ b/docs/installation.md @@ -0,0 +1,47 @@ +# Installation + +Requires Python 3.8 or later. + +```bash +pip install subfork +``` + +This installs the Python package and the `subfork` command. Both connect to +[subfork.com](https://subfork.com). + +## Set your API key + +Create a key in **Account → API keys**, then set it in your environment: + +```bash +export SUBFORK_API_KEY="your-api-key" +subfork list +``` + +The client reads exported environment variables; it does not load `.env` files +automatically. Keep your key out of source files and graph definitions. + +## Choose permissions + +| Scope | Allows | +| --- | --- | +| `graphs:read` | Read accessible graphs, discover nodes, and inspect your executions | +| `graphs:write` | Create and update your graphs, and validate definitions | +| `graphs:run` | Execute your graphs and cancel your executions | +| `graphs:publish` | Publish versions of your graphs | + +The CLI's default execution workflow needs both read and run permissions because +it waits for the result. Keys act as their owning account; scopes do not grant +permission to modify other users' graphs. Public graphs can be read and reused. + +## Check the connection + +```python +from subfork import Subfork + +with Subfork() as client: + for graph in client.graphs.list(): + print(graph["id"], graph["name"]) +``` + +Continue with [Python usage](usage.md) or the [CLI](cli.md). diff --git a/docs/mkpages.yml b/docs/mkpages.yml new file mode 100644 index 0000000..1e70b59 --- /dev/null +++ b/docs/mkpages.yml @@ -0,0 +1,20 @@ +title: Subfork Python +description: Create, publish, and run Subfork graphs from Python and the command line. +theme: dark +navigation: + - label: Home + href: / + - label: Install + href: /installation/ + - label: Python + href: /usage/ + - label: CLI + href: /cli/ + - label: Examples + href: /examples/ + - label: Troubleshooting + href: /troubleshooting/ + - label: Example Catalog + href: https://examples.subfork.com + - label: GitHub + href: https://github.com/subforkdev/subfork-python diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md new file mode 100644 index 0000000..093730b --- /dev/null +++ b/docs/troubleshooting.md @@ -0,0 +1,41 @@ +# Troubleshooting + +## 401: authentication failed + +Check that `SUBFORK_API_KEY` is exported and is an active key from your Subfork +account. The client does not automatically read `.env` files. Create a replacement +under **Account → API keys** if the key has expired or been revoked. + +## 403: operation not permitted + +Check the key's scopes. Waiting for execution results needs `graphs:read` as well +as `graphs:run`. See [permissions](installation.md#choose-permissions). + +## 404: graph not found + +Check the graph ID and ownership. Reading a public graph does not give you +permission to modify, publish, or execute the original. Create your own copy first. + +## 409: graph secret cannot be decrypted + +Re-enter and save the affected secret in **Graph Settings → Secrets**, then retry. +This is a stored graph credential, separate from the key used by the Python +client. Other 409 responses can indicate a different execution setup conflict. + +## Output file already exists + +Use `-f` / `--force` to overwrite it: + +```bash +subfork execute GRAPH_ID -o results.json --force +``` + +## Execution timed out or failed + +A wait timeout stops the client from polling; the run may still be active. Use +`client.executions.get(execution_id)` to inspect it, or open the graph in Subfork. +Use `client.executions.cancel(execution_id)` if you want to cancel it. + +A terminal `failed` state is different from a timeout. Inspect the execution +snapshot or the graph's execution history for node errors. The CLI's `--raw` +option includes the full snapshot when submitting a run. diff --git a/docs/usage.md b/docs/usage.md new file mode 100644 index 0000000..c62bdef --- /dev/null +++ b/docs/usage.md @@ -0,0 +1,89 @@ +# Python usage + +Use `Subfork` as a context manager to close its HTTP connection when finished. +Responses are ordinary dictionaries and lists. + +```python +from subfork import Subfork + +with Subfork() as client: + graphs = client.graphs.list() + nodes = client.nodes.list() +``` + +## Create and publish + +Load a graph definition from JSON, validate it, and save a new graph: + +```python +import json +from subfork import Subfork + +with open("graph.json", encoding="utf-8") as stream: + definition = json.load(stream) + +with Subfork() as client: + validation = client.graphs.validate(definition) + if not validation.get("valid", False): + raise ValueError(validation) + graph = client.graphs.create(name="My graph", definition=definition) + published = client.graphs.publish(graph["id"], version="v1") +``` + +Graphs are public. Publication creates an immutable version. To replace draft +content, use `client.graphs.update(graph_id, name=..., definition=..., description=...)`. +Supply the description you want to retain; omitting it clears the description. + +## Execute and wait + +```python +with Subfork() as client: + execution = client.graphs.execute(graph_id, version="v1", inputs={}) + result = client.executions.wait(execution["id"], timeout=120) + if result["status"] == "completed": + print(result["outputs"]) + else: + print("Execution ended:", result["status"]) +``` + +Replace `graph_id` with your graph ID and `inputs` with its named inputs. Omit +`version` to run the draft. Runs consume your account's execution quota. + +`execute()` submits immediately; `wait()` polls until a terminal state. You can +also call `executions.get(execution_id)` or `executions.cancel(execution_id)`. +A wait timeout stops polling without canceling the remote run. + +## Discover reusable graphs + +```python +with Subfork() as client: + catalog = client.graphs.published() + block = client.graphs.published_version(graph_id, "v1") + interface = client.graphs.interface(owned_graph_id) +``` + +Published graph versions include a composite node manifest for use in larger +graphs. Pin versions to keep later publications from changing your graph. +See [examples](examples.md) for complete definitions. + +## Handle errors + +```python +from subfork import APIError, ExecutionTimeout, Subfork + +try: + with Subfork() as client: + execution = client.graphs.execute(graph_id) + result = client.executions.wait(execution["id"]) +except APIError as error: + print(error.status_code, str(error)) +except ExecutionTimeout as error: + print("Still waiting for:", error.execution_id) +``` + +API errors include `AuthenticationError`, `PermissionDeniedError`, `NotFoundError`, +`ValidationError`, and `RateLimitError`. The client does not automatically retry +requests. After a `TransportError`, check remote state before submitting another +create, publish, or execute request. + +See [troubleshooting](troubleshooting.md) for common errors. diff --git a/requirements-docs.txt b/requirements-docs.txt new file mode 100644 index 0000000..c2e58c7 --- /dev/null +++ b/requirements-docs.txt @@ -0,0 +1 @@ +mkpages==0.4.1 From 3740bacab163363a056763eb33d96c7b6c22b658 Mon Sep 17 00:00:00 2001 From: Ryan Galloway Date: Tue, 29 Sep 2026 06:28:37 -0700 Subject: [PATCH 11/14] Move documentation dependencies into docs extra --- .github/workflows/pages.yml | 4 ++-- CONTRIBUTING.md | 2 +- pyproject.toml | 1 + requirements-docs.txt | 1 - 4 files changed, 4 insertions(+), 4 deletions(-) delete mode 100644 requirements-docs.txt diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index 0d835ba..7afb688 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -23,9 +23,9 @@ jobs: with: python-version: "3.12" cache: pip - cache-dependency-path: requirements-docs.txt + cache-dependency-path: pyproject.toml - name: Install MkPages - run: python -m pip install --requirement requirements-docs.txt + run: python -m pip install '.[docs]' - name: Generate Jekyll source run: >- mkpages build docs --output .mkpages diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ac65a6f..e8a742b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -41,7 +41,7 @@ Public documentation lives in `docs/`. Its `mkpages.yml` selects the dark theme. To generate the Jekyll source with Python 3.12: ```bash -python -m pip install -r requirements-docs.txt +python -m pip install -e '.[docs]' mkpages build docs --output .mkpages mkpages preview docs/ ``` diff --git a/pyproject.toml b/pyproject.toml index 6288916..c22f644 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -21,6 +21,7 @@ classifiers = [ subfork = "subfork.cli:main" [project.optional-dependencies] +docs = ["mkpages==0.4.1"] dev = [ "pytest>=8,<10", "build>=1,<2", diff --git a/requirements-docs.txt b/requirements-docs.txt deleted file mode 100644 index c2e58c7..0000000 --- a/requirements-docs.txt +++ /dev/null @@ -1 +0,0 @@ -mkpages==0.4.1 From 4610ed51534c1d70c2a3555e91c3c30c5468f6e0 Mon Sep 17 00:00:00 2001 From: Ryan Galloway Date: Tue, 29 Sep 2026 06:30:18 -0700 Subject: [PATCH 12/14] Add Python documentation URL to package metadata --- pyproject.toml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index c22f644..430e497 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -17,6 +17,9 @@ classifiers = [ "Typing :: Typed", ] +[project.urls] +Documentation = "https://python.subfork.com" + [project.scripts] subfork = "subfork.cli:main" From bd488a7d4970e98ecd115d964c71937c9d64c9de Mon Sep 17 00:00:00 2001 From: Ryan Galloway Date: Tue, 29 Sep 2026 06:33:35 -0700 Subject: [PATCH 13/14] Bump client version to 2.0.0 --- pyproject.toml | 2 +- src/subfork/__init__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 430e497..ce5da3a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "subfork" -version = "0.1.0a1" +version = "2.0.0" description = "Python API client for Subfork graph authoring and execution" readme = "README.md" license = {file = "LICENSE"} diff --git a/src/subfork/__init__.py b/src/subfork/__init__.py index 6c44599..b59ac78 100644 --- a/src/subfork/__init__.py +++ b/src/subfork/__init__.py @@ -14,7 +14,7 @@ ValidationError, ) -__version__ = "0.1.0a1" +__version__ = "2.0.0" __all__ = [ "Subfork", "SubforkError", From 040e4da2e6abf542cea32e94c2596d17a1c4b986 Mon Sep 17 00:00:00 2001 From: Ryan Galloway Date: Tue, 29 Sep 2026 06:36:21 -0700 Subject: [PATCH 14/14] Add synchronized version bump Make targets --- CONTRIBUTING.md | 14 ++++++++ Makefile | 29 ++++++++++++---- scripts/bump-version.py | 76 +++++++++++++++++++++++++++++++++++++++++ tests/test_version.py | 56 ++++++++++++++++++++++++++++++ 4 files changed, 168 insertions(+), 7 deletions(-) create mode 100644 scripts/bump-version.py create mode 100644 tests/test_version.py diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e8a742b..99fd037 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -35,6 +35,20 @@ this release does not pretend to provide complete generated response models. Mypy checks library signatures and bodies; Flake8 and formatting cover both the library and tests. Runtime tests continue to cover Python 3.8 in CI. +## Versioning + +```bash +make version # Show the current version +make check-version # Verify both version fields agree +make bump-patch # 2.0.0 -> 2.0.1 +make bump-minor # 2.0.0 -> 2.1.0 +make bump-major # 2.0.0 -> 3.0.0 +make bump-version VERSION=2.1.0 # Set an explicit stable version +``` + +Bumps update `pyproject.toml` and `subfork.__version__` together. They do not +commit, tag, or publish. Review and commit the changes before releasing. + ## Documentation site Public documentation lives in `docs/`. Its `mkpages.yml` selects the dark theme. diff --git a/Makefile b/Makefile index f488839..ef8ad4a 100644 --- a/Makefile +++ b/Makefile @@ -2,13 +2,13 @@ PYTHON ?= python .PHONY: format lint typecheck test check build format: - $(PYTHON) -m isort src tests - $(PYTHON) -m black src tests + $(PYTHON) -m isort src tests scripts + $(PYTHON) -m black src tests scripts lint: - $(PYTHON) -m black --check src tests - $(PYTHON) -m isort --check-only src tests - $(PYTHON) -m flake8 src tests + $(PYTHON) -m black --check src tests scripts + $(PYTHON) -m isort --check-only src tests scripts + $(PYTHON) -m flake8 src tests scripts typecheck: $(PYTHON) -m mypy @@ -16,8 +16,23 @@ typecheck: test: $(PYTHON) -m pytest -check: lint typecheck test +check: lint typecheck test check-version -build: +build: check-version $(PYTHON) -m build $(PYTHON) -m twine check dist/* + +.PHONY: version check-version bump-patch bump-minor bump-major bump-version +export VERSION + +version: + @$(PYTHON) scripts/bump-version.py --show + +check-version: + @$(PYTHON) scripts/bump-version.py --check + +bump-patch bump-minor bump-major: + @$(PYTHON) scripts/bump-version.py --bump $(@:bump-%=%) + +bump-version: + @$(PYTHON) scripts/bump-version.py --set diff --git a/scripts/bump-version.py b/scripts/bump-version.py new file mode 100644 index 0000000..c618130 --- /dev/null +++ b/scripts/bump-version.py @@ -0,0 +1,76 @@ +"""Keep package metadata and the public client version synchronized.""" + +import argparse +import os +import re +from pathlib import Path +from typing import Dict, Optional, Sequence, Tuple + +ROOT = Path(__file__).resolve().parents[1] +SEMVER = re.compile(r"(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)") + + +def version_files(root: Path) -> Tuple[str, Dict[Path, Tuple[str, re.Match]]]: + """Read both declarations and reject missing, invalid, or mismatched versions.""" + files = {} + versions = [] + for relative, pattern in ( + ("pyproject.toml", r'(?ms)^\[project\]\s*\n(?:(?!^\[).)*?^version = "([^"]+)"'), + ("src/subfork/__init__.py", r'(?m)^__version__ = "([^"]+)"'), + ): + path = root / relative + content = path.read_text(encoding="utf-8") + matches = list(re.finditer(pattern, content)) + if len(matches) != 1 or not SEMVER.fullmatch(matches[0].group(1)): + raise ValueError("Expected one stable x.y.z version in {}.".format(relative)) + files[path] = (content, matches[0]) + versions.append(matches[0].group(1)) + if versions[0] != versions[1]: + raise ValueError("Version drift between pyproject.toml and __version__; no files changed.") + return versions[0], files + + +def next_version(current: str, requested: str) -> str: + """Compute a stable release version, resetting lower components on major/minor bumps.""" + if SEMVER.fullmatch(requested): + return requested + major, minor, patch = map(int, current.split(".")) + if requested == "major": + return "{}.0.0".format(major + 1) + if requested == "minor": + return "{}.{}.0".format(major, minor + 1) + if requested == "patch": + return "{}.{}.{}".format(major, minor, patch + 1) + raise ValueError("Use major, minor, patch, or a stable x.y.z version.") + + +def main(argv: Optional[Sequence[str]] = None) -> int: + """Show, check, or update the version without committing or tagging a release.""" + parser = argparse.ArgumentParser(description=__doc__) + group = parser.add_mutually_exclusive_group(required=True) + group.add_argument("--show", action="store_true") + group.add_argument("--check", action="store_true") + group.add_argument("--bump", choices=("major", "minor", "patch")) + group.add_argument("--set", action="store_true", help="Read the explicit version from VERSION") + args = parser.parse_args(argv) + try: + current, files = version_files(ROOT) + if args.show or args.check: + print(current if args.show else "Version fields match: " + current) + return 0 + requested = os.environ.get("VERSION", "") if args.set else args.bump + if not requested: + raise ValueError("Usage: make bump-version VERSION=x.y.z") + version = next_version(current, requested) + for path, (content, match) in files.items(): + updated = content[: match.start(1)] + version + content[match.end(1) :] + if updated != content: + path.write_text(updated, encoding="utf-8") + print("{} -> {}".format(current, version)) + return 0 + except (OSError, ValueError) as error: + parser.exit(1, str(error) + "\n") + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tests/test_version.py b/tests/test_version.py new file mode 100644 index 0000000..c31decf --- /dev/null +++ b/tests/test_version.py @@ -0,0 +1,56 @@ +"""Exercise release targets in isolated copies without bumping this checkout.""" + +import shutil +import subprocess +from pathlib import Path + +import pytest + +ROOT = Path(__file__).resolve().parents[1] + + +@pytest.mark.parametrize( + "target,version", + [ + ("bump-patch", "2.3.5"), + ("bump-minor", "2.4.0"), + ("bump-major", "3.0.0"), + ("bump-version", "4.5.6"), + ("version", "2.3.4"), + ("check-version", "2.3.4"), + ], +) +def test_version_targets(tmp_path: Path, target: str, version: str) -> None: + """Run Make targets against a fixture and preserve unrelated metadata.""" + import sys + + (tmp_path / "scripts").mkdir() + (tmp_path / "src/subfork").mkdir(parents=True) + shutil.copy(ROOT / "Makefile", tmp_path) + shutil.copy(ROOT / "scripts/bump-version.py", tmp_path / "scripts") + project = tmp_path / "pyproject.toml" + init = tmp_path / "src/subfork/__init__.py" + project.write_text('[project]\nname = "subfork"\nversion = "2.3.4"\n') + init.write_text('__version__ = "2.3.4"\n') + result = subprocess.run( + ["make", target, "PYTHON=" + sys.executable, "VERSION=4.5.6"], + cwd=tmp_path, + capture_output=True, + text=True, + ) + assert result.returncode == 0, result.stderr + assert version in result.stdout + assert project.read_text() == '[project]\nname = "subfork"\nversion = "' + version + '"\n' + assert init.read_text() == '__version__ = "' + version + '"\n' + # A mismatch must fail before either file is changed. + init.write_text('__version__ = "9.9.9"\n') + before = project.read_text() + result = subprocess.run( + [sys.executable, "scripts/bump-version.py", "--bump", "patch"], + cwd=tmp_path, + capture_output=True, + text=True, + ) + assert result.returncode == 1 + assert project.read_text() == before + assert init.read_text() == '__version__ = "9.9.9"\n'