airbyte-cdk 6.61.2__py3-none-any.whl → 6.61.4__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.
- airbyte_cdk/manifest_server/Dockerfile +45 -0
- airbyte_cdk/manifest_server/README.md +142 -0
- airbyte_cdk/manifest_server/__init__.py +3 -0
- airbyte_cdk/manifest_server/api_models/__init__.py +49 -0
- airbyte_cdk/manifest_server/api_models/capabilities.py +7 -0
- airbyte_cdk/manifest_server/api_models/dicts.py +17 -0
- airbyte_cdk/manifest_server/api_models/manifest.py +73 -0
- airbyte_cdk/manifest_server/api_models/stream.py +76 -0
- airbyte_cdk/manifest_server/app.py +17 -0
- airbyte_cdk/manifest_server/auth.py +43 -0
- airbyte_cdk/manifest_server/cli/__init__.py +5 -0
- airbyte_cdk/manifest_server/cli/_common.py +28 -0
- airbyte_cdk/manifest_server/cli/_info.py +30 -0
- airbyte_cdk/manifest_server/cli/_openapi.py +43 -0
- airbyte_cdk/manifest_server/cli/_start.py +38 -0
- airbyte_cdk/manifest_server/cli/run.py +59 -0
- airbyte_cdk/manifest_server/command_processor/__init__.py +0 -0
- airbyte_cdk/manifest_server/command_processor/processor.py +122 -0
- airbyte_cdk/manifest_server/command_processor/utils.py +99 -0
- airbyte_cdk/manifest_server/main.py +24 -0
- airbyte_cdk/manifest_server/openapi.yaml +641 -0
- airbyte_cdk/manifest_server/routers/__init__.py +0 -0
- airbyte_cdk/manifest_server/routers/capabilities.py +25 -0
- airbyte_cdk/manifest_server/routers/health.py +13 -0
- airbyte_cdk/manifest_server/routers/manifest.py +155 -0
- {airbyte_cdk-6.61.2.dist-info → airbyte_cdk-6.61.4.dist-info}/METADATA +4 -1
- {airbyte_cdk-6.61.2.dist-info → airbyte_cdk-6.61.4.dist-info}/RECORD +31 -6
- {airbyte_cdk-6.61.2.dist-info → airbyte_cdk-6.61.4.dist-info}/entry_points.txt +1 -0
- {airbyte_cdk-6.61.2.dist-info → airbyte_cdk-6.61.4.dist-info}/LICENSE.txt +0 -0
- {airbyte_cdk-6.61.2.dist-info → airbyte_cdk-6.61.4.dist-info}/LICENSE_SHORT +0 -0
- {airbyte_cdk-6.61.2.dist-info → airbyte_cdk-6.61.4.dist-info}/WHEEL +0 -0
@@ -0,0 +1,155 @@
|
|
1
|
+
import hashlib
|
2
|
+
from dataclasses import asdict
|
3
|
+
from typing import Any, Dict, List, Mapping, Optional
|
4
|
+
|
5
|
+
import jsonschema
|
6
|
+
from airbyte_protocol_dataclasses.models import AirbyteStateMessage, ConfiguredAirbyteCatalog
|
7
|
+
from fastapi import APIRouter, Depends, HTTPException
|
8
|
+
|
9
|
+
from airbyte_cdk.models import AirbyteStateMessageSerializer
|
10
|
+
from airbyte_cdk.sources.declarative.concurrent_declarative_source import (
|
11
|
+
ConcurrentDeclarativeSource,
|
12
|
+
)
|
13
|
+
from airbyte_cdk.sources.declarative.parsers.custom_code_compiler import (
|
14
|
+
INJECTED_COMPONENTS_PY,
|
15
|
+
INJECTED_COMPONENTS_PY_CHECKSUMS,
|
16
|
+
)
|
17
|
+
|
18
|
+
from ..api_models import (
|
19
|
+
CheckRequest,
|
20
|
+
CheckResponse,
|
21
|
+
DiscoverRequest,
|
22
|
+
DiscoverResponse,
|
23
|
+
FullResolveRequest,
|
24
|
+
Manifest,
|
25
|
+
ManifestResponse,
|
26
|
+
ResolveRequest,
|
27
|
+
StreamReadResponse,
|
28
|
+
StreamTestReadRequest,
|
29
|
+
)
|
30
|
+
from ..auth import verify_jwt_token
|
31
|
+
from ..command_processor.processor import ManifestCommandProcessor
|
32
|
+
from ..command_processor.utils import build_catalog, build_source
|
33
|
+
|
34
|
+
|
35
|
+
def safe_build_source(
|
36
|
+
manifest_dict: Dict[str, Any],
|
37
|
+
config_dict: Mapping[str, Any],
|
38
|
+
catalog: Optional[ConfiguredAirbyteCatalog] = None,
|
39
|
+
state: Optional[List[AirbyteStateMessage]] = None,
|
40
|
+
page_limit: Optional[int] = None,
|
41
|
+
slice_limit: Optional[int] = None,
|
42
|
+
record_limit: Optional[int] = None,
|
43
|
+
) -> ConcurrentDeclarativeSource[Optional[List[AirbyteStateMessage]]]:
|
44
|
+
"""Wrapper around build_source that converts ValidationError to HTTPException."""
|
45
|
+
try:
|
46
|
+
return build_source(
|
47
|
+
manifest_dict,
|
48
|
+
catalog,
|
49
|
+
config_dict,
|
50
|
+
state,
|
51
|
+
record_limit,
|
52
|
+
page_limit,
|
53
|
+
slice_limit,
|
54
|
+
)
|
55
|
+
except jsonschema.exceptions.ValidationError as e:
|
56
|
+
raise HTTPException(status_code=400, detail=f"Invalid manifest: {e.message}")
|
57
|
+
|
58
|
+
|
59
|
+
router = APIRouter(
|
60
|
+
prefix="/manifest",
|
61
|
+
tags=["manifest"],
|
62
|
+
dependencies=[Depends(verify_jwt_token)],
|
63
|
+
)
|
64
|
+
|
65
|
+
|
66
|
+
@router.post("/test_read", operation_id="testRead")
|
67
|
+
def test_read(request: StreamTestReadRequest) -> StreamReadResponse:
|
68
|
+
"""
|
69
|
+
Test reading from a specific stream in the manifest.
|
70
|
+
"""
|
71
|
+
config_dict = request.config.model_dump()
|
72
|
+
|
73
|
+
catalog = build_catalog(request.stream_name)
|
74
|
+
converted_state = [AirbyteStateMessageSerializer.load(state) for state in request.state]
|
75
|
+
|
76
|
+
if request.custom_components_code:
|
77
|
+
config_dict[INJECTED_COMPONENTS_PY] = request.custom_components_code
|
78
|
+
config_dict[INJECTED_COMPONENTS_PY_CHECKSUMS] = {
|
79
|
+
"md5": hashlib.md5(request.custom_components_code.encode()).hexdigest()
|
80
|
+
}
|
81
|
+
|
82
|
+
source = safe_build_source(
|
83
|
+
request.manifest.model_dump(),
|
84
|
+
config_dict,
|
85
|
+
catalog,
|
86
|
+
converted_state,
|
87
|
+
request.page_limit,
|
88
|
+
request.slice_limit,
|
89
|
+
request.record_limit,
|
90
|
+
)
|
91
|
+
|
92
|
+
runner = ManifestCommandProcessor(source)
|
93
|
+
cdk_result = runner.test_read(
|
94
|
+
config_dict,
|
95
|
+
catalog,
|
96
|
+
converted_state,
|
97
|
+
request.record_limit,
|
98
|
+
request.page_limit,
|
99
|
+
request.slice_limit,
|
100
|
+
)
|
101
|
+
return StreamReadResponse.model_validate(asdict(cdk_result))
|
102
|
+
|
103
|
+
|
104
|
+
@router.post("/check", operation_id="check")
|
105
|
+
def check(request: CheckRequest) -> CheckResponse:
|
106
|
+
"""Check configuration against a manifest"""
|
107
|
+
source = safe_build_source(request.manifest.model_dump(), request.config.model_dump())
|
108
|
+
runner = ManifestCommandProcessor(source)
|
109
|
+
success, message = runner.check_connection(request.config.model_dump())
|
110
|
+
return CheckResponse(success=success, message=message)
|
111
|
+
|
112
|
+
|
113
|
+
@router.post("/discover", operation_id="discover")
|
114
|
+
def discover(request: DiscoverRequest) -> DiscoverResponse:
|
115
|
+
"""Discover streams from a manifest"""
|
116
|
+
source = safe_build_source(request.manifest.model_dump(), request.config.model_dump())
|
117
|
+
runner = ManifestCommandProcessor(source)
|
118
|
+
catalog = runner.discover(request.config.model_dump())
|
119
|
+
if catalog is None:
|
120
|
+
raise HTTPException(status_code=422, detail="Connector did not return a discovered catalog")
|
121
|
+
return DiscoverResponse(catalog=catalog)
|
122
|
+
|
123
|
+
|
124
|
+
@router.post("/resolve", operation_id="resolve")
|
125
|
+
def resolve(request: ResolveRequest) -> ManifestResponse:
|
126
|
+
"""Resolve a manifest to its final configuration."""
|
127
|
+
source = safe_build_source(request.manifest.model_dump(), {})
|
128
|
+
return ManifestResponse(manifest=Manifest(**source.resolved_manifest))
|
129
|
+
|
130
|
+
|
131
|
+
@router.post("/full_resolve", operation_id="fullResolve")
|
132
|
+
def full_resolve(request: FullResolveRequest) -> ManifestResponse:
|
133
|
+
"""
|
134
|
+
Fully resolve a manifest, including dynamic streams.
|
135
|
+
|
136
|
+
This is a similar operation to resolve, but has an extra step which generates streams from dynamic stream templates if the manifest contains any. This is used when a user clicks the generate streams button on a stream template in the Builder UI
|
137
|
+
"""
|
138
|
+
source = safe_build_source(request.manifest.model_dump(), request.config.model_dump())
|
139
|
+
manifest = {**source.resolved_manifest}
|
140
|
+
streams = manifest.get("streams", [])
|
141
|
+
for stream in streams:
|
142
|
+
stream["dynamic_stream_name"] = None
|
143
|
+
|
144
|
+
mapped_streams: Dict[str, List[Dict[str, Any]]] = {}
|
145
|
+
for stream in source.dynamic_streams:
|
146
|
+
generated_streams = mapped_streams.setdefault(stream["dynamic_stream_name"], [])
|
147
|
+
|
148
|
+
if len(generated_streams) < request.stream_limit:
|
149
|
+
generated_streams += [stream]
|
150
|
+
|
151
|
+
for generated_streams_list in mapped_streams.values():
|
152
|
+
streams.extend(generated_streams_list)
|
153
|
+
|
154
|
+
manifest["streams"] = streams
|
155
|
+
return ManifestResponse(manifest=Manifest(**manifest))
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: airbyte-cdk
|
3
|
-
Version: 6.61.
|
3
|
+
Version: 6.61.4
|
4
4
|
Summary: A framework for writing Airbyte Connectors.
|
5
5
|
Home-page: https://airbyte.com
|
6
6
|
License: MIT
|
@@ -19,6 +19,7 @@ Classifier: Topic :: Scientific/Engineering
|
|
19
19
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
20
20
|
Provides-Extra: dev
|
21
21
|
Provides-Extra: file-based
|
22
|
+
Provides-Extra: manifest-server
|
22
23
|
Provides-Extra: sql
|
23
24
|
Provides-Extra: vector-db-based
|
24
25
|
Requires-Dist: Jinja2 (>=3.1.2,<3.2.0)
|
@@ -35,6 +36,7 @@ Requires-Dist: cryptography (>=44.0.0,<45.0.0)
|
|
35
36
|
Requires-Dist: dateparser (>=1.2.2,<2.0.0)
|
36
37
|
Requires-Dist: dpath (>=2.1.6,<3.0.0)
|
37
38
|
Requires-Dist: dunamai (>=1.22.0,<2.0.0)
|
39
|
+
Requires-Dist: fastapi (>=0.116.1) ; extra == "manifest-server"
|
38
40
|
Requires-Dist: fastavro (>=1.8.0,<1.9.0) ; extra == "file-based"
|
39
41
|
Requires-Dist: genson (==1.3.0)
|
40
42
|
Requires-Dist: google-cloud-secret-manager (>=2.17.0,<3.0.0)
|
@@ -77,6 +79,7 @@ Requires-Dist: typing-extensions
|
|
77
79
|
Requires-Dist: unidecode (>=1.3.8,<2.0.0)
|
78
80
|
Requires-Dist: unstructured.pytesseract (>=0.3.12) ; extra == "file-based"
|
79
81
|
Requires-Dist: unstructured[docx,pptx] (==0.10.27) ; extra == "file-based"
|
82
|
+
Requires-Dist: uvicorn (>=0.35.0) ; extra == "manifest-server"
|
80
83
|
Requires-Dist: wcmatch (==10.0)
|
81
84
|
Requires-Dist: whenever (>=0.6.16,<0.7.0)
|
82
85
|
Requires-Dist: xmltodict (>=0.13,<0.15)
|
@@ -55,6 +55,31 @@ airbyte_cdk/manifest_migrations/migrations/http_requester_request_body_json_data
|
|
55
55
|
airbyte_cdk/manifest_migrations/migrations/http_requester_url_base_to_url.py,sha256=EX1MVYVpoWypA28qoH48wA0SYZjGdlR8bcSixTDzfgo,1346
|
56
56
|
airbyte_cdk/manifest_migrations/migrations/registry.yaml,sha256=F-hdapvl_vZnsI7CQsV00Rb7g7j4Nt2zaM83-Tbwgbg,956
|
57
57
|
airbyte_cdk/manifest_migrations/migrations_registry.py,sha256=zly2fwaOxDukqC7eowzrDlvhA2v71FjW74kDzvRXhSY,2619
|
58
|
+
airbyte_cdk/manifest_server/Dockerfile,sha256=hNgnUguE9jA5XFkpLmzvbsQbsZTuwOxJgE7qYNkPueo,1316
|
59
|
+
airbyte_cdk/manifest_server/README.md,sha256=W2zHnGM4pOynkfm4gSzFGHfEkou4NgDDDRFQGiJhFZ8,3772
|
60
|
+
airbyte_cdk/manifest_server/__init__.py,sha256=EE54nk2dbtExIEEvLPCTUkJ_ESV5OYP4B2rBJlDpJ5g,33
|
61
|
+
airbyte_cdk/manifest_server/api_models/__init__.py,sha256=1UFpMsJm1sjNBjgEasbOU98BgZxLthlPM1KdUpGfC4I,1015
|
62
|
+
airbyte_cdk/manifest_server/api_models/capabilities.py,sha256=eL88UxojIewHt97wMeCvyt92Hzh95UvLvVH6MSlsj5o,152
|
63
|
+
airbyte_cdk/manifest_server/api_models/dicts.py,sha256=Rm10IeV745MY8bLyrYyG7a9NGNrZBlnfkXct8gi7OTI,467
|
64
|
+
airbyte_cdk/manifest_server/api_models/manifest.py,sha256=cqxA4hU7Q29R8w6fqRDxtM7bVcFcADU2eQXZYKbib3M,1673
|
65
|
+
airbyte_cdk/manifest_server/api_models/stream.py,sha256=Jtz4TbqLf6Xbnu1KtTEQhzi_1rqClB2n22pueK8xgrI,2001
|
66
|
+
airbyte_cdk/manifest_server/app.py,sha256=kPJVHIq8twI5KqlCuyV1fT01sFYQoSBdGBj87rfLcFE,429
|
67
|
+
airbyte_cdk/manifest_server/auth.py,sha256=kKET6zg4olyf8p_UMcTnm7vkAtowxK6loSf8o83SdEM,1264
|
68
|
+
airbyte_cdk/manifest_server/cli/__init__.py,sha256=YfCEfXq3Jr7z3GOKMA6vF-D-7Y66BNHUwBLNM9UQbiQ,273
|
69
|
+
airbyte_cdk/manifest_server/cli/_common.py,sha256=5hfwKjkB5IQ4SGI54DBKMEbzLMsgN2Itv1wlQBzj8ts,799
|
70
|
+
airbyte_cdk/manifest_server/cli/_info.py,sha256=-h8U1bSD1umqLuoXfg4yDNWFR1BZuxcXxLhVKfLWB0Y,982
|
71
|
+
airbyte_cdk/manifest_server/cli/_openapi.py,sha256=rNghqbBMMT118auUIsxr89Mu6L6hqoQAifxyDbv1ZqQ,1445
|
72
|
+
airbyte_cdk/manifest_server/cli/_start.py,sha256=SgkW_dQcpCIrXYNZ6qF95oYIVaCszm9tFEbYiAZo4EQ,876
|
73
|
+
airbyte_cdk/manifest_server/cli/run.py,sha256=-Yv_Jv_hDeMBVZdzuyeJJ_JBT1WUhCyUQn4f4mA21Ds,1224
|
74
|
+
airbyte_cdk/manifest_server/command_processor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
75
|
+
airbyte_cdk/manifest_server/command_processor/processor.py,sha256=qaQdmF1SaM7gr0B2D53eaooZ_cOv70hSlHL4c_iV8hg,3830
|
76
|
+
airbyte_cdk/manifest_server/command_processor/utils.py,sha256=f_CkN2nURTTp07Twr9vZfFj5j-jTFtezoOUu2i402W4,3221
|
77
|
+
airbyte_cdk/manifest_server/main.py,sha256=iSgL7x8ifBpGpXi7Dq7017QjeC20l_CYBAIsumiyJn0,573
|
78
|
+
airbyte_cdk/manifest_server/openapi.yaml,sha256=jwJXohDXP3BLL0JGZhkyhpNLWLZu6_iXEgMtM58F2Pc,16693
|
79
|
+
airbyte_cdk/manifest_server/routers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
80
|
+
airbyte_cdk/manifest_server/routers/capabilities.py,sha256=UeZQzbqEuDN23vizgDb_N7KEXR-YZUPnW5AkXeXy1hA,727
|
81
|
+
airbyte_cdk/manifest_server/routers/health.py,sha256=akBUaHUGN-jmN82lQ3kj_3-wdS6gsZx3iSD2KMI5dW8,200
|
82
|
+
airbyte_cdk/manifest_server/routers/manifest.py,sha256=6UT8bD-og-Eg-cfxuXkJXzzj0z3Kko6vOfsGjOAaPks,5570
|
58
83
|
airbyte_cdk/models/__init__.py,sha256=Et9wJWs5VOWynGbb-3aJRhsdAHAiLkNNLxdwqJAuqkw,2114
|
59
84
|
airbyte_cdk/models/airbyte_protocol.py,sha256=oZdKsZ7yPjUt9hvxdWNpxCtgjSV2RWhf4R9Np03sqyY,3613
|
60
85
|
airbyte_cdk/models/airbyte_protocol_serializers.py,sha256=Dq4ry_Wwvzsos6neDiaOZkY6riQYC33ZlPNWpfIIB1E,1926
|
@@ -429,9 +454,9 @@ airbyte_cdk/utils/slice_hasher.py,sha256=EDxgROHDbfG-QKQb59m7h_7crN1tRiawdf5uU7G
|
|
429
454
|
airbyte_cdk/utils/spec_schema_transformations.py,sha256=-5HTuNsnDBAhj-oLeQXwpTGA0HdcjFOf2zTEMUTTg_Y,816
|
430
455
|
airbyte_cdk/utils/stream_status_utils.py,sha256=ZmBoiy5HVbUEHAMrUONxZvxnvfV9CesmQJLDTAIWnWw,1171
|
431
456
|
airbyte_cdk/utils/traced_exception.py,sha256=C8uIBuCL_E4WnBAOPSxBicD06JAldoN9fGsQDp463OY,6292
|
432
|
-
airbyte_cdk-6.61.
|
433
|
-
airbyte_cdk-6.61.
|
434
|
-
airbyte_cdk-6.61.
|
435
|
-
airbyte_cdk-6.61.
|
436
|
-
airbyte_cdk-6.61.
|
437
|
-
airbyte_cdk-6.61.
|
457
|
+
airbyte_cdk-6.61.4.dist-info/LICENSE.txt,sha256=Wfe61S4BaGPj404v8lrAbvhjYR68SHlkzeYrg3_bbuM,1051
|
458
|
+
airbyte_cdk-6.61.4.dist-info/LICENSE_SHORT,sha256=aqF6D1NcESmpn-cqsxBtszTEnHKnlsp8L4x9wAh3Nxg,55
|
459
|
+
airbyte_cdk-6.61.4.dist-info/METADATA,sha256=gsNA8x1tcy3wL-75j4PGkhTYwFEQg22noo-gAfUc-gY,6636
|
460
|
+
airbyte_cdk-6.61.4.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
|
461
|
+
airbyte_cdk-6.61.4.dist-info/entry_points.txt,sha256=eLZ2UYvJZGm1s07Pplcs--1Gim60YhZWTb53j_dghwU,195
|
462
|
+
airbyte_cdk-6.61.4.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|