dominus-sdk-python 9.0.4__tar.gz → 9.0.6__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.
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/PKG-INFO +2 -2
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/README.md +1 -1
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/dominus/__init__.py +28 -5
- dominus_sdk_python-9.0.6/dominus/contract/__init__.py +10 -0
- dominus_sdk_python-9.0.6/dominus/contract/envelope.py +23 -0
- dominus_sdk_python-9.0.6/dominus/contract/projections.py +22 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/dominus/namespaces/artifacts.py +7 -1
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/dominus/namespaces/browser.py +6 -1
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/dominus/namespaces/stash.py +20 -1
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/dominus/start.py +2 -2
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/dominus_sdk_python.egg-info/PKG-INFO +2 -2
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/dominus_sdk_python.egg-info/SOURCES.txt +5 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/pyproject.toml +1 -1
- dominus_sdk_python-9.0.6/tests/test_contract.py +70 -0
- dominus_sdk_python-9.0.6/tests/test_errors_aliases.py +277 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/tests/test_stash_artifact_facade.py +69 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/dominus/config/__init__.py +0 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/dominus/config/endpoints.py +0 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/dominus/errors.py +0 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/dominus/helpers/__init__.py +0 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/dominus/helpers/auth.py +0 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/dominus/helpers/cache.py +0 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/dominus/helpers/console_capture.py +0 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/dominus/helpers/core.py +0 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/dominus/helpers/crypto.py +0 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/dominus/helpers/sse.py +0 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/dominus/helpers/trace.py +0 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/dominus/namespaces/__init__.py +0 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/dominus/namespaces/admin.py +0 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/dominus/namespaces/ai.py +0 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/dominus/namespaces/auth.py +0 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/dominus/namespaces/authority.py +0 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/dominus/namespaces/coder.py +0 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/dominus/namespaces/courier.py +0 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/dominus/namespaces/db.py +0 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/dominus/namespaces/ddl.py +0 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/dominus/namespaces/deployer.py +0 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/dominus/namespaces/fastapi.py +0 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/dominus/namespaces/files.py +0 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/dominus/namespaces/health.py +0 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/dominus/namespaces/jobs.py +0 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/dominus/namespaces/logs.py +0 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/dominus/namespaces/platform.py +0 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/dominus/namespaces/portal.py +0 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/dominus/namespaces/processor.py +0 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/dominus/namespaces/publisher.py +0 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/dominus/namespaces/recipes.py +0 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/dominus/namespaces/redis.py +0 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/dominus/namespaces/secrets.py +0 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/dominus/namespaces/secure.py +0 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/dominus/namespaces/sync.py +0 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/dominus/namespaces/warden.py +0 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/dominus/namespaces/workflow.py +0 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/dominus/py.typed +0 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/dominus/services/__init__.py +0 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/dominus_sdk_python.egg-info/dependency_links.txt +0 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/dominus_sdk_python.egg-info/requires.txt +0 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/dominus_sdk_python.egg-info/top_level.txt +0 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/setup.cfg +0 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/tests/test_auth.py +0 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/tests/test_authority_public_vocabulary.py +0 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/tests/test_browser_namespace.py +0 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/tests/test_control_plane_namespaces.py +0 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/tests/test_error_recovery_action.py +0 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/tests/test_errors.py +0 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/tests/test_flat_commands.py +0 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/tests/test_health.py +0 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/tests/test_logs.py +0 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/tests/test_namespace_barrel_exports.py +0 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/tests/test_platform_coder_namespaces.py +0 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/tests/test_provisioning_parity.py +0 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/tests/test_public_exports.py +0 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/tests/test_publisher_namespace.py +0 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/tests/test_readme_quickstart_catalog.py +0 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/tests/test_recipes_namespace.py +0 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/tests/test_recipes_stash_routing.py +0 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/tests/test_secrets_presence_contract.py +0 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/tests/test_stash_tables_namespace.py +0 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/tests/test_transport_compat.py +0 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/tests/test_workflow_lifecycle.py +0 -0
- {dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/tests/test_workflow_refs.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dominus-sdk-python
|
|
3
|
-
Version: 9.0.
|
|
3
|
+
Version: 9.0.6
|
|
4
4
|
Summary: Python SDK for the Dominus gateway-first platform
|
|
5
5
|
Author-email: CareBridge Systems <dev@carebridge.io>
|
|
6
6
|
License-Expression: LicenseRef-Proprietary
|
|
@@ -48,7 +48,7 @@ cleanup audit is `docs/janitor/2026-08-04-sdk-python-cleanup-audit.md`.
|
|
|
48
48
|
- Gateway-scoped client mode for MCP and other user-JWT sessions
|
|
49
49
|
- Transport compatibility for wrapped `{success,data}` responses and unwrapped Warden/control-plane success objects
|
|
50
50
|
- Local helpers for JWT verification, trace propagation, retries, and console capture
|
|
51
|
-
- Current package version: `9.0.
|
|
51
|
+
- Current package version: `9.0.5`
|
|
52
52
|
|
|
53
53
|
## Install
|
|
54
54
|
|
|
@@ -15,7 +15,7 @@ cleanup audit is `docs/janitor/2026-08-04-sdk-python-cleanup-audit.md`.
|
|
|
15
15
|
- Gateway-scoped client mode for MCP and other user-JWT sessions
|
|
16
16
|
- Transport compatibility for wrapped `{success,data}` responses and unwrapped Warden/control-plane success objects
|
|
17
17
|
- Local helpers for JWT verification, trace propagation, retries, and console capture
|
|
18
|
-
- Current package version: `9.0.
|
|
18
|
+
- Current package version: `9.0.5`
|
|
19
19
|
|
|
20
20
|
## Install
|
|
21
21
|
|
|
@@ -160,12 +160,24 @@ from .helpers.trace import (
|
|
|
160
160
|
# Export error classes
|
|
161
161
|
from .errors import (
|
|
162
162
|
DominusError,
|
|
163
|
+
# v1 aliases (preserved — deprecated in v2, removed in v3 per ADR 0010)
|
|
163
164
|
AuthenticationError,
|
|
164
165
|
AuthorizationError,
|
|
165
|
-
NotFoundError,
|
|
166
166
|
ValidationError,
|
|
167
|
-
ConflictError,
|
|
168
167
|
ServiceError,
|
|
168
|
+
# Per-kind canonical subclasses (Seams fork 6, ADR 0010)
|
|
169
|
+
UnauthorizedError,
|
|
170
|
+
ForbiddenError,
|
|
171
|
+
NotFoundError,
|
|
172
|
+
ValidationFailedError,
|
|
173
|
+
ConflictError,
|
|
174
|
+
RateLimitedError,
|
|
175
|
+
UpstreamUnavailableError,
|
|
176
|
+
InternalError,
|
|
177
|
+
TimeoutError,
|
|
178
|
+
CanceledError,
|
|
179
|
+
UnsupportedVersionError,
|
|
180
|
+
# Stash subclasses
|
|
169
181
|
StashBookmarkArtifactNotFound,
|
|
170
182
|
StashBookmarkInvalidVersionRef,
|
|
171
183
|
StashBookmarkDuplicateName,
|
|
@@ -178,7 +190,7 @@ from .errors import (
|
|
|
178
190
|
TimeoutError as DominusTimeoutError,
|
|
179
191
|
)
|
|
180
192
|
|
|
181
|
-
__version__ = "9.0.
|
|
193
|
+
__version__ = "9.0.6"
|
|
182
194
|
__all__ = [
|
|
183
195
|
# Main SDK instance
|
|
184
196
|
"dominus",
|
|
@@ -262,12 +274,23 @@ __all__ = [
|
|
|
262
274
|
"with_trace",
|
|
263
275
|
# Error classes
|
|
264
276
|
"DominusError",
|
|
277
|
+
# v1 aliases (preserved)
|
|
265
278
|
"AuthenticationError",
|
|
266
279
|
"AuthorizationError",
|
|
267
|
-
"NotFoundError",
|
|
268
280
|
"ValidationError",
|
|
269
|
-
"ConflictError",
|
|
270
281
|
"ServiceError",
|
|
282
|
+
# Per-kind canonical subclasses
|
|
283
|
+
"UnauthorizedError",
|
|
284
|
+
"ForbiddenError",
|
|
285
|
+
"NotFoundError",
|
|
286
|
+
"ValidationFailedError",
|
|
287
|
+
"ConflictError",
|
|
288
|
+
"RateLimitedError",
|
|
289
|
+
"UpstreamUnavailableError",
|
|
290
|
+
"InternalError",
|
|
291
|
+
"TimeoutError",
|
|
292
|
+
"CanceledError",
|
|
293
|
+
"UnsupportedVersionError",
|
|
271
294
|
"StashBookmarkArtifactNotFound",
|
|
272
295
|
"StashBookmarkInvalidVersionRef",
|
|
273
296
|
"StashBookmarkDuplicateName",
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"""Python SDK contract module (S-4.8): envelope + projection helpers."""
|
|
2
|
+
from .envelope import python_envelope, python_raise_for_status
|
|
3
|
+
from .projections import Projections, python_projections
|
|
4
|
+
|
|
5
|
+
__all__ = [
|
|
6
|
+
"Projections",
|
|
7
|
+
"python_envelope",
|
|
8
|
+
"python_projections",
|
|
9
|
+
"python_raise_for_status",
|
|
10
|
+
]
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"""Surface-adapter view of the canonical error envelope.
|
|
2
|
+
|
|
3
|
+
Wraps existing ``DominusError.to_dict()`` / ``raise_for_status`` — no
|
|
4
|
+
wire-shape change. Existing call sites stay on those APIs directly.
|
|
5
|
+
"""
|
|
6
|
+
from __future__ import annotations
|
|
7
|
+
|
|
8
|
+
from typing import Any, Dict, Optional
|
|
9
|
+
|
|
10
|
+
from dominus.errors import DominusError, raise_for_status
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def python_envelope(error: DominusError) -> Dict[str, Any]:
|
|
14
|
+
return error.to_dict()
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def python_raise_for_status(
|
|
18
|
+
status_code: int,
|
|
19
|
+
message: str,
|
|
20
|
+
details: Optional[Dict[str, Any]] = None,
|
|
21
|
+
endpoint: Optional[str] = None,
|
|
22
|
+
) -> None:
|
|
23
|
+
raise_for_status(status_code, message, details, endpoint)
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"""Typed passthrough builder for per-surface name projections (ADR-0009).
|
|
2
|
+
|
|
3
|
+
This SDK has no projection catalog; the helper accepts a projections
|
|
4
|
+
object and returns it unchanged.
|
|
5
|
+
"""
|
|
6
|
+
from __future__ import annotations
|
|
7
|
+
|
|
8
|
+
from typing import TypedDict
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class Projections(TypedDict, total=False):
|
|
12
|
+
gateway_path: str
|
|
13
|
+
sdk_python: str
|
|
14
|
+
sdk_nodejs: str
|
|
15
|
+
error_code_prefix: str
|
|
16
|
+
log_event_name: str
|
|
17
|
+
timeline_event_type: str
|
|
18
|
+
deploy_class: str
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def python_projections(projections: Projections) -> Projections:
|
|
22
|
+
return projections
|
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
"""
|
|
2
|
-
Artifacts Namespace -
|
|
2
|
+
Artifacts Namespace - temporary and addressed artifact storage.
|
|
3
|
+
|
|
4
|
+
Positioning: this is the **escape hatch** for direct ``ar://`` addressed
|
|
5
|
+
artifact workflows — use it when you already hold a canonical ``ar://`` ref.
|
|
6
|
+
For new code, prefer a Stash ``artifact-v2``-backed kind (e.g. ``artifact-v1``)
|
|
7
|
+
via ``dominus.stash.*``, the primary storage surface (the Two-Layer Storage
|
|
8
|
+
Rule). These addressed helpers are a building block under Stash, not deprecated.
|
|
3
9
|
|
|
4
10
|
Provides auto-tiered artifact storage (Redis < 1MB, B2 >= 1MB)
|
|
5
11
|
with TTL-based expiration. Routes through gateway to artifact-worker.
|
|
@@ -162,7 +162,12 @@ class BrowserNamespace:
|
|
|
162
162
|
)
|
|
163
163
|
|
|
164
164
|
async def get_run_status(self, run_id: str, *, timeout: float = 30.0) -> Dict[str, Any]:
|
|
165
|
-
"""Read browser run runtime state. ``GET /api/browser/runs/{run_id}/status``.
|
|
165
|
+
"""Read browser run runtime state. ``GET /api/browser/runs/{run_id}/status``.
|
|
166
|
+
|
|
167
|
+
The envelope may carry an additive ``result_stash_ref`` (Stash palette
|
|
168
|
+
``artifact`` selector) alongside the legacy ``result_artifact_ref``; it is
|
|
169
|
+
present only when a best-effort Stash dual-write succeeded.
|
|
170
|
+
"""
|
|
166
171
|
if not run_id:
|
|
167
172
|
raise ValueError("run_id is required")
|
|
168
173
|
return await self._get(
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
"""
|
|
2
|
-
Stash Namespace -
|
|
2
|
+
Stash Namespace - the primary kind-addressed storage surface.
|
|
3
|
+
|
|
4
|
+
Store named-kind data here and let the kind registry pick the backend — you
|
|
5
|
+
address items by (kind, scope, key), not by physical storage. ``ar://``
|
|
6
|
+
addressed artifact workflows remain the escape hatch for foreign refs.
|
|
3
7
|
|
|
4
8
|
Routes through ``/svc/stash/*`` on the Dominus gateway. The stash worker
|
|
5
9
|
stores items in each project's ``stash.*`` schema and transparently falls
|
|
@@ -53,6 +57,18 @@ ManagedTableOperator = Literal[
|
|
|
53
57
|
"after",
|
|
54
58
|
]
|
|
55
59
|
|
|
60
|
+
# Live stash kind backends. The kind registry dispatches each registered kind
|
|
61
|
+
# to exactly one of these; `artifact-v2` and `journal` are the newer additions
|
|
62
|
+
# that previously had no typed surface in this SDK.
|
|
63
|
+
StashBackend = Literal[
|
|
64
|
+
"db-row",
|
|
65
|
+
"b2-versioned-bytes",
|
|
66
|
+
"b2-pointer-text",
|
|
67
|
+
"redis-ttl",
|
|
68
|
+
"artifact-v2",
|
|
69
|
+
"journal",
|
|
70
|
+
]
|
|
71
|
+
|
|
56
72
|
|
|
57
73
|
class _ManagedTableFieldOptional(TypedDict, total=False):
|
|
58
74
|
required: bool
|
|
@@ -536,6 +552,7 @@ class StashNamespace:
|
|
|
536
552
|
self,
|
|
537
553
|
*,
|
|
538
554
|
kind: str,
|
|
555
|
+
backend: Optional[StashBackend] = None,
|
|
539
556
|
is_sensitive: Optional[bool] = None,
|
|
540
557
|
value_schema: Optional[Dict[str, Any]] = None,
|
|
541
558
|
default_rotation_days: Optional[int] = None,
|
|
@@ -544,6 +561,8 @@ class StashNamespace:
|
|
|
544
561
|
) -> Dict[str, Any]:
|
|
545
562
|
"""Register or update a kind in stash.kind_registry. Admin-scoped."""
|
|
546
563
|
body: Dict[str, Any] = {"kind": kind}
|
|
564
|
+
if backend is not None:
|
|
565
|
+
body["backend"] = backend
|
|
547
566
|
if is_sensitive is not None:
|
|
548
567
|
body["is_sensitive"] = is_sensitive
|
|
549
568
|
if value_schema is not None:
|
|
@@ -472,7 +472,7 @@ class Dominus:
|
|
|
472
472
|
if not isinstance(error_details, dict):
|
|
473
473
|
error_details = {}
|
|
474
474
|
for src in (error_payload, nested_err):
|
|
475
|
-
for key in ("code", "category", "retryable", "trace_id", "request_id"):
|
|
475
|
+
for key in ("kind", "code", "category", "retryable", "trace_id", "request_id", "correlation_id", "cause"):
|
|
476
476
|
if key in src and key not in error_details:
|
|
477
477
|
error_details[key] = src[key]
|
|
478
478
|
raise_for_status(
|
|
@@ -502,7 +502,7 @@ class Dominus:
|
|
|
502
502
|
error_details = result.get("details")
|
|
503
503
|
if not isinstance(error_details, dict):
|
|
504
504
|
error_details = {}
|
|
505
|
-
for key in ("code", "category", "retryable", "trace_id", "request_id"):
|
|
505
|
+
for key in ("kind", "code", "category", "retryable", "trace_id", "request_id", "correlation_id", "cause"):
|
|
506
506
|
if key in result:
|
|
507
507
|
error_details[key] = result[key]
|
|
508
508
|
raise DominusError(str(error_msg), details=error_details, endpoint=endpoint)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dominus-sdk-python
|
|
3
|
-
Version: 9.0.
|
|
3
|
+
Version: 9.0.6
|
|
4
4
|
Summary: Python SDK for the Dominus gateway-first platform
|
|
5
5
|
Author-email: CareBridge Systems <dev@carebridge.io>
|
|
6
6
|
License-Expression: LicenseRef-Proprietary
|
|
@@ -48,7 +48,7 @@ cleanup audit is `docs/janitor/2026-08-04-sdk-python-cleanup-audit.md`.
|
|
|
48
48
|
- Gateway-scoped client mode for MCP and other user-JWT sessions
|
|
49
49
|
- Transport compatibility for wrapped `{success,data}` responses and unwrapped Warden/control-plane success objects
|
|
50
50
|
- Local helpers for JWT verification, trace propagation, retries, and console capture
|
|
51
|
-
- Current package version: `9.0.
|
|
51
|
+
- Current package version: `9.0.5`
|
|
52
52
|
|
|
53
53
|
## Install
|
|
54
54
|
|
{dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/dominus_sdk_python.egg-info/SOURCES.txt
RENAMED
|
@@ -6,6 +6,9 @@ dominus/py.typed
|
|
|
6
6
|
dominus/start.py
|
|
7
7
|
dominus/config/__init__.py
|
|
8
8
|
dominus/config/endpoints.py
|
|
9
|
+
dominus/contract/__init__.py
|
|
10
|
+
dominus/contract/envelope.py
|
|
11
|
+
dominus/contract/projections.py
|
|
9
12
|
dominus/helpers/__init__.py
|
|
10
13
|
dominus/helpers/auth.py
|
|
11
14
|
dominus/helpers/cache.py
|
|
@@ -52,9 +55,11 @@ dominus_sdk_python.egg-info/top_level.txt
|
|
|
52
55
|
tests/test_auth.py
|
|
53
56
|
tests/test_authority_public_vocabulary.py
|
|
54
57
|
tests/test_browser_namespace.py
|
|
58
|
+
tests/test_contract.py
|
|
55
59
|
tests/test_control_plane_namespaces.py
|
|
56
60
|
tests/test_error_recovery_action.py
|
|
57
61
|
tests/test_errors.py
|
|
62
|
+
tests/test_errors_aliases.py
|
|
58
63
|
tests/test_flat_commands.py
|
|
59
64
|
tests/test_health.py
|
|
60
65
|
tests/test_logs.py
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
from dominus.errors import DominusError, raise_for_status
|
|
2
|
+
from dominus.contract import python_envelope, python_projections, python_raise_for_status
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
def test_python_envelope_wraps_to_dict_without_changing_wire_shape():
|
|
6
|
+
error = DominusError(
|
|
7
|
+
"Missing resource",
|
|
8
|
+
status_code=404,
|
|
9
|
+
details={
|
|
10
|
+
"code": "authority.resource.not_found",
|
|
11
|
+
"kind": "not_found",
|
|
12
|
+
"request_id": "req-python-contract-1",
|
|
13
|
+
"correlation_id": "corr-python-contract-1",
|
|
14
|
+
},
|
|
15
|
+
endpoint="/svc/authority/runs/status",
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
from_class = error.to_dict()
|
|
19
|
+
from_contract = python_envelope(error)
|
|
20
|
+
|
|
21
|
+
assert from_contract == from_class
|
|
22
|
+
assert from_contract["kind"] == "not_found"
|
|
23
|
+
assert from_contract["code"] == "authority.resource.not_found"
|
|
24
|
+
assert from_contract["request_id"] == "req-python-contract-1"
|
|
25
|
+
assert from_contract["http_status"] == 404
|
|
26
|
+
assert from_contract["envelope_version"] == "1"
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def test_python_raise_for_status_wraps_existing_raise_for_status():
|
|
30
|
+
try:
|
|
31
|
+
python_raise_for_status(
|
|
32
|
+
401,
|
|
33
|
+
"bad token",
|
|
34
|
+
{"kind": "unauthorized", "code": "kernel.auth.token_invalid"},
|
|
35
|
+
)
|
|
36
|
+
except DominusError as error:
|
|
37
|
+
assert error.kind == "unauthorized"
|
|
38
|
+
assert python_envelope(error) == error.to_dict()
|
|
39
|
+
else:
|
|
40
|
+
raise AssertionError("python_raise_for_status should raise DominusError")
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def test_python_raise_for_status_matches_raise_for_status_class():
|
|
44
|
+
raised = None
|
|
45
|
+
wrapped = None
|
|
46
|
+
try:
|
|
47
|
+
raise_for_status(404, "gone")
|
|
48
|
+
except DominusError as error:
|
|
49
|
+
raised = type(error)
|
|
50
|
+
try:
|
|
51
|
+
python_raise_for_status(404, "gone")
|
|
52
|
+
except DominusError as error:
|
|
53
|
+
wrapped = type(error)
|
|
54
|
+
assert raised is not None and raised is wrapped
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def test_python_projections_is_typed_passthrough_builder():
|
|
58
|
+
incoming = {
|
|
59
|
+
"gateway_path": "/svc/authority/runs/ensure",
|
|
60
|
+
"sdk_python": "dominus.workflow.ensure",
|
|
61
|
+
"sdk_nodejs": "dominus.workflow.ensure",
|
|
62
|
+
"error_code_prefix": "authority.",
|
|
63
|
+
"log_event_name": "authority.run.ensure",
|
|
64
|
+
"timeline_event_type": "authority.run.ensured",
|
|
65
|
+
"deploy_class": "worker_ga",
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
out = python_projections(incoming)
|
|
69
|
+
assert out is incoming
|
|
70
|
+
assert out == incoming
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Test per-kind canonical error subclasses and v1 alias compatibility.
|
|
3
|
+
|
|
4
|
+
Seams fork 6 (ADR 0010): DominusError base + 11 per-kind subclasses;
|
|
5
|
+
existing class names preserved as aliases in v1.
|
|
6
|
+
"""
|
|
7
|
+
import pytest
|
|
8
|
+
from dominus.errors import (
|
|
9
|
+
DominusError,
|
|
10
|
+
# v1 aliases (preserved)
|
|
11
|
+
AuthenticationError,
|
|
12
|
+
AuthorizationError,
|
|
13
|
+
ValidationError,
|
|
14
|
+
ServiceError,
|
|
15
|
+
ConnectionError,
|
|
16
|
+
SecureTableError,
|
|
17
|
+
# Per-kind canonical subclasses
|
|
18
|
+
UnauthorizedError,
|
|
19
|
+
ForbiddenError,
|
|
20
|
+
NotFoundError,
|
|
21
|
+
ValidationFailedError,
|
|
22
|
+
ConflictError,
|
|
23
|
+
RateLimitedError,
|
|
24
|
+
UpstreamUnavailableError,
|
|
25
|
+
InternalError,
|
|
26
|
+
TimeoutError,
|
|
27
|
+
CanceledError,
|
|
28
|
+
UnsupportedVersionError,
|
|
29
|
+
# Stash subclasses
|
|
30
|
+
StashBookmarkArtifactNotFound,
|
|
31
|
+
StashBookmarkInvalidVersionRef,
|
|
32
|
+
StashBookmarkDuplicateName,
|
|
33
|
+
StashBookmarkUpstreamRejected,
|
|
34
|
+
StashWatchInvalidWebhookUrl,
|
|
35
|
+
StashWatchUpstreamRejected,
|
|
36
|
+
StashWatchNotFound,
|
|
37
|
+
raise_for_status,
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
CANONICAL_KINDS = [
|
|
41
|
+
"unauthorized",
|
|
42
|
+
"forbidden",
|
|
43
|
+
"not_found",
|
|
44
|
+
"validation_failed",
|
|
45
|
+
"conflict",
|
|
46
|
+
"rate_limited",
|
|
47
|
+
"upstream_unavailable",
|
|
48
|
+
"internal",
|
|
49
|
+
"timeout",
|
|
50
|
+
"canceled",
|
|
51
|
+
"unsupported_version",
|
|
52
|
+
]
|
|
53
|
+
|
|
54
|
+
PER_KIND_CLASSES = [
|
|
55
|
+
UnauthorizedError,
|
|
56
|
+
ForbiddenError,
|
|
57
|
+
NotFoundError,
|
|
58
|
+
ValidationFailedError,
|
|
59
|
+
ConflictError,
|
|
60
|
+
RateLimitedError,
|
|
61
|
+
UpstreamUnavailableError,
|
|
62
|
+
InternalError,
|
|
63
|
+
TimeoutError,
|
|
64
|
+
CanceledError,
|
|
65
|
+
UnsupportedVersionError,
|
|
66
|
+
]
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
class TestPerKindSubclasses:
|
|
70
|
+
"""Each canonical kind has a DominusError subclass with the correct kind."""
|
|
71
|
+
|
|
72
|
+
def test_all_kinds_have_subclass(self):
|
|
73
|
+
kind_map = {cls.kind: cls for cls in PER_KIND_CLASSES}
|
|
74
|
+
for kind in CANONICAL_KINDS:
|
|
75
|
+
assert kind in kind_map, f"Missing subclass for kind '{kind}'"
|
|
76
|
+
|
|
77
|
+
def test_each_subclass_has_kind_attribute(self):
|
|
78
|
+
for cls in PER_KIND_CLASSES:
|
|
79
|
+
assert cls.kind in CANONICAL_KINDS, f"{cls.__name__}.kind = {cls.kind!r} not in canonical kinds"
|
|
80
|
+
|
|
81
|
+
def test_each_subclass_is_dominus_error(self):
|
|
82
|
+
for cls in PER_KIND_CLASSES:
|
|
83
|
+
assert issubclass(cls, DominusError), f"{cls.__name__} is not a DominusError subclass"
|
|
84
|
+
|
|
85
|
+
def test_instance_kind_matches_class_kind(self):
|
|
86
|
+
for cls in PER_KIND_CLASSES:
|
|
87
|
+
err = cls("test")
|
|
88
|
+
assert err.kind == cls.kind, f"{cls.__name__} instance kind mismatch: {err.kind!r} != {cls.kind!r}"
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
class TestV1Aliases:
|
|
92
|
+
"""v1 alias class names resolve to the canonical per-kind subclass."""
|
|
93
|
+
|
|
94
|
+
def test_authentication_error_is_unauthorized(self):
|
|
95
|
+
assert issubclass(AuthenticationError, UnauthorizedError)
|
|
96
|
+
err = AuthenticationError()
|
|
97
|
+
assert isinstance(err, UnauthorizedError)
|
|
98
|
+
assert isinstance(err, DominusError)
|
|
99
|
+
assert err.kind == "unauthorized"
|
|
100
|
+
|
|
101
|
+
def test_authorization_error_is_forbidden(self):
|
|
102
|
+
assert issubclass(AuthorizationError, ForbiddenError)
|
|
103
|
+
err = AuthorizationError()
|
|
104
|
+
assert isinstance(err, ForbiddenError)
|
|
105
|
+
assert isinstance(err, DominusError)
|
|
106
|
+
assert err.kind == "forbidden"
|
|
107
|
+
|
|
108
|
+
def test_validation_error_is_validation_failed(self):
|
|
109
|
+
assert issubclass(ValidationError, ValidationFailedError)
|
|
110
|
+
err = ValidationError()
|
|
111
|
+
assert isinstance(err, ValidationFailedError)
|
|
112
|
+
assert isinstance(err, DominusError)
|
|
113
|
+
assert err.kind == "validation_failed"
|
|
114
|
+
|
|
115
|
+
def test_service_error_is_upstream_unavailable(self):
|
|
116
|
+
assert issubclass(ServiceError, UpstreamUnavailableError)
|
|
117
|
+
err = ServiceError()
|
|
118
|
+
assert isinstance(err, UpstreamUnavailableError)
|
|
119
|
+
assert isinstance(err, DominusError)
|
|
120
|
+
assert err.kind == "upstream_unavailable"
|
|
121
|
+
|
|
122
|
+
def test_connection_error_is_upstream_unavailable(self):
|
|
123
|
+
assert issubclass(ConnectionError, UpstreamUnavailableError)
|
|
124
|
+
err = ConnectionError()
|
|
125
|
+
assert isinstance(err, UpstreamUnavailableError)
|
|
126
|
+
assert isinstance(err, DominusError)
|
|
127
|
+
assert err.kind == "upstream_unavailable"
|
|
128
|
+
|
|
129
|
+
def test_secure_table_error_is_forbidden(self):
|
|
130
|
+
assert issubclass(SecureTableError, ForbiddenError)
|
|
131
|
+
err = SecureTableError()
|
|
132
|
+
assert isinstance(err, ForbiddenError)
|
|
133
|
+
assert isinstance(err, DominusError)
|
|
134
|
+
assert err.kind == "forbidden"
|
|
135
|
+
|
|
136
|
+
def test_existing_catch_sites_still_work(self):
|
|
137
|
+
"""Catching by old name still catches the canonical subclass instance."""
|
|
138
|
+
err = UnauthorizedError("bad token")
|
|
139
|
+
# Old catch pattern
|
|
140
|
+
try:
|
|
141
|
+
raise err
|
|
142
|
+
except AuthenticationError as e:
|
|
143
|
+
assert e.kind == "unauthorized"
|
|
144
|
+
assert e.message == "bad token"
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
class TestStashSubclasses:
|
|
148
|
+
"""Stash subclasses map to canonical per-kind bases."""
|
|
149
|
+
|
|
150
|
+
def test_stash_bookmark_not_found(self):
|
|
151
|
+
assert issubclass(StashBookmarkArtifactNotFound, NotFoundError)
|
|
152
|
+
assert StashBookmarkArtifactNotFound().kind == "not_found"
|
|
153
|
+
|
|
154
|
+
def test_stash_bookmark_invalid_ref(self):
|
|
155
|
+
assert issubclass(StashBookmarkInvalidVersionRef, ValidationFailedError)
|
|
156
|
+
assert StashBookmarkInvalidVersionRef().kind == "validation_failed"
|
|
157
|
+
|
|
158
|
+
def test_stash_bookmark_duplicate(self):
|
|
159
|
+
assert issubclass(StashBookmarkDuplicateName, ConflictError)
|
|
160
|
+
assert StashBookmarkDuplicateName().kind == "conflict"
|
|
161
|
+
|
|
162
|
+
def test_stash_bookmark_upstream(self):
|
|
163
|
+
assert issubclass(StashBookmarkUpstreamRejected, UpstreamUnavailableError)
|
|
164
|
+
assert StashBookmarkUpstreamRejected().kind == "upstream_unavailable"
|
|
165
|
+
|
|
166
|
+
def test_stash_watch_invalid_url(self):
|
|
167
|
+
assert issubclass(StashWatchInvalidWebhookUrl, ValidationFailedError)
|
|
168
|
+
assert StashWatchInvalidWebhookUrl().kind == "validation_failed"
|
|
169
|
+
|
|
170
|
+
def test_stash_watch_upstream(self):
|
|
171
|
+
assert issubclass(StashWatchUpstreamRejected, UpstreamUnavailableError)
|
|
172
|
+
assert StashWatchUpstreamRejected().kind == "upstream_unavailable"
|
|
173
|
+
|
|
174
|
+
def test_stash_watch_not_found(self):
|
|
175
|
+
assert issubclass(StashWatchNotFound, NotFoundError)
|
|
176
|
+
assert StashWatchNotFound().kind == "not_found"
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
class TestRaiseForStatus:
|
|
180
|
+
"""raise_for_status maps HTTP codes to canonical per-kind classes."""
|
|
181
|
+
|
|
182
|
+
def test_401_raises_unauthorized(self):
|
|
183
|
+
with pytest.raises(UnauthorizedError) as exc:
|
|
184
|
+
raise_for_status(401, "bad token")
|
|
185
|
+
assert exc.value.kind == "unauthorized"
|
|
186
|
+
|
|
187
|
+
def test_403_raises_forbidden(self):
|
|
188
|
+
with pytest.raises(ForbiddenError) as exc:
|
|
189
|
+
raise_for_status(403, "nope")
|
|
190
|
+
assert exc.value.kind == "forbidden"
|
|
191
|
+
|
|
192
|
+
def test_404_raises_not_found(self):
|
|
193
|
+
with pytest.raises(NotFoundError) as exc:
|
|
194
|
+
raise_for_status(404, "gone")
|
|
195
|
+
assert exc.value.kind == "not_found"
|
|
196
|
+
|
|
197
|
+
def test_400_raises_validation_failed(self):
|
|
198
|
+
with pytest.raises(ValidationFailedError) as exc:
|
|
199
|
+
raise_for_status(400, "bad input")
|
|
200
|
+
assert exc.value.kind == "validation_failed"
|
|
201
|
+
|
|
202
|
+
def test_409_raises_conflict(self):
|
|
203
|
+
with pytest.raises(ConflictError) as exc:
|
|
204
|
+
raise_for_status(409, "dup")
|
|
205
|
+
assert exc.value.kind == "conflict"
|
|
206
|
+
|
|
207
|
+
def test_429_raises_rate_limited(self):
|
|
208
|
+
with pytest.raises(RateLimitedError) as exc:
|
|
209
|
+
raise_for_status(429, "slow down")
|
|
210
|
+
assert exc.value.kind == "rate_limited"
|
|
211
|
+
|
|
212
|
+
def test_500_raises_upstream_unavailable(self):
|
|
213
|
+
with pytest.raises(UpstreamUnavailableError) as exc:
|
|
214
|
+
raise_for_status(500, "boom")
|
|
215
|
+
assert exc.value.kind == "upstream_unavailable"
|
|
216
|
+
|
|
217
|
+
def test_504_raises_timeout(self):
|
|
218
|
+
with pytest.raises(TimeoutError) as exc:
|
|
219
|
+
raise_for_status(504, "took too long")
|
|
220
|
+
assert exc.value.kind == "timeout"
|
|
221
|
+
|
|
222
|
+
def test_explicit_wire_kind_wins_over_status_mapping(self):
|
|
223
|
+
with pytest.raises(UnsupportedVersionError) as exc:
|
|
224
|
+
raise_for_status(
|
|
225
|
+
400,
|
|
226
|
+
"Unsupported API version",
|
|
227
|
+
{"kind": "unsupported_version", "code": "platform.api.unsupported_version"},
|
|
228
|
+
)
|
|
229
|
+
assert exc.value.kind == "unsupported_version"
|
|
230
|
+
|
|
231
|
+
def test_stash_code_dispatches_to_stash_subclass(self):
|
|
232
|
+
with pytest.raises(StashBookmarkArtifactNotFound) as exc:
|
|
233
|
+
raise_for_status(404, "bookmark gone", {"code": "stash.bookmark.artifact_not_found"})
|
|
234
|
+
assert isinstance(exc.value, NotFoundError)
|
|
235
|
+
assert exc.value.kind == "not_found"
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
class TestDominusErrorKind:
|
|
239
|
+
"""DominusError base class carries kind and exposes it in to_dict."""
|
|
240
|
+
|
|
241
|
+
def test_default_kind_is_internal(self):
|
|
242
|
+
err = DominusError("generic")
|
|
243
|
+
assert err.kind == "internal"
|
|
244
|
+
|
|
245
|
+
def test_explicit_kind_overrides_default(self):
|
|
246
|
+
err = DominusError("custom", kind="timeout")
|
|
247
|
+
assert err.kind == "timeout"
|
|
248
|
+
|
|
249
|
+
def test_to_dict_includes_kind(self):
|
|
250
|
+
err = UnauthorizedError("nope")
|
|
251
|
+
d = err.to_dict()
|
|
252
|
+
assert d["kind"] == "unauthorized"
|
|
253
|
+
|
|
254
|
+
def test_to_dict_emits_canonical_wire_fields(self):
|
|
255
|
+
err = NotFoundError(
|
|
256
|
+
"Missing resource",
|
|
257
|
+
details={
|
|
258
|
+
"code": "authority.resource.not_found",
|
|
259
|
+
"request_id": "req-python-envelope-1",
|
|
260
|
+
"correlation_id": "corr-python-envelope-1",
|
|
261
|
+
},
|
|
262
|
+
)
|
|
263
|
+
|
|
264
|
+
envelope = err.to_dict()
|
|
265
|
+
assert {key: envelope.get(key) for key in (
|
|
266
|
+
"kind", "code", "message", "request_id", "correlation_id",
|
|
267
|
+
"retryable", "http_status", "envelope_version",
|
|
268
|
+
)} == {
|
|
269
|
+
"kind": "not_found",
|
|
270
|
+
"code": "authority.resource.not_found",
|
|
271
|
+
"message": "Missing resource",
|
|
272
|
+
"request_id": "req-python-envelope-1",
|
|
273
|
+
"correlation_id": "corr-python-envelope-1",
|
|
274
|
+
"retryable": False,
|
|
275
|
+
"http_status": 404,
|
|
276
|
+
"envelope_version": "1",
|
|
277
|
+
}
|
|
@@ -353,3 +353,72 @@ async def test_watch_invalid_webhook_url_raises_typed_exception(monkeypatch, sdk
|
|
|
353
353
|
|
|
354
354
|
assert exc_info.value.code == "stash.watch.invalid_webhook_url"
|
|
355
355
|
assert exc_info.value.endpoint == "/svc/stash/watch"
|
|
356
|
+
|
|
357
|
+
|
|
358
|
+
@pytest.mark.asyncio
|
|
359
|
+
async def test_register_kind_posts_backend(monkeypatch, sdk):
|
|
360
|
+
calls = []
|
|
361
|
+
|
|
362
|
+
async def fake_request(**kwargs):
|
|
363
|
+
calls.append(kwargs)
|
|
364
|
+
return {"kind": {"kind": "artifact", "backend": "artifact-v2"}}
|
|
365
|
+
|
|
366
|
+
monkeypatch.setattr(sdk, "_request", fake_request)
|
|
367
|
+
|
|
368
|
+
result = await sdk.stash.register_kind(
|
|
369
|
+
kind="artifact",
|
|
370
|
+
backend="artifact-v2",
|
|
371
|
+
is_sensitive=False,
|
|
372
|
+
description="versioned artifacts",
|
|
373
|
+
)
|
|
374
|
+
|
|
375
|
+
assert result == {"kind": "artifact", "backend": "artifact-v2"}
|
|
376
|
+
assert calls == [
|
|
377
|
+
{
|
|
378
|
+
"endpoint": "/svc/stash/kinds/register",
|
|
379
|
+
"body": {
|
|
380
|
+
"kind": "artifact",
|
|
381
|
+
"backend": "artifact-v2",
|
|
382
|
+
"is_sensitive": False,
|
|
383
|
+
"description": "versioned artifacts",
|
|
384
|
+
},
|
|
385
|
+
"use_gateway": True,
|
|
386
|
+
}
|
|
387
|
+
]
|
|
388
|
+
|
|
389
|
+
|
|
390
|
+
@pytest.mark.asyncio
|
|
391
|
+
async def test_register_kind_omits_backend_when_unset(monkeypatch, sdk):
|
|
392
|
+
calls = []
|
|
393
|
+
|
|
394
|
+
async def fake_request(**kwargs):
|
|
395
|
+
calls.append(kwargs)
|
|
396
|
+
return {"kind": {"kind": "document"}}
|
|
397
|
+
|
|
398
|
+
monkeypatch.setattr(sdk, "_request", fake_request)
|
|
399
|
+
|
|
400
|
+
result = await sdk.stash.register_kind(kind="document")
|
|
401
|
+
|
|
402
|
+
assert result == {"kind": "document"}
|
|
403
|
+
assert calls == [
|
|
404
|
+
{
|
|
405
|
+
"endpoint": "/svc/stash/kinds/register",
|
|
406
|
+
"body": {"kind": "document"},
|
|
407
|
+
"use_gateway": True,
|
|
408
|
+
}
|
|
409
|
+
]
|
|
410
|
+
|
|
411
|
+
|
|
412
|
+
def test_stash_backend_literal_covers_live_backends():
|
|
413
|
+
from typing import get_args
|
|
414
|
+
|
|
415
|
+
from dominus.namespaces.stash import StashBackend
|
|
416
|
+
|
|
417
|
+
assert set(get_args(StashBackend)) == {
|
|
418
|
+
"db-row",
|
|
419
|
+
"b2-versioned-bytes",
|
|
420
|
+
"b2-pointer-text",
|
|
421
|
+
"redis-ttl",
|
|
422
|
+
"artifact-v2",
|
|
423
|
+
"journal",
|
|
424
|
+
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/dominus_sdk_python.egg-info/requires.txt
RENAMED
|
File without changes
|
{dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/dominus_sdk_python.egg-info/top_level.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/tests/test_authority_public_vocabulary.py
RENAMED
|
File without changes
|
|
File without changes
|
{dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/tests/test_control_plane_namespaces.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/tests/test_namespace_barrel_exports.py
RENAMED
|
File without changes
|
{dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/tests/test_platform_coder_namespaces.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/tests/test_readme_quickstart_catalog.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dominus_sdk_python-9.0.4 → dominus_sdk_python-9.0.6}/tests/test_secrets_presence_contract.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|