airbyte-cdk 6.25.0__py3-none-any.whl → 6.25.1__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/sources/declarative/incremental/per_partition_cursor.py +35 -18
- airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py +1 -1
- {airbyte_cdk-6.25.0.dist-info → airbyte_cdk-6.25.1.dist-info}/METADATA +1 -1
- {airbyte_cdk-6.25.0.dist-info → airbyte_cdk-6.25.1.dist-info}/RECORD +7 -7
- {airbyte_cdk-6.25.0.dist-info → airbyte_cdk-6.25.1.dist-info}/LICENSE.txt +0 -0
- {airbyte_cdk-6.25.0.dist-info → airbyte_cdk-6.25.1.dist-info}/WHEEL +0 -0
- {airbyte_cdk-6.25.0.dist-info → airbyte_cdk-6.25.1.dist-info}/entry_points.txt +0 -0
@@ -222,6 +222,8 @@ class PerPartitionCursor(DeclarativeCursor):
|
|
222
222
|
next_page_token: Optional[Mapping[str, Any]] = None,
|
223
223
|
) -> Mapping[str, Any]:
|
224
224
|
if stream_slice:
|
225
|
+
if self._to_partition_key(stream_slice.partition) not in self._cursor_per_partition:
|
226
|
+
self._create_cursor_for_partition(self._to_partition_key(stream_slice.partition))
|
225
227
|
return self._partition_router.get_request_params( # type: ignore # this always returns a mapping
|
226
228
|
stream_state=stream_state,
|
227
229
|
stream_slice=StreamSlice(partition=stream_slice.partition, cursor_slice={}),
|
@@ -244,6 +246,8 @@ class PerPartitionCursor(DeclarativeCursor):
|
|
244
246
|
next_page_token: Optional[Mapping[str, Any]] = None,
|
245
247
|
) -> Mapping[str, Any]:
|
246
248
|
if stream_slice:
|
249
|
+
if self._to_partition_key(stream_slice.partition) not in self._cursor_per_partition:
|
250
|
+
self._create_cursor_for_partition(self._to_partition_key(stream_slice.partition))
|
247
251
|
return self._partition_router.get_request_headers( # type: ignore # this always returns a mapping
|
248
252
|
stream_state=stream_state,
|
249
253
|
stream_slice=StreamSlice(partition=stream_slice.partition, cursor_slice={}),
|
@@ -266,6 +270,8 @@ class PerPartitionCursor(DeclarativeCursor):
|
|
266
270
|
next_page_token: Optional[Mapping[str, Any]] = None,
|
267
271
|
) -> Union[Mapping[str, Any], str]:
|
268
272
|
if stream_slice:
|
273
|
+
if self._to_partition_key(stream_slice.partition) not in self._cursor_per_partition:
|
274
|
+
self._create_cursor_for_partition(self._to_partition_key(stream_slice.partition))
|
269
275
|
return self._partition_router.get_request_body_data( # type: ignore # this always returns a mapping
|
270
276
|
stream_state=stream_state,
|
271
277
|
stream_slice=StreamSlice(partition=stream_slice.partition, cursor_slice={}),
|
@@ -288,6 +294,8 @@ class PerPartitionCursor(DeclarativeCursor):
|
|
288
294
|
next_page_token: Optional[Mapping[str, Any]] = None,
|
289
295
|
) -> Mapping[str, Any]:
|
290
296
|
if stream_slice:
|
297
|
+
if self._to_partition_key(stream_slice.partition) not in self._cursor_per_partition:
|
298
|
+
self._create_cursor_for_partition(self._to_partition_key(stream_slice.partition))
|
291
299
|
return self._partition_router.get_request_body_json( # type: ignore # this always returns a mapping
|
292
300
|
stream_state=stream_state,
|
293
301
|
stream_slice=StreamSlice(partition=stream_slice.partition, cursor_slice={}),
|
@@ -303,21 +311,6 @@ class PerPartitionCursor(DeclarativeCursor):
|
|
303
311
|
raise ValueError("A partition needs to be provided in order to get request body json")
|
304
312
|
|
305
313
|
def should_be_synced(self, record: Record) -> bool:
|
306
|
-
if (
|
307
|
-
record.associated_slice
|
308
|
-
and self._to_partition_key(record.associated_slice.partition)
|
309
|
-
not in self._cursor_per_partition
|
310
|
-
):
|
311
|
-
partition_state = (
|
312
|
-
self._state_to_migrate_from
|
313
|
-
if self._state_to_migrate_from
|
314
|
-
else self._NO_CURSOR_STATE
|
315
|
-
)
|
316
|
-
cursor = self._create_cursor(partition_state)
|
317
|
-
|
318
|
-
self._cursor_per_partition[
|
319
|
-
self._to_partition_key(record.associated_slice.partition)
|
320
|
-
] = cursor
|
321
314
|
return self._get_cursor(record).should_be_synced(
|
322
315
|
self._convert_record_to_cursor_record(record)
|
323
316
|
)
|
@@ -356,8 +349,32 @@ class PerPartitionCursor(DeclarativeCursor):
|
|
356
349
|
)
|
357
350
|
partition_key = self._to_partition_key(record.associated_slice.partition)
|
358
351
|
if partition_key not in self._cursor_per_partition:
|
359
|
-
|
360
|
-
"Invalid state as stream slices that are emitted should refer to an existing cursor"
|
361
|
-
)
|
352
|
+
self._create_cursor_for_partition(partition_key)
|
362
353
|
cursor = self._cursor_per_partition[partition_key]
|
363
354
|
return cursor
|
355
|
+
|
356
|
+
def _create_cursor_for_partition(self, partition_key: str) -> None:
|
357
|
+
"""
|
358
|
+
Dynamically creates and initializes a cursor for the specified partition.
|
359
|
+
|
360
|
+
This method is required for `ConcurrentPerPartitionCursor`. For concurrent cursors,
|
361
|
+
stream_slices is executed only for the concurrent cursor, so cursors per partition
|
362
|
+
are not created for the declarative cursor. This method ensures that a cursor is available
|
363
|
+
to create requests for the specified partition. The cursor is initialized
|
364
|
+
with the per-partition state if present in the initial state, or with the global state
|
365
|
+
adjusted by the lookback window, or with the state to migrate from.
|
366
|
+
|
367
|
+
Note:
|
368
|
+
This is a temporary workaround and should be removed once the declarative cursor
|
369
|
+
is decoupled from the concurrent cursor implementation.
|
370
|
+
|
371
|
+
Args:
|
372
|
+
partition_key (str): The unique identifier for the partition for which the cursor
|
373
|
+
needs to be created.
|
374
|
+
"""
|
375
|
+
partition_state = (
|
376
|
+
self._state_to_migrate_from if self._state_to_migrate_from else self._NO_CURSOR_STATE
|
377
|
+
)
|
378
|
+
cursor = self._create_cursor(partition_state)
|
379
|
+
|
380
|
+
self._cursor_per_partition[partition_key] = cursor
|
@@ -2386,7 +2386,7 @@ class ModelToComponentFactory:
|
|
2386
2386
|
if (
|
2387
2387
|
not isinstance(stream_slicer, DatetimeBasedCursor)
|
2388
2388
|
or type(stream_slicer) is not DatetimeBasedCursor
|
2389
|
-
)
|
2389
|
+
):
|
2390
2390
|
# Many of the custom component implementations of DatetimeBasedCursor override get_request_params() (or other methods).
|
2391
2391
|
# Because we're decoupling RequestOptionsProvider from the Cursor, custom components will eventually need to reimplement
|
2392
2392
|
# their own RequestOptionsProvider. However, right now the existing StreamSlicer/Cursor still can act as the SimpleRetriever's
|
@@ -92,7 +92,7 @@ airbyte_cdk/sources/declarative/incremental/concurrent_partition_cursor.py,sha25
|
|
92
92
|
airbyte_cdk/sources/declarative/incremental/datetime_based_cursor.py,sha256=_UzUnSIUsDbRgbFTXgSyZEFb4ws-KdhdQPWO8mFbV7U,22028
|
93
93
|
airbyte_cdk/sources/declarative/incremental/declarative_cursor.py,sha256=5Bhw9VRPyIuCaD0wmmq_L3DZsa-rJgtKSEUzSd8YYD0,536
|
94
94
|
airbyte_cdk/sources/declarative/incremental/global_substream_cursor.py,sha256=9HO-QbL9akvjq2NP7l498RwLA4iQZlBMQW1tZbt34I8,15943
|
95
|
-
airbyte_cdk/sources/declarative/incremental/per_partition_cursor.py,sha256=
|
95
|
+
airbyte_cdk/sources/declarative/incremental/per_partition_cursor.py,sha256=9IAJTCiRUXvhFFz-IhZtYh_KfAjLHqthsYf2jErQRls,17728
|
96
96
|
airbyte_cdk/sources/declarative/incremental/per_partition_with_global.py,sha256=2YBOA2NnwAeIKlIhSwUB_W-FaGnPcmrG_liY7b4mV2Y,8365
|
97
97
|
airbyte_cdk/sources/declarative/incremental/resumable_full_refresh_cursor.py,sha256=10LFv1QPM-agVKl6eaANmEBOfd7gZgBrkoTcMggsieQ,4809
|
98
98
|
airbyte_cdk/sources/declarative/interpolation/__init__.py,sha256=tjUJkn3B-iZ-p7RP2c3dVZejrGiQeooGmS5ibWTuUL4,437
|
@@ -115,7 +115,7 @@ airbyte_cdk/sources/declarative/parsers/custom_code_compiler.py,sha256=958MMX6_Z
|
|
115
115
|
airbyte_cdk/sources/declarative/parsers/custom_exceptions.py,sha256=Rir9_z3Kcd5Es0-LChrzk-0qubAsiK_RSEnLmK2OXm8,553
|
116
116
|
airbyte_cdk/sources/declarative/parsers/manifest_component_transformer.py,sha256=CXwTfD3wSQq3okcqwigpprbHhSURUokh4GK2OmOyKC8,9132
|
117
117
|
airbyte_cdk/sources/declarative/parsers/manifest_reference_resolver.py,sha256=IWUOdF03o-aQn0Occo1BJCxU0Pz-QILk5L67nzw2thw,6803
|
118
|
-
airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py,sha256=
|
118
|
+
airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py,sha256=a96vNwEc3J8S99KGtSt2G147leh8GADfkTrejVCBXzs,122064
|
119
119
|
airbyte_cdk/sources/declarative/partition_routers/__init__.py,sha256=HJ-Syp3p7RpyR_OK0X_a2kSyISfu3W-PKrRI16iY0a8,957
|
120
120
|
airbyte_cdk/sources/declarative/partition_routers/async_job_partition_router.py,sha256=n82J15S8bjeMZ5uROu--P3hnbQoxkY5v7RPHYx7g7ro,2929
|
121
121
|
airbyte_cdk/sources/declarative/partition_routers/cartesian_product_stream_slicer.py,sha256=c5cuVFM6NFkuQqG8Z5IwkBuwDrvXZN1CunUOM_L0ezg,6892
|
@@ -350,8 +350,8 @@ airbyte_cdk/utils/slice_hasher.py,sha256=-pHexlNYoWYPnXNH-M7HEbjmeJe9Zk7SJijdQ7d
|
|
350
350
|
airbyte_cdk/utils/spec_schema_transformations.py,sha256=-5HTuNsnDBAhj-oLeQXwpTGA0HdcjFOf2zTEMUTTg_Y,816
|
351
351
|
airbyte_cdk/utils/stream_status_utils.py,sha256=ZmBoiy5HVbUEHAMrUONxZvxnvfV9CesmQJLDTAIWnWw,1171
|
352
352
|
airbyte_cdk/utils/traced_exception.py,sha256=C8uIBuCL_E4WnBAOPSxBicD06JAldoN9fGsQDp463OY,6292
|
353
|
-
airbyte_cdk-6.25.
|
354
|
-
airbyte_cdk-6.25.
|
355
|
-
airbyte_cdk-6.25.
|
356
|
-
airbyte_cdk-6.25.
|
357
|
-
airbyte_cdk-6.25.
|
353
|
+
airbyte_cdk-6.25.1.dist-info/LICENSE.txt,sha256=Wfe61S4BaGPj404v8lrAbvhjYR68SHlkzeYrg3_bbuM,1051
|
354
|
+
airbyte_cdk-6.25.1.dist-info/METADATA,sha256=-GwhDgrPHloQoypcXxNAkh2QV5cPejFe7MEGiYd9w6w,5996
|
355
|
+
airbyte_cdk-6.25.1.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
|
356
|
+
airbyte_cdk-6.25.1.dist-info/entry_points.txt,sha256=fj-e3PAQvsxsQzyyq8UkG1k8spunWnD4BAH2AwlR6NM,95
|
357
|
+
airbyte_cdk-6.25.1.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|