atlan-application-sdk-api 3.51.0__py3-none-any.whl
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.
- application_sdk/__init__.py +7 -0
- application_sdk/_build_info.py +62 -0
- application_sdk/_context_errors.py +65 -0
- application_sdk/_install.py +130 -0
- application_sdk/_logging.py +171 -0
- application_sdk/_runtime/__init__.py +29 -0
- application_sdk/_runtime/offload.py +1020 -0
- application_sdk/_runtime/progress.py +757 -0
- application_sdk/clients/__init__.py +63 -0
- application_sdk/clients/_interface.py +58 -0
- application_sdk/clients/_sql_failure_classifier.py +112 -0
- application_sdk/clients/base.py +565 -0
- application_sdk/clients/http_errors.py +28 -0
- application_sdk/clients/models.py +49 -0
- application_sdk/clients/sql.py +1218 -0
- application_sdk/clients/sql_errors.py +192 -0
- application_sdk/clients/sql_typecasters.py +431 -0
- application_sdk/clients/ssl_utils.py +247 -0
- application_sdk/common/__init__.py +53 -0
- application_sdk/common/_generated_tree.py +321 -0
- application_sdk/common/_listing.py +192 -0
- application_sdk/common/aws_utils.py +522 -0
- application_sdk/common/aws_utils_errors.py +88 -0
- application_sdk/common/build_identity.py +120 -0
- application_sdk/common/concurrency.py +45 -0
- application_sdk/common/errors.py +99 -0
- application_sdk/common/filter_matching.py +261 -0
- application_sdk/common/logger.py +11 -0
- application_sdk/common/models.py +31 -0
- application_sdk/common/sql_filters.py +719 -0
- application_sdk/common/sql_filters_errors.py +17 -0
- application_sdk/common/task_queue.py +431 -0
- application_sdk/common/types.py +51 -0
- application_sdk/common/utils.py +87 -0
- application_sdk/constants.py +1120 -0
- application_sdk/contracts/__init__.py +158 -0
- application_sdk/contracts/base.py +1178 -0
- application_sdk/contracts/events.py +251 -0
- application_sdk/contracts/types.py +801 -0
- application_sdk/contracts/types_errors.py +17 -0
- application_sdk/credentials/__init__.py +326 -0
- application_sdk/credentials/errors.py +226 -0
- application_sdk/credentials/extra.py +114 -0
- application_sdk/credentials/ingress.py +283 -0
- application_sdk/credentials/ref.py +376 -0
- application_sdk/credentials/spec.py +182 -0
- application_sdk/credentials/types.py +339 -0
- application_sdk/credentials/utils.py +257 -0
- application_sdk/errors/__init__.py +224 -0
- application_sdk/errors/base.py +504 -0
- application_sdk/errors/categories.py +118 -0
- application_sdk/errors/http.py +81 -0
- application_sdk/errors/leaves.py +526 -0
- application_sdk/errors/wire.py +124 -0
- application_sdk/handler/__init__.py +97 -0
- application_sdk/handler/_warmup.py +198 -0
- application_sdk/handler/asgi.py +252 -0
- application_sdk/handler/base.py +281 -0
- application_sdk/handler/context.py +212 -0
- application_sdk/handler/contracts.py +1166 -0
- application_sdk/handler/manifest.py +81 -0
- application_sdk/handler/metadata_routes.py +699 -0
- application_sdk/handler/object_routes.py +418 -0
- application_sdk/handler/request_contract.py +91 -0
- application_sdk/handler/routes.py +1118 -0
- application_sdk/handler/service_errors.py +37 -0
- application_sdk/server/__init__.py +15 -0
- application_sdk/server/fastapi/models.py +338 -0
- application_sdk/templates/__init__.py +52 -0
- application_sdk/templates/contracts/__init__.py +111 -0
- application_sdk/templates/contracts/base_metadata_extraction.py +32 -0
- application_sdk/templates/contracts/incremental_sql.py +563 -0
- application_sdk/templates/contracts/sql_metadata.py +824 -0
- application_sdk/templates/contracts/sql_query.py +105 -0
- application_sdk/version.py +40 -0
- atlan_application_sdk_api-3.51.0.dist-info/METADATA +230 -0
- atlan_application_sdk_api-3.51.0.dist-info/RECORD +78 -0
- atlan_application_sdk_api-3.51.0.dist-info/WHEEL +4 -0
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"""Typed contracts for SQL query extraction.
|
|
2
|
+
|
|
3
|
+
These replace the ``Dict[str, Any]`` interfaces used by
|
|
4
|
+
``SQLQueryExtractionWorkflow`` and ``SQLQueryExtractionActivities``.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from typing import Annotated
|
|
10
|
+
|
|
11
|
+
from pydantic import Field
|
|
12
|
+
|
|
13
|
+
from application_sdk.contracts.base import Input, Output
|
|
14
|
+
from application_sdk.contracts.types import ConnectionRef, MaxItems
|
|
15
|
+
from application_sdk.credentials.ref import CredentialRef
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class QueryExtractionInput(Input):
|
|
19
|
+
"""Top-level input for a SQL query extraction run."""
|
|
20
|
+
|
|
21
|
+
workflow_id: str = ""
|
|
22
|
+
"""Temporal workflow ID for this run."""
|
|
23
|
+
|
|
24
|
+
connection: ConnectionRef = Field(default_factory=ConnectionRef)
|
|
25
|
+
"""Typed connection reference (qualified name, name, admin users, etc.)."""
|
|
26
|
+
|
|
27
|
+
credential_guid: str = ""
|
|
28
|
+
"""GUID of credentials stored in the secret store."""
|
|
29
|
+
|
|
30
|
+
credential_ref: CredentialRef | None = None
|
|
31
|
+
"""Typed credential reference — preferred over credential_guid for new apps."""
|
|
32
|
+
|
|
33
|
+
output_prefix: str = ""
|
|
34
|
+
"""Object store prefix for output artifacts."""
|
|
35
|
+
|
|
36
|
+
output_path: str = ""
|
|
37
|
+
"""Local or object store path for output files."""
|
|
38
|
+
|
|
39
|
+
lookback_days: int = 30
|
|
40
|
+
"""Number of days of query history to extract."""
|
|
41
|
+
|
|
42
|
+
batch_size: int = 100000
|
|
43
|
+
"""Number of queries per batch."""
|
|
44
|
+
|
|
45
|
+
exclude_users: Annotated[list[str], MaxItems(1000)] = Field(default_factory=list)
|
|
46
|
+
"""Users whose queries should be excluded."""
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class QueryExtractionOutput(Output):
|
|
50
|
+
"""Top-level output from a SQL query extraction run."""
|
|
51
|
+
|
|
52
|
+
workflow_id: str = ""
|
|
53
|
+
success: bool = False
|
|
54
|
+
total_batches: int = 0
|
|
55
|
+
total_queries: int = 0
|
|
56
|
+
records_uploaded: int = 0
|
|
57
|
+
error: str = ""
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
class QueryBatchInput(Input):
|
|
61
|
+
"""Input for the get_query_batches task.
|
|
62
|
+
|
|
63
|
+
``workflow_args`` is a pass-through dict rather than typed fields because
|
|
64
|
+
query-mining connectors vary widely in what context they need for batch
|
|
65
|
+
sizing (e.g. date ranges, warehouse IDs, session filters). The dict lets
|
|
66
|
+
each connector add connector-specific keys without requiring a base-class
|
|
67
|
+
change. ``SqlQueryExtractor.run()`` populates it from ``QueryExtractionInput``.
|
|
68
|
+
"""
|
|
69
|
+
|
|
70
|
+
workflow_args: Annotated[
|
|
71
|
+
dict[str, str | int | float | bool | None],
|
|
72
|
+
MaxItems(100),
|
|
73
|
+
] = Field(default_factory=dict)
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
class QueryBatchOutput(Output):
|
|
77
|
+
"""Output from the get_query_batches task."""
|
|
78
|
+
|
|
79
|
+
total_batches: int = 0
|
|
80
|
+
batch_size: int = 0
|
|
81
|
+
total_count: int = 0
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
class QueryFetchInput(Input):
|
|
85
|
+
"""Input for the fetch_queries task.
|
|
86
|
+
|
|
87
|
+
``workflow_args`` carries the same connector context as ``QueryBatchInput``
|
|
88
|
+
(see its docstring). ``batch_number`` and ``batch_size`` are typed here
|
|
89
|
+
because all connectors need them for pagination.
|
|
90
|
+
"""
|
|
91
|
+
|
|
92
|
+
workflow_args: Annotated[
|
|
93
|
+
dict[str, str | int | float | bool | None],
|
|
94
|
+
MaxItems(100),
|
|
95
|
+
] = Field(default_factory=dict)
|
|
96
|
+
batch_number: int = 0
|
|
97
|
+
batch_size: int = 100000
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
class QueryFetchOutput(Output):
|
|
101
|
+
"""Output from the fetch_queries task."""
|
|
102
|
+
|
|
103
|
+
batch_number: int = 0
|
|
104
|
+
queries_fetched: int = 0
|
|
105
|
+
chunk_count: int = 0
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"""Version information for the application_sdk package.
|
|
2
|
+
|
|
3
|
+
Holds two kinds of versions:
|
|
4
|
+
|
|
5
|
+
* ``__version__`` — the SDK's own package version.
|
|
6
|
+
* ``__dapr_version`` — the pinned Dapr runtime the SDK auto-downloads on
|
|
7
|
+
first local-dev run (see ``application_sdk.dev._dapr``). Leading double
|
|
8
|
+
underscore signals it is **SDK-internal**; consumer apps should rely on
|
|
9
|
+
the runtime behaviour, not import this value.
|
|
10
|
+
|
|
11
|
+
This governs **only** the local-dev download path (and the CI daprd cache
|
|
12
|
+
key). It does **not** *control* the container image's daprd: that is baked
|
|
13
|
+
into the ``app-framework-golden`` base image via Chainguard Custom Assembly
|
|
14
|
+
and pinned by the Custom Assembly config. The dependency runs the other
|
|
15
|
+
way — the base image is the source of truth, and this constant is kept in
|
|
16
|
+
sync with the daprd baked into it: ``.github/workflows/check-dapr-version.yaml``
|
|
17
|
+
reads ``daprd --version`` from the golden base on each release-time image
|
|
18
|
+
rebuild and opens a PR bumping this constant when it drifts (BLDX-1467).
|
|
19
|
+
Don't expect editing this value to move the container — it only steers the
|
|
20
|
+
local-dev / CI download so it matches what the container already runs.
|
|
21
|
+
|
|
22
|
+
Everything that needs the daprd pin derives it from this one line — nothing
|
|
23
|
+
re-hardcodes the version:
|
|
24
|
+
|
|
25
|
+
* ``application_sdk.dev._dapr`` imports ``__dapr_version`` directly for the
|
|
26
|
+
embedded local-dev daprd download.
|
|
27
|
+
* The external-Dapr CI paths read it without importing, by grepping this file::
|
|
28
|
+
|
|
29
|
+
ver=$(grep '^__dapr_version' application_sdk/version.py | cut -d'"' -f2)
|
|
30
|
+
|
|
31
|
+
— namely ``.github/actions/ae-stack-up/ae-stack-up.sh`` and
|
|
32
|
+
``.github/actions/connector-integration-tests/action.yaml``.
|
|
33
|
+
|
|
34
|
+
This constant is normally updated by the sync workflow above; bump it by hand
|
|
35
|
+
only to reconcile ahead of a release — and deliberately, since older Dapr
|
|
36
|
+
releases drop off the CDN.
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
__version__ = "3.51.0"
|
|
40
|
+
__dapr_version: str = "1.18.7"
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: atlan-application-sdk-api
|
|
3
|
+
Version: 3.51.0
|
|
4
|
+
Summary: Experimental: the handler surface of the Atlan Application SDK, for the consolidated API host
|
|
5
|
+
Project-URL: Homepage, https://github.com/atlanhq/application-sdk
|
|
6
|
+
Project-URL: Source, https://github.com/atlanhq/application-sdk/tree/main/packages/api
|
|
7
|
+
Project-URL: Documentation, https://github.com/atlanhq/application-sdk/blob/main/docs/standards/api-distribution.md
|
|
8
|
+
Project-URL: Changelog, https://github.com/atlanhq/application-sdk/blob/main/CHANGELOG.md
|
|
9
|
+
Author-email: Atlan App Team <connect@atlan.com>
|
|
10
|
+
License-Expression: Apache-2.0
|
|
11
|
+
Keywords: api,atlan,handler,sdk
|
|
12
|
+
Classifier: Development Status :: 3 - Alpha
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
14
|
+
Classifier: License :: OSI Approved :: Apache Software License
|
|
15
|
+
Classifier: Programming Language :: Python :: 3
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
17
|
+
Requires-Python: >=3.11
|
|
18
|
+
Requires-Dist: fastapi<0.144.0,>=0.143.0
|
|
19
|
+
Requires-Dist: httpx<0.29.0,>=0.27.0
|
|
20
|
+
Requires-Dist: orjson<4.0.0,>=3.11.6
|
|
21
|
+
Requires-Dist: pydantic<3.0.0,>=2.10.6
|
|
22
|
+
Requires-Dist: python-multipart>=0.0.26
|
|
23
|
+
Provides-Extra: aws
|
|
24
|
+
Requires-Dist: boto3<2.0.0,>=1.38.6; extra == 'aws'
|
|
25
|
+
Requires-Dist: httpx<0.29.0,>=0.27.0; extra == 'aws'
|
|
26
|
+
Requires-Dist: python-dotenv<2.0.0,>=1.1.0; extra == 'aws'
|
|
27
|
+
Provides-Extra: pandas
|
|
28
|
+
Requires-Dist: pandas<3.0.0,>=2.2.3; extra == 'pandas'
|
|
29
|
+
Provides-Extra: pyatlan
|
|
30
|
+
Requires-Dist: pyatlan<12,>=11.3; extra == 'pyatlan'
|
|
31
|
+
Provides-Extra: sql
|
|
32
|
+
Requires-Dist: httpx<0.29.0,>=0.27.0; extra == 'sql'
|
|
33
|
+
Requires-Dist: python-dotenv<2.0.0,>=1.1.0; extra == 'sql'
|
|
34
|
+
Requires-Dist: sqlalchemy[asyncio]<3.0.0,>=2.0.36; extra == 'sql'
|
|
35
|
+
Description-Content-Type: text/markdown
|
|
36
|
+
|
|
37
|
+
# atlan-application-sdk-api
|
|
38
|
+
|
|
39
|
+
> **Experimental.** The contents of this package and how it is built may change
|
|
40
|
+
> between releases. If you are building an Atlan app, depend on
|
|
41
|
+
> [`atlan-application-sdk`](https://pypi.org/project/atlan-application-sdk/),
|
|
42
|
+
> which installs this package for you.
|
|
43
|
+
|
|
44
|
+
The **handler** part of the
|
|
45
|
+
[Atlan Application SDK](https://github.com/atlanhq/application-sdk), packaged
|
|
46
|
+
on its own.
|
|
47
|
+
|
|
48
|
+
An Atlan app has two halves:
|
|
49
|
+
|
|
50
|
+
- a **worker**, which runs the app's workflows (extraction, publishing) on
|
|
51
|
+
Temporal and Dapr;
|
|
52
|
+
- a **handler**, a small HTTP service that answers Atlan while a user sets up a
|
|
53
|
+
connection: *do these credentials work?*, *is the source ready?*, *which
|
|
54
|
+
databases and schemas can I pick?*
|
|
55
|
+
|
|
56
|
+
This package contains everything the handler needs and none of the worker
|
|
57
|
+
runtime. Its core dependencies are FastAPI, Pydantic, orjson, httpx and
|
|
58
|
+
python-multipart. That lets one lightweight process serve the handlers of many
|
|
59
|
+
apps.
|
|
60
|
+
|
|
61
|
+
## Do I need this?
|
|
62
|
+
|
|
63
|
+
Usually not. `atlan-application-sdk` depends on this package at exactly the
|
|
64
|
+
same version, so installing the SDK gives you both, and your imports stay the
|
|
65
|
+
same:
|
|
66
|
+
|
|
67
|
+
```python
|
|
68
|
+
from application_sdk.handler import Handler # same module either way
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Install this package directly only to run handlers **without** the worker
|
|
72
|
+
runtime, for example to serve them from a separate, smaller service.
|
|
73
|
+
|
|
74
|
+
## Installation
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
pip install atlan-application-sdk-api
|
|
78
|
+
# or
|
|
79
|
+
uv add atlan-application-sdk-api
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Requires Python 3.11 or newer. Add an extra when your handler uses that part of
|
|
83
|
+
the SDK:
|
|
84
|
+
|
|
85
|
+
| Extra | When your handler uses |
|
|
86
|
+
|---|---|
|
|
87
|
+
| `sql` | The SDK's SQL client (SQLAlchemy) |
|
|
88
|
+
| `aws` | The SDK's AWS helpers (boto3), or the config and file routes |
|
|
89
|
+
| `pandas` | Query results as pandas DataFrames |
|
|
90
|
+
| `pyatlan` | The Atlas conversion helpers on `ConnectionRef` |
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
pip install "atlan-application-sdk-api[sql]"
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
The extras have the same version pins as the matching extras of
|
|
97
|
+
`atlan-application-sdk`.
|
|
98
|
+
|
|
99
|
+
## Quick start
|
|
100
|
+
|
|
101
|
+
Write a handler by subclassing `Handler` and implementing its three methods.
|
|
102
|
+
Then turn it into a FastAPI app with `build_asgi_app`:
|
|
103
|
+
|
|
104
|
+
```python
|
|
105
|
+
from application_sdk.handler import (
|
|
106
|
+
AuthInput,
|
|
107
|
+
AuthOutput,
|
|
108
|
+
AuthStatus,
|
|
109
|
+
Handler,
|
|
110
|
+
MetadataInput,
|
|
111
|
+
MetadataOutput,
|
|
112
|
+
PreflightInput,
|
|
113
|
+
PreflightOutput,
|
|
114
|
+
PreflightStatus,
|
|
115
|
+
SqlMetadataOutput,
|
|
116
|
+
)
|
|
117
|
+
from application_sdk.handler.asgi import build_asgi_app
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
class DemoHandler(Handler):
|
|
121
|
+
async def test_auth(self, input: AuthInput) -> AuthOutput:
|
|
122
|
+
# Check input.credentials against your source.
|
|
123
|
+
return AuthOutput(status=AuthStatus.SUCCESS)
|
|
124
|
+
|
|
125
|
+
async def preflight_check(self, input: PreflightInput) -> PreflightOutput:
|
|
126
|
+
# Confirm the source is ready to be extracted.
|
|
127
|
+
return PreflightOutput(status=PreflightStatus.READY)
|
|
128
|
+
|
|
129
|
+
async def fetch_metadata(self, input: MetadataInput) -> MetadataOutput:
|
|
130
|
+
# List what the user can choose to extract.
|
|
131
|
+
return SqlMetadataOutput(
|
|
132
|
+
objects=[{"TABLE_CATALOG": "analytics", "TABLE_SCHEMA": "public"}]
|
|
133
|
+
)
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
app = build_asgi_app(DemoHandler(), app_name="demo")
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
Serve it with any ASGI server (not included), for example
|
|
140
|
+
`pip install uvicorn` and then `uvicorn demo:app`:
|
|
141
|
+
|
|
142
|
+
```bash
|
|
143
|
+
curl -X POST localhost:8000/workflows/v1/auth \
|
|
144
|
+
-H 'content-type: application/json' -d '{"credentials": []}'
|
|
145
|
+
# {"success": true, "data": {"status": "success", ...}, "message": "Authentication success"}
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
## Routes
|
|
149
|
+
|
|
150
|
+
`build_asgi_app` serves the same routes the full SDK's handler service does, so
|
|
151
|
+
an app answers identically from either one:
|
|
152
|
+
|
|
153
|
+
| Route | Answered by |
|
|
154
|
+
|---|---|
|
|
155
|
+
| `GET /health` | Always `{"status": "ok"}` |
|
|
156
|
+
| `POST /workflows/v1/auth` | `Handler.test_auth` |
|
|
157
|
+
| `POST /workflows/v1/check` | `Handler.preflight_check` |
|
|
158
|
+
| `POST /workflows/v1/metadata` | `Handler.fetch_metadata` |
|
|
159
|
+
| `POST /workflows/v1/warmup` | `Handler.warmup` (optional) |
|
|
160
|
+
| `GET /workflows/v1/configmap/{id}`, `/configmaps`, `/input-contract`, `GET`/`POST /workflows/v1/manifest` | The app's `generated/` folder, if the app package ships one |
|
|
161
|
+
| `GET`/`POST /workflows/v1/config/{id}`, `POST /workflows/v1/file` | An S3 bucket named by `ATLAN_S3_BUCKET` (and `ATLAN_S3_REGION`); needs the `aws` extra. These routes return 503 when it isn't set |
|
|
162
|
+
| Your own routes | FastAPI routers returned from `Handler.routers()`, served after the SDK's |
|
|
163
|
+
|
|
164
|
+
`build_asgi_app` takes a few keyword options:
|
|
165
|
+
|
|
166
|
+
- `app_package`: where the app's code and `generated/` folder live;
|
|
167
|
+
- `blocking_threads`: the size of this app's thread pool, default 8;
|
|
168
|
+
- `generated_dir`;
|
|
169
|
+
- `object_store`.
|
|
170
|
+
|
|
171
|
+
Each app built this way gets its own thread pool for `run_in_thread`, so several
|
|
172
|
+
apps in one process don't block each other.
|
|
173
|
+
|
|
174
|
+
## What's included
|
|
175
|
+
|
|
176
|
+
| Module | Contents |
|
|
177
|
+
|---|---|
|
|
178
|
+
| `application_sdk.handler` | `Handler`, `HandlerContext`, and the request and response models |
|
|
179
|
+
| `application_sdk.handler.asgi` | `build_asgi_app` |
|
|
180
|
+
| `application_sdk.errors` | `AppError` and typed error classes; secrets and URL credentials are redacted from messages |
|
|
181
|
+
| `application_sdk.credentials` | Credential specs, types and parsing |
|
|
182
|
+
| `application_sdk.contracts`, `application_sdk.templates.contracts` | Input-contract models |
|
|
183
|
+
| `application_sdk.common.concurrency` | `run_in_thread`, for blocking calls inside async handlers |
|
|
184
|
+
| `application_sdk.common.logger` | `get_logger` |
|
|
185
|
+
| `application_sdk.clients.sql` (`sql` extra) | The SQL client base |
|
|
186
|
+
| `application_sdk.common.aws_utils` (`aws` extra) | AWS helpers |
|
|
187
|
+
|
|
188
|
+
The complete file list is in
|
|
189
|
+
[`api-files.txt`](https://github.com/atlanhq/application-sdk/blob/main/packages/api/api-files.txt).
|
|
190
|
+
|
|
191
|
+
**Not included:** Temporal, Dapr, the SDK's object-store layer, its structured
|
|
192
|
+
logging and telemetry, or anything else that runs workflows. That stays in
|
|
193
|
+
`atlan-application-sdk`.
|
|
194
|
+
|
|
195
|
+
A few handler features depend on the worker runtime. Without it they raise a
|
|
196
|
+
clear, typed error instead of failing on an import. For example,
|
|
197
|
+
`self.context.get_secret()` raises `SecretStoreNotConfiguredError` because
|
|
198
|
+
there is no secret store. Credentials sent with the request work normally.
|
|
199
|
+
|
|
200
|
+
## Versioning
|
|
201
|
+
|
|
202
|
+
This package is released together with `atlan-application-sdk`, from the same
|
|
203
|
+
commit and always with the **same version number**. For example,
|
|
204
|
+
`atlan-application-sdk` 3.51.0 requires `atlan-application-sdk-api` 3.51.0.
|
|
205
|
+
|
|
206
|
+
A new version can contain the same code as the previous one when a release
|
|
207
|
+
changed only the worker part of the SDK.
|
|
208
|
+
|
|
209
|
+
## Upgrading from an SDK release older than this package
|
|
210
|
+
|
|
211
|
+
Before this package existed, `atlan-application-sdk` shipped these files itself.
|
|
212
|
+
Upgrading across that boundary **with pip** can delete them. pip installs this
|
|
213
|
+
package first, then deletes the same files when it removes the old SDK.
|
|
214
|
+
Starting the app (`python -m application_sdk.main`) reports this and tells you
|
|
215
|
+
to run:
|
|
216
|
+
|
|
217
|
+
```bash
|
|
218
|
+
pip install --force-reinstall --no-deps atlan-application-sdk-api
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
uv is not affected. This only happens once; later upgrades are clean.
|
|
222
|
+
|
|
223
|
+
## Links
|
|
224
|
+
|
|
225
|
+
- Source and documentation:
|
|
226
|
+
[github.com/atlanhq/application-sdk](https://github.com/atlanhq/application-sdk)
|
|
227
|
+
- Design notes:
|
|
228
|
+
[docs/standards/api-distribution.md](https://github.com/atlanhq/application-sdk/blob/main/docs/standards/api-distribution.md)
|
|
229
|
+
- Full SDK: [atlan-application-sdk on PyPI](https://pypi.org/project/atlan-application-sdk/)
|
|
230
|
+
- License: Apache-2.0
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
application_sdk/__init__.py,sha256=2e2mvmLJ5dxmJGPELtb33xwP-j6JMdoIuqKycEn7hjg,151
|
|
2
|
+
application_sdk/_build_info.py,sha256=XmxBcrprOincs6ZmL1qBaPrM_ADngSL5JM3mrYCvN60,2310
|
|
3
|
+
application_sdk/_context_errors.py,sha256=bZRDE4NZJoWtBZCZLYaqsoxUnewdnVpmmIfIfA6VrOo,2358
|
|
4
|
+
application_sdk/_install.py,sha256=es9UVUDBW5DCc4uZTiBPmRdbhO7t8CBMPDvOEeidHuA,5630
|
|
5
|
+
application_sdk/_logging.py,sha256=MF8nRCXSsXpezfN9JSaVseI6CAeAx01traw2rMTEfrU,5601
|
|
6
|
+
application_sdk/constants.py,sha256=nDrj-eO2zhTQpMAerMWqA2hxOnWDycJY9GhSCqeB7Qk,57358
|
|
7
|
+
application_sdk/version.py,sha256=HfBJFmdkRP_ShtvU33EGMlONIHmp7l9dMyT3XJWyR_M,1929
|
|
8
|
+
application_sdk/_runtime/__init__.py,sha256=q2bsC6ZMzs3IxYApASAi7FF_jYq0rWW0McPOLVWTCGc,1661
|
|
9
|
+
application_sdk/_runtime/offload.py,sha256=SJErwLMYQj6egeXl4KNNHZUKEU_sMzueI5gxoC-ei5w,47307
|
|
10
|
+
application_sdk/_runtime/progress.py,sha256=ZzPgHT-eYq7q-2z5YFf1C-xSO6SBUP9CPw-qjE9Aztc,35898
|
|
11
|
+
application_sdk/clients/__init__.py,sha256=UQpSypkiMKsQmj6xDDh7BLB3zTW_sJ6-Z9aE5NN36rM,2316
|
|
12
|
+
application_sdk/clients/_interface.py,sha256=kLMvnty1JARC-wWg53RspxuYKdJLUqB5_zj_luHgnIM,2056
|
|
13
|
+
application_sdk/clients/_sql_failure_classifier.py,sha256=V1HXI9_6qHhiA-6VBHs6mRb4iW-Dbcn5gx3vNSPYlCg,4405
|
|
14
|
+
application_sdk/clients/base.py,sha256=WiZLJDEjR56PlMNM8DsMTC2S_g_LGWVHXQHkhHofhfM,25743
|
|
15
|
+
application_sdk/clients/http_errors.py,sha256=LzISD0RFfZqThWTsVXJ56q1jXgsdIXyodPh1bLNqREw,1062
|
|
16
|
+
application_sdk/clients/models.py,sha256=sg4BbZ1OjjMhHYhKI98QznNpf6R0NseR4uOQjv7xB8I,1893
|
|
17
|
+
application_sdk/clients/sql.py,sha256=qOsi-qZBJxlLG79sI8M3ovX0NI516zjKh5n_zfx5M4c,51131
|
|
18
|
+
application_sdk/clients/sql_errors.py,sha256=gFkYtFpuwjtiYyKjZnRn4lKAxvlgKPaaqOsHxC1iDic,7228
|
|
19
|
+
application_sdk/clients/sql_typecasters.py,sha256=5I2wkVg_jhbSCThoQcxIGaeXqeZKicZHSqL9scjkAwQ,19815
|
|
20
|
+
application_sdk/clients/ssl_utils.py,sha256=-fRUzg8gdfcEvYC9T5umvJKuwtv_pU8heTSDbOckT0M,8252
|
|
21
|
+
application_sdk/common/__init__.py,sha256=Jt4-qAamjlGIepPQQg5ZRat1ElA-wnR7-cCCJWpMP-4,1510
|
|
22
|
+
application_sdk/common/_generated_tree.py,sha256=0AQDSHx7Gf3vpnbKvLGXYOUzXA1Z2WA_ARiWBCqZqq4,14275
|
|
23
|
+
application_sdk/common/_listing.py,sha256=Je7VXrVrs6twQiwWtEVaP4SfDjfhgZneT3jkOYd53Zs,8265
|
|
24
|
+
application_sdk/common/aws_utils.py,sha256=3kmDLTp36ZabFVHtZSZlFUEeOD5zbBSgvCCNW3CMSGg,18563
|
|
25
|
+
application_sdk/common/aws_utils_errors.py,sha256=JpPerOzPITi9iyUBZRvXpb17AsBvoFuTyDfquvlLCdI,3049
|
|
26
|
+
application_sdk/common/build_identity.py,sha256=FzRiRy1leiH4Rh8X2vWhUxJxDg--Lr5_U6_q-vRr-TM,5711
|
|
27
|
+
application_sdk/common/concurrency.py,sha256=ne7E1tQFF2NVrao0PfFyN_6U-nChHwW_HHp5oEIjyZI,1411
|
|
28
|
+
application_sdk/common/errors.py,sha256=Z2DYMknoEK70NT2kjgiin-ygsWtMh1pJ_4xoHHWSoRc,3386
|
|
29
|
+
application_sdk/common/filter_matching.py,sha256=EYhntNg7Q_7i7z_5lCO0pjhzYGqlZ-qnlBjk5pX4qlE,11839
|
|
30
|
+
application_sdk/common/logger.py,sha256=OePZ7PEg7MRvln_aXComGnJ-CuYttrIMcsjcSMmZtGQ,461
|
|
31
|
+
application_sdk/common/models.py,sha256=qqgSI-wy3IFTtgd7YrioX9YpdDqKjgZngY_ZAK4Xjn8,885
|
|
32
|
+
application_sdk/common/sql_filters.py,sha256=lIj0nam219FTQfuDrXbk8cfc_4BIitUp6E9W678FL_M,29411
|
|
33
|
+
application_sdk/common/sql_filters_errors.py,sha256=beED79h7tCcFzBq-lZ-8DUFo1MHvJl6YGuLzIg0WkDo,479
|
|
34
|
+
application_sdk/common/task_queue.py,sha256=nEBHwvzII47kwcQYJXPcBy8k5c0fUgCvUpu9QrMOBLs,20876
|
|
35
|
+
application_sdk/common/types.py,sha256=AkjA_wMj1M3D6Zzca4D_ai9Vk9OQvywFdjY57zWnHJs,2105
|
|
36
|
+
application_sdk/common/utils.py,sha256=3hx60cUNiCNmQSp2JdXi6_dMSSQ5LA9Wp_IIIXocxaA,3088
|
|
37
|
+
application_sdk/contracts/__init__.py,sha256=bJbJnH9Ydb85TstXO3oPIrAjNAh1Si6iF7KSKRo4kRQ,5174
|
|
38
|
+
application_sdk/contracts/base.py,sha256=RasICpDQQtDUMZNGfA7mQKdTE3_PaO_pC6EHoodth2s,46073
|
|
39
|
+
application_sdk/contracts/events.py,sha256=J_OcKSwB8Ez50iq0ekMr59k6jx80-oK5fO3ywKBlfyc,8891
|
|
40
|
+
application_sdk/contracts/types.py,sha256=mP56vvaJVlIyUceqi60dz1vRJ157Uf3Ti1xiXROj_B8,36026
|
|
41
|
+
application_sdk/contracts/types_errors.py,sha256=mIZJJZFmeQR1dlyFqd3ZHkiHmRSUoriyW8xxB0VjPRI,541
|
|
42
|
+
application_sdk/credentials/__init__.py,sha256=WwSs2cit6McTEEEIbg06qlt4eVkS9LCBgdVzEgOzx8Y,10802
|
|
43
|
+
application_sdk/credentials/errors.py,sha256=8Nd1cikMHEmGdkLwZTk-MP8J-lO3P3w4JmNyfnxgIFg,8132
|
|
44
|
+
application_sdk/credentials/extra.py,sha256=-9voLv9JHZKN5Vt9wX2AvP9xAekQjgOK6w-G1Sg_eTk,4957
|
|
45
|
+
application_sdk/credentials/ingress.py,sha256=a_K557ApbzJ-Y6P01avIy-be621A27TZ_cDP2M2TwEw,12486
|
|
46
|
+
application_sdk/credentials/ref.py,sha256=AUPzPmgp3i5EUj2E1OgX3wrkmobtCYfb5buT4zw668w,15668
|
|
47
|
+
application_sdk/credentials/spec.py,sha256=88_R1-jkscS9hYB9DD8QiTt1N_DwOVEUG32Y0H_KHVY,7312
|
|
48
|
+
application_sdk/credentials/types.py,sha256=EoTa1CTh7V53QH0ATw6076Lyvx-uG6nw2XsgHeMWDXw,10672
|
|
49
|
+
application_sdk/credentials/utils.py,sha256=xQppGlx-OZ8VoqAoG9W8SMx5YGFaQ2bSXvyqX-97gF4,11332
|
|
50
|
+
application_sdk/errors/__init__.py,sha256=D6XwpwssW1LCUCq6Un1wH9MFvNsn1bfV2f1zCyEr6u0,6374
|
|
51
|
+
application_sdk/errors/base.py,sha256=gJpLGyhC4anaWcq2oWiwYlTkboUb9kTX9iW0KdkSpic,25203
|
|
52
|
+
application_sdk/errors/categories.py,sha256=CsZH7cflO6Lew6nQwXEMSKLRBNpU5Lg7e3E_1uY2UTE,5737
|
|
53
|
+
application_sdk/errors/http.py,sha256=3hZhwEneaDwrLoXHDizkT8Tq_eyWGu57kV6cJm9qtCU,2987
|
|
54
|
+
application_sdk/errors/leaves.py,sha256=l0GNujyfYiivsjewfs2Zv2P3O_ZuBIx9Cah_kV9nfjE,22625
|
|
55
|
+
application_sdk/errors/wire.py,sha256=qhp1nmvMB3dRlzWoyVelPEAXM-8OOS5mRbzntdWod5I,5130
|
|
56
|
+
application_sdk/handler/__init__.py,sha256=TtMbs1Kz85s8xX1mn8MBjVTp7a6EFBwMTSw2HbcUgLY,2638
|
|
57
|
+
application_sdk/handler/_warmup.py,sha256=ItSXAV9XGotvcU3NjQ-sPXUJr88EDgOpj_wjaODbv6E,8065
|
|
58
|
+
application_sdk/handler/asgi.py,sha256=kRWm623CdtO1bislW-VlnLPDLQTyUzEIKi3FdK_UA7A,9858
|
|
59
|
+
application_sdk/handler/base.py,sha256=fUQ3Z9-PgyZ8BARlFf3LPWDRvH_Fts9tbeFbQdmiMmA,10755
|
|
60
|
+
application_sdk/handler/context.py,sha256=8m1hKRJcX40xmZnqgkyD5RLr5E6a9dbpcWIrXSWXZcc,7261
|
|
61
|
+
application_sdk/handler/contracts.py,sha256=Ke7YHsrMZQfcXQLFpIATtsHO9e4SNpURWjoeaite8DA,45667
|
|
62
|
+
application_sdk/handler/manifest.py,sha256=ZccekRT9MY-HJ8GlZNPu9pIEwqrXCfZi9X1ZD0V_lVE,2530
|
|
63
|
+
application_sdk/handler/metadata_routes.py,sha256=XFXEsCqhtN3pGELuFSx5RdMI7ySE1Hc44YQaAujj_94,32538
|
|
64
|
+
application_sdk/handler/object_routes.py,sha256=Hf3-RmcnUsPcJ_Vnwkd-EqOXdjy3yzL6Li7YcdZzIKA,16782
|
|
65
|
+
application_sdk/handler/request_contract.py,sha256=STdc0ZRRI3q4ezmgdjukFymfHKfdFvvjTzHLmwfMx6I,3960
|
|
66
|
+
application_sdk/handler/routes.py,sha256=IfAm3ogu53mDnn96JytvXIGNwDzKZtYlRxQKGYOxIss,50826
|
|
67
|
+
application_sdk/handler/service_errors.py,sha256=Acpn6ynL8KjKnb5vfvuFdKVLm9hRh-dBUfVPeh2ZKHI,1232
|
|
68
|
+
application_sdk/server/__init__.py,sha256=3F0ZNS4UEVt_zmZ33kKQ8QGBmfsWW-ew9Hx5D3vhPx4,869
|
|
69
|
+
application_sdk/templates/__init__.py,sha256=r-gd3dghgsGF4FEJUUXODenalG7xOiqXFgkgjqmxKYI,1858
|
|
70
|
+
application_sdk/server/fastapi/models.py,sha256=_JoRoWbjl-NYKcR6vrKEDGtPPsj56XlHRMybhdmSMkY,11596
|
|
71
|
+
application_sdk/templates/contracts/__init__.py,sha256=igGpFiWkE59ZcRZrODu6phK1GrAwNDzFqUjkTYi61_c,2965
|
|
72
|
+
application_sdk/templates/contracts/base_metadata_extraction.py,sha256=cS8W5iRUVQPmacUNpth8hcvvA4zyJQzDlOk2u3shyCo,1025
|
|
73
|
+
application_sdk/templates/contracts/incremental_sql.py,sha256=FyF0zfaFZEt4dOh6nlEAO_HXzrUQGKEAHkd726wOHHY,20281
|
|
74
|
+
application_sdk/templates/contracts/sql_metadata.py,sha256=-IdvhouNARodwcngV43HMyDDP9h22se4hkuvkSQa97E,35068
|
|
75
|
+
application_sdk/templates/contracts/sql_query.py,sha256=bljv0TL-RtOdPXoWjDD9vbDt8pat2-_RoUACaruuhsc,3136
|
|
76
|
+
atlan_application_sdk_api-3.51.0.dist-info/METADATA,sha256=1M0C-FrI4VQyJOTeyXpGXJruLhGUfPflwgx8KPR-tEY,9073
|
|
77
|
+
atlan_application_sdk_api-3.51.0.dist-info/WHEEL,sha256=W3fkpkm7-wf9vBI5Z-7s0eWkeM-spu78I8Neb98DeEg,87
|
|
78
|
+
atlan_application_sdk_api-3.51.0.dist-info/RECORD,,
|