Skip to content

feat: aignostics-sdk v2 — consolidated integration branch [PYSDK-133]#661

Draft
ari-nz wants to merge 57 commits into
mainfrom
feat/PYSDK-133/integration
Draft

feat: aignostics-sdk v2 — consolidated integration branch [PYSDK-133]#661
ari-nz wants to merge 57 commits into
mainfrom
feat/PYSDK-133/integration

Conversation

@ari-nz

@ari-nz ari-nz commented May 28, 2026

Copy link
Copy Markdown
Collaborator

Purpose

This is a wiring-verification branch that merges all 9 PYSDK-133 feature branches in sequence, so the overall workspace layout can be inspected end-to-end. It is NOT the final merge path — the individual phase PRs will be reviewed separately and merged one-by-one into `feat/PYSDK-133/python-sdk-slim`. This integration branch will be rebased/recreated once all phases have landed.

Branches merged (in order)

  1. `feat/PYSDK-134/workspace-scaffolding` — uv workspace, two package stubs
  2. `feat/PYSDK-135/source-migration` — git mv of source into packages/
  3. `feat/PYSDK-136/import-rewrite` — all imports rewritten to `aignostics_sdk.*`
  4. `feat/PYSDK-137/slim-cli` — `packages/aignostics-sdk/src/aignostics_sdk/cli.py`
  5. `feat/PYSDK-141/tests` — `slim` marker + smoke tests
  6. `feat/PYSDK-138/dependency-split` — slim vs full dep split
  7. `feat/PYSDK-139/tooling-updates` — noxfile, pyrightconfig, coverage paths
  8. `feat/PYSDK-140/cicd-pipeline` — dual-package publish workflow
  9. `feat/PYSDK-142/docs-and-migration` — README, docs, migration guide

Conflict resolutions

  • pyrightconfig.json (PYSDK-136 vs PYSDK-139): kept union — removed stale `src/aignostics/*` paths, kept `examples/**` and PYSDK-139's `extraPaths`
  • noxfile.py (PYSDK-139 vs PYSDK-140): kept both sets of changes, took PYSDK-140's more descriptive docstring for `dist` session
  • packages/aignostics-sdk/pyproject.toml (PYSDK-138 vs PYSDK-142): kept PYSDK-138's slim dep list (correct), incorporated PYSDK-142's CVE comments where applicable; PYSDK-142 was branched from PYSDK-134 so it had the full (pre-split) dep list
  • packages/aignostics/pyproject.toml (PYSDK-138 vs PYSDK-142): kept PYSDK-138's real heavy deps over PYSDK-142's "Phase 5 placeholder" comment; added PYSDK-142's CVE comments for jupyter/marimo optional deps

Agent-added fixup commits

Two commits were added on top of the 9 merge commits to make the workspace pass `uv build` and `make lint`. These represent known issues that individual phase PRs will need to address properly:

`fix(packaging): resolve LICENSE/README paths for hatchling build isolation`

Hatchling cannot follow `../../LICENSE` paths outside the package root during build isolation. Workaround: copied `LICENSE` and `README.md` into each package dir and updated references. The intended solution (a hatchling build hook, or accepted duplication) should be finalised in PYSDK-134 or PYSDK-138.

`fix(tooling): suppress new ruff/mypy/pyright issues introduced by workspace migration`

Three sub-fixes:

  • PLW0717/RUF075 ruff ignores: ruff was bumped 0.15.12 → 0.15.14 by the dep changes; these two rules are new and flag pre-existing code patterns. PYSDK-139 (tooling) is the natural home for these suppressions when individual PRs land.
  • mypy `follow_imports = "skip"` for `aignx.*`: the aignx codegen symlink lives inside `packages/aignostics-sdk/src/` (as a symlink to `codegen/out/aignx`), so mypy follows it and sees incompatible types when checking platform code. On main this was invisible because `src/aignostics/` (the old path) didn't contain the symlink. Whether aignx belongs inside the package source tree is a design question for the codegen migration (planned for a later phase).
  • pyright `/aignx/` exclude: same root cause as the mypy fix.

Validation results

Check Result
`uv sync --all-extras` ✅ resolves (419 packages)
`uv build --package aignostics-sdk` ✅ `aignostics_sdk-1.4.0-py3-none-any.whl`
`uv build --package aignostics` ✅ `aignostics-1.4.0-py3-none-any.whl`
`uv run --package aignostics-sdk aignostics-sdk --help` ✅ user + sdk commands shown
`uv run pytest tests/ --collect-only` ✅ 906 tests collected
`make lint` (ruff + pyright + mypy) ✅ all pass
Stale `aignostics.platform/utils` imports ✅ none (the `aignostics.constants` matches are correct — that's `packages/aignostics/`'s own namespace)

Note for reviewers

Do not merge this PR directly. Review and approve the 9 individual phase PRs targeting `feat/PYSDK-133/python-sdk-slim` instead. This branch exists solely to show the full picture assembled together.

ari-nz added 26 commits May 28, 2026 12:19
…ease

- Replace single uv publish step with sequential build+publish for aignostics-sdk (first) then aignostics (second) to respect dependency order
- Add pre-publish lockstep version consistency check that fails fast if the two packages diverge
- Add informational smoke_test_slim job (continue-on-error) that installs aignostics-sdk from PyPI after publish and asserts the CLI works, the slim import succeeds, and heavy deps (openslide) are absent
- Update noxfile dist() session to build both packages into dist/ so make dist stays consistent with the new publish flow
- GitHub release glob ./dist/* already covers both wheels since both are built into dist/
Adds documentation for the v2 dual-package distribution that splits the
SDK into aignostics-sdk (slim API client) and aignostics (full SDK),
including migration guide for users upgrading from v1.
…tics

Move heavy/domain-specific dependencies from aignostics-sdk to aignostics,
leaving only platform+utils runtime dependencies in the slim package.

Slim (aignostics-sdk): platform auth, HTTP, JWT, logging, MCP, nicegui,
fastapi, pydantic, typer, sentry, retry, jsonschema/jsf, tqdm — 28 deps.
Heavy (aignostics): WSI (openslide, wsidicom, pydicom), cloud storage
(boto3, google-cloud-storage), data (duckdb, pandas, fastparquet/pyarrow),
DICOM validation, IDC index, shapely, procrastinate, html-sanitizer,
humanize, pyyaml, packaging, python-dateutil, defusedxml — 30 deps.
CVE transitive overrides split accordingly (slim vs heavy deps).

Deviations from task guidance (import-trace is authoritative):
- tqdm kept in slim: imported by platform/_utils.py for upload progress
- humanize/pyyaml/packaging/python-dateutil/jsf moved to heavy (or left in
  slim as appropriate): not imported by platform/ or utils/ directly
- jsf kept in slim: used for JSON schema generation (jsonschema companion)
Update mypy, pyright, coverage, pytest, and dist build configs to target
packages/aignostics-sdk/src and packages/aignostics/src instead of the
legacy src/ layout introduced by PYSDK-134 workspace scaffolding.
Also fix four Pylance type-narrowing errors in noxfile.py latexmk version
detection (session.error() is not NoReturn in nox's type stubs).
- platform/ and utils/ → packages/aignostics-sdk/src/aignostics_sdk/
- application/, wsi/, dataset/, bucket/, qupath/, notebook/, gui/, system/, third_party/, cli.py → packages/aignostics/src/aignostics/
- constants.py split: INTERNAL_ORGS → aignostics-sdk/constants.py; remaining constants → aignostics/constants.py
- Created symlink packages/aignostics-sdk/src/aignx → codegen/out/aignx to bundle codegen into slim wheel
- Updated packages/aignostics-sdk/pyproject.toml: packages = [\"src/aignostics_sdk\", \"src/aignx\"]
- Updated packages/aignostics-sdk/src/aignostics_sdk/__init__.py with real module docstring
- Moved packages/aignostics/src/aignostics/__init__.py from src/aignostics/ (preserving full content)

Note: imports are intentionally broken at this stage. Import rewrites (aignostics.* → aignostics_sdk.* for slim-module consumers) are deferred to PYSDK-136.
- platform/ and utils/ → packages/aignostics-sdk/src/aignostics_sdk/
- application/, wsi/, dataset/, bucket/, qupath/, notebook/, gui/, system/, third_party/, cli.py → packages/aignostics/src/aignostics/
- constants.py split: INTERNAL_ORGS → aignostics-sdk/constants.py; remaining constants → aignostics/constants.py
- Created symlink packages/aignostics-sdk/src/aignx → codegen/out/aignx to bundle codegen into slim wheel
- Updated packages/aignostics-sdk/pyproject.toml: packages = ["src/aignostics_sdk", "src/aignx"]
- Updated packages/aignostics-sdk/src/aignostics_sdk/__init__.py with real module docstring
- Moved packages/aignostics/src/aignostics/__init__.py from src/aignostics/ (preserving full content)

Note: imports are intentionally broken at this stage. Import rewrites
(aignostics.* → aignostics_sdk.* for slim-module consumers) are deferred to PYSDK-136.
…sdk.*

- Mechanically rewrites 206 import statements across 91 files in
  packages/aignostics-sdk/, packages/aignostics/, and tests/ so that
  platform and utils references point at the new aignostics_sdk package
- Fixes two classes of non-obvious imports missed by naive sed:
    * from ..utils import  (relative two-level imports in heavy modules)
    * from .utils.boot import boot  (relative import in aignostics __init__)
- Restores aignostics.constants imports where heavy constants
  (WINDOW_TITLE, HETA_APPLICATION_ID, etc.) live, since aignostics_sdk.constants
  only carries the slim subset (INTERNAL_ORGS)
- Patches utils/_constants.py to preserve backward compat:
    * __project_name__ = "aignostics" (keeps ~/.aignostics token cache
      and AIGNOSTICS_* env-var prefix)
    * _package_name derives from __name__.split(".")[0] = "aignostics_sdk"
    * All three importlib.metadata calls now use _package_name so they
      resolve against the correct installed distribution
- 900 tests collect successfully after the rewrite (0 collection errors)
- PYSDK-137 (slim CLI) and PYSDK-141 (tests) build on top of this change
…rce migration

- Add packages/aignostics/src/aignostics/wsi/_pydicom_handler.py and
  packages/aignostics/src/aignostics/notebook/_notebook.py to ignore list
  (both were previously ignored under src/ but moved in PYSDK-135)
- Exclude examples/ from pyright (pre-existing errors from before the split)
- Remove stale extraPaths pointing at old src/ layout
Creates packages/aignostics-sdk/src/aignostics_sdk/cli.py with a
trimmed Typer app exposing only the platform CLI commands (user, sdk).

Deliberately avoids calling prepare_cli() to prevent auto-discovery
of heavy domain modules (application, wsi, dataset, bucket, qupath,
system) via locate_implementations(typer.Typer). Instead, applies
epilog and no-args-is-help behaviour directly by calling the private
helpers _add_epilog_recursively and _no_args_is_help_recursively.
…plit [PYSDK-141]

- Add `slim` pytest marker to pyproject.toml for aignostics-sdk package tests
- Create tests/aignostics_sdk/__init__.py and smoke_test.py
- 5 smoke tests verify importability of aignostics_sdk.platform.Client,
  aignostics_sdk.utils.{BaseService,Health}, aignx.codegen.exceptions.ApiException,
  __project_name__ backward-compat constant, and __version__ availability
- 1 xfail test documents missing aignostics_sdk.cli module (pending PYSDK-137)
- No stale `from aignostics.platform` / `from aignostics.utils` imports in tests/
- Collection: 904 tests collected (0 collection errors)
- Pre-existing failures in base branch (stale patch() paths from PYSDK-136
  import rewrite) are not introduced by this PR; they will be tracked separately
…ation

Hatchling builds packages in an isolated environment and cannot follow
relative paths outside the package root (e.g. ../../LICENSE). Copy
LICENSE and README.md into each package directory and update pyproject.toml
references from ../../LICENSE/README.md to ./LICENSE/README.md.

This unblocks `uv build --package` for the integration branch validation.
…kspace migration

- ruff: ignore PLW0717 (try clause too many statements) and RUF075 (fallible
  context manager) — introduced in ruff 0.15.13 by the dep version bump in
  PYSDK-138; pre-existing code patterns, to be addressed in individual PRs
- mypy: exclude packages/aignostics-sdk/src/aignx (codegen symlink) and add
  follow_imports=skip override for aignx.* to prevent imported codegen types
  from causing errors in caller code; aignx is not part of the SDK source
- pyright: add **/aignx/** to exclude list so the codegen symlink is not
  type-checked by pyright

These are integration-branch compatibility fixes, not feature changes.
Copilot AI review requested due to automatic review settings May 28, 2026 12:32
@ari-nz ari-nz added the skip:test:long_running Skip long-running tests (≥5min) label May 28, 2026
ari-nz added 5 commits May 29, 2026 17:42
- Move __version__ import to top of aignostics_sdk/constants.py and drop noqa: E402
- Fix find_spec("sentry") → find_spec("sentry_sdk") in both slim and full utils __init__.py
  (Sentry SDK ships as sentry_sdk on PyPI, not sentry — SentrySettings was never re-exported)
Copilot AI review requested due to automatic review settings June 1, 2026 13:26

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 195 out of 275 changed files in this pull request and generated 12 comments.

Comments suppressed due to low confidence (6)

src/aignostics_sdk/utils/_cli.py:26

  • prepare_cli imports locate_implementations from aignostics.utils, which will raise ImportError when aignostics-sdk is installed without the full aignostics package (even though prepare_cli is exported from aignostics_sdk.utils). Consider making the discovery import optional so slim-only installs can still apply epilog/no-args-is-help behavior.
    packages/aignostics/src/aignostics/utils/_mcp.py:17
  • The usage example imports MCP helpers from aignostics_sdk.utils, but MCP utilities are implemented/exposed by the full package (aignostics.utils). Importing from aignostics_sdk.utils will fail for slim-only installs.
    src/aignostics_sdk/utils/_cli.py:26
  • prepare_cli imports locate_implementations from aignostics.utils, which will raise ImportError when aignostics-sdk is installed without the full aignostics package (even though prepare_cli is exported from aignostics_sdk.utils). Consider making the discovery import optional so slim-only installs can still apply epilog/no-args-is-help behavior.
    packages/aignostics/src/aignostics/utils/_mcp.py:17
  • The usage example imports MCP helpers from aignostics_sdk.utils, but MCP utilities are implemented/exposed by the full package (aignostics.utils). Importing from aignostics_sdk.utils will fail for slim-only installs.
    src/aignostics_sdk/utils/_cli.py:26
  • prepare_cli imports locate_implementations from aignostics.utils, which will raise ImportError when aignostics-sdk is installed without the full aignostics package (even though prepare_cli is exported from aignostics_sdk.utils). Consider making the discovery import optional so slim-only installs can still apply epilog/no-args-is-help behavior.
    packages/aignostics/src/aignostics/utils/_mcp.py:20
  • The usage example imports MCP helpers from aignostics_sdk.utils, but MCP utilities are implemented/exposed by the full package (aignostics.utils). Importing from aignostics_sdk.utils will fail for slim-only installs.

Comment on lines +7 to +13
Note: The aignostics-sdk CLI entry point (aignostics_sdk.cli) is pending
PYSDK-137 (CLI carve-out). The test_slim_cli_entry_point test is marked
xfail until that phase lands.

Note: Dependency slimming (removal of heavy deps such as openslide, nicegui,
etc.) is pending PYSDK-138 (dependency split). Until that phase merges,
aignostics-sdk carries the full dependency tree.
Comment on lines +7 to +13
Note: The aignostics-sdk CLI entry point (aignostics_sdk.cli) is pending
PYSDK-137 (CLI carve-out). The test_slim_cli_entry_point test is marked
xfail until that phase lands.

Note: Dependency slimming (removal of heavy deps such as openslide, nicegui,
etc.) is pending PYSDK-138 (dependency split). Until that phase merges,
aignostics-sdk carries the full dependency tree.
Comment on lines +7 to +13
Note: The aignostics-sdk CLI entry point (aignostics_sdk.cli) is pending
PYSDK-137 (CLI carve-out). The test_slim_cli_entry_point test is marked
xfail until that phase lands.

Note: Dependency slimming (removal of heavy deps such as openslide, nicegui,
etc.) is pending PYSDK-138 (dependency split). Until that phase merges,
aignostics-sdk carries the full dependency tree.
Comment thread src/aignostics.py
Comment on lines 26 to 29
from aignostics.constants import SENTRY_INTEGRATIONS, WINDOW_TITLE # noqa: E402
from aignostics.utils import boot, gui_run # noqa: E402

from aignostics_sdk.utils import boot, gui_run # noqa: E402

Comment thread runner/gui_watch.py
"""Graphical User Interface (GUI) of Aignostics Python SDK."""

from aignostics.utils import gui_run
from aignostics_sdk.utils import gui_run
Comment thread runner/gui_watch.py
"""Graphical User Interface (GUI) of Aignostics Python SDK."""

from aignostics.utils import gui_run
from aignostics_sdk.utils import gui_run
Comment thread tests/main.py
Comment on lines +5 to 7
from aignostics_sdk.utils import (
gui_run,
)
Comment thread src/aignostics.py
Comment on lines 26 to 29
from aignostics.constants import SENTRY_INTEGRATIONS, WINDOW_TITLE # noqa: E402
from aignostics.utils import boot, gui_run # noqa: E402

from aignostics_sdk.utils import boot, gui_run # noqa: E402

Comment thread runner/gui_watch.py
"""Graphical User Interface (GUI) of Aignostics Python SDK."""

from aignostics.utils import gui_run
from aignostics_sdk.utils import gui_run
Comment thread tests/main.py
Comment on lines +5 to 7
from aignostics_sdk.utils import (
gui_run,
)
@sonarqubecloud

Copy link
Copy Markdown

Quality Gate Failed Quality Gate failed

Failed conditions
2 Security Hotspots
5.7% Duplication on New Code (required ≤ 3%)
E Security Rating on New Code (required ≥ A)

See analysis details on SonarQube Cloud

Catch issues before they fail your Quality Gate with our IDE extension SonarQube for IDE

Comment thread src/aignostics_sdk/_codegen/api_client.py Fixed
ari-nz added 10 commits June 19, 2026 15:10
…identity mismatch

The SAMIA 1.6.0 codegen update changed public_api.py to import models
directly from the aignx package, but left _codegen/models/__init__.py
importing from local duplicate files. This caused pydantic to reject
RunCreationRequest instances since the two classes had different identities.
Resolves conflicts between HEAD (slim package split) and origin/main
(access grants + share tokens feature):

- pyproject.toml: keep HEAD (no root [project] section; packages/ layout);
  keep HEAD ruff rules (RUF075 + PLW0717 additions)
- _service.py: keep aignostics_sdk.* paths; add AccessGrant/ShareToken from
  aignostics_sdk.platform.resources.access (new in origin/main)
- runs.py: keep aignostics_sdk.* paths; add AccessGrant import and the
  missing grant codegen models (GrantCreateRequest, GrantReadResponse,
  GrantRelation, ResourceType, SubjectType) to the local import block
- service_test.py: keep both ApplicationService and SubjectType imports
- di_test.py: keep HEAD formatting (MAIN_PACKAGE constant + inline-brace style)
- uv.lock: regenerated (bleach 6.4.0, aignostics-sdk 1.4.7)
data = json.loads(response_text)
except ValueError:
data = response_text
elif re.match(r'^application/(json|[\w!#$&.+-^_]+\+json)\s*(;|$)', content_type, re.IGNORECASE):
ari-nz added 3 commits July 6, 2026 18:54
Copies codegen/out/aignx/codegen/ into src/aignostics_sdk/_codegen/ so
the SDK has submitted_by as a real API filter parameter (was only in the
sort-field description before). No import path changes needed — _codegen
already imports internally from aignx.codegen.
@codecov

codecov Bot commented Jul 6, 2026

Copy link
Copy Markdown

❌ 40 Tests Failed:

Tests completed Failed Passed Skipped
219 40 179 3
View the top 3 failed test(s) by shortest run time
::tests.aignostics.application.cli_pipeline_validation_test
Stack Traces | 0s run time
ImportError while importing test module '.../aignostics/application/cli_pipeline_validation_test.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/importlib/__init__.py:88: in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.../aignostics/application/cli_pipeline_validation_test.py:8: in <module>
    from aignostics.cli import cli
.../src/aignostics/cli.py:26: in <module>
    cli.add_typer(_ep.load())
                  ^^^^^^^^^^
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14.../importlib/metadata/__init__.py:179: in load
    module = import_module(match.group('module'))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/importlib/__init__.py:88: in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.../aignostics_sdk/application/__init__.py:8: in <module>
    from ._cli import cli
.../aignostics_sdk/application/_cli.py:17: in <module>
    from aignostics_sdk.platform import (
.../aignostics_sdk/platform/__init__.py:19: in <module>
    from ._client import Client
.../aignostics_sdk/platform/_client.py:22: in <module>
    from .resources.access import ShareTokens
.../platform/resources/access.py:57: in <module>
    from aignostics.platform._api import RETRYABLE_EXCEPTIONS, _AuthenticatedApi, _AuthenticatedResource, _log_retry_attempt
E   ModuleNotFoundError: No module named 'aignostics.platform'
::tests.aignostics.application.download_test
Stack Traces | 0s run time
ImportError while importing test module '.../aignostics/application/download_test.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
../...../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/importlib/__init__.py:88: in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.../aignostics/application/download_test.py:9: in <module>
    from aignostics_sdk.application._download import (
.../aignostics_sdk/application/__init__.py:8: in <module>
    from ._cli import cli
.../aignostics_sdk/application/_cli.py:17: in <module>
    from aignostics_sdk.platform import (
.../aignostics_sdk/platform/__init__.py:19: in <module>
    from ._client import Client
.../aignostics_sdk/platform/_client.py:22: in <module>
    from .resources.access import ShareTokens
.../platform/resources/access.py:57: in <module>
    from aignostics.platform._api import RETRYABLE_EXCEPTIONS, _AuthenticatedApi, _AuthenticatedResource, _log_retry_attempt
E   ModuleNotFoundError: No module named 'aignostics.platform'
::tests.aignostics.application.gui_test
Stack Traces | 0s run time
ImportError while importing test module '.../aignostics/application/gui_test.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
../...../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/importlib/__init__.py:88: in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.../aignostics/application/gui_test.py:13: in <module>
    from aignostics.application import Service
.../aignostics/application/__init__.py:3: in <module>
    from aignostics_sdk.application import (
.../aignostics_sdk/application/__init__.py:8: in <module>
    from ._cli import cli
.../aignostics_sdk/application/_cli.py:17: in <module>
    from aignostics_sdk.platform import (
.../aignostics_sdk/platform/__init__.py:19: in <module>
    from ._client import Client
.../aignostics_sdk/platform/_client.py:22: in <module>
    from .resources.access import ShareTokens
.../platform/resources/access.py:57: in <module>
    from aignostics.platform._api import RETRYABLE_EXCEPTIONS, _AuthenticatedApi, _AuthenticatedResource, _log_retry_attempt
E   ModuleNotFoundError: No module named 'aignostics.platform'
::tests.aignostics.application.service_test
Stack Traces | 0s run time
ImportError while importing test module '.../aignostics/application/service_test.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
../...../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/importlib/__init__.py:88: in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.../aignostics/application/service_test.py:7: in <module>
    from aignostics.application import Service as ApplicationService
.../aignostics/application/__init__.py:3: in <module>
    from aignostics_sdk.application import (
.../aignostics_sdk/application/__init__.py:8: in <module>
    from ._cli import cli
.../aignostics_sdk/application/_cli.py:17: in <module>
    from aignostics_sdk.platform import (
.../aignostics_sdk/platform/__init__.py:19: in <module>
    from ._client import Client
.../aignostics_sdk/platform/_client.py:22: in <module>
    from .resources.access import ShareTokens
.../platform/resources/access.py:57: in <module>
    from aignostics.platform._api import RETRYABLE_EXCEPTIONS, _AuthenticatedApi, _AuthenticatedResource, _log_retry_attempt
E   ModuleNotFoundError: No module named 'aignostics.platform'
::tests.aignostics.application.utils_test
Stack Traces | 0s run time
ImportError while importing test module '.../aignostics/application/utils_test.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
../...../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/importlib/__init__.py:88: in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.../aignostics/application/utils_test.py:17: in <module>
    from aignostics_sdk.application._utils import (
.../aignostics_sdk/application/__init__.py:8: in <module>
    from ._cli import cli
.../aignostics_sdk/application/_cli.py:17: in <module>
    from aignostics_sdk.platform import (
.../aignostics_sdk/platform/__init__.py:19: in <module>
    from ._client import Client
.../aignostics_sdk/platform/_client.py:22: in <module>
    from .resources.access import ShareTokens
.../platform/resources/access.py:57: in <module>
    from aignostics.platform._api import RETRYABLE_EXCEPTIONS, _AuthenticatedApi, _AuthenticatedResource, _log_retry_attempt
E   ModuleNotFoundError: No module named 'aignostics.platform'
::tests.aignostics.bucket.cli_test
Stack Traces | 0s run time
ImportError while importing test module '.../aignostics/bucket/cli_test.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/importlib/__init__.py:88: in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.../aignostics/bucket/cli_test.py:8: in <module>
    from aignostics.cli import cli
.../src/aignostics/cli.py:26: in <module>
    cli.add_typer(_ep.load())
                  ^^^^^^^^^^
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14.../importlib/metadata/__init__.py:179: in load
    module = import_module(match.group('module'))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/importlib/__init__.py:88: in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.../aignostics_sdk/application/__init__.py:8: in <module>
    from ._cli import cli
.../aignostics_sdk/application/_cli.py:17: in <module>
    from aignostics_sdk.platform import (
.../aignostics_sdk/platform/__init__.py:19: in <module>
    from ._client import Client
.../aignostics_sdk/platform/_client.py:22: in <module>
    from .resources.access import ShareTokens
.../platform/resources/access.py:57: in <module>
    from aignostics.platform._api import RETRYABLE_EXCEPTIONS, _AuthenticatedApi, _AuthenticatedResource, _log_retry_attempt
E   ModuleNotFoundError: No module named 'aignostics.platform'
::tests.aignostics.bucket.gui_test
Stack Traces | 0s run time
ImportError while importing test module '.../aignostics/bucket/gui_test.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/importlib/__init__.py:88: in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.../aignostics/bucket/gui_test.py:12: in <module>
    from aignostics.cli import cli
.../src/aignostics/cli.py:26: in <module>
    cli.add_typer(_ep.load())
                  ^^^^^^^^^^
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14.../importlib/metadata/__init__.py:179: in load
    module = import_module(match.group('module'))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/importlib/__init__.py:88: in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.../aignostics_sdk/application/__init__.py:8: in <module>
    from ._cli import cli
.../aignostics_sdk/application/_cli.py:17: in <module>
    from aignostics_sdk.platform import (
.../aignostics_sdk/platform/__init__.py:19: in <module>
    from ._client import Client
.../aignostics_sdk/platform/_client.py:22: in <module>
    from .resources.access import ShareTokens
.../platform/resources/access.py:57: in <module>
    from aignostics.platform._api import RETRYABLE_EXCEPTIONS, _AuthenticatedApi, _AuthenticatedResource, _log_retry_attempt
E   ModuleNotFoundError: No module named 'aignostics.platform'
::tests.aignostics.bucket.service_test
Stack Traces | 0s run time
ImportError while importing test module '.../aignostics/bucket/service_test.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
../...../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/importlib/__init__.py:88: in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.../aignostics/bucket/service_test.py:7: in <module>
    from aignostics.bucket._service import Service
.../aignostics/bucket/__init__.py:7: in <module>
    from ._cli import cli
.../aignostics/bucket/_cli.py:17: in <module>
    from ._service import DownloadProgress, Service
.../aignostics/bucket/_service.py:18: in <module>
    from aignostics_sdk.platform import Service as PlatformService
.../aignostics_sdk/platform/__init__.py:19: in <module>
    from ._client import Client
.../aignostics_sdk/platform/_client.py:22: in <module>
    from .resources.access import ShareTokens
.../platform/resources/access.py:57: in <module>
    from aignostics.platform._api import RETRYABLE_EXCEPTIONS, _AuthenticatedApi, _AuthenticatedResource, _log_retry_attempt
E   ModuleNotFoundError: No module named 'aignostics.platform'
::tests.aignostics.bucket.settings_test
Stack Traces | 0s run time
ImportError while importing test module '.../aignostics/bucket/settings_test.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
../...../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/importlib/__init__.py:88: in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.../aignostics/bucket/settings_test.py:6: in <module>
    from aignostics.bucket._settings import Settings
.../aignostics/bucket/__init__.py:7: in <module>
    from ._cli import cli
.../aignostics/bucket/_cli.py:17: in <module>
    from ._service import DownloadProgress, Service
.../aignostics/bucket/_service.py:18: in <module>
    from aignostics_sdk.platform import Service as PlatformService
.../aignostics_sdk/platform/__init__.py:19: in <module>
    from ._client import Client
.../aignostics_sdk/platform/_client.py:22: in <module>
    from .resources.access import ShareTokens
.../platform/resources/access.py:57: in <module>
    from aignostics.platform._api import RETRYABLE_EXCEPTIONS, _AuthenticatedApi, _AuthenticatedResource, _log_retry_attempt
E   ModuleNotFoundError: No module named 'aignostics.platform'
::tests.aignostics.cli_test
Stack Traces | 0s run time
ImportError while importing test module '.../tests/aignostics/cli_test.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/importlib/__init__.py:88: in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
tests/aignostics/cli_test.py:11: in <module>
    from aignostics.cli import cli
.../src/aignostics/cli.py:26: in <module>
    cli.add_typer(_ep.load())
                  ^^^^^^^^^^
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14.../importlib/metadata/__init__.py:179: in load
    module = import_module(match.group('module'))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/importlib/__init__.py:88: in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.../aignostics_sdk/application/__init__.py:8: in <module>
    from ._cli import cli
.../aignostics_sdk/application/_cli.py:17: in <module>
    from aignostics_sdk.platform import (
.../aignostics_sdk/platform/__init__.py:19: in <module>
    from ._client import Client
.../aignostics_sdk/platform/_client.py:22: in <module>
    from .resources.access import ShareTokens
.../platform/resources/access.py:57: in <module>
    from aignostics.platform._api import RETRYABLE_EXCEPTIONS, _AuthenticatedApi, _AuthenticatedResource, _log_retry_attempt
E   ModuleNotFoundError: No module named 'aignostics.platform'
::tests.aignostics.dataset.cli_test
Stack Traces | 0s run time
ImportError while importing test module '.../aignostics/dataset/cli_test.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/importlib/__init__.py:88: in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.../aignostics/dataset/cli_test.py:10: in <module>
    from aignostics.cli import cli
.../src/aignostics/cli.py:26: in <module>
    cli.add_typer(_ep.load())
                  ^^^^^^^^^^
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14.../importlib/metadata/__init__.py:179: in load
    module = import_module(match.group('module'))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/importlib/__init__.py:88: in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.../aignostics_sdk/application/__init__.py:8: in <module>
    from ._cli import cli
.../aignostics_sdk/application/_cli.py:17: in <module>
    from aignostics_sdk.platform import (
.../aignostics_sdk/platform/__init__.py:19: in <module>
    from ._client import Client
.../aignostics_sdk/platform/_client.py:22: in <module>
    from .resources.access import ShareTokens
.../platform/resources/access.py:57: in <module>
    from aignostics.platform._api import RETRYABLE_EXCEPTIONS, _AuthenticatedApi, _AuthenticatedResource, _log_retry_attempt
E   ModuleNotFoundError: No module named 'aignostics.platform'
::tests.aignostics.dataset.service_test
Stack Traces | 0s run time
ImportError while importing test module '.../aignostics/dataset/service_test.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
../...../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/importlib/__init__.py:88: in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.../aignostics/dataset/service_test.py:7: in <module>
    from aignostics.dataset._service import _active_processes, _cleanup_processes, _terminate_process
.../aignostics/dataset/__init__.py:8: in <module>
    from ._service import Service
.../aignostics/dataset/_service.py:17: in <module>
    from aignostics_sdk.platform import generate_signed_url as platform_generate_signed_url
.../aignostics_sdk/platform/__init__.py:19: in <module>
    from ._client import Client
.../aignostics_sdk/platform/_client.py:22: in <module>
    from .resources.access import ShareTokens
.../platform/resources/access.py:57: in <module>
    from aignostics.platform._api import RETRYABLE_EXCEPTIONS, _AuthenticatedApi, _AuthenticatedResource, _log_retry_attempt
E   ModuleNotFoundError: No module named 'aignostics.platform'
::tests.aignostics.platform
Stack Traces | 0s run time
../...../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/importlib/__init__.py:88: in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
<frozen importlib._bootstrap>:1398: in _gcd_import
    ???
<frozen importlib._bootstrap>:1371: in _find_and_load
    ???
<frozen importlib._bootstrap>:1342: in _find_and_load_unlocked
    ???
<frozen importlib._bootstrap>:938: in _load_unlocked
    ???
..../test-3-14-3/lib/python3.14.../_pytest/assertion/rewrite.py:197: in exec_module
    exec(co, module.__dict__)
.../aignostics/platform/conftest.py:8: in <module>
    from aignostics_sdk.platform._api import _AuthenticatedApi
.../aignostics_sdk/platform/__init__.py:19: in <module>
    from ._client import Client
.../aignostics_sdk/platform/_client.py:22: in <module>
    from .resources.access import ShareTokens
.../platform/resources/access.py:57: in <module>
    from aignostics.platform._api import RETRYABLE_EXCEPTIONS, _AuthenticatedApi, _AuthenticatedResource, _log_retry_attempt
E   ModuleNotFoundError: No module named 'aignostics.platform'
::tests.aignostics.qupath
Stack Traces | 0s run time
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/importlib/__init__.py:88: in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
<frozen importlib._bootstrap>:1398: in _gcd_import
    ???
<frozen importlib._bootstrap>:1371: in _find_and_load
    ???
<frozen importlib._bootstrap>:1342: in _find_and_load_unlocked
    ???
<frozen importlib._bootstrap>:938: in _load_unlocked
    ???
..../test-3-14-3/lib/python3.14.../_pytest/assertion/rewrite.py:197: in exec_module
    exec(co, module.__dict__)
.../aignostics/qupath/conftest.py:6: in <module>
    from aignostics.cli import cli
.../src/aignostics/cli.py:26: in <module>
    cli.add_typer(_ep.load())
                  ^^^^^^^^^^
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14.../importlib/metadata/__init__.py:179: in load
    module = import_module(match.group('module'))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/importlib/__init__.py:88: in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.../aignostics_sdk/application/__init__.py:8: in <module>
    from ._cli import cli
.../aignostics_sdk/application/_cli.py:17: in <module>
    from aignostics_sdk.platform import (
.../aignostics_sdk/platform/__init__.py:19: in <module>
    from ._client import Client
.../aignostics_sdk/platform/_client.py:22: in <module>
    from .resources.access import ShareTokens
.../platform/resources/access.py:57: in <module>
    from aignostics.platform._api import RETRYABLE_EXCEPTIONS, _AuthenticatedApi, _AuthenticatedResource, _log_retry_attempt
E   ModuleNotFoundError: No module named 'aignostics.platform'
::tests.aignostics.system.cli_test
Stack Traces | 0s run time
ImportError while importing test module '.../aignostics/system/cli_test.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/importlib/__init__.py:88: in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.../aignostics/system/cli_test.py:8: in <module>
    from aignostics.cli import cli
.../src/aignostics/cli.py:26: in <module>
    cli.add_typer(_ep.load())
                  ^^^^^^^^^^
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14.../importlib/metadata/__init__.py:179: in load
    module = import_module(match.group('module'))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/importlib/__init__.py:88: in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.../aignostics_sdk/application/__init__.py:8: in <module>
    from ._cli import cli
.../aignostics_sdk/application/_cli.py:17: in <module>
    from aignostics_sdk.platform import (
.../aignostics_sdk/platform/__init__.py:19: in <module>
    from ._client import Client
.../aignostics_sdk/platform/_client.py:22: in <module>
    from .resources.access import ShareTokens
.../platform/resources/access.py:57: in <module>
    from aignostics.platform._api import RETRYABLE_EXCEPTIONS, _AuthenticatedApi, _AuthenticatedResource, _log_retry_attempt
E   ModuleNotFoundError: No module named 'aignostics.platform'
::tests.aignostics.wsi.cli_test
Stack Traces | 0s run time
ImportError while importing test module '.../aignostics/wsi/cli_test.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/importlib/__init__.py:88: in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.../aignostics/wsi/cli_test.py:9: in <module>
    from aignostics.cli import cli
.../src/aignostics/cli.py:26: in <module>
    cli.add_typer(_ep.load())
                  ^^^^^^^^^^
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14.../importlib/metadata/__init__.py:179: in load
    module = import_module(match.group('module'))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/importlib/__init__.py:88: in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.../aignostics_sdk/application/__init__.py:8: in <module>
    from ._cli import cli
.../aignostics_sdk/application/_cli.py:17: in <module>
    from aignostics_sdk.platform import (
.../aignostics_sdk/platform/__init__.py:19: in <module>
    from ._client import Client
.../aignostics_sdk/platform/_client.py:22: in <module>
    from .resources.access import ShareTokens
.../platform/resources/access.py:57: in <module>
    from aignostics.platform._api import RETRYABLE_EXCEPTIONS, _AuthenticatedApi, _AuthenticatedResource, _log_retry_attempt
E   ModuleNotFoundError: No module named 'aignostics.platform'
tests.aignostics_sdk.smoke_test::test_platform_client_importable
Stack Traces | 0.011s run time
@pytest.mark.unit
    @pytest.mark.slim
    def test_platform_client_importable() -> None:
        """Core import from aignostics_sdk.platform works."""
>       from aignostics_sdk.platform import Client

tests/aignostics_sdk/smoke_test.py:28: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.../aignostics_sdk/platform/__init__.py:19: in <module>
    from ._client import Client
.../aignostics_sdk/platform/_client.py:22: in <module>
    from .resources.access import ShareTokens
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    """Access-control resources: organization grants and share tokens.
    
    This module provides classes for managing access to Aignostics platform resources.
    There are two complementary mechanisms:
    
    * **Share grants** (``AccessGrant``) — delegate access to an existing platform
      user or organization directly.  Grants are always associated with a specific
      resource (e.g. a run) and a subject (e.g. an organization).
    
    * **Share tokens** (``ShareToken``) — create a short-lived, revocable secret that
      can be handed to anyone.  The recipient exchanges the token for a grant without
      needing a platform account.
    
    Typical workflow::
    
        from aignostics.platform import Client
        from aignx.codegen.models import SubjectType
    
        client = Client()
    
        # --- Share a run with another organization via a grant ---
        run = client.run("run-abc123")
        grant = run.grant_access(
            subject_type=SubjectType.ORGANIZATION_USER,
            subject_id="org-xyz",
        )
        print(f"Granted access: {grant.grant_id}")
    
        # List all active grants on the run
        for g in run.list_share_grants():
            print(g.grant_id, g.subject_type, g.subject_id)
    
        # Revoke a specific grant
        grant.revoke()
    
        # --- Share a run via a one-time token ---
        token = client.share_tokens.create()
        print(f"Share this token secret once: {token.share_token}")
    
        # Grant the token access to the run
        run.grant_access(
            subject_type=SubjectType.SHARE_TOKEN,
            subject_id=token.share_token_id,
        )
    
        # List tokens and revoke one
        for t in client.share_tokens.list():
            print(t.share_token_id, t.expires_at)
        token.revoke()
    """
    
    import builtins
    from collections.abc import Iterator
    from datetime import datetime
    from typing import Any, cast
    
>   from aignostics.platform._api import RETRYABLE_EXCEPTIONS, _AuthenticatedApi, _AuthenticatedResource, _log_retry_attempt
E   ModuleNotFoundError: No module named 'aignostics.platform'

.../platform/resources/access.py:57: ModuleNotFoundError
tests.aignostics.utils.fs_test::test_open_user_data_directory_show_in_file_manager_exception
Stack Traces | 0.015s run time
record_property = <function record_property.<locals>.append_property at 0x7f2573cf47d0>
tmp_path = PosixPath('.../pytest-7/popen-gw2/test_open_user_data_directory_2')

    @pytest.mark.integration
    def test_open_user_data_directory_show_in_file_manager_exception(record_property, tmp_path) -> None:
        """Test open_user_data_directory handles show_in_file_manager exceptions gracefully."""
        record_property("tested-item-id", "SPEC-UTILS-SERVICE")
        with (
            patch("aignostics_sdk.utils._fs.platformdirs.user_data_dir") as mock_user_data_dir,
            patch("aignostics_sdk.utils._fs.__project_name__", "test_project"),
            patch("aignostics_sdk.utils._fs.__is_running_in_read_only_environment__", False),
            patch("pathlib.Path.mkdir") as _mock_mkdir,
>           patch("aignostics_sdk.utils._fs.show_in_file_manager") as mock_show_in_file_manager,
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        ):

.../aignostics/utils/fs_test.py:491: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
../......../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/unittest/mock.py:1503: in __enter__
    original, local = self.get_original()
                      ^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <unittest.mock._patch object at 0x7f2573d95b70>

    def get_original(self):
        target = self.getter()
        name = self.attribute
    
        original = DEFAULT
        local = False
    
        try:
            original = target.__dict__[name]
        except (AttributeError, KeyError):
            original = getattr(target, name, DEFAULT)
        else:
            local = True
    
        if name in _builtins and isinstance(target, ModuleType):
            self.create = True
    
        if not self.create and original is DEFAULT:
>           raise AttributeError(
                "%s does not have the attribute %r" % (target, name)
            )
E           AttributeError: <module 'aignostics_sdk.utils._fs' from '.../aignostics_sdk/utils/_fs.py'> does not have the attribute 'show_in_file_manager'

../......../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/unittest/mock.py:1473: AttributeError
tests.aignostics.utils.fs_test::test_open_user_data_directory_without_scope
Stack Traces | 0.015s run time
record_property = <function record_property.<locals>.append_property at 0x7f9361292770>
tmp_path = PosixPath('.../pytest-7/popen-gw4/test_open_user_data_directory_0')

    @pytest.mark.integration
    def test_open_user_data_directory_without_scope(record_property, tmp_path) -> None:
        """Test open_user_data_directory opens correct directory without scope."""
        record_property("tested-item-id", "SPEC-UTILS-SERVICE")
        with (
            patch("aignostics_sdk.utils._fs.platformdirs.user_data_dir") as mock_user_data_dir,
            patch("aignostics_sdk.utils._fs.__project_name__", "test_project"),
            patch("aignostics_sdk.utils._fs.__is_running_in_read_only_environment__", False),
            patch("pathlib.Path.mkdir") as mock_mkdir,
>           patch("aignostics_sdk.utils._fs.show_in_file_manager") as mock_show_in_file_manager,
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        ):

.../aignostics/utils/fs_test.py:403: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
../......../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/unittest/mock.py:1503: in __enter__
    original, local = self.get_original()
                      ^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <unittest.mock._patch object at 0x7f93612a51d0>

    def get_original(self):
        target = self.getter()
        name = self.attribute
    
        original = DEFAULT
        local = False
    
        try:
            original = target.__dict__[name]
        except (AttributeError, KeyError):
            original = getattr(target, name, DEFAULT)
        else:
            local = True
    
        if name in _builtins and isinstance(target, ModuleType):
            self.create = True
    
        if not self.create and original is DEFAULT:
>           raise AttributeError(
                "%s does not have the attribute %r" % (target, name)
            )
E           AttributeError: <module 'aignostics_sdk.utils._fs' from '.../aignostics_sdk/utils/_fs.py'> does not have the attribute 'show_in_file_manager'

../......../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/unittest/mock.py:1473: AttributeError
tests.aignostics.utils.fs_test::test_open_user_data_directory_with_scope
Stack Traces | 0.016s run time
record_property = <function record_property.<locals>.append_property at 0x7f93605fc460>
tmp_path = PosixPath('.../pytest-7/popen-gw4/test_open_user_data_directory_1')

    @pytest.mark.integration
    def test_open_user_data_directory_with_scope(record_property, tmp_path) -> None:
        """Test open_user_data_directory opens correct directory with scope."""
        record_property("tested-item-id", "SPEC-UTILS-SERVICE")
        with (
            patch("aignostics_sdk.utils._fs.platformdirs.user_data_dir") as mock_user_data_dir,
            patch("aignostics_sdk.utils._fs.__project_name__", "test_project"),
            patch("aignostics_sdk.utils._fs.__is_running_in_read_only_environment__", False),
            patch("pathlib.Path.mkdir") as mock_mkdir,
>           patch("aignostics_sdk.utils._fs.show_in_file_manager") as mock_show_in_file_manager,
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        ):

.../aignostics/utils/fs_test.py:425: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
../......../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/unittest/mock.py:1503: in __enter__
    original, local = self.get_original()
                      ^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <unittest.mock._patch object at 0x7f93612a59b0>

    def get_original(self):
        target = self.getter()
        name = self.attribute
    
        original = DEFAULT
        local = False
    
        try:
            original = target.__dict__[name]
        except (AttributeError, KeyError):
            original = getattr(target, name, DEFAULT)
        else:
            local = True
    
        if name in _builtins and isinstance(target, ModuleType):
            self.create = True
    
        if not self.create and original is DEFAULT:
>           raise AttributeError(
                "%s does not have the attribute %r" % (target, name)
            )
E           AttributeError: <module 'aignostics_sdk.utils._fs' from '.../aignostics_sdk/utils/_fs.py'> does not have the attribute 'show_in_file_manager'

../......../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/unittest/mock.py:1473: AttributeError
tests.aignostics.dataset.gui_test::test_gui_idc_shows
Stack Traces | 0.827s run time
self = <Coroutine test_gui_idc_shows>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
        # When loop factories are configured, resolve the loop factory
        # fixture early so that a factory variant change cascades cache
        # invalidation before any async fixture checks its cache.
        hook_caller = self.config.hook.pytest_asyncio_loop_factories
        if hook_caller.get_hookimpls():
            _ = self._request.getfixturevalue(_asyncio_loop_factory.__name__)
>       return super().setup()
               ^^^^^^^^^^^^^^^

..../test-3-14-3/lib/python3.14............/site-packages/pytest_asyncio/plugin.py:558: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
..../test-3-14-3/lib/python3.14............/site-packages/pytest_asyncio/plugin.py:944: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
..../test-3-14-3/lib/python3.14............/site-packages/pytest_asyncio/plugin.py:407: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/asyncio/runners.py:127: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/asyncio/base_events.py:719: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
..../test-3-14-3/lib/python3.14............/site-packages/pytest_asyncio/plugin.py:403: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
..../test-3-14-3/lib/python3.14.../nicegui/testing/user_plugin.py:25: in user
    async with user_simulation(main_file=get_path_to_main_file(request)) as user:
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/contextlib.py:214: in __aenter__
    return await anext(self.gen)
           ^^^^^^^^^^^^^^^^^^^^^
..../test-3-14-3/lib/python3.14.../nicegui/testing/user_simulation.py:37: in user_simulation
    runpy.run_path(str(main_file), run_name='__main__')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    """Start script for pytest."""
    
    from aignostics.constants import WINDOW_TITLE
    
>   from aignostics_sdk.utils import (
        gui_run,
    )
E   ImportError: cannot import name 'gui_run' from 'aignostics_sdk.utils' (.../aignostics_sdk/utils/__init__.py)

tests/main.py:5: ImportError
tests.aignostics.wsi.service_test::test_serve_tiff_to_jpeg_fails_on_broken_tiff
Stack Traces | 1.01s run time
fixturedef = <FixtureDef argname='user' scope='function' baseid=''>
request = <SubRequest 'user' for <Function test_serve_tiff_to_jpeg_fails_on_broken_tiff>>

    @pytest.hookimpl(wrapper=True)
    def pytest_fixture_setup(fixturedef: FixtureDef, request) -> object | None:
        if (
            fixturedef.argname == "event_loop_policy"
            and fixturedef.func.__module__ != __name__
        ):
            warnings.warn(
                PytestDeprecationWarning(_EVENT_LOOP_POLICY_FIXTURE_DEPRECATION_WARNING),
            )
        asyncio_mode = _get_asyncio_mode(request.config)
        if not _is_asyncio_fixture_function(fixturedef.func):
            if asyncio_mode == Mode.STRICT:
                # Ignore async fixtures without explicit asyncio mark in strict mode
                # This applies to pytest_trio fixtures, for example
                return (yield)
            if not _is_coroutine_or_asyncgen(fixturedef.func):
                return (yield)
        default_loop_scope = request.config.getini("asyncio_default_fixture_loop_scope")
        loop_scope = (
            getattr(fixturedef.func, "_loop_scope", None)
            or default_loop_scope
            or fixturedef.scope
        )
        runner_fixture_id = f"_{loop_scope}_scoped_runner"
        runner = request.getfixturevalue(runner_fixture_id)
        # Prevent the runner closing before the fixture's async teardown.
        runner_fixturedef = request._get_active_fixturedef(runner_fixture_id)
        runner_fixturedef.addfinalizer(
            functools.partial(fixturedef.finish, request=request)
        )
        synchronizer = _fixture_synchronizer(fixturedef, runner, request)
        _make_asyncio_fixture_function(synchronizer, loop_scope)
        with MonkeyPatch.context() as c:
            c.setattr(fixturedef, "func", synchronizer)
>           hook_result = yield
                          ^^^^^

..../test-3-14-3/lib/python3.14........./site-packages/pytest_asyncio/plugin.py:944: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
..../test-3-14-3/lib/python3.14........./site-packages/pytest_asyncio/plugin.py:407: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/asyncio/runners.py:127: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/asyncio/base_events.py:719: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
..../test-3-14-3/lib/python3.14........./site-packages/pytest_asyncio/plugin.py:403: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
..../test-3-14-3/lib/python3.14.../nicegui/testing/user_plugin.py:25: in user
    async with user_simulation(main_file=get_path_to_main_file(request)) as user:
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/contextlib.py:214: in __aenter__
    return await anext(self.gen)
           ^^^^^^^^^^^^^^^^^^^^^
..../test-3-14-3/lib/python3.14.../nicegui/testing/user_simulation.py:37: in user_simulation
    runpy.run_path(str(main_file), run_name='__main__')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    """Start script for pytest."""
    
    from aignostics.constants import WINDOW_TITLE
    
>   from aignostics_sdk.utils import (
        gui_run,
    )
E   ImportError: cannot import name 'gui_run' from 'aignostics_sdk.utils' (.../aignostics_sdk/utils/__init__.py)

tests/main.py:5: ImportError
tests.aignostics.wsi.service_test::test_serve_thumbnail_fails_on_incomplete_pyramid
Stack Traces | 1.09s run time
fixturedef = <FixtureDef argname='user' scope='function' baseid=''>
request = <SubRequest 'user' for <Function test_serve_thumbnail_fails_on_incomplete_pyramid>>

    @pytest.hookimpl(wrapper=True)
    def pytest_fixture_setup(fixturedef: FixtureDef, request) -> object | None:
        if (
            fixturedef.argname == "event_loop_policy"
            and fixturedef.func.__module__ != __name__
        ):
            warnings.warn(
                PytestDeprecationWarning(_EVENT_LOOP_POLICY_FIXTURE_DEPRECATION_WARNING),
            )
        asyncio_mode = _get_asyncio_mode(request.config)
        if not _is_asyncio_fixture_function(fixturedef.func):
            if asyncio_mode == Mode.STRICT:
                # Ignore async fixtures without explicit asyncio mark in strict mode
                # This applies to pytest_trio fixtures, for example
                return (yield)
            if not _is_coroutine_or_asyncgen(fixturedef.func):
                return (yield)
        default_loop_scope = request.config.getini("asyncio_default_fixture_loop_scope")
        loop_scope = (
            getattr(fixturedef.func, "_loop_scope", None)
            or default_loop_scope
            or fixturedef.scope
        )
        runner_fixture_id = f"_{loop_scope}_scoped_runner"
        runner = request.getfixturevalue(runner_fixture_id)
        # Prevent the runner closing before the fixture's async teardown.
        runner_fixturedef = request._get_active_fixturedef(runner_fixture_id)
        runner_fixturedef.addfinalizer(
            functools.partial(fixturedef.finish, request=request)
        )
        synchronizer = _fixture_synchronizer(fixturedef, runner, request)
        _make_asyncio_fixture_function(synchronizer, loop_scope)
        with MonkeyPatch.context() as c:
            c.setattr(fixturedef, "func", synchronizer)
>           hook_result = yield
                          ^^^^^

..../test-3-14-3/lib/python3.14........./site-packages/pytest_asyncio/plugin.py:944: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
..../test-3-14-3/lib/python3.14........./site-packages/pytest_asyncio/plugin.py:407: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/asyncio/runners.py:127: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/asyncio/base_events.py:719: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
..../test-3-14-3/lib/python3.14........./site-packages/pytest_asyncio/plugin.py:403: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
..../test-3-14-3/lib/python3.14.../nicegui/testing/user_plugin.py:25: in user
    async with user_simulation(main_file=get_path_to_main_file(request)) as user:
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/contextlib.py:214: in __aenter__
    return await anext(self.gen)
           ^^^^^^^^^^^^^^^^^^^^^
..../test-3-14-3/lib/python3.14.../nicegui/testing/user_simulation.py:37: in user_simulation
    runpy.run_path(str(main_file), run_name='__main__')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    """Start script for pytest."""
    
    from aignostics.constants import WINDOW_TITLE
    
>   from aignostics_sdk.utils import (
        gui_run,
    )
E   ImportError: cannot import name 'gui_run' from 'aignostics_sdk.utils' (.../aignostics_sdk/utils/__init__.py)

tests/main.py:5: ImportError
tests.aignostics.wsi.service_test::test_serve_tiff_to_jpeg_serves
Stack Traces | 1.09s run time
fixturedef = <FixtureDef argname='user' scope='function' baseid=''>
request = <SubRequest 'user' for <Function test_serve_tiff_to_jpeg_serves>>

    @pytest.hookimpl(wrapper=True)
    def pytest_fixture_setup(fixturedef: FixtureDef, request) -> object | None:
        if (
            fixturedef.argname == "event_loop_policy"
            and fixturedef.func.__module__ != __name__
        ):
            warnings.warn(
                PytestDeprecationWarning(_EVENT_LOOP_POLICY_FIXTURE_DEPRECATION_WARNING),
            )
        asyncio_mode = _get_asyncio_mode(request.config)
        if not _is_asyncio_fixture_function(fixturedef.func):
            if asyncio_mode == Mode.STRICT:
                # Ignore async fixtures without explicit asyncio mark in strict mode
                # This applies to pytest_trio fixtures, for example
                return (yield)
            if not _is_coroutine_or_asyncgen(fixturedef.func):
                return (yield)
        default_loop_scope = request.config.getini("asyncio_default_fixture_loop_scope")
        loop_scope = (
            getattr(fixturedef.func, "_loop_scope", None)
            or default_loop_scope
            or fixturedef.scope
        )
        runner_fixture_id = f"_{loop_scope}_scoped_runner"
        runner = request.getfixturevalue(runner_fixture_id)
        # Prevent the runner closing before the fixture's async teardown.
        runner_fixturedef = request._get_active_fixturedef(runner_fixture_id)
        runner_fixturedef.addfinalizer(
            functools.partial(fixturedef.finish, request=request)
        )
        synchronizer = _fixture_synchronizer(fixturedef, runner, request)
        _make_asyncio_fixture_function(synchronizer, loop_scope)
        with MonkeyPatch.context() as c:
            c.setattr(fixturedef, "func", synchronizer)
>           hook_result = yield
                          ^^^^^

..../test-3-14-3/lib/python3.14........./site-packages/pytest_asyncio/plugin.py:944: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
..../test-3-14-3/lib/python3.14........./site-packages/pytest_asyncio/plugin.py:407: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/asyncio/runners.py:127: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/asyncio/base_events.py:719: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
..../test-3-14-3/lib/python3.14........./site-packages/pytest_asyncio/plugin.py:403: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
..../test-3-14-3/lib/python3.14.../nicegui/testing/user_plugin.py:25: in user
    async with user_simulation(main_file=get_path_to_main_file(request)) as user:
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/contextlib.py:214: in __aenter__
    return await anext(self.gen)
           ^^^^^^^^^^^^^^^^^^^^^
..../test-3-14-3/lib/python3.14.../nicegui/testing/user_simulation.py:37: in user_simulation
    runpy.run_path(str(main_file), run_name='__main__')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    """Start script for pytest."""
    
    from aignostics.constants import WINDOW_TITLE
    
>   from aignostics_sdk.utils import (
        gui_run,
    )
E   ImportError: cannot import name 'gui_run' from 'aignostics_sdk.utils' (.../aignostics_sdk/utils/__init__.py)

tests/main.py:5: ImportError
tests.aignostics.wsi.service_test::test_serve_tiff_to_jpeg_fails_on_tiff_url_broken
Stack Traces | 1.1s run time
fixturedef = <FixtureDef argname='user' scope='function' baseid=''>
request = <SubRequest 'user' for <Function test_serve_tiff_to_jpeg_fails_on_tiff_url_broken>>

    @pytest.hookimpl(wrapper=True)
    def pytest_fixture_setup(fixturedef: FixtureDef, request) -> object | None:
        if (
            fixturedef.argname == "event_loop_policy"
            and fixturedef.func.__module__ != __name__
        ):
            warnings.warn(
                PytestDeprecationWarning(_EVENT_LOOP_POLICY_FIXTURE_DEPRECATION_WARNING),
            )
        asyncio_mode = _get_asyncio_mode(request.config)
        if not _is_asyncio_fixture_function(fixturedef.func):
            if asyncio_mode == Mode.STRICT:
                # Ignore async fixtures without explicit asyncio mark in strict mode
                # This applies to pytest_trio fixtures, for example
                return (yield)
            if not _is_coroutine_or_asyncgen(fixturedef.func):
                return (yield)
        default_loop_scope = request.config.getini("asyncio_default_fixture_loop_scope")
        loop_scope = (
            getattr(fixturedef.func, "_loop_scope", None)
            or default_loop_scope
            or fixturedef.scope
        )
        runner_fixture_id = f"_{loop_scope}_scoped_runner"
        runner = request.getfixturevalue(runner_fixture_id)
        # Prevent the runner closing before the fixture's async teardown.
        runner_fixturedef = request._get_active_fixturedef(runner_fixture_id)
        runner_fixturedef.addfinalizer(
            functools.partial(fixturedef.finish, request=request)
        )
        synchronizer = _fixture_synchronizer(fixturedef, runner, request)
        _make_asyncio_fixture_function(synchronizer, loop_scope)
        with MonkeyPatch.context() as c:
            c.setattr(fixturedef, "func", synchronizer)
>           hook_result = yield
                          ^^^^^

..../test-3-14-3/lib/python3.14........./site-packages/pytest_asyncio/plugin.py:944: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
..../test-3-14-3/lib/python3.14........./site-packages/pytest_asyncio/plugin.py:407: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/asyncio/runners.py:127: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/asyncio/base_events.py:719: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
..../test-3-14-3/lib/python3.14........./site-packages/pytest_asyncio/plugin.py:403: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
..../test-3-14-3/lib/python3.14.../nicegui/testing/user_plugin.py:25: in user
    async with user_simulation(main_file=get_path_to_main_file(request)) as user:
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/contextlib.py:214: in __aenter__
    return await anext(self.gen)
           ^^^^^^^^^^^^^^^^^^^^^
..../test-3-14-3/lib/python3.14.../nicegui/testing/user_simulation.py:37: in user_simulation
    runpy.run_path(str(main_file), run_name='__main__')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    """Start script for pytest."""
    
    from aignostics.constants import WINDOW_TITLE
    
>   from aignostics_sdk.utils import (
        gui_run,
    )
E   ImportError: cannot import name 'gui_run' from 'aignostics_sdk.utils' (.../aignostics_sdk/utils/__init__.py)

tests/main.py:5: ImportError
tests.aignostics.notebook.gui_test::test_gui_marimo_extension
Stack Traces | 1.18s run time
self = <Coroutine test_gui_marimo_extension>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
        # When loop factories are configured, resolve the loop factory
        # fixture early so that a factory variant change cascades cache
        # invalidation before any async fixture checks its cache.
        hook_caller = self.config.hook.pytest_asyncio_loop_factories
        if hook_caller.get_hookimpls():
            _ = self._request.getfixturevalue(_asyncio_loop_factory.__name__)
>       return super().setup()
               ^^^^^^^^^^^^^^^

..../test-3-14-3/lib/python3.14............/site-packages/pytest_asyncio/plugin.py:558: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
..../test-3-14-3/lib/python3.14............/site-packages/pytest_asyncio/plugin.py:944: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
..../test-3-14-3/lib/python3.14............/site-packages/pytest_asyncio/plugin.py:407: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/asyncio/runners.py:127: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/asyncio/base_events.py:719: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
..../test-3-14-3/lib/python3.14............/site-packages/pytest_asyncio/plugin.py:403: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
..../test-3-14-3/lib/python3.14.../nicegui/testing/user_plugin.py:25: in user
    async with user_simulation(main_file=get_path_to_main_file(request)) as user:
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/contextlib.py:214: in __aenter__
    return await anext(self.gen)
           ^^^^^^^^^^^^^^^^^^^^^
..../test-3-14-3/lib/python3.14.../nicegui/testing/user_simulation.py:37: in user_simulation
    runpy.run_path(str(main_file), run_name='__main__')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    """Start script for pytest."""
    
    from aignostics.constants import WINDOW_TITLE
    
>   from aignostics_sdk.utils import (
        gui_run,
    )
E   ImportError: cannot import name 'gui_run' from 'aignostics_sdk.utils' (.../aignostics_sdk/utils/__init__.py)

tests/main.py:5: ImportError
tests.aignostics.wsi.service_test::test_serve_tiff_to_jpeg_fails_on_broken_url
Stack Traces | 1.19s run time
fixturedef = <FixtureDef argname='user' scope='function' baseid=''>
request = <SubRequest 'user' for <Function test_serve_tiff_to_jpeg_fails_on_broken_url>>

    @pytest.hookimpl(wrapper=True)
    def pytest_fixture_setup(fixturedef: FixtureDef, request) -> object | None:
        if (
            fixturedef.argname == "event_loop_policy"
            and fixturedef.func.__module__ != __name__
        ):
            warnings.warn(
                PytestDeprecationWarning(_EVENT_LOOP_POLICY_FIXTURE_DEPRECATION_WARNING),
            )
        asyncio_mode = _get_asyncio_mode(request.config)
        if not _is_asyncio_fixture_function(fixturedef.func):
            if asyncio_mode == Mode.STRICT:
                # Ignore async fixtures without explicit asyncio mark in strict mode
                # This applies to pytest_trio fixtures, for example
                return (yield)
            if not _is_coroutine_or_asyncgen(fixturedef.func):
                return (yield)
        default_loop_scope = request.config.getini("asyncio_default_fixture_loop_scope")
        loop_scope = (
            getattr(fixturedef.func, "_loop_scope", None)
            or default_loop_scope
            or fixturedef.scope
        )
        runner_fixture_id = f"_{loop_scope}_scoped_runner"
        runner = request.getfixturevalue(runner_fixture_id)
        # Prevent the runner closing before the fixture's async teardown.
        runner_fixturedef = request._get_active_fixturedef(runner_fixture_id)
        runner_fixturedef.addfinalizer(
            functools.partial(fixturedef.finish, request=request)
        )
        synchronizer = _fixture_synchronizer(fixturedef, runner, request)
        _make_asyncio_fixture_function(synchronizer, loop_scope)
        with MonkeyPatch.context() as c:
            c.setattr(fixturedef, "func", synchronizer)
>           hook_result = yield
                          ^^^^^

..../test-3-14-3/lib/python3.14........./site-packages/pytest_asyncio/plugin.py:944: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
..../test-3-14-3/lib/python3.14........./site-packages/pytest_asyncio/plugin.py:407: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/asyncio/runners.py:127: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/asyncio/base_events.py:719: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
..../test-3-14-3/lib/python3.14........./site-packages/pytest_asyncio/plugin.py:403: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
..../test-3-14-3/lib/python3.14.../nicegui/testing/user_plugin.py:25: in user
    async with user_simulation(main_file=get_path_to_main_file(request)) as user:
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/contextlib.py:214: in __aenter__
    return await anext(self.gen)
           ^^^^^^^^^^^^^^^^^^^^^
..../test-3-14-3/lib/python3.14.../nicegui/testing/user_simulation.py:37: in user_simulation
    runpy.run_path(str(main_file), run_name='__main__')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    """Start script for pytest."""
    
    from aignostics.constants import WINDOW_TITLE
    
>   from aignostics_sdk.utils import (
        gui_run,
    )
E   ImportError: cannot import name 'gui_run' from 'aignostics_sdk.utils' (.../aignostics_sdk/utils/__init__.py)

tests/main.py:5: ImportError
tests.aignostics.dataset.gui_test::test_gui_idc_download_fails_with_no_inputs[ -Download failed: No IDs provided.]
Stack Traces | 1.23s run time
self = <Coroutine test_gui_idc_download_fails_with_no_inputs[ -Download failed: No IDs provided.]>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
        # When loop factories are configured, resolve the loop factory
        # fixture early so that a factory variant change cascades cache
        # invalidation before any async fixture checks its cache.
        hook_caller = self.config.hook.pytest_asyncio_loop_factories
        if hook_caller.get_hookimpls():
            _ = self._request.getfixturevalue(_asyncio_loop_factory.__name__)
>       return super().setup()
               ^^^^^^^^^^^^^^^

..../test-3-14-3/lib/python3.14............/site-packages/pytest_asyncio/plugin.py:558: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
..../test-3-14-3/lib/python3.14............/site-packages/pytest_asyncio/plugin.py:944: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
..../test-3-14-3/lib/python3.14............/site-packages/pytest_asyncio/plugin.py:407: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/asyncio/runners.py:127: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/asyncio/base_events.py:719: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
..../test-3-14-3/lib/python3.14............/site-packages/pytest_asyncio/plugin.py:403: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
..../test-3-14-3/lib/python3.14.../nicegui/testing/user_plugin.py:25: in user
    async with user_simulation(main_file=get_path_to_main_file(request)) as user:
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/contextlib.py:214: in __aenter__
    return await anext(self.gen)
           ^^^^^^^^^^^^^^^^^^^^^
..../test-3-14-3/lib/python3.14.../nicegui/testing/user_simulation.py:37: in user_simulation
    runpy.run_path(str(main_file), run_name='__main__')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    """Start script for pytest."""
    
    from aignostics.constants import WINDOW_TITLE
    
>   from aignostics_sdk.utils import (
        gui_run,
    )
E   ImportError: cannot import name 'gui_run' from 'aignostics_sdk.utils' (.../aignostics_sdk/utils/__init__.py)

tests/main.py:5: ImportError
tests.aignostics.dataset.gui_test::test_gui_idc_download_fails_with_invalid_inputs[4711-Download failed: None of the values passed matched any of the identifiers: collection_id, PatientID, StudyInstanceUID, SeriesInstanceUID, SOPInstanceUID.]
Stack Traces | 1.39s run time
self = <Coroutine test_gui_idc_download_fails_with_invalid_inputs[4711-Download failed: None of the values passed matched any of the identifiers: collection_id, PatientID, StudyInstanceUID, SeriesInstanceUID, SOPInstanceUID.]>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
        # When loop factories are configured, resolve the loop factory
        # fixture early so that a factory variant change cascades cache
        # invalidation before any async fixture checks its cache.
        hook_caller = self.config.hook.pytest_asyncio_loop_factories
        if hook_caller.get_hookimpls():
            _ = self._request.getfixturevalue(_asyncio_loop_factory.__name__)
>       return super().setup()
               ^^^^^^^^^^^^^^^

..../test-3-14-3/lib/python3.14............/site-packages/pytest_asyncio/plugin.py:558: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
..../test-3-14-3/lib/python3.14............/site-packages/pytest_asyncio/plugin.py:944: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
..../test-3-14-3/lib/python3.14............/site-packages/pytest_asyncio/plugin.py:407: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/asyncio/runners.py:127: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/asyncio/base_events.py:719: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
..../test-3-14-3/lib/python3.14............/site-packages/pytest_asyncio/plugin.py:403: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
..../test-3-14-3/lib/python3.14.../nicegui/testing/user_plugin.py:25: in user
    async with user_simulation(main_file=get_path_to_main_file(request)) as user:
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/contextlib.py:214: in __aenter__
    return await anext(self.gen)
           ^^^^^^^^^^^^^^^^^^^^^
..../test-3-14-3/lib/python3.14.../nicegui/testing/user_simulation.py:37: in user_simulation
    runpy.run_path(str(main_file), run_name='__main__')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    """Start script for pytest."""
    
    from aignostics.constants import WINDOW_TITLE
    
>   from aignostics_sdk.utils import (
        gui_run,
    )
E   ImportError: cannot import name 'gui_run' from 'aignostics_sdk.utils' (.../aignostics_sdk/utils/__init__.py)

tests/main.py:5: ImportError
tests.aignostics.wsi.service_test::test_serve_tiff_to_jpeg_fails_on_tiff_not_found
Stack Traces | 1.4s run time
fixturedef = <FixtureDef argname='user' scope='function' baseid=''>
request = <SubRequest 'user' for <Function test_serve_tiff_to_jpeg_fails_on_tiff_not_found>>

    @pytest.hookimpl(wrapper=True)
    def pytest_fixture_setup(fixturedef: FixtureDef, request) -> object | None:
        if (
            fixturedef.argname == "event_loop_policy"
            and fixturedef.func.__module__ != __name__
        ):
            warnings.warn(
                PytestDeprecationWarning(_EVENT_LOOP_POLICY_FIXTURE_DEPRECATION_WARNING),
            )
        asyncio_mode = _get_asyncio_mode(request.config)
        if not _is_asyncio_fixture_function(fixturedef.func):
            if asyncio_mode == Mode.STRICT:
                # Ignore async fixtures without explicit asyncio mark in strict mode
                # This applies to pytest_trio fixtures, for example
                return (yield)
            if not _is_coroutine_or_asyncgen(fixturedef.func):
                return (yield)
        default_loop_scope = request.config.getini("asyncio_default_fixture_loop_scope")
        loop_scope = (
            getattr(fixturedef.func, "_loop_scope", None)
            or default_loop_scope
            or fixturedef.scope
        )
        runner_fixture_id = f"_{loop_scope}_scoped_runner"
        runner = request.getfixturevalue(runner_fixture_id)
        # Prevent the runner closing before the fixture's async teardown.
        runner_fixturedef = request._get_active_fixturedef(runner_fixture_id)
        runner_fixturedef.addfinalizer(
            functools.partial(fixturedef.finish, request=request)
        )
        synchronizer = _fixture_synchronizer(fixturedef, runner, request)
        _make_asyncio_fixture_function(synchronizer, loop_scope)
        with MonkeyPatch.context() as c:
            c.setattr(fixturedef, "func", synchronizer)
>           hook_result = yield
                          ^^^^^

..../test-3-14-3/lib/python3.14........./site-packages/pytest_asyncio/plugin.py:944: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
..../test-3-14-3/lib/python3.14........./site-packages/pytest_asyncio/plugin.py:407: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/asyncio/runners.py:127: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/asyncio/base_events.py:719: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
..../test-3-14-3/lib/python3.14........./site-packages/pytest_asyncio/plugin.py:403: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
..../test-3-14-3/lib/python3.14.../nicegui/testing/user_plugin.py:25: in user
    async with user_simulation(main_file=get_path_to_main_file(request)) as user:
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/contextlib.py:214: in __aenter__
    return await anext(self.gen)
           ^^^^^^^^^^^^^^^^^^^^^
..../test-3-14-3/lib/python3.14.../nicegui/testing/user_simulation.py:37: in user_simulation
    runpy.run_path(str(main_file), run_name='__main__')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    """Start script for pytest."""
    
    from aignostics.constants import WINDOW_TITLE
    
>   from aignostics_sdk.utils import (
        gui_run,
    )
E   ImportError: cannot import name 'gui_run' from 'aignostics_sdk.utils' (.../aignostics_sdk/utils/__init__.py)

tests/main.py:5: ImportError
tests.aignostics_sdk.smoke_test::test_slim_cli_entry_point
Stack Traces | 2.89s run time
@pytest.mark.unit
    @pytest.mark.slim
    def test_slim_cli_entry_point() -> None:
        """aignostics-sdk CLI entry point exits 0."""
        result = subprocess.run(
            [sys.executable, "-m", "aignostics_sdk.cli", "--help"],
            capture_output=True,
            text=True,
            timeout=30,
            check=False,
        )
>       assert result.returncode == 0
E       assert 1 == 0
E        +  where 1 = CompletedProcess(args=['.../python-sdk/python-sdk/.nox.../test-3-14-3/bin/python3', '-m', 'aignostics_sdk.cli', '--help'], returncode=1, stdout='', stderr='Traceback (most recent call last):\n  File "<frozen runpy>", line 198, in _run_module_as_main\n  File "<frozen runpy>", line 88, in _run_code\n  File ".../src/aignostics_sdk/cli.py", line 15, in <module>\n    from aignostics_sdk.application._cli import cli as application_cli\n  File ".../aignostics_sdk/application/__init__.py", line 8, in <module>\n    from ._cli import cli\n  File ".../aignostics_sdk/application/_cli.py", line 17, in <module>\n    from aignostics_sdk.platform import (\n    ...<9 lines>...\n    )\n  File ".../aignostics_sdk/platform/__init__.py", line 19, in <module>\n    from ._client import Client\n  File ".../aignostics_sdk/platform/_client.py", line 22, in <module>\n    from .resources.access import ShareTokens\n  File ".../platform/resources/access.py", line 57, in <module>\n    from aignostics.platform._api import RETRYABLE_EXCEPTIONS, _AuthenticatedApi, _AuthenticatedResource, _log_retry_attempt\nModuleNotFoundError: No module named \'aignostics.platform\'\n').returncode

tests/aignostics_sdk/smoke_test.py:63: AssertionError
View the full list of 9 ❄️ flaky test(s)
::tests.aignostics.application.cli_test

Flake rate in main: 100.00% (Passed 0 times, Failed 25 times)

Stack Traces | 0s run time
ImportError while importing test module '.../aignostics/application/cli_test.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
../...../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/importlib/__init__.py:88: in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.../aignostics/application/cli_test.py:15: in <module>
    from aignostics.application import Service as ApplicationService
.../aignostics/application/__init__.py:3: in <module>
    from aignostics_sdk.application import (
.../aignostics_sdk/application/__init__.py:8: in <module>
    from ._cli import cli
.../aignostics_sdk/application/_cli.py:17: in <module>
    from aignostics_sdk.platform import (
.../aignostics_sdk/platform/__init__.py:19: in <module>
    from ._client import Client
.../aignostics_sdk/platform/_client.py:22: in <module>
    from .resources.access import ShareTokens
.../platform/resources/access.py:57: in <module>
    from aignostics.platform._api import RETRYABLE_EXCEPTIONS, _AuthenticatedApi, _AuthenticatedResource, _log_retry_attempt
E   ModuleNotFoundError: No module named 'aignostics.platform'
tests.aignostics.system.gui_test::test_gui_system_alive

Flake rate in main: 4.65% (Passed 41 times, Failed 2 times)

Stack Traces | 0.714s run time
self = <Coroutine test_gui_system_alive>

    def setup(self) -> None:
        runner_fixture_id = f"_{self._loop_scope}_scoped_runner"
        if runner_fixture_id not in self.fixturenames:
            self.fixturenames.append(runner_fixture_id)
        # When loop factories are configured, resolve the loop factory
        # fixture early so that a factory variant change cascades cache
        # invalidation before any async fixture checks its cache.
        hook_caller = self.config.hook.pytest_asyncio_loop_factories
        if hook_caller.get_hookimpls():
            _ = self._request.getfixturevalue(_asyncio_loop_factory.__name__)
>       return super().setup()
               ^^^^^^^^^^^^^^^

..../test-3-14-3/lib/python3.14............/site-packages/pytest_asyncio/plugin.py:558: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
..../test-3-14-3/lib/python3.14............/site-packages/pytest_asyncio/plugin.py:944: in pytest_fixture_setup
    hook_result = yield
                  ^^^^^
..../test-3-14-3/lib/python3.14............/site-packages/pytest_asyncio/plugin.py:407: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/asyncio/runners.py:127: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/asyncio/base_events.py:719: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
..../test-3-14-3/lib/python3.14............/site-packages/pytest_asyncio/plugin.py:403: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
..../test-3-14-3/lib/python3.14.../nicegui/testing/user_plugin.py:25: in user
    async with user_simulation(main_file=get_path_to_main_file(request)) as user:
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/contextlib.py:214: in __aenter__
    return await anext(self.gen)
           ^^^^^^^^^^^^^^^^^^^^^
..../test-3-14-3/lib/python3.14.../nicegui/testing/user_simulation.py:37: in user_simulation
    runpy.run_path(str(main_file), run_name='__main__')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    """Start script for pytest."""
    
    from aignostics.constants import WINDOW_TITLE
    
>   from aignostics_sdk.utils import (
        gui_run,
    )
E   ImportError: cannot import name 'gui_run' from 'aignostics_sdk.utils' (.../aignostics_sdk/utils/__init__.py)

tests/main.py:5: ImportError
tests.aignostics.utils.fs_test::test_open_user_data_directory_read_only_environment

Flake rate in main: 4.65% (Passed 41 times, Failed 2 times)

Stack Traces | 0.019s run time
record_property = <function record_property.<locals>.append_property at 0x7f2573cf4040>
tmp_path = PosixPath('.../pytest-7/popen-gw2/test_open_user_data_directory_1')

    @pytest.mark.integration
    def test_open_user_data_directory_read_only_environment(record_property, tmp_path) -> None:
        """Test open_user_data_directory works in read-only environment."""
        record_property("tested-item-id", "SPEC-UTILS-SERVICE")
        with (
            patch("aignostics_sdk.utils._fs.platformdirs.user_data_dir") as mock_user_data_dir,
            patch("aignostics_sdk.utils._fs.__project_name__", "test_project"),
            patch("aignostics_sdk.utils._fs.__is_running_in_read_only_environment__", True),
            patch("pathlib.Path.mkdir") as mock_mkdir,
>           patch("aignostics_sdk.utils._fs.show_in_file_manager") as mock_show_in_file_manager,
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        ):

.../aignostics/utils/fs_test.py:469: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
../......../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/unittest/mock.py:1503: in __enter__
    original, local = self.get_original()
                      ^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <unittest.mock._patch object at 0x7f2573d958d0>

    def get_original(self):
        target = self.getter()
        name = self.attribute
    
        original = DEFAULT
        local = False
    
        try:
            original = target.__dict__[name]
        except (AttributeError, KeyError):
            original = getattr(target, name, DEFAULT)
        else:
            local = True
    
        if name in _builtins and isinstance(target, ModuleType):
            self.create = True
    
        if not self.create and original is DEFAULT:
>           raise AttributeError(
                "%s does not have the attribute %r" % (target, name)
            )
E           AttributeError: <module 'aignostics_sdk.utils._fs' from '.../aignostics_sdk/utils/_fs.py'> does not have the attribute 'show_in_file_manager'

../......../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/unittest/mock.py:1473: AttributeError
tests.aignostics.utils.fs_test::test_open_user_data_directory_with_nested_scope

Flake rate in main: 4.65% (Passed 41 times, Failed 2 times)

Stack Traces | 0.101s run time
record_property = <function record_property.<locals>.append_property at 0x7f2573d7ec40>
tmp_path = PosixPath('.../pytest-7/popen-gw2/test_open_user_data_directory_0')

    @pytest.mark.integration
    def test_open_user_data_directory_with_nested_scope(record_property, tmp_path) -> None:
        """Test open_user_data_directory opens correct directory with nested scope."""
        record_property("tested-item-id", "SPEC-UTILS-SERVICE")
        with (
            patch("aignostics_sdk.utils._fs.platformdirs.user_data_dir") as mock_user_data_dir,
            patch("aignostics_sdk.utils._fs.__project_name__", "test_project"),
            patch("aignostics_sdk.utils._fs.__is_running_in_read_only_environment__", False),
            patch("pathlib.Path.mkdir") as mock_mkdir,
>           patch("aignostics_sdk.utils._fs.show_in_file_manager") as mock_show_in_file_manager,
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        ):

.../aignostics/utils/fs_test.py:447: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
../......../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/unittest/mock.py:1503: in __enter__
    original, local = self.get_original()
                      ^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <unittest.mock._patch object at 0x7f2573d95630>

    def get_original(self):
        target = self.getter()
        name = self.attribute
    
        original = DEFAULT
        local = False
    
        try:
            original = target.__dict__[name]
        except (AttributeError, KeyError):
            original = getattr(target, name, DEFAULT)
        else:
            local = True
    
        if name in _builtins and isinstance(target, ModuleType):
            self.create = True
    
        if not self.create and original is DEFAULT:
>           raise AttributeError(
                "%s does not have the attribute %r" % (target, name)
            )
E           AttributeError: <module 'aignostics_sdk.utils._fs' from '.../aignostics_sdk/utils/_fs.py'> does not have the attribute 'show_in_file_manager'

../......../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/unittest/mock.py:1473: AttributeError
tests.aignostics.wsi.service_test::test_serve_thumbnail_fails_on_missing_file

Flake rate in main: 6.25% (Passed 30 times, Failed 2 times)

Stack Traces | 0.616s run time
fixturedef = <FixtureDef argname='user' scope='function' baseid=''>
request = <SubRequest 'user' for <Function test_serve_thumbnail_fails_on_missing_file>>

    @pytest.hookimpl(wrapper=True)
    def pytest_fixture_setup(fixturedef: FixtureDef, request) -> object | None:
        if (
            fixturedef.argname == "event_loop_policy"
            and fixturedef.func.__module__ != __name__
        ):
            warnings.warn(
                PytestDeprecationWarning(_EVENT_LOOP_POLICY_FIXTURE_DEPRECATION_WARNING),
            )
        asyncio_mode = _get_asyncio_mode(request.config)
        if not _is_asyncio_fixture_function(fixturedef.func):
            if asyncio_mode == Mode.STRICT:
                # Ignore async fixtures without explicit asyncio mark in strict mode
                # This applies to pytest_trio fixtures, for example
                return (yield)
            if not _is_coroutine_or_asyncgen(fixturedef.func):
                return (yield)
        default_loop_scope = request.config.getini("asyncio_default_fixture_loop_scope")
        loop_scope = (
            getattr(fixturedef.func, "_loop_scope", None)
            or default_loop_scope
            or fixturedef.scope
        )
        runner_fixture_id = f"_{loop_scope}_scoped_runner"
        runner = request.getfixturevalue(runner_fixture_id)
        # Prevent the runner closing before the fixture's async teardown.
        runner_fixturedef = request._get_active_fixturedef(runner_fixture_id)
        runner_fixturedef.addfinalizer(
            functools.partial(fixturedef.finish, request=request)
        )
        synchronizer = _fixture_synchronizer(fixturedef, runner, request)
        _make_asyncio_fixture_function(synchronizer, loop_scope)
        with MonkeyPatch.context() as c:
            c.setattr(fixturedef, "func", synchronizer)
>           hook_result = yield
                          ^^^^^

..../test-3-14-3/lib/python3.14........./site-packages/pytest_asyncio/plugin.py:944: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
..../test-3-14-3/lib/python3.14........./site-packages/pytest_asyncio/plugin.py:407: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/asyncio/runners.py:127: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/asyncio/base_events.py:719: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
..../test-3-14-3/lib/python3.14........./site-packages/pytest_asyncio/plugin.py:403: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
..../test-3-14-3/lib/python3.14.../nicegui/testing/user_plugin.py:25: in user
    async with user_simulation(main_file=get_path_to_main_file(request)) as user:
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/contextlib.py:214: in __aenter__
    return await anext(self.gen)
           ^^^^^^^^^^^^^^^^^^^^^
..../test-3-14-3/lib/python3.14.../nicegui/testing/user_simulation.py:37: in user_simulation
    runpy.run_path(str(main_file), run_name='__main__')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    """Start script for pytest."""
    
    from aignostics.constants import WINDOW_TITLE
    
>   from aignostics_sdk.utils import (
        gui_run,
    )
E   ImportError: cannot import name 'gui_run' from 'aignostics_sdk.utils' (.../aignostics_sdk/utils/__init__.py)

tests/main.py:5: ImportError
tests.aignostics.wsi.service_test::test_serve_thumbnail_fails_on_unsupported_filetype

Flake rate in main: 4.65% (Passed 41 times, Failed 2 times)

Stack Traces | 1.24s run time
fixturedef = <FixtureDef argname='user' scope='function' baseid=''>
request = <SubRequest 'user' for <Function test_serve_thumbnail_fails_on_unsupported_filetype>>

    @pytest.hookimpl(wrapper=True)
    def pytest_fixture_setup(fixturedef: FixtureDef, request) -> object | None:
        if (
            fixturedef.argname == "event_loop_policy"
            and fixturedef.func.__module__ != __name__
        ):
            warnings.warn(
                PytestDeprecationWarning(_EVENT_LOOP_POLICY_FIXTURE_DEPRECATION_WARNING),
            )
        asyncio_mode = _get_asyncio_mode(request.config)
        if not _is_asyncio_fixture_function(fixturedef.func):
            if asyncio_mode == Mode.STRICT:
                # Ignore async fixtures without explicit asyncio mark in strict mode
                # This applies to pytest_trio fixtures, for example
                return (yield)
            if not _is_coroutine_or_asyncgen(fixturedef.func):
                return (yield)
        default_loop_scope = request.config.getini("asyncio_default_fixture_loop_scope")
        loop_scope = (
            getattr(fixturedef.func, "_loop_scope", None)
            or default_loop_scope
            or fixturedef.scope
        )
        runner_fixture_id = f"_{loop_scope}_scoped_runner"
        runner = request.getfixturevalue(runner_fixture_id)
        # Prevent the runner closing before the fixture's async teardown.
        runner_fixturedef = request._get_active_fixturedef(runner_fixture_id)
        runner_fixturedef.addfinalizer(
            functools.partial(fixturedef.finish, request=request)
        )
        synchronizer = _fixture_synchronizer(fixturedef, runner, request)
        _make_asyncio_fixture_function(synchronizer, loop_scope)
        with MonkeyPatch.context() as c:
            c.setattr(fixturedef, "func", synchronizer)
>           hook_result = yield
                          ^^^^^

..../test-3-14-3/lib/python3.14........./site-packages/pytest_asyncio/plugin.py:944: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
..../test-3-14-3/lib/python3.14........./site-packages/pytest_asyncio/plugin.py:407: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/asyncio/runners.py:127: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/asyncio/base_events.py:719: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
..../test-3-14-3/lib/python3.14........./site-packages/pytest_asyncio/plugin.py:403: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
..../test-3-14-3/lib/python3.14.../nicegui/testing/user_plugin.py:25: in user
    async with user_simulation(main_file=get_path_to_main_file(request)) as user:
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/contextlib.py:214: in __aenter__
    return await anext(self.gen)
           ^^^^^^^^^^^^^^^^^^^^^
..../test-3-14-3/lib/python3.14.../nicegui/testing/user_simulation.py:37: in user_simulation
    runpy.run_path(str(main_file), run_name='__main__')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    """Start script for pytest."""
    
    from aignostics.constants import WINDOW_TITLE
    
>   from aignostics_sdk.utils import (
        gui_run,
    )
E   ImportError: cannot import name 'gui_run' from 'aignostics_sdk.utils' (.../aignostics_sdk/utils/__init__.py)

tests/main.py:5: ImportError
tests.aignostics.wsi.service_test::test_serve_thumbnail_for_dicom_pyramidal_small

Flake rate in main: 4.65% (Passed 41 times, Failed 2 times)

Stack Traces | 0.668s run time
fixturedef = <FixtureDef argname='user' scope='function' baseid=''>
request = <SubRequest 'user' for <Function test_serve_thumbnail_for_dicom_pyramidal_small>>

    @pytest.hookimpl(wrapper=True)
    def pytest_fixture_setup(fixturedef: FixtureDef, request) -> object | None:
        if (
            fixturedef.argname == "event_loop_policy"
            and fixturedef.func.__module__ != __name__
        ):
            warnings.warn(
                PytestDeprecationWarning(_EVENT_LOOP_POLICY_FIXTURE_DEPRECATION_WARNING),
            )
        asyncio_mode = _get_asyncio_mode(request.config)
        if not _is_asyncio_fixture_function(fixturedef.func):
            if asyncio_mode == Mode.STRICT:
                # Ignore async fixtures without explicit asyncio mark in strict mode
                # This applies to pytest_trio fixtures, for example
                return (yield)
            if not _is_coroutine_or_asyncgen(fixturedef.func):
                return (yield)
        default_loop_scope = request.config.getini("asyncio_default_fixture_loop_scope")
        loop_scope = (
            getattr(fixturedef.func, "_loop_scope", None)
            or default_loop_scope
            or fixturedef.scope
        )
        runner_fixture_id = f"_{loop_scope}_scoped_runner"
        runner = request.getfixturevalue(runner_fixture_id)
        # Prevent the runner closing before the fixture's async teardown.
        runner_fixturedef = request._get_active_fixturedef(runner_fixture_id)
        runner_fixturedef.addfinalizer(
            functools.partial(fixturedef.finish, request=request)
        )
        synchronizer = _fixture_synchronizer(fixturedef, runner, request)
        _make_asyncio_fixture_function(synchronizer, loop_scope)
        with MonkeyPatch.context() as c:
            c.setattr(fixturedef, "func", synchronizer)
>           hook_result = yield
                          ^^^^^

..../test-3-14-3/lib/python3.14........./site-packages/pytest_asyncio/plugin.py:944: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
..../test-3-14-3/lib/python3.14........./site-packages/pytest_asyncio/plugin.py:407: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/asyncio/runners.py:127: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/asyncio/base_events.py:719: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
..../test-3-14-3/lib/python3.14........./site-packages/pytest_asyncio/plugin.py:403: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
..../test-3-14-3/lib/python3.14.../nicegui/testing/user_plugin.py:25: in user
    async with user_simulation(main_file=get_path_to_main_file(request)) as user:
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/contextlib.py:214: in __aenter__
    return await anext(self.gen)
           ^^^^^^^^^^^^^^^^^^^^^
..../test-3-14-3/lib/python3.14.../nicegui/testing/user_simulation.py:37: in user_simulation
    runpy.run_path(str(main_file), run_name='__main__')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    """Start script for pytest."""
    
    from aignostics.constants import WINDOW_TITLE
    
>   from aignostics_sdk.utils import (
        gui_run,
    )
E   ImportError: cannot import name 'gui_run' from 'aignostics_sdk.utils' (.../aignostics_sdk/utils/__init__.py)

tests/main.py:5: ImportError
tests.aignostics.wsi.service_test::test_serve_thumbnail_for_dicom_thumbnail

Flake rate in main: 4.65% (Passed 41 times, Failed 2 times)

Stack Traces | 1.32s run time
fixturedef = <FixtureDef argname='user' scope='function' baseid=''>
request = <SubRequest 'user' for <Function test_serve_thumbnail_for_dicom_thumbnail>>

    @pytest.hookimpl(wrapper=True)
    def pytest_fixture_setup(fixturedef: FixtureDef, request) -> object | None:
        if (
            fixturedef.argname == "event_loop_policy"
            and fixturedef.func.__module__ != __name__
        ):
            warnings.warn(
                PytestDeprecationWarning(_EVENT_LOOP_POLICY_FIXTURE_DEPRECATION_WARNING),
            )
        asyncio_mode = _get_asyncio_mode(request.config)
        if not _is_asyncio_fixture_function(fixturedef.func):
            if asyncio_mode == Mode.STRICT:
                # Ignore async fixtures without explicit asyncio mark in strict mode
                # This applies to pytest_trio fixtures, for example
                return (yield)
            if not _is_coroutine_or_asyncgen(fixturedef.func):
                return (yield)
        default_loop_scope = request.config.getini("asyncio_default_fixture_loop_scope")
        loop_scope = (
            getattr(fixturedef.func, "_loop_scope", None)
            or default_loop_scope
            or fixturedef.scope
        )
        runner_fixture_id = f"_{loop_scope}_scoped_runner"
        runner = request.getfixturevalue(runner_fixture_id)
        # Prevent the runner closing before the fixture's async teardown.
        runner_fixturedef = request._get_active_fixturedef(runner_fixture_id)
        runner_fixturedef.addfinalizer(
            functools.partial(fixturedef.finish, request=request)
        )
        synchronizer = _fixture_synchronizer(fixturedef, runner, request)
        _make_asyncio_fixture_function(synchronizer, loop_scope)
        with MonkeyPatch.context() as c:
            c.setattr(fixturedef, "func", synchronizer)
>           hook_result = yield
                          ^^^^^

..../test-3-14-3/lib/python3.14........./site-packages/pytest_asyncio/plugin.py:944: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
..../test-3-14-3/lib/python3.14........./site-packages/pytest_asyncio/plugin.py:407: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/asyncio/runners.py:127: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/asyncio/base_events.py:719: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
..../test-3-14-3/lib/python3.14........./site-packages/pytest_asyncio/plugin.py:403: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
..../test-3-14-3/lib/python3.14.../nicegui/testing/user_plugin.py:25: in user
    async with user_simulation(main_file=get_path_to_main_file(request)) as user:
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/contextlib.py:214: in __aenter__
    return await anext(self.gen)
           ^^^^^^^^^^^^^^^^^^^^^
..../test-3-14-3/lib/python3.14.../nicegui/testing/user_simulation.py:37: in user_simulation
    runpy.run_path(str(main_file), run_name='__main__')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    """Start script for pytest."""
    
    from aignostics.constants import WINDOW_TITLE
    
>   from aignostics_sdk.utils import (
        gui_run,
    )
E   ImportError: cannot import name 'gui_run' from 'aignostics_sdk.utils' (.../aignostics_sdk/utils/__init__.py)

tests/main.py:5: ImportError
tests.aignostics.wsi.service_test::test_serve_thumbnail_for_tiff

Flake rate in main: 4.65% (Passed 41 times, Failed 2 times)

Stack Traces | 1.1s run time
fixturedef = <FixtureDef argname='user' scope='function' baseid=''>
request = <SubRequest 'user' for <Function test_serve_thumbnail_for_tiff>>

    @pytest.hookimpl(wrapper=True)
    def pytest_fixture_setup(fixturedef: FixtureDef, request) -> object | None:
        if (
            fixturedef.argname == "event_loop_policy"
            and fixturedef.func.__module__ != __name__
        ):
            warnings.warn(
                PytestDeprecationWarning(_EVENT_LOOP_POLICY_FIXTURE_DEPRECATION_WARNING),
            )
        asyncio_mode = _get_asyncio_mode(request.config)
        if not _is_asyncio_fixture_function(fixturedef.func):
            if asyncio_mode == Mode.STRICT:
                # Ignore async fixtures without explicit asyncio mark in strict mode
                # This applies to pytest_trio fixtures, for example
                return (yield)
            if not _is_coroutine_or_asyncgen(fixturedef.func):
                return (yield)
        default_loop_scope = request.config.getini("asyncio_default_fixture_loop_scope")
        loop_scope = (
            getattr(fixturedef.func, "_loop_scope", None)
            or default_loop_scope
            or fixturedef.scope
        )
        runner_fixture_id = f"_{loop_scope}_scoped_runner"
        runner = request.getfixturevalue(runner_fixture_id)
        # Prevent the runner closing before the fixture's async teardown.
        runner_fixturedef = request._get_active_fixturedef(runner_fixture_id)
        runner_fixturedef.addfinalizer(
            functools.partial(fixturedef.finish, request=request)
        )
        synchronizer = _fixture_synchronizer(fixturedef, runner, request)
        _make_asyncio_fixture_function(synchronizer, loop_scope)
        with MonkeyPatch.context() as c:
            c.setattr(fixturedef, "func", synchronizer)
>           hook_result = yield
                          ^^^^^

..../test-3-14-3/lib/python3.14........./site-packages/pytest_asyncio/plugin.py:944: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
..../test-3-14-3/lib/python3.14........./site-packages/pytest_asyncio/plugin.py:407: in _asyncgen_fixture_wrapper
    result = runner.run(setup(), context=context)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/asyncio/runners.py:127: in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/asyncio/base_events.py:719: in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
..../test-3-14-3/lib/python3.14........./site-packages/pytest_asyncio/plugin.py:403: in setup
    res = await gen_obj.__anext__()
          ^^^^^^^^^^^^^^^^^^^^^^^^^
..../test-3-14-3/lib/python3.14.../nicegui/testing/user_plugin.py:25: in user
    async with user_simulation(main_file=get_path_to_main_file(request)) as user:
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
../.........../_temp/uv-python-dir/cpython-3.14.3-linux-x86_64-gnu/lib/python3.14/contextlib.py:214: in __aenter__
    return await anext(self.gen)
           ^^^^^^^^^^^^^^^^^^^^^
..../test-3-14-3/lib/python3.14.../nicegui/testing/user_simulation.py:37: in user_simulation
    runpy.run_path(str(main_file), run_name='__main__')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    """Start script for pytest."""
    
    from aignostics.constants import WINDOW_TITLE
    
>   from aignostics_sdk.utils import (
        gui_run,
    )
E   ImportError: cannot import name 'gui_run' from 'aignostics_sdk.utils' (.../aignostics_sdk/utils/__init__.py)

tests/main.py:5: ImportError

To view more test analytics, go to the Test Analytics Dashboard
📋 Got 3 mins? Take this short survey to help us improve Test Analytics.

@sonarqubecloud

sonarqubecloud Bot commented Jul 6, 2026

Copy link
Copy Markdown

Quality Gate Failed Quality Gate failed

Failed conditions
13.1% Coverage on New Code (required ≥ 70%)
10.6% Duplication on New Code (required ≤ 3%)
E Security Rating on New Code (required ≥ A)

See analysis details on SonarQube Cloud

Catch issues before they fail your Quality Gate with our IDE extension SonarQube for IDE

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

skip:test:long_running Skip long-running tests (≥5min)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants