airbyte-cdk 6.61.3.post2.dev17299502224__py3-none-any.whl → 6.61.5__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.
@@ -37,26 +37,31 @@ The server will start on `http://localhost:8000` by default.
37
37
  ## API Endpoints
38
38
 
39
39
  ### `/v1/manifest/test_read`
40
+
40
41
  Test reading from a specific stream in the manifest.
41
42
 
42
43
  **POST** - Test stream reading with configurable limits for records, pages, and slices.
43
44
 
44
45
  ### `/v1/manifest/check`
46
+
45
47
  Check configuration against a manifest.
46
48
 
47
49
  **POST** - Validates connector configuration and returns success/failure status with message.
48
50
 
49
51
  ### `/v1/manifest/discover`
52
+
50
53
  Discover streams from a manifest.
51
54
 
52
55
  **POST** - Returns the catalog of available streams from the manifest.
53
56
 
54
- ### `/v1/manifest/resolve`
57
+ ### `/v1/manifest/resolve`
58
+
55
59
  Resolve a manifest to its final configuration.
56
60
 
57
61
  **POST** - Returns the resolved manifest without dynamic stream generation.
58
62
 
59
63
  ### `/v1/manifest/full_resolve`
64
+
60
65
  Fully resolve a manifest including dynamic streams.
61
66
 
62
67
  **POST** - Generates dynamic streams up to specified limits and includes them in the resolved manifest.
@@ -68,6 +73,7 @@ The manifest server supports custom Python components, but this feature is **dis
68
73
  ### Enabling Custom Components
69
74
 
70
75
  To allow custom Python components in your manifest files, set the environment variable:
76
+
71
77
  ```bash
72
78
  export AIRBYTE_ENABLE_UNSAFE_CODE=true
73
79
  ```
@@ -77,20 +83,25 @@ export AIRBYTE_ENABLE_UNSAFE_CODE=true
77
83
  The manifest server supports optional JWT bearer token authentication:
78
84
 
79
85
  ### Configuration
86
+
80
87
  Set the environment variable to enable authentication:
88
+
81
89
  ```bash
82
90
  export AB_JWT_SIGNATURE_SECRET="your-jwt-secret-key"
83
91
  ```
84
92
 
85
93
  ### Usage
94
+
86
95
  When authentication is enabled, include a valid JWT token in the Authorization header:
96
+
87
97
  ```bash
88
98
  curl -H "Authorization: Bearer <your-jwt-token>" \
89
99
  http://localhost:8000/v1/manifest/test_read
90
100
  ```
91
101
 
92
102
  ### Behavior
93
- - **Without `AB_JWT_SIGNATURE_SECRET`**: All requests pass through
103
+
104
+ - **Without `AB_JWT_SIGNATURE_SECRET`**: All requests pass through
94
105
  - **With `AB_JWT_SIGNATURE_SECRET`**: Requires valid JWT bearer token using HS256 algorithm
95
106
 
96
107
  ## OpenAPI Specification
@@ -98,6 +109,7 @@ curl -H "Authorization: Bearer <your-jwt-token>" \
98
109
  The manifest server provides an OpenAPI specification for API client generation:
99
110
 
100
111
  ### Generating the OpenAPI Spec
112
+
101
113
  ```bash
102
114
  # Generate OpenAPI YAML (default location)
103
115
  manifest-server generate-openapi
@@ -107,6 +119,7 @@ manifest-server generate-openapi --output /path/to/openapi.yaml
107
119
  ```
108
120
 
109
121
  The generated OpenAPI specification is consumed by other applications and tools to:
122
+
110
123
  - Generate API clients in various programming languages
111
124
  - Create SDK bindings for the manifest server
112
125
  - Provide API documentation and validation
@@ -115,6 +128,7 @@ The generated OpenAPI specification is consumed by other applications and tools
115
128
  ### Interactive API Documentation
116
129
 
117
130
  When running, interactive API documentation is available at:
131
+
118
132
  - Swagger UI: `http://localhost:8000/docs`
119
133
  - ReDoc: `http://localhost:8000/redoc`
120
134
 
@@ -139,4 +153,26 @@ docker build -f airbyte_cdk/manifest_server/Dockerfile -t manifest-server .
139
153
  docker run -p 8080:8080 manifest-server
140
154
  ```
141
155
 
142
- Note: The container runs on port 8080 by default.
156
+ Note: The container runs on port 8080 by default.
157
+
158
+ ## Datadog APM
159
+
160
+ The manifest server supports Datadog APM tracing for monitoring and observability:
161
+
162
+ ### Configuration
163
+
164
+ To enable Datadog tracing, set the environment variable:
165
+
166
+ ```bash
167
+ export DD_ENABLED=true
168
+ ```
169
+
170
+ This requires the `ddtrace` dependency, which is included in the `manifest-server` extra. For additional configuration options via environment variables, see [ddtrace configuration](https://ddtrace.readthedocs.io/en/stable/configuration.html).
171
+
172
+ ### Usage
173
+
174
+ ```bash
175
+ # Run with Datadog tracing enabled
176
+ DD_ENABLED=true manifest-server start
177
+ ```
178
+
@@ -1,3 +1,9 @@
1
+ import os
2
+
3
+ if os.getenv("DD_ENABLED", "false").lower() == "true":
4
+ # Auto-instrumentation should be imported as early as possible.
5
+ import ddtrace.auto # noqa: F401
6
+
1
7
  from fastapi import FastAPI
2
8
 
3
9
  from .routers import capabilities, health, manifest
@@ -7,6 +7,7 @@ import rich_click as click
7
7
 
8
8
  # Import server dependencies with graceful fallback
9
9
  try:
10
+ import ddtrace # noqa: F401
10
11
  import fastapi # noqa: F401
11
12
  import uvicorn # noqa: F401
12
13
 
@@ -41,7 +41,6 @@ class ManifestCommandProcessor:
41
41
  """
42
42
  Test the read method of the source.
43
43
  """
44
-
45
44
  test_read_handler = TestReader(
46
45
  max_pages_per_slice=page_limit,
47
46
  max_slices=slice_limit,
@@ -61,7 +61,7 @@ paths:
61
61
  content:
62
62
  application/json:
63
63
  schema:
64
- $ref: '#/components/schemas/StreamRead'
64
+ $ref: '#/components/schemas/StreamReadResponse'
65
65
  '422':
66
66
  description: Validation Error
67
67
  content:
@@ -159,12 +159,13 @@ paths:
159
159
  tags:
160
160
  - manifest
161
161
  summary: Full Resolve
162
- description: 'Fully resolve a manifest including dynamic streams.
162
+ description: 'Fully resolve a manifest, including dynamic streams.
163
163
 
164
164
 
165
- Generates dynamic streams up to the specified limit and includes
166
-
167
- them in the resolved manifest.'
165
+ This is a similar operation to resolve, but has an extra step which generates
166
+ streams from dynamic stream templates if the manifest contains any. This is
167
+ used when a user clicks the generate streams button on a stream template in
168
+ the Builder UI'
168
169
  operationId: fullResolve
169
170
  requestBody:
170
171
  content:
@@ -465,7 +466,26 @@ components:
465
466
  - manifest
466
467
  title: ResolveRequest
467
468
  description: Request to resolve a manifest.
468
- StreamRead:
469
+ StreamReadPages:
470
+ properties:
471
+ records:
472
+ items: {}
473
+ type: array
474
+ title: Records
475
+ request:
476
+ anyOf:
477
+ - $ref: '#/components/schemas/HttpRequest'
478
+ - type: 'null'
479
+ response:
480
+ anyOf:
481
+ - $ref: '#/components/schemas/HttpResponse'
482
+ - type: 'null'
483
+ type: object
484
+ required:
485
+ - records
486
+ title: StreamReadPages
487
+ description: Pages of data read from a stream slice.
488
+ StreamReadResponse:
469
489
  properties:
470
490
  logs:
471
491
  items:
@@ -511,27 +531,8 @@ components:
511
531
  - inferred_schema
512
532
  - inferred_datetime_formats
513
533
  - latest_config_update
514
- title: StreamRead
534
+ title: StreamReadResponse
515
535
  description: Complete stream read response with properly typed fields.
516
- StreamReadPages:
517
- properties:
518
- records:
519
- items: {}
520
- type: array
521
- title: Records
522
- request:
523
- anyOf:
524
- - $ref: '#/components/schemas/HttpRequest'
525
- - type: 'null'
526
- response:
527
- anyOf:
528
- - $ref: '#/components/schemas/HttpResponse'
529
- - type: 'null'
530
- type: object
531
- required:
532
- - records
533
- title: StreamReadPages
534
- description: Pages of data read from a stream slice.
535
536
  StreamReadSlices:
536
537
  properties:
537
538
  pages:
@@ -577,7 +578,6 @@ components:
577
578
  items: {}
578
579
  type: array
579
580
  title: State
580
- default: []
581
581
  custom_components_code:
582
582
  anyOf:
583
583
  - type: string
@@ -149,6 +149,7 @@ class CartesianProductStreamSlicer(PartitionRouter):
149
149
  for stream_slice_tuple in product:
150
150
  partition = dict(ChainMap(*[s.partition for s in stream_slice_tuple])) # type: ignore # ChainMap expects a MutableMapping[Never, Never] for reasons
151
151
  cursor_slices = [s.cursor_slice for s in stream_slice_tuple if s.cursor_slice]
152
+ extra_fields = dict(ChainMap(*[s.extra_fields for s in stream_slice_tuple])) # type: ignore # ChainMap expects a MutableMapping[Never, Never] for reasons
152
153
  if len(cursor_slices) > 1:
153
154
  raise ValueError(
154
155
  f"There should only be a single cursor slice. Found {cursor_slices}"
@@ -157,7 +158,9 @@ class CartesianProductStreamSlicer(PartitionRouter):
157
158
  cursor_slice = cursor_slices[0]
158
159
  else:
159
160
  cursor_slice = {}
160
- yield StreamSlice(partition=partition, cursor_slice=cursor_slice)
161
+ yield StreamSlice(
162
+ partition=partition, cursor_slice=cursor_slice, extra_fields=extra_fields
163
+ )
161
164
 
162
165
  def set_initial_state(self, stream_state: StreamState) -> None:
163
166
  """
@@ -14,10 +14,21 @@ from airbyte_cdk.sources.streams.concurrent.partitions.stream_slicer import Stre
14
14
  from airbyte_cdk.sources.types import Record, StreamSlice
15
15
  from airbyte_cdk.utils.slice_hasher import SliceHasher
16
16
 
17
+
17
18
  # For Connector Builder test read operations, we track the total number of records
18
- # read for the stream at the global level so that we can stop reading early if we
19
- # exceed the record limit
20
- total_record_counter = 0
19
+ # read for the stream so that we can stop reading early if we exceed the record limit.
20
+ class RecordCounter:
21
+ def __init__(self) -> None:
22
+ self.total_record_counter = 0
23
+
24
+ def increment(self) -> None:
25
+ self.total_record_counter += 1
26
+
27
+ def reset(self) -> None:
28
+ self.total_record_counter = 0
29
+
30
+ def get_total_records(self) -> int:
31
+ return self.total_record_counter
21
32
 
22
33
 
23
34
  class SchemaLoaderCachingDecorator(SchemaLoader):
@@ -51,6 +62,7 @@ class DeclarativePartitionFactory:
51
62
  self._retriever = retriever
52
63
  self._message_repository = message_repository
53
64
  self._max_records_limit = max_records_limit
65
+ self._record_counter = RecordCounter()
54
66
 
55
67
  def create(self, stream_slice: StreamSlice) -> Partition:
56
68
  return DeclarativePartition(
@@ -60,6 +72,7 @@ class DeclarativePartitionFactory:
60
72
  message_repository=self._message_repository,
61
73
  max_records_limit=self._max_records_limit,
62
74
  stream_slice=stream_slice,
75
+ record_counter=self._record_counter,
63
76
  )
64
77
 
65
78
 
@@ -72,6 +85,7 @@ class DeclarativePartition(Partition):
72
85
  message_repository: MessageRepository,
73
86
  max_records_limit: Optional[int],
74
87
  stream_slice: StreamSlice,
88
+ record_counter: RecordCounter,
75
89
  ):
76
90
  self._stream_name = stream_name
77
91
  self._schema_loader = schema_loader
@@ -80,17 +94,17 @@ class DeclarativePartition(Partition):
80
94
  self._max_records_limit = max_records_limit
81
95
  self._stream_slice = stream_slice
82
96
  self._hash = SliceHasher.hash(self._stream_name, self._stream_slice)
97
+ self._record_counter = record_counter
83
98
 
84
99
  def read(self) -> Iterable[Record]:
85
100
  if self._max_records_limit is not None:
86
- global total_record_counter
87
- if total_record_counter >= self._max_records_limit:
101
+ if self._record_counter.get_total_records() >= self._max_records_limit:
88
102
  return
89
103
  for stream_data in self._retriever.read_records(
90
104
  self._schema_loader.get_json_schema(), self._stream_slice
91
105
  ):
92
106
  if self._max_records_limit is not None:
93
- if total_record_counter >= self._max_records_limit:
107
+ if self._record_counter.get_total_records() >= self._max_records_limit:
94
108
  break
95
109
 
96
110
  if isinstance(stream_data, Mapping):
@@ -108,7 +122,7 @@ class DeclarativePartition(Partition):
108
122
  self._message_repository.emit_message(stream_data)
109
123
 
110
124
  if self._max_records_limit is not None:
111
- total_record_counter += 1
125
+ self._record_counter.increment()
112
126
 
113
127
  def to_slice(self) -> Optional[Mapping[str, Any]]:
114
128
  return self._stream_slice
@@ -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
- 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"))
121
+ yield from orjson.loads(
122
+ df.to_json(orient="records", date_format="iso", date_unit="us")
123
+ )
124
124
 
125
125
  except Exception as exc:
126
126
  # Raise a RecordParseError if any exception occurs during parsing
@@ -1,13 +1,13 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: airbyte-cdk
3
- Version: 6.61.3.post2.dev17299502224
3
+ Version: 6.61.5
4
4
  Summary: A framework for writing Airbyte Connectors.
5
5
  Home-page: https://airbyte.com
6
6
  License: MIT
7
7
  Keywords: airbyte,connector-development-kit,cdk
8
8
  Author: Airbyte
9
9
  Author-email: contact@airbyte.io
10
- Requires-Python: >=3.10,<3.13
10
+ Requires-Python: >=3.10,<3.14
11
11
  Classifier: Development Status :: 3 - Alpha
12
12
  Classifier: Intended Audience :: Developers
13
13
  Classifier: License :: OSI Approved :: MIT License
@@ -15,6 +15,7 @@ Classifier: Programming Language :: Python :: 3
15
15
  Classifier: Programming Language :: Python :: 3.10
16
16
  Classifier: Programming Language :: Python :: 3.11
17
17
  Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Programming Language :: Python :: 3.13
18
19
  Classifier: Topic :: Scientific/Engineering
19
20
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
20
21
  Provides-Extra: dev
@@ -31,13 +32,14 @@ Requires-Dist: backoff
31
32
  Requires-Dist: boltons (>=25.0.0,<26.0.0)
32
33
  Requires-Dist: cachetools
33
34
  Requires-Dist: click (>=8.1.8,<9.0.0)
34
- Requires-Dist: cohere (==4.21) ; extra == "vector-db-based"
35
+ Requires-Dist: cohere (>=4.21,<6.0.0) ; extra == "vector-db-based"
35
36
  Requires-Dist: cryptography (>=44.0.0,<45.0.0)
36
37
  Requires-Dist: dateparser (>=1.2.2,<2.0.0)
38
+ Requires-Dist: ddtrace (>=3.12.3,<4.0.0) ; extra == "manifest-server"
37
39
  Requires-Dist: dpath (>=2.1.6,<3.0.0)
38
40
  Requires-Dist: dunamai (>=1.22.0,<2.0.0)
39
41
  Requires-Dist: fastapi (>=0.116.1) ; extra == "manifest-server"
40
- Requires-Dist: fastavro (>=1.8.0,<1.9.0) ; extra == "file-based"
42
+ Requires-Dist: fastavro (>=1.11.0,<2.0.0) ; extra == "file-based"
41
43
  Requires-Dist: genson (==1.3.0)
42
44
  Requires-Dist: google-cloud-secret-manager (>=2.17.0,<3.0.0)
43
45
  Requires-Dist: isodate (>=0.6.1,<0.7.0)
@@ -51,7 +53,7 @@ Requires-Dist: numpy (<2)
51
53
  Requires-Dist: openai[embeddings] (==0.27.9) ; extra == "vector-db-based"
52
54
  Requires-Dist: orjson (>=3.10.7,<4.0.0)
53
55
  Requires-Dist: packaging
54
- Requires-Dist: pandas (==2.2.2)
56
+ Requires-Dist: pandas (==2.2.3)
55
57
  Requires-Dist: pdf2image (==1.16.3) ; extra == "file-based"
56
58
  Requires-Dist: pdfminer.six (==20221105) ; extra == "file-based"
57
59
  Requires-Dist: psutil (==6.1.0)
@@ -56,26 +56,26 @@ airbyte_cdk/manifest_migrations/migrations/http_requester_url_base_to_url.py,sha
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
58
  airbyte_cdk/manifest_server/Dockerfile,sha256=hNgnUguE9jA5XFkpLmzvbsQbsZTuwOxJgE7qYNkPueo,1316
59
- airbyte_cdk/manifest_server/README.md,sha256=W2zHnGM4pOynkfm4gSzFGHfEkou4NgDDDRFQGiJhFZ8,3772
59
+ airbyte_cdk/manifest_server/README.md,sha256=bYzb3QAnkaM9mR9XgK7n4FKAvZkM4OWaBGcQb91f3vk,4341
60
60
  airbyte_cdk/manifest_server/__init__.py,sha256=EE54nk2dbtExIEEvLPCTUkJ_ESV5OYP4B2rBJlDpJ5g,33
61
61
  airbyte_cdk/manifest_server/api_models/__init__.py,sha256=1UFpMsJm1sjNBjgEasbOU98BgZxLthlPM1KdUpGfC4I,1015
62
62
  airbyte_cdk/manifest_server/api_models/capabilities.py,sha256=eL88UxojIewHt97wMeCvyt92Hzh95UvLvVH6MSlsj5o,152
63
63
  airbyte_cdk/manifest_server/api_models/dicts.py,sha256=Rm10IeV745MY8bLyrYyG7a9NGNrZBlnfkXct8gi7OTI,467
64
64
  airbyte_cdk/manifest_server/api_models/manifest.py,sha256=cqxA4hU7Q29R8w6fqRDxtM7bVcFcADU2eQXZYKbib3M,1673
65
65
  airbyte_cdk/manifest_server/api_models/stream.py,sha256=Jtz4TbqLf6Xbnu1KtTEQhzi_1rqClB2n22pueK8xgrI,2001
66
- airbyte_cdk/manifest_server/app.py,sha256=kPJVHIq8twI5KqlCuyV1fT01sFYQoSBdGBj87rfLcFE,429
66
+ airbyte_cdk/manifest_server/app.py,sha256=RrjV73qx_PBoYoO_IAxDNV5v-UZNwjSG4muxZ4kiMj8,602
67
67
  airbyte_cdk/manifest_server/auth.py,sha256=kKET6zg4olyf8p_UMcTnm7vkAtowxK6loSf8o83SdEM,1264
68
68
  airbyte_cdk/manifest_server/cli/__init__.py,sha256=YfCEfXq3Jr7z3GOKMA6vF-D-7Y66BNHUwBLNM9UQbiQ,273
69
- airbyte_cdk/manifest_server/cli/_common.py,sha256=5hfwKjkB5IQ4SGI54DBKMEbzLMsgN2Itv1wlQBzj8ts,799
69
+ airbyte_cdk/manifest_server/cli/_common.py,sha256=_dV7Lq30-MFDAw4feNKJDnQkAaNpPnuHm4xcGJb9SvE,832
70
70
  airbyte_cdk/manifest_server/cli/_info.py,sha256=-h8U1bSD1umqLuoXfg4yDNWFR1BZuxcXxLhVKfLWB0Y,982
71
71
  airbyte_cdk/manifest_server/cli/_openapi.py,sha256=rNghqbBMMT118auUIsxr89Mu6L6hqoQAifxyDbv1ZqQ,1445
72
72
  airbyte_cdk/manifest_server/cli/_start.py,sha256=SgkW_dQcpCIrXYNZ6qF95oYIVaCszm9tFEbYiAZo4EQ,876
73
73
  airbyte_cdk/manifest_server/cli/run.py,sha256=-Yv_Jv_hDeMBVZdzuyeJJ_JBT1WUhCyUQn4f4mA21Ds,1224
74
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
75
+ airbyte_cdk/manifest_server/command_processor/processor.py,sha256=_YNJdP3H9IP_26m1S6j-ZfVK-EC9YppAV-Degd7yll0,3829
76
76
  airbyte_cdk/manifest_server/command_processor/utils.py,sha256=f_CkN2nURTTp07Twr9vZfFj5j-jTFtezoOUu2i402W4,3221
77
77
  airbyte_cdk/manifest_server/main.py,sha256=iSgL7x8ifBpGpXi7Dq7017QjeC20l_CYBAIsumiyJn0,573
78
- airbyte_cdk/manifest_server/openapi.yaml,sha256=iTHsQLmZLKYj4hWns0vgDr8KFnK1MbiOO76kz1SEcUk,16526
78
+ airbyte_cdk/manifest_server/openapi.yaml,sha256=jwJXohDXP3BLL0JGZhkyhpNLWLZu6_iXEgMtM58F2Pc,16693
79
79
  airbyte_cdk/manifest_server/routers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
80
80
  airbyte_cdk/manifest_server/routers/capabilities.py,sha256=UeZQzbqEuDN23vizgDb_N7KEXR-YZUPnW5AkXeXy1hA,727
81
81
  airbyte_cdk/manifest_server/routers/health.py,sha256=akBUaHUGN-jmN82lQ3kj_3-wdS6gsZx3iSD2KMI5dW8,200
@@ -173,7 +173,7 @@ airbyte_cdk/sources/declarative/parsers/manifest_reference_resolver.py,sha256=pJ
173
173
  airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py,sha256=BTJ9CtBOukVrOhgkxejbXjpDvLgMVDt6nseR8K2k3xo,186944
174
174
  airbyte_cdk/sources/declarative/partition_routers/__init__.py,sha256=TBC9AkGaUqHm2IKHMPN6punBIcY5tWGULowcLoAVkfw,1109
175
175
  airbyte_cdk/sources/declarative/partition_routers/async_job_partition_router.py,sha256=VelO7zKqKtzMJ35jyFeg0ypJLQC0plqqIBNXoBW1G2E,3001
176
- airbyte_cdk/sources/declarative/partition_routers/cartesian_product_stream_slicer.py,sha256=c5cuVFM6NFkuQqG8Z5IwkBuwDrvXZN1CunUOM_L0ezg,6892
176
+ airbyte_cdk/sources/declarative/partition_routers/cartesian_product_stream_slicer.py,sha256=mPCtBpxBVM_TbLZI2qexlQuayhz1JLZM3-92boHm8JI,7116
177
177
  airbyte_cdk/sources/declarative/partition_routers/grouping_partition_router.py,sha256=-W1CAg2NayCMDNj7QLWn7Nqipaz7av9sLjbMnyMGUek,6271
178
178
  airbyte_cdk/sources/declarative/partition_routers/list_partition_router.py,sha256=tmGGpMoOBmaMfhVZq53AEWxoHm2lmNVi6hA2_IVEnAA,4882
179
179
  airbyte_cdk/sources/declarative/partition_routers/partition_router.py,sha256=YyEIzdmLd1FjbVP3QbQ2VFCLW_P-OGbVh6VpZShp54k,2218
@@ -249,7 +249,7 @@ airbyte_cdk/sources/declarative/schema/schema_loader.py,sha256=kjt8v0N5wWKA5zyLn
249
249
  airbyte_cdk/sources/declarative/spec/__init__.py,sha256=9FYO-fVOclrwjAW4qwRTbZRVopTc9rOaauAJfThdNCQ,177
250
250
  airbyte_cdk/sources/declarative/spec/spec.py,sha256=SwL_pfXZgcLYLJY-MAeFMHug9oYh2tOWjgG0C3DoLOY,3602
251
251
  airbyte_cdk/sources/declarative/stream_slicers/__init__.py,sha256=UX-cP_C-9FIFFPL9z8nuxu_rglssRsMOqQmQHN8FLB8,341
252
- airbyte_cdk/sources/declarative/stream_slicers/declarative_partition_generator.py,sha256=P3LqmgprbkW-Fy7c57meWny7D66XHY1EFjDw0ZzZLJk,5704
252
+ airbyte_cdk/sources/declarative/stream_slicers/declarative_partition_generator.py,sha256=LLr5U_6UI3zp4i9gvP8dawIcdE-UYTSa-B0l5qkDW3Q,6161
253
253
  airbyte_cdk/sources/declarative/stream_slicers/stream_slicer.py,sha256=SOkIPBi2Wu7yxIvA15yFzUAB95a3IzA8LPq5DEqHQQc,725
254
254
  airbyte_cdk/sources/declarative/stream_slicers/stream_slicer_test_read_decorator.py,sha256=4vit5ADyhoZnd1psRVeM5jdySYzhjwspLVXxh8vt1M8,944
255
255
  airbyte_cdk/sources/declarative/transformations/__init__.py,sha256=CPJ8TlMpiUmvG3624VYu_NfTzxwKcfBjM2Q2wJ7fkSA,919
@@ -300,7 +300,7 @@ airbyte_cdk/sources/file_based/file_record_data.py,sha256=Vkr5AyZzlsOezjVCLhFrm_
300
300
  airbyte_cdk/sources/file_based/file_types/__init__.py,sha256=blCLn0-2LC-ZdgcNyDEhqM2RiUvEjEBh-G4-t32ZtuM,1268
301
301
  airbyte_cdk/sources/file_based/file_types/avro_parser.py,sha256=USEYqiICXBWpDV443VtNOCmUA-GINzY_Zah74_5w3qQ,10860
302
302
  airbyte_cdk/sources/file_based/file_types/csv_parser.py,sha256=QlCXB-ry3np67Q_VerQEPoWDOTcPTB6Go4ydZxY9ae4,20445
303
- airbyte_cdk/sources/file_based/file_types/excel_parser.py,sha256=bpAtkDs_QyHAUYcWRkF3ROkQB4wbGe3TzY2jwQgG664,7251
303
+ airbyte_cdk/sources/file_based/file_types/excel_parser.py,sha256=BeplCq0hmojELU6bZCvvpRLpQ9us81TqbGYwrhd3INo,7188
304
304
  airbyte_cdk/sources/file_based/file_types/file_transfer.py,sha256=5l2Jo6bp6neDmgM427PrZMZeqU0hCIZVWnzUZ_7BT10,1100
305
305
  airbyte_cdk/sources/file_based/file_types/file_type_parser.py,sha256=JgpH21PrbRqwK92BJklZWvh2TndA6xZ-eP1LPMo44oQ,2832
306
306
  airbyte_cdk/sources/file_based/file_types/jsonl_parser.py,sha256=GwyNyxmST4RX-XpXy7xVH0D-znYWWBmGv_pVAu95oHQ,5886
@@ -454,9 +454,9 @@ airbyte_cdk/utils/slice_hasher.py,sha256=EDxgROHDbfG-QKQb59m7h_7crN1tRiawdf5uU7G
454
454
  airbyte_cdk/utils/spec_schema_transformations.py,sha256=-5HTuNsnDBAhj-oLeQXwpTGA0HdcjFOf2zTEMUTTg_Y,816
455
455
  airbyte_cdk/utils/stream_status_utils.py,sha256=ZmBoiy5HVbUEHAMrUONxZvxnvfV9CesmQJLDTAIWnWw,1171
456
456
  airbyte_cdk/utils/traced_exception.py,sha256=C8uIBuCL_E4WnBAOPSxBicD06JAldoN9fGsQDp463OY,6292
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,,
457
+ airbyte_cdk-6.61.5.dist-info/LICENSE.txt,sha256=Wfe61S4BaGPj404v8lrAbvhjYR68SHlkzeYrg3_bbuM,1051
458
+ airbyte_cdk-6.61.5.dist-info/LICENSE_SHORT,sha256=aqF6D1NcESmpn-cqsxBtszTEnHKnlsp8L4x9wAh3Nxg,55
459
+ airbyte_cdk-6.61.5.dist-info/METADATA,sha256=zlQaW0NJTYCeg64XINJttXW9XxgcRjeCy0Rc-OfEDKQ,6765
460
+ airbyte_cdk-6.61.5.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
461
+ airbyte_cdk-6.61.5.dist-info/entry_points.txt,sha256=eLZ2UYvJZGm1s07Pplcs--1Gim60YhZWTb53j_dghwU,195
462
+ airbyte_cdk-6.61.5.dist-info/RECORD,,