airbyte-cdk 6.61.2__py3-none-any.whl → 6.61.3__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.
Files changed (31) hide show
  1. airbyte_cdk/manifest_server/Dockerfile +45 -0
  2. airbyte_cdk/manifest_server/README.md +142 -0
  3. airbyte_cdk/manifest_server/__init__.py +3 -0
  4. airbyte_cdk/manifest_server/api_models/__init__.py +49 -0
  5. airbyte_cdk/manifest_server/api_models/capabilities.py +7 -0
  6. airbyte_cdk/manifest_server/api_models/dicts.py +17 -0
  7. airbyte_cdk/manifest_server/api_models/manifest.py +73 -0
  8. airbyte_cdk/manifest_server/api_models/stream.py +76 -0
  9. airbyte_cdk/manifest_server/app.py +17 -0
  10. airbyte_cdk/manifest_server/auth.py +43 -0
  11. airbyte_cdk/manifest_server/cli/__init__.py +5 -0
  12. airbyte_cdk/manifest_server/cli/_common.py +28 -0
  13. airbyte_cdk/manifest_server/cli/_info.py +30 -0
  14. airbyte_cdk/manifest_server/cli/_openapi.py +43 -0
  15. airbyte_cdk/manifest_server/cli/_start.py +38 -0
  16. airbyte_cdk/manifest_server/cli/run.py +59 -0
  17. airbyte_cdk/manifest_server/command_processor/__init__.py +0 -0
  18. airbyte_cdk/manifest_server/command_processor/processor.py +122 -0
  19. airbyte_cdk/manifest_server/command_processor/utils.py +99 -0
  20. airbyte_cdk/manifest_server/main.py +24 -0
  21. airbyte_cdk/manifest_server/openapi.yaml +641 -0
  22. airbyte_cdk/manifest_server/routers/__init__.py +0 -0
  23. airbyte_cdk/manifest_server/routers/capabilities.py +25 -0
  24. airbyte_cdk/manifest_server/routers/health.py +13 -0
  25. airbyte_cdk/manifest_server/routers/manifest.py +155 -0
  26. {airbyte_cdk-6.61.2.dist-info → airbyte_cdk-6.61.3.dist-info}/METADATA +4 -1
  27. {airbyte_cdk-6.61.2.dist-info → airbyte_cdk-6.61.3.dist-info}/RECORD +31 -6
  28. {airbyte_cdk-6.61.2.dist-info → airbyte_cdk-6.61.3.dist-info}/entry_points.txt +1 -0
  29. {airbyte_cdk-6.61.2.dist-info → airbyte_cdk-6.61.3.dist-info}/LICENSE.txt +0 -0
  30. {airbyte_cdk-6.61.2.dist-info → airbyte_cdk-6.61.3.dist-info}/LICENSE_SHORT +0 -0
  31. {airbyte_cdk-6.61.2.dist-info → airbyte_cdk-6.61.3.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.2
3
+ Version: 6.61.3
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=iTHsQLmZLKYj4hWns0vgDr8KFnK1MbiOO76kz1SEcUk,16526
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.2.dist-info/LICENSE.txt,sha256=Wfe61S4BaGPj404v8lrAbvhjYR68SHlkzeYrg3_bbuM,1051
433
- airbyte_cdk-6.61.2.dist-info/LICENSE_SHORT,sha256=aqF6D1NcESmpn-cqsxBtszTEnHKnlsp8L4x9wAh3Nxg,55
434
- airbyte_cdk-6.61.2.dist-info/METADATA,sha256=jrR3TXXz1BFLlHY2ls02vKhGHZRKFAqSfJ7en-6zfHY,6477
435
- airbyte_cdk-6.61.2.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
436
- airbyte_cdk-6.61.2.dist-info/entry_points.txt,sha256=AKWbEkHfpzzk9nF9tqBUaw1MbvTM4mGtEzmZQm0ZWvM,139
437
- airbyte_cdk-6.61.2.dist-info/RECORD,,
457
+ airbyte_cdk-6.61.3.dist-info/LICENSE.txt,sha256=Wfe61S4BaGPj404v8lrAbvhjYR68SHlkzeYrg3_bbuM,1051
458
+ airbyte_cdk-6.61.3.dist-info/LICENSE_SHORT,sha256=aqF6D1NcESmpn-cqsxBtszTEnHKnlsp8L4x9wAh3Nxg,55
459
+ airbyte_cdk-6.61.3.dist-info/METADATA,sha256=254-RO5u5SN-uUJ3L5wBoP6p6dxbEZvA3OH-8ytxIYs,6636
460
+ airbyte_cdk-6.61.3.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
461
+ airbyte_cdk-6.61.3.dist-info/entry_points.txt,sha256=eLZ2UYvJZGm1s07Pplcs--1Gim60YhZWTb53j_dghwU,195
462
+ airbyte_cdk-6.61.3.dist-info/RECORD,,
@@ -1,4 +1,5 @@
1
1
  [console_scripts]
2
2
  airbyte-cdk=airbyte_cdk.cli.airbyte_cdk:cli
3
+ manifest-server=airbyte_cdk.manifest_server.cli.run:run
3
4
  source-declarative-manifest=airbyte_cdk.cli.source_declarative_manifest:run
4
5