airbyte-cdk 6.61.2__py3-none-any.whl → 6.61.3.post2.dev17299502224__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 (32) 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/sources/file_based/file_types/excel_parser.py +3 -3
  27. {airbyte_cdk-6.61.2.dist-info → airbyte_cdk-6.61.3.post2.dev17299502224.dist-info}/METADATA +4 -1
  28. {airbyte_cdk-6.61.2.dist-info → airbyte_cdk-6.61.3.post2.dev17299502224.dist-info}/RECORD +32 -7
  29. {airbyte_cdk-6.61.2.dist-info → airbyte_cdk-6.61.3.post2.dev17299502224.dist-info}/entry_points.txt +1 -0
  30. {airbyte_cdk-6.61.2.dist-info → airbyte_cdk-6.61.3.post2.dev17299502224.dist-info}/LICENSE.txt +0 -0
  31. {airbyte_cdk-6.61.2.dist-info → airbyte_cdk-6.61.3.post2.dev17299502224.dist-info}/LICENSE_SHORT +0 -0
  32. {airbyte_cdk-6.61.2.dist-info → airbyte_cdk-6.61.3.post2.dev17299502224.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))
@@ -118,9 +118,9 @@ class ExcelParser(FileTypeParser):
118
118
  # DataFrame.to_dict() method returns datetime values in pandas.Timestamp values, which are not serializable by orjson
119
119
  # DataFrame.to_json() returns string with datetime values serialized to iso8601 with microseconds to align with pydantic behavior
120
120
  # see PR description: https://github.com/airbytehq/airbyte/pull/44444/
121
- yield from orjson.loads(
122
- df.to_json(orient="records", date_format="iso", date_unit="us")
123
- )
121
+ for index, row in df.iterrows():
122
+ # Convert each row (as a Series) to a JSON string
123
+ yield orjson.loads(row.to_json(date_format="iso", date_unit="us"))
124
124
 
125
125
  except Exception as exc:
126
126
  # Raise a RecordParseError if any exception occurs during parsing
@@ -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.post2.dev17299502224
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
@@ -275,7 +300,7 @@ airbyte_cdk/sources/file_based/file_record_data.py,sha256=Vkr5AyZzlsOezjVCLhFrm_
275
300
  airbyte_cdk/sources/file_based/file_types/__init__.py,sha256=blCLn0-2LC-ZdgcNyDEhqM2RiUvEjEBh-G4-t32ZtuM,1268
276
301
  airbyte_cdk/sources/file_based/file_types/avro_parser.py,sha256=USEYqiICXBWpDV443VtNOCmUA-GINzY_Zah74_5w3qQ,10860
277
302
  airbyte_cdk/sources/file_based/file_types/csv_parser.py,sha256=QlCXB-ry3np67Q_VerQEPoWDOTcPTB6Go4ydZxY9ae4,20445
278
- airbyte_cdk/sources/file_based/file_types/excel_parser.py,sha256=BeplCq0hmojELU6bZCvvpRLpQ9us81TqbGYwrhd3INo,7188
303
+ airbyte_cdk/sources/file_based/file_types/excel_parser.py,sha256=bpAtkDs_QyHAUYcWRkF3ROkQB4wbGe3TzY2jwQgG664,7251
279
304
  airbyte_cdk/sources/file_based/file_types/file_transfer.py,sha256=5l2Jo6bp6neDmgM427PrZMZeqU0hCIZVWnzUZ_7BT10,1100
280
305
  airbyte_cdk/sources/file_based/file_types/file_type_parser.py,sha256=JgpH21PrbRqwK92BJklZWvh2TndA6xZ-eP1LPMo44oQ,2832
281
306
  airbyte_cdk/sources/file_based/file_types/jsonl_parser.py,sha256=GwyNyxmST4RX-XpXy7xVH0D-znYWWBmGv_pVAu95oHQ,5886
@@ -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.post2.dev17299502224.dist-info/LICENSE.txt,sha256=Wfe61S4BaGPj404v8lrAbvhjYR68SHlkzeYrg3_bbuM,1051
458
+ airbyte_cdk-6.61.3.post2.dev17299502224.dist-info/LICENSE_SHORT,sha256=aqF6D1NcESmpn-cqsxBtszTEnHKnlsp8L4x9wAh3Nxg,55
459
+ airbyte_cdk-6.61.3.post2.dev17299502224.dist-info/METADATA,sha256=B0FyXybZxYX0Y7NO06p5xim0SwSEENo58CGuaCUmRTs,6657
460
+ airbyte_cdk-6.61.3.post2.dev17299502224.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
461
+ airbyte_cdk-6.61.3.post2.dev17299502224.dist-info/entry_points.txt,sha256=eLZ2UYvJZGm1s07Pplcs--1Gim60YhZWTb53j_dghwU,195
462
+ airbyte_cdk-6.61.3.post2.dev17299502224.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