labqoat 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) hide show
  1. labqoat-0.1.0/.github/workflows/ci.yml +29 -0
  2. labqoat-0.1.0/.github/workflows/publish.yml +23 -0
  3. labqoat-0.1.0/.gitignore +12 -0
  4. labqoat-0.1.0/.python-version +1 -0
  5. labqoat-0.1.0/LICENSE +4 -0
  6. labqoat-0.1.0/PKG-INFO +86 -0
  7. labqoat-0.1.0/README.md +69 -0
  8. labqoat-0.1.0/pyproject.toml +154 -0
  9. labqoat-0.1.0/src/labqoat/__init__.py +416 -0
  10. labqoat-0.1.0/src/labqoat/analytics/__init__.py +192 -0
  11. labqoat-0.1.0/src/labqoat/analytics_contracts.py +508 -0
  12. labqoat-0.1.0/src/labqoat/api.py +68 -0
  13. labqoat-0.1.0/src/labqoat/argument_codec.py +551 -0
  14. labqoat-0.1.0/src/labqoat/assets/__init__.py +58 -0
  15. labqoat-0.1.0/src/labqoat/assets/cache.py +226 -0
  16. labqoat-0.1.0/src/labqoat/assets/derivations.py +142 -0
  17. labqoat-0.1.0/src/labqoat/assets/domain.py +183 -0
  18. labqoat-0.1.0/src/labqoat/assets/namespace.py +539 -0
  19. labqoat-0.1.0/src/labqoat/assets/service.py +321 -0
  20. labqoat-0.1.0/src/labqoat/assets/store.py +106 -0
  21. labqoat-0.1.0/src/labqoat/async_client.py +107 -0
  22. labqoat-0.1.0/src/labqoat/auth.py +146 -0
  23. labqoat-0.1.0/src/labqoat/aws_identity.py +329 -0
  24. labqoat-0.1.0/src/labqoat/checkpoint_contracts.py +350 -0
  25. labqoat-0.1.0/src/labqoat/checkpoints.py +156 -0
  26. labqoat-0.1.0/src/labqoat/client.py +93 -0
  27. labqoat-0.1.0/src/labqoat/contract_artifacts.py +178 -0
  28. labqoat-0.1.0/src/labqoat/contract_registry.py +140 -0
  29. labqoat-0.1.0/src/labqoat/contracts/__init__.py +101 -0
  30. labqoat-0.1.0/src/labqoat/contracts/attestation.py +168 -0
  31. labqoat-0.1.0/src/labqoat/contracts/audio.py +166 -0
  32. labqoat-0.1.0/src/labqoat/contracts/compatibility.py +288 -0
  33. labqoat-0.1.0/src/labqoat/contracts/compiler.py +927 -0
  34. labqoat-0.1.0/src/labqoat/contracts/declarations.py +210 -0
  35. labqoat-0.1.0/src/labqoat/contracts/fixtures.py +23 -0
  36. labqoat-0.1.0/src/labqoat/contracts/validation.py +415 -0
  37. labqoat-0.1.0/src/labqoat/dataset_contracts.py +320 -0
  38. labqoat-0.1.0/src/labqoat/datasets/__init__.py +832 -0
  39. labqoat-0.1.0/src/labqoat/deployment.py +27 -0
  40. labqoat-0.1.0/src/labqoat/errors.py +98 -0
  41. labqoat-0.1.0/src/labqoat/evaluation_worker.py +177 -0
  42. labqoat-0.1.0/src/labqoat/evaluations/__init__.py +398 -0
  43. labqoat-0.1.0/src/labqoat/events.py +300 -0
  44. labqoat-0.1.0/src/labqoat/identity.py +446 -0
  45. labqoat-0.1.0/src/labqoat/images.py +63 -0
  46. labqoat-0.1.0/src/labqoat/import_worker.py +208 -0
  47. labqoat-0.1.0/src/labqoat/imports/__init__.py +368 -0
  48. labqoat-0.1.0/src/labqoat/imports/sources.py +235 -0
  49. labqoat-0.1.0/src/labqoat/migration/__init__.py +53 -0
  50. labqoat-0.1.0/src/labqoat/model_contracts.py +898 -0
  51. labqoat-0.1.0/src/labqoat/model_registry_client.py +483 -0
  52. labqoat-0.1.0/src/labqoat/models/__init__.py +329 -0
  53. labqoat-0.1.0/src/labqoat/nodes.py +478 -0
  54. labqoat-0.1.0/src/labqoat/platform.py +191 -0
  55. labqoat-0.1.0/src/labqoat/publication_contracts.py +566 -0
  56. labqoat-0.1.0/src/labqoat/py.typed +1 -0
  57. labqoat-0.1.0/src/labqoat/references.py +261 -0
  58. labqoat-0.1.0/src/labqoat/resources.py +83 -0
  59. labqoat-0.1.0/src/labqoat/retry.py +212 -0
  60. labqoat-0.1.0/src/labqoat/run_contracts.py +505 -0
  61. labqoat-0.1.0/src/labqoat/runs.py +990 -0
  62. labqoat-0.1.0/src/labqoat/staging.py +243 -0
  63. labqoat-0.1.0/src/labqoat/training/__init__.py +414 -0
  64. labqoat-0.1.0/src/labqoat/training/runtime.py +396 -0
  65. labqoat-0.1.0/src/labqoat/training_worker.py +196 -0
  66. labqoat-0.1.0/src/labqoat/transform_worker.py +182 -0
  67. labqoat-0.1.0/src/labqoat/transforms/__init__.py +555 -0
  68. labqoat-0.1.0/src/labqoat/transport.py +198 -0
  69. labqoat-0.1.0/src/labqoat/wire.py +87 -0
  70. labqoat-0.1.0/src/labqoat/workload_client.py +664 -0
  71. labqoat-0.1.0/src/labqoat/workload_contracts.py +136 -0
  72. labqoat-0.1.0/src/labqoat/workloads.py +239 -0
  73. labqoat-0.1.0/src/labqoat_cli/__init__.py +1 -0
  74. labqoat-0.1.0/src/labqoat_cli/asset_download.py +78 -0
  75. labqoat-0.1.0/src/labqoat_cli/cloud_builder.py +562 -0
  76. labqoat-0.1.0/src/labqoat_cli/commands.py +1360 -0
  77. labqoat-0.1.0/src/labqoat_cli/connection.py +325 -0
  78. labqoat-0.1.0/src/labqoat_cli/evaluation_arguments.py +436 -0
  79. labqoat-0.1.0/src/labqoat_cli/image_builder.py +58 -0
  80. labqoat-0.1.0/src/labqoat_cli/local_context.py +314 -0
  81. labqoat-0.1.0/src/labqoat_cli/main.py +3001 -0
  82. labqoat-0.1.0/src/labqoat_cli/model_development.py +399 -0
  83. labqoat-0.1.0/src/labqoat_cli/project.py +150 -0
  84. labqoat-0.1.0/src/labqoat_cli/py.typed +1 -0
  85. labqoat-0.1.0/src/labqoat_cli/rendering.py +181 -0
  86. labqoat-0.1.0/src/labqoat_cli/scaffolding.py +563 -0
  87. labqoat-0.1.0/src/labqoat_cli/verification.py +126 -0
  88. labqoat-0.1.0/src/labqoat_cli/workspace.py +91 -0
  89. labqoat-0.1.0/tests/cli/__init__.py +1 -0
  90. labqoat-0.1.0/tests/cli/test_asset_download.py +118 -0
  91. labqoat-0.1.0/tests/cli/test_commands.py +328 -0
  92. labqoat-0.1.0/tests/cli/test_connection.py +406 -0
  93. labqoat-0.1.0/tests/cli/test_evaluation_arguments.py +278 -0
  94. labqoat-0.1.0/tests/cli/test_image_builder.py +136 -0
  95. labqoat-0.1.0/tests/cli/test_local_context.py +154 -0
  96. labqoat-0.1.0/tests/cli/test_main.py +3306 -0
  97. labqoat-0.1.0/tests/cli/test_model_development.py +310 -0
  98. labqoat-0.1.0/tests/cli/test_project.py +44 -0
  99. labqoat-0.1.0/tests/cli/test_rendering.py +149 -0
  100. labqoat-0.1.0/tests/cli/test_scaffolding.py +139 -0
  101. labqoat-0.1.0/tests/cli/test_verification.py +192 -0
  102. labqoat-0.1.0/tests/cli/test_workspace.py +84 -0
  103. labqoat-0.1.0/tests/sdk/contracts/test_attestation.py +101 -0
  104. labqoat-0.1.0/tests/sdk/contracts/test_compatibility.py +311 -0
  105. labqoat-0.1.0/tests/sdk/contracts/test_compiler.py +393 -0
  106. labqoat-0.1.0/tests/sdk/contracts/test_declarations.py +174 -0
  107. labqoat-0.1.0/tests/sdk/contracts/test_validation.py +228 -0
  108. labqoat-0.1.0/tests/sdk/test_analytics_metadata.py +94 -0
  109. labqoat-0.1.0/tests/sdk/test_analytics_namespace.py +358 -0
  110. labqoat-0.1.0/tests/sdk/test_api.py +90 -0
  111. labqoat-0.1.0/tests/sdk/test_argument_codec.py +207 -0
  112. labqoat-0.1.0/tests/sdk/test_asset_cache.py +168 -0
  113. labqoat-0.1.0/tests/sdk/test_asset_derivations.py +153 -0
  114. labqoat-0.1.0/tests/sdk/test_asset_namespace.py +365 -0
  115. labqoat-0.1.0/tests/sdk/test_assets.py +364 -0
  116. labqoat-0.1.0/tests/sdk/test_auth.py +109 -0
  117. labqoat-0.1.0/tests/sdk/test_aws_identity.py +437 -0
  118. labqoat-0.1.0/tests/sdk/test_checkpoints.py +258 -0
  119. labqoat-0.1.0/tests/sdk/test_clients.py +481 -0
  120. labqoat-0.1.0/tests/sdk/test_contract_registry.py +158 -0
  121. labqoat-0.1.0/tests/sdk/test_dataset_repositories.py +228 -0
  122. labqoat-0.1.0/tests/sdk/test_errors.py +57 -0
  123. labqoat-0.1.0/tests/sdk/test_evaluation_contracts.py +132 -0
  124. labqoat-0.1.0/tests/sdk/test_evaluation_namespace.py +338 -0
  125. labqoat-0.1.0/tests/sdk/test_evaluation_worker.py +228 -0
  126. labqoat-0.1.0/tests/sdk/test_events.py +171 -0
  127. labqoat-0.1.0/tests/sdk/test_identity.py +414 -0
  128. labqoat-0.1.0/tests/sdk/test_images.py +70 -0
  129. labqoat-0.1.0/tests/sdk/test_import_namespace.py +340 -0
  130. labqoat-0.1.0/tests/sdk/test_import_worker.py +338 -0
  131. labqoat-0.1.0/tests/sdk/test_migration_contracts.py +73 -0
  132. labqoat-0.1.0/tests/sdk/test_model_contracts.py +272 -0
  133. labqoat-0.1.0/tests/sdk/test_model_invocation.py +167 -0
  134. labqoat-0.1.0/tests/sdk/test_model_registry_client.py +442 -0
  135. labqoat-0.1.0/tests/sdk/test_nodes_namespace.py +213 -0
  136. labqoat-0.1.0/tests/sdk/test_package.py +8 -0
  137. labqoat-0.1.0/tests/sdk/test_platform_panels.py +44 -0
  138. labqoat-0.1.0/tests/sdk/test_publication_contracts.py +139 -0
  139. labqoat-0.1.0/tests/sdk/test_references.py +232 -0
  140. labqoat-0.1.0/tests/sdk/test_resources.py +65 -0
  141. labqoat-0.1.0/tests/sdk/test_retry.py +232 -0
  142. labqoat-0.1.0/tests/sdk/test_runs_namespace.py +1130 -0
  143. labqoat-0.1.0/tests/sdk/test_staging.py +298 -0
  144. labqoat-0.1.0/tests/sdk/test_training_namespace.py +386 -0
  145. labqoat-0.1.0/tests/sdk/test_training_runtime.py +310 -0
  146. labqoat-0.1.0/tests/sdk/test_training_worker.py +289 -0
  147. labqoat-0.1.0/tests/sdk/test_transform_namespace.py +321 -0
  148. labqoat-0.1.0/tests/sdk/test_transform_worker.py +228 -0
  149. labqoat-0.1.0/tests/sdk/test_transforms.py +220 -0
  150. labqoat-0.1.0/tests/sdk/test_transport.py +190 -0
  151. labqoat-0.1.0/tests/sdk/test_workload_client.py +598 -0
  152. labqoat-0.1.0/tests/sdk/test_workload_harness.py +141 -0
  153. labqoat-0.1.0/tests/sdk/test_workloads.py +193 -0
  154. labqoat-0.1.0/uv.lock +828 -0
@@ -0,0 +1,29 @@
1
+ name: CI
2
+
3
+ on:
4
+ pull_request:
5
+ push:
6
+ branches: [main]
7
+
8
+ permissions:
9
+ contents: read
10
+
11
+ jobs:
12
+ verify:
13
+ runs-on: ubuntu-24.04
14
+ timeout-minutes: 30
15
+ steps:
16
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
17
+ - uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
18
+ with:
19
+ enable-cache: true
20
+ version: "0.9.2"
21
+ - run: uv python install 3.13
22
+ - run: uv sync --all-groups --locked
23
+ - run: uv run ruff format --check .
24
+ - run: uv run ruff check .
25
+ - run: uv run lint-imports
26
+ - run: uv run pyright
27
+ - run: uv run pyright --verifytypes labqoat --ignoreexternal
28
+ - run: uv run pytest --randomly-seed="$GITHUB_RUN_ID"
29
+ - run: uv build
@@ -0,0 +1,23 @@
1
+ name: Publish to PyPI
2
+
3
+ on:
4
+ push:
5
+ tags: ["v*"]
6
+
7
+ permissions:
8
+ contents: read
9
+
10
+ jobs:
11
+ publish:
12
+ runs-on: ubuntu-24.04
13
+ environment: pypi
14
+ permissions:
15
+ contents: read
16
+ id-token: write
17
+ steps:
18
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
19
+ - uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0
20
+ with:
21
+ version: "0.9.2"
22
+ - run: uv build
23
+ - run: uv publish --trusted-publishing always
@@ -0,0 +1,12 @@
1
+ .coverage
2
+ .labqoat/
3
+ .pytest_cache/
4
+ .ruff_cache/
5
+ .venv/
6
+ __pycache__/
7
+ build/
8
+ dist/
9
+ *.egg-info/
10
+ *.py[cod]
11
+ .DS_Store
12
+ .import_linter_cache/
@@ -0,0 +1 @@
1
+ 3.13
labqoat-0.1.0/LICENSE ADDED
@@ -0,0 +1,4 @@
1
+ Copyright (c) 2026 Labqoat. All rights reserved.
2
+
3
+ This software is proprietary and may be used only with permission from
4
+ Labqoat.
labqoat-0.1.0/PKG-INFO ADDED
@@ -0,0 +1,86 @@
1
+ Metadata-Version: 2.5
2
+ Name: labqoat
3
+ Version: 0.1.0
4
+ Summary: Typed Python SDK and lab command-line client for the Labqoat platform
5
+ Author: Labqoat
6
+ License-Expression: LicenseRef-Proprietary
7
+ License-File: LICENSE
8
+ Requires-Python: <3.14,>=3.13
9
+ Requires-Dist: botocore[crt]<2,>=1.40
10
+ Requires-Dist: click<9,>=8.4
11
+ Requires-Dist: httpx<0.29,>=0.28.1
12
+ Requires-Dist: keyring<26,>=25
13
+ Requires-Dist: msgspec<0.20,>=0.19.0
14
+ Requires-Dist: pyarrow<24,>=21.0.0
15
+ Requires-Dist: rich<15,>=14.3
16
+ Description-Content-Type: text/markdown
17
+
18
+ # Labqoat
19
+
20
+ `labqoat` is the public Python SDK and the `lab` command-line client for the
21
+ shared Labqoat cloud platform. Application repositories contain only authored
22
+ resources—models, jobs, datasets, evaluations, and transforms. Terraform,
23
+ Kubernetes, persistence, and control-plane services stay in the platform
24
+ repository and are deployed once.
25
+
26
+ ## Install
27
+
28
+ ```bash
29
+ uv tool install labqoat
30
+ # or
31
+ pipx install labqoat
32
+ ```
33
+
34
+ Python projects that import the SDK should also declare `labqoat` as a normal
35
+ dependency.
36
+
37
+ ## Start a project
38
+
39
+ ```bash
40
+ lab init my-lab-project
41
+ cd my-lab-project
42
+ uv sync
43
+
44
+ lab model new audio/my-model
45
+ lab train new audio/my-training-job
46
+ lab dataset new audio/my-dataset
47
+ ```
48
+
49
+ Authenticate once, then open the AWS dashboard with the same stored session:
50
+
51
+ ```bash
52
+ lab auth
53
+ lab auth ui
54
+ ```
55
+
56
+ The browser handoff is automatic; the bearer token is not printed or placed in
57
+ the HTTP request URL.
58
+
59
+ The generated repository has this shape and no infrastructure code:
60
+
61
+ ```text
62
+ my-lab-project/
63
+ ├── datasets/
64
+ ├── evals/
65
+ ├── jobs/
66
+ ├── models/
67
+ ├── transforms/
68
+ ├── pyproject.toml
69
+ └── README.md
70
+ ```
71
+
72
+ Run `lab <group> --help` for the command surface. Local `check`, `test`, and
73
+ `build` commands do not require cloud authentication. `submit` and `deploy`
74
+ require a clean pushed Git commit and send a source snapshot to the one shared
75
+ AWS builder; user repositories never contain or apply Terraform.
76
+
77
+ ## Development
78
+
79
+ ```bash
80
+ uv sync --all-groups --locked
81
+ uv run ruff format --check .
82
+ uv run ruff check .
83
+ uv run pyright
84
+ uv run pytest
85
+ uv build
86
+ ```
@@ -0,0 +1,69 @@
1
+ # Labqoat
2
+
3
+ `labqoat` is the public Python SDK and the `lab` command-line client for the
4
+ shared Labqoat cloud platform. Application repositories contain only authored
5
+ resources—models, jobs, datasets, evaluations, and transforms. Terraform,
6
+ Kubernetes, persistence, and control-plane services stay in the platform
7
+ repository and are deployed once.
8
+
9
+ ## Install
10
+
11
+ ```bash
12
+ uv tool install labqoat
13
+ # or
14
+ pipx install labqoat
15
+ ```
16
+
17
+ Python projects that import the SDK should also declare `labqoat` as a normal
18
+ dependency.
19
+
20
+ ## Start a project
21
+
22
+ ```bash
23
+ lab init my-lab-project
24
+ cd my-lab-project
25
+ uv sync
26
+
27
+ lab model new audio/my-model
28
+ lab train new audio/my-training-job
29
+ lab dataset new audio/my-dataset
30
+ ```
31
+
32
+ Authenticate once, then open the AWS dashboard with the same stored session:
33
+
34
+ ```bash
35
+ lab auth
36
+ lab auth ui
37
+ ```
38
+
39
+ The browser handoff is automatic; the bearer token is not printed or placed in
40
+ the HTTP request URL.
41
+
42
+ The generated repository has this shape and no infrastructure code:
43
+
44
+ ```text
45
+ my-lab-project/
46
+ ├── datasets/
47
+ ├── evals/
48
+ ├── jobs/
49
+ ├── models/
50
+ ├── transforms/
51
+ ├── pyproject.toml
52
+ └── README.md
53
+ ```
54
+
55
+ Run `lab <group> --help` for the command surface. Local `check`, `test`, and
56
+ `build` commands do not require cloud authentication. `submit` and `deploy`
57
+ require a clean pushed Git commit and send a source snapshot to the one shared
58
+ AWS builder; user repositories never contain or apply Terraform.
59
+
60
+ ## Development
61
+
62
+ ```bash
63
+ uv sync --all-groups --locked
64
+ uv run ruff format --check .
65
+ uv run ruff check .
66
+ uv run pyright
67
+ uv run pytest
68
+ uv build
69
+ ```
@@ -0,0 +1,154 @@
1
+ [build-system]
2
+ requires = ["hatchling"]
3
+ build-backend = "hatchling.build"
4
+
5
+ [project]
6
+ name = "labqoat"
7
+ version = "0.1.0"
8
+ description = "Typed Python SDK and lab command-line client for the Labqoat platform"
9
+ readme = "README.md"
10
+ requires-python = ">=3.13,<3.14"
11
+ license = "LicenseRef-Proprietary"
12
+ authors = [{ name = "Labqoat" }]
13
+ dependencies = [
14
+ "botocore[crt]>=1.40,<2",
15
+ "click>=8.4,<9",
16
+ "httpx>=0.28.1,<0.29",
17
+ "keyring>=25,<26",
18
+ "msgspec>=0.19.0,<0.20",
19
+ "pyarrow>=21.0.0,<24",
20
+ "rich>=14.3,<15",
21
+ ]
22
+
23
+ [project.scripts]
24
+ lab = "labqoat_cli.main:main"
25
+
26
+ [dependency-groups]
27
+ dev = [
28
+ "boto3>=1.40,<2",
29
+ "boto3-stubs[s3]>=1.40,<2",
30
+ "botocore-stubs>=1.40,<2",
31
+ "build>=1.3,<2",
32
+ "import-linter>=2.5,<3",
33
+ "pyright>=1.1.403,<2",
34
+ "pytest>=8.4,<9",
35
+ "pytest-asyncio>=1.1,<2",
36
+ "pytest-cov>=6.2,<7",
37
+ "pytest-randomly>=4,<5",
38
+ "pyarrow-stubs>=20.0.0.20260625,<21",
39
+ "ruff>=0.12.7,<0.13",
40
+ "types-jsonschema>=4.26.0.20260518,<5",
41
+ ]
42
+
43
+ [tool.hatch.build.targets.wheel]
44
+ packages = ["src/labqoat", "src/labqoat_cli"]
45
+
46
+ [tool.ruff]
47
+ target-version = "py313"
48
+ line-length = 88
49
+ src = ["src", "tests"]
50
+
51
+ [tool.ruff.lint]
52
+ ignore = ["N818", "TRY003", "ASYNC109"]
53
+ select = [
54
+ "ASYNC",
55
+ "B",
56
+ "C4",
57
+ "C90",
58
+ "DTZ",
59
+ "E",
60
+ "EXE",
61
+ "F",
62
+ "FA",
63
+ "FLY",
64
+ "FURB",
65
+ "G",
66
+ "I",
67
+ "ICN",
68
+ "INP",
69
+ "LOG",
70
+ "N",
71
+ "PERF",
72
+ "PIE",
73
+ "PLC",
74
+ "PLE",
75
+ "PLR",
76
+ "PLW",
77
+ "PTH",
78
+ "RET",
79
+ "RSE",
80
+ "RUF",
81
+ "S",
82
+ "SIM",
83
+ "SLF",
84
+ "T10",
85
+ "T20",
86
+ "TC",
87
+ "TRY",
88
+ "UP",
89
+ "W",
90
+ ]
91
+
92
+ [tool.ruff.lint.mccabe]
93
+ max-complexity = 8
94
+
95
+ [tool.ruff.lint.pylint]
96
+ max-args = 5
97
+ max-branches = 8
98
+ max-returns = 6
99
+ max-statements = 40
100
+
101
+ [tool.ruff.lint.per-file-ignores]
102
+ "tests/**/*.py" = ["INP001", "PLR2004", "S101"]
103
+
104
+ [tool.pyright]
105
+ include = ["src", "tests"]
106
+ stubPath = "tests/typing_stubs"
107
+ pythonVersion = "3.13"
108
+ typeCheckingMode = "strict"
109
+ venvPath = "."
110
+ venv = ".venv"
111
+ reportImplicitOverride = "error"
112
+ reportMissingTypeStubs = "error"
113
+ reportUnnecessaryTypeIgnoreComment = "error"
114
+
115
+ [tool.pytest.ini_options]
116
+ addopts = [
117
+ "--strict-config",
118
+ "--strict-markers",
119
+ "--strict",
120
+ "--cov=labqoat",
121
+ "--cov=labqoat_cli",
122
+ "--cov-branch",
123
+ "--cov-report=term-missing",
124
+ ]
125
+ filterwarnings = ["error"]
126
+ pythonpath = ["src"]
127
+ testpaths = ["tests"]
128
+ xfail_strict = true
129
+
130
+ [tool.coverage.run]
131
+ branch = true
132
+ source = ["labqoat", "labqoat_cli"]
133
+ omit = ["**/tests/**"]
134
+
135
+ [tool.coverage.report]
136
+ fail_under = 0
137
+ show_missing = true
138
+ skip_empty = false
139
+
140
+ [tool.importlinter]
141
+ root_packages = ["labqoat", "labqoat_cli"]
142
+ include_external_packages = true
143
+
144
+ [[tool.importlinter.contracts]]
145
+ name = "Domain primitives do not depend on client adapters"
146
+ type = "forbidden"
147
+ source_modules = ["labqoat.contracts", "labqoat.references"]
148
+ forbidden_modules = ["labqoat.client", "labqoat.async_client"]
149
+
150
+ [[tool.importlinter.contracts]]
151
+ name = "CLI uses only the public SDK"
152
+ type = "forbidden"
153
+ source_modules = ["labqoat_cli"]
154
+ forbidden_modules = ["labqoat_control_plane"]