airbyte-cdk 6.12.3__py3-none-any.whl → 6.12.4.dev0__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 (22) hide show
  1. airbyte_cdk/sources/declarative/auth/oauth.py +12 -27
  2. airbyte_cdk/sources/declarative/concurrent_declarative_source.py +57 -0
  3. airbyte_cdk/sources/declarative/declarative_component_schema.yaml +1 -23
  4. airbyte_cdk/sources/declarative/extractors/record_filter.py +3 -5
  5. airbyte_cdk/sources/declarative/incremental/__init__.py +3 -0
  6. airbyte_cdk/sources/declarative/incremental/concurrent_partition_cursor.py +344 -0
  7. airbyte_cdk/sources/declarative/incremental/per_partition_cursor.py +14 -0
  8. airbyte_cdk/sources/declarative/models/declarative_component_schema.py +2 -25
  9. airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py +80 -53
  10. airbyte_cdk/sources/declarative/partition_routers/__init__.py +1 -9
  11. airbyte_cdk/sources/declarative/resolvers/http_components_resolver.py +14 -20
  12. airbyte_cdk/sources/declarative/retrievers/async_retriever.py +31 -8
  13. airbyte_cdk/sources/declarative/retrievers/simple_retriever.py +1 -1
  14. airbyte_cdk/sources/declarative/schema/dynamic_schema_loader.py +3 -20
  15. airbyte_cdk/sources/streams/concurrent/cursor.py +1 -0
  16. airbyte_cdk/sources/streams/http/requests_native_auth/abstract_oauth.py +3 -12
  17. {airbyte_cdk-6.12.3.dist-info → airbyte_cdk-6.12.4.dev0.dist-info}/METADATA +2 -2
  18. {airbyte_cdk-6.12.3.dist-info → airbyte_cdk-6.12.4.dev0.dist-info}/RECORD +21 -21
  19. airbyte_cdk/sources/declarative/partition_routers/async_job_partition_router.py +0 -65
  20. {airbyte_cdk-6.12.3.dist-info → airbyte_cdk-6.12.4.dev0.dist-info}/LICENSE.txt +0 -0
  21. {airbyte_cdk-6.12.3.dist-info → airbyte_cdk-6.12.4.dev0.dist-info}/WHEEL +0 -0
  22. {airbyte_cdk-6.12.3.dist-info → airbyte_cdk-6.12.4.dev0.dist-info}/entry_points.txt +0 -0
@@ -81,6 +81,8 @@ from airbyte_cdk.sources.declarative.extractors.record_selector import (
81
81
  )
82
82
  from airbyte_cdk.sources.declarative.incremental import (
83
83
  ChildPartitionResumableFullRefreshCursor,
84
+ ConcurrentCursorFactory,
85
+ ConcurrentPerPartitionCursor,
84
86
  CursorFactory,
85
87
  DatetimeBasedCursor,
86
88
  DeclarativeCursor,
@@ -239,9 +241,6 @@ from airbyte_cdk.sources.declarative.models.declarative_component_schema import
239
241
  from airbyte_cdk.sources.declarative.models.declarative_component_schema import (
240
242
  KeysToLower as KeysToLowerModel,
241
243
  )
242
- from airbyte_cdk.sources.declarative.models.declarative_component_schema import (
243
- KeysToSnakeCase as KeysToSnakeCaseModel,
244
- )
245
244
  from airbyte_cdk.sources.declarative.models.declarative_component_schema import (
246
245
  LegacySessionTokenAuthenticator as LegacySessionTokenAuthenticatorModel,
247
246
  )
@@ -329,9 +328,6 @@ from airbyte_cdk.sources.declarative.partition_routers import (
329
328
  SinglePartitionRouter,
330
329
  SubstreamPartitionRouter,
331
330
  )
332
- from airbyte_cdk.sources.declarative.partition_routers.async_job_partition_router import (
333
- AsyncJobPartitionRouter,
334
- )
335
331
  from airbyte_cdk.sources.declarative.partition_routers.substream_partition_router import (
336
332
  ParentStreamConfig,
337
333
  )
@@ -402,13 +398,11 @@ from airbyte_cdk.sources.declarative.transformations.flatten_fields import (
402
398
  from airbyte_cdk.sources.declarative.transformations.keys_to_lower_transformation import (
403
399
  KeysToLowerTransformation,
404
400
  )
405
- from airbyte_cdk.sources.declarative.transformations.keys_to_snake_transformation import (
406
- KeysToSnakeCaseTransformation,
407
- )
408
401
  from airbyte_cdk.sources.message import (
409
402
  InMemoryMessageRepository,
410
403
  LogAppenderMessageRepositoryDecorator,
411
404
  MessageRepository,
405
+ NoopMessageRepository,
412
406
  )
413
407
  from airbyte_cdk.sources.streams.concurrent.cursor import ConcurrentCursor, CursorField
414
408
  from airbyte_cdk.sources.streams.concurrent.state_converters.datetime_stream_state_converter import (
@@ -487,7 +481,6 @@ class ModelToComponentFactory:
487
481
  JsonlDecoderModel: self.create_jsonl_decoder,
488
482
  GzipJsonDecoderModel: self.create_gzipjson_decoder,
489
483
  KeysToLowerModel: self.create_keys_to_lower_transformation,
490
- KeysToSnakeCaseModel: self.create_keys_to_snake_transformation,
491
484
  FlattenFieldsModel: self.create_flatten_fields,
492
485
  IterableDecoderModel: self.create_iterable_decoder,
493
486
  XmlDecoderModel: self.create_xml_decoder,
@@ -604,11 +597,6 @@ class ModelToComponentFactory:
604
597
  ) -> KeysToLowerTransformation:
605
598
  return KeysToLowerTransformation()
606
599
 
607
- def create_keys_to_snake_transformation(
608
- self, model: KeysToSnakeCaseModel, config: Config, **kwargs: Any
609
- ) -> KeysToSnakeCaseTransformation:
610
- return KeysToSnakeCaseTransformation()
611
-
612
600
  def create_flatten_fields(
613
601
  self, model: FlattenFieldsModel, config: Config, **kwargs: Any
614
602
  ) -> FlattenFields:
@@ -823,6 +811,7 @@ class ModelToComponentFactory:
823
811
  stream_namespace: Optional[str],
824
812
  config: Config,
825
813
  stream_state: MutableMapping[str, Any],
814
+ message_repository: Optional[MessageRepository] = None,
826
815
  **kwargs: Any,
827
816
  ) -> ConcurrentCursor:
828
817
  component_type = component_definition.get("type")
@@ -958,7 +947,7 @@ class ModelToComponentFactory:
958
947
  stream_name=stream_name,
959
948
  stream_namespace=stream_namespace,
960
949
  stream_state=stream_state,
961
- message_repository=self._message_repository,
950
+ message_repository=message_repository or self._message_repository,
962
951
  connector_state_manager=state_manager,
963
952
  connector_state_converter=connector_state_converter,
964
953
  cursor_field=cursor_field,
@@ -970,6 +959,63 @@ class ModelToComponentFactory:
970
959
  cursor_granularity=cursor_granularity,
971
960
  )
972
961
 
962
+ def create_concurrent_cursor_from_perpartition_cursor(
963
+ self,
964
+ state_manager: ConnectorStateManager,
965
+ model_type: Type[BaseModel],
966
+ component_definition: ComponentDefinition,
967
+ stream_name: str,
968
+ stream_namespace: Optional[str],
969
+ config: Config,
970
+ stream_state: MutableMapping[str, Any],
971
+ partition_router,
972
+ **kwargs: Any,
973
+ ) -> ConcurrentPerPartitionCursor:
974
+ component_type = component_definition.get("type")
975
+ if component_definition.get("type") != model_type.__name__:
976
+ raise ValueError(
977
+ f"Expected manifest component of type {model_type.__name__}, but received {component_type} instead"
978
+ )
979
+
980
+ datetime_based_cursor_model = model_type.parse_obj(component_definition)
981
+
982
+ if not isinstance(datetime_based_cursor_model, DatetimeBasedCursorModel):
983
+ raise ValueError(
984
+ f"Expected {model_type.__name__} component, but received {datetime_based_cursor_model.__class__.__name__}"
985
+ )
986
+
987
+ interpolated_cursor_field = InterpolatedString.create(
988
+ datetime_based_cursor_model.cursor_field,
989
+ parameters=datetime_based_cursor_model.parameters or {},
990
+ )
991
+ cursor_field = CursorField(interpolated_cursor_field.eval(config=config))
992
+
993
+ # Create the cursor factory
994
+ cursor_factory = ConcurrentCursorFactory(
995
+ partial(
996
+ self.create_concurrent_cursor_from_datetime_based_cursor,
997
+ state_manager=state_manager,
998
+ model_type=model_type,
999
+ component_definition=component_definition,
1000
+ stream_name=stream_name,
1001
+ stream_namespace=stream_namespace,
1002
+ config=config,
1003
+ message_repository=NoopMessageRepository(),
1004
+ )
1005
+ )
1006
+
1007
+ # Return the concurrent cursor and state converter
1008
+ return ConcurrentPerPartitionCursor(
1009
+ cursor_factory=cursor_factory,
1010
+ partition_router=partition_router,
1011
+ stream_name=stream_name,
1012
+ stream_namespace=stream_namespace,
1013
+ stream_state=stream_state,
1014
+ message_repository=self._message_repository, # type: ignore
1015
+ connector_state_manager=state_manager,
1016
+ cursor_field=cursor_field,
1017
+ )
1018
+
973
1019
  @staticmethod
974
1020
  def create_constant_backoff_strategy(
975
1021
  model: ConstantBackoffStrategyModel, config: Config, **kwargs: Any
@@ -1252,18 +1298,15 @@ class ModelToComponentFactory:
1252
1298
  raise ValueError(
1253
1299
  "Unsupported Slicer is used. PerPartitionWithGlobalCursor should be used here instead"
1254
1300
  )
1255
- client_side_incremental_sync = {
1256
- "date_time_based_cursor": self._create_component_from_model(
1257
- model=model.incremental_sync, config=config
1258
- ),
1259
- "substream_cursor": (
1260
- combined_slicers
1261
- if isinstance(
1262
- combined_slicers, (PerPartitionWithGlobalCursor, GlobalSubstreamCursor)
1263
- )
1264
- else None
1265
- ),
1266
- }
1301
+ cursor = (
1302
+ combined_slicers
1303
+ if isinstance(
1304
+ combined_slicers, (PerPartitionWithGlobalCursor, GlobalSubstreamCursor)
1305
+ )
1306
+ else self._create_component_from_model(model=model.incremental_sync, config=config)
1307
+ )
1308
+
1309
+ client_side_incremental_sync = {"cursor": cursor}
1267
1310
 
1268
1311
  if model.incremental_sync and isinstance(model.incremental_sync, DatetimeBasedCursorModel):
1269
1312
  cursor_model = model.incremental_sync
@@ -1665,13 +1708,6 @@ class ModelToComponentFactory:
1665
1708
  model.retriever, stream_slicer
1666
1709
  )
1667
1710
 
1668
- schema_transformations = []
1669
- if model.schema_transformations:
1670
- for transformation_model in model.schema_transformations:
1671
- schema_transformations.append(
1672
- self._create_component_from_model(model=transformation_model, config=config)
1673
- )
1674
-
1675
1711
  retriever = self._create_component_from_model(
1676
1712
  model=model.retriever,
1677
1713
  config=config,
@@ -1686,7 +1722,6 @@ class ModelToComponentFactory:
1686
1722
  return DynamicSchemaLoader(
1687
1723
  retriever=retriever,
1688
1724
  config=config,
1689
- schema_transformations=schema_transformations,
1690
1725
  schema_type_identifier=schema_type_identifier,
1691
1726
  parameters=model.parameters or {},
1692
1727
  )
@@ -1800,8 +1835,7 @@ class ModelToComponentFactory:
1800
1835
  return DeclarativeSingleUseRefreshTokenOauth2Authenticator( # type: ignore
1801
1836
  config,
1802
1837
  InterpolatedString.create(
1803
- model.token_refresh_endpoint, # type: ignore
1804
- parameters=model.parameters or {},
1838
+ model.token_refresh_endpoint, parameters=model.parameters or {}
1805
1839
  ).eval(config),
1806
1840
  access_token_name=InterpolatedString.create(
1807
1841
  model.access_token_name or "access_token", parameters=model.parameters or {}
@@ -1835,7 +1869,6 @@ class ModelToComponentFactory:
1835
1869
  # ignore type error because fixing it would have a lot of dependencies, revisit later
1836
1870
  return DeclarativeOauth2Authenticator( # type: ignore
1837
1871
  access_token_name=model.access_token_name or "access_token",
1838
- access_token_value=model.access_token_value,
1839
1872
  client_id=model.client_id,
1840
1873
  client_secret=model.client_secret,
1841
1874
  expires_in_name=model.expires_in_name or "expires_in",
@@ -2051,7 +2084,7 @@ class ModelToComponentFactory:
2051
2084
  if (
2052
2085
  not isinstance(stream_slicer, DatetimeBasedCursor)
2053
2086
  or type(stream_slicer) is not DatetimeBasedCursor
2054
- ):
2087
+ ) and not isinstance(stream_slicer, PerPartitionWithGlobalCursor):
2055
2088
  # Many of the custom component implementations of DatetimeBasedCursor override get_request_params() (or other methods).
2056
2089
  # Because we're decoupling RequestOptionsProvider from the Cursor, custom components will eventually need to reimplement
2057
2090
  # their own RequestOptionsProvider. However, right now the existing StreamSlicer/Cursor still can act as the SimpleRetriever's
@@ -2265,24 +2298,18 @@ class ModelToComponentFactory:
2265
2298
  urls_extractor=urls_extractor,
2266
2299
  )
2267
2300
 
2268
- async_job_partition_router = AsyncJobPartitionRouter(
2301
+ return AsyncRetriever(
2269
2302
  job_orchestrator_factory=lambda stream_slices: AsyncJobOrchestrator(
2270
2303
  job_repository,
2271
2304
  stream_slices,
2272
- JobTracker(1),
2273
- # FIXME eventually make the number of concurrent jobs in the API configurable. Until then, we limit to 1
2305
+ JobTracker(
2306
+ 1
2307
+ ), # FIXME eventually make the number of concurrent jobs in the API configurable. Until then, we limit to 1
2274
2308
  self._message_repository,
2275
- has_bulk_parent=False,
2276
- # FIXME work would need to be done here in order to detect if a stream as a parent stream that is bulk
2309
+ has_bulk_parent=False, # FIXME work would need to be done here in order to detect if a stream as a parent stream that is bulk
2277
2310
  ),
2278
- stream_slicer=stream_slicer,
2279
- config=config,
2280
- parameters=model.parameters or {},
2281
- )
2282
-
2283
- return AsyncRetriever(
2284
2311
  record_selector=record_selector,
2285
- stream_slicer=async_job_partition_router,
2312
+ stream_slicer=stream_slicer,
2286
2313
  config=config,
2287
2314
  parameters=model.parameters or {},
2288
2315
  )
@@ -2396,7 +2423,7 @@ class ModelToComponentFactory:
2396
2423
  config=config,
2397
2424
  name="",
2398
2425
  primary_key=None,
2399
- stream_slicer=stream_slicer if stream_slicer else combined_slicers,
2426
+ stream_slicer=combined_slicers,
2400
2427
  transformations=[],
2401
2428
  )
2402
2429
 
@@ -2,18 +2,10 @@
2
2
  # Copyright (c) 2022 Airbyte, Inc., all rights reserved.
3
3
  #
4
4
 
5
- from airbyte_cdk.sources.declarative.partition_routers.async_job_partition_router import AsyncJobPartitionRouter
6
5
  from airbyte_cdk.sources.declarative.partition_routers.cartesian_product_stream_slicer import CartesianProductStreamSlicer
7
6
  from airbyte_cdk.sources.declarative.partition_routers.list_partition_router import ListPartitionRouter
8
7
  from airbyte_cdk.sources.declarative.partition_routers.single_partition_router import SinglePartitionRouter
9
8
  from airbyte_cdk.sources.declarative.partition_routers.substream_partition_router import SubstreamPartitionRouter
10
9
  from airbyte_cdk.sources.declarative.partition_routers.partition_router import PartitionRouter
11
10
 
12
- __all__ = [
13
- "AsyncJobPartitionRouter",
14
- "CartesianProductStreamSlicer",
15
- "ListPartitionRouter",
16
- "SinglePartitionRouter",
17
- "SubstreamPartitionRouter",
18
- "PartitionRouter"
19
- ]
11
+ __all__ = ["CartesianProductStreamSlicer", "ListPartitionRouter", "SinglePartitionRouter", "SubstreamPartitionRouter", "PartitionRouter"]
@@ -88,25 +88,19 @@ class HttpComponentsResolver(ComponentsResolver):
88
88
  """
89
89
  kwargs = {"stream_template_config": stream_template_config}
90
90
 
91
- for stream_slice in self.retriever.stream_slices():
92
- for components_values in self.retriever.read_records(
93
- records_schema={}, stream_slice=stream_slice
94
- ):
95
- updated_config = deepcopy(stream_template_config)
96
- kwargs["components_values"] = components_values # type: ignore[assignment] # component_values will always be of type Mapping[str, Any]
97
- kwargs["stream_slice"] = stream_slice # type: ignore[assignment] # stream_slice will always be of type Mapping[str, Any]
98
-
99
- for resolved_component in self._resolved_components:
100
- valid_types = (
101
- (resolved_component.value_type,) if resolved_component.value_type else None
102
- )
103
- value = resolved_component.value.eval(
104
- self.config, valid_types=valid_types, **kwargs
105
- )
91
+ for components_values in self.retriever.read_records({}):
92
+ updated_config = deepcopy(stream_template_config)
93
+ kwargs["components_values"] = components_values # type: ignore[assignment] # component_values will always be of type Mapping[str, Any]
94
+
95
+ for resolved_component in self._resolved_components:
96
+ valid_types = (
97
+ (resolved_component.value_type,) if resolved_component.value_type else None
98
+ )
99
+ value = resolved_component.value.eval(
100
+ self.config, valid_types=valid_types, **kwargs
101
+ )
106
102
 
107
- path = [
108
- path.eval(self.config, **kwargs) for path in resolved_component.field_path
109
- ]
110
- dpath.set(updated_config, path, value)
103
+ path = [path.eval(self.config, **kwargs) for path in resolved_component.field_path]
104
+ dpath.set(updated_config, path, value)
111
105
 
112
- yield updated_config
106
+ yield updated_config
@@ -1,8 +1,8 @@
1
1
  # Copyright (c) 2024 Airbyte, Inc., all rights reserved.
2
2
 
3
3
 
4
- from dataclasses import InitVar, dataclass
5
- from typing import Any, Iterable, Mapping, Optional
4
+ from dataclasses import InitVar, dataclass, field
5
+ from typing import Any, Callable, Iterable, Mapping, Optional
6
6
 
7
7
  from typing_extensions import deprecated
8
8
 
@@ -12,10 +12,9 @@ from airbyte_cdk.sources.declarative.async_job.job_orchestrator import (
12
12
  AsyncPartition,
13
13
  )
14
14
  from airbyte_cdk.sources.declarative.extractors.record_selector import RecordSelector
15
- from airbyte_cdk.sources.declarative.partition_routers.async_job_partition_router import (
16
- AsyncJobPartitionRouter,
17
- )
15
+ from airbyte_cdk.sources.declarative.partition_routers import SinglePartitionRouter
18
16
  from airbyte_cdk.sources.declarative.retrievers import Retriever
17
+ from airbyte_cdk.sources.declarative.stream_slicers import StreamSlicer
19
18
  from airbyte_cdk.sources.source import ExperimentalClassWarning
20
19
  from airbyte_cdk.sources.streams.core import StreamData
21
20
  from airbyte_cdk.sources.types import Config, StreamSlice, StreamState
@@ -30,10 +29,15 @@ from airbyte_cdk.utils.traced_exception import AirbyteTracedException
30
29
  class AsyncRetriever(Retriever):
31
30
  config: Config
32
31
  parameters: InitVar[Mapping[str, Any]]
32
+ job_orchestrator_factory: Callable[[Iterable[StreamSlice]], AsyncJobOrchestrator]
33
33
  record_selector: RecordSelector
34
- stream_slicer: AsyncJobPartitionRouter
34
+ stream_slicer: StreamSlicer = field(
35
+ default_factory=lambda: SinglePartitionRouter(parameters={})
36
+ )
35
37
 
36
38
  def __post_init__(self, parameters: Mapping[str, Any]) -> None:
39
+ self._job_orchestrator_factory = self.job_orchestrator_factory
40
+ self.__job_orchestrator: Optional[AsyncJobOrchestrator] = None
37
41
  self._parameters = parameters
38
42
 
39
43
  @property
@@ -50,6 +54,17 @@ class AsyncRetriever(Retriever):
50
54
  """
51
55
  pass
52
56
 
57
+ @property
58
+ def _job_orchestrator(self) -> AsyncJobOrchestrator:
59
+ if not self.__job_orchestrator:
60
+ raise AirbyteTracedException(
61
+ message="Invalid state within AsyncJobRetriever. Please contact Airbyte Support",
62
+ internal_message="AsyncPartitionRepository is expected to be accessed only after `stream_slices`",
63
+ failure_type=FailureType.system_error,
64
+ )
65
+
66
+ return self.__job_orchestrator
67
+
53
68
  def _get_stream_state(self) -> StreamState:
54
69
  """
55
70
  Gets the current state of the stream.
@@ -84,7 +99,15 @@ class AsyncRetriever(Retriever):
84
99
  return stream_slice["partition"] # type: ignore # stream_slice["partition"] has been added as an AsyncPartition as part of stream_slices
85
100
 
86
101
  def stream_slices(self) -> Iterable[Optional[StreamSlice]]:
87
- return self.stream_slicer.stream_slices()
102
+ slices = self.stream_slicer.stream_slices()
103
+ self.__job_orchestrator = self._job_orchestrator_factory(slices)
104
+
105
+ for completed_partition in self._job_orchestrator.create_and_get_completed_partitions():
106
+ yield StreamSlice(
107
+ partition=dict(completed_partition.stream_slice.partition)
108
+ | {"partition": completed_partition},
109
+ cursor_slice=completed_partition.stream_slice.cursor_slice,
110
+ )
88
111
 
89
112
  def read_records(
90
113
  self,
@@ -93,7 +116,7 @@ class AsyncRetriever(Retriever):
93
116
  ) -> Iterable[StreamData]:
94
117
  stream_state: StreamState = self._get_stream_state()
95
118
  partition: AsyncPartition = self._validate_and_get_stream_slice_partition(stream_slice)
96
- records: Iterable[Mapping[str, Any]] = self.stream_slicer.fetch_records(partition)
119
+ records: Iterable[Mapping[str, Any]] = self._job_orchestrator.fetch_records(partition)
97
120
 
98
121
  yield from self.record_selector.filter_and_transform(
99
122
  all_data=records,
@@ -178,7 +178,7 @@ class SimpleRetriever(Retriever):
178
178
  stream_slice,
179
179
  next_page_token,
180
180
  self._paginator.get_request_headers,
181
- self.stream_slicer.get_request_headers,
181
+ self.request_option_provider.get_request_headers,
182
182
  )
183
183
  if isinstance(headers, str):
184
184
  raise ValueError("Request headers cannot be a string")
@@ -4,7 +4,7 @@
4
4
 
5
5
 
6
6
  from copy import deepcopy
7
- from dataclasses import InitVar, dataclass, field
7
+ from dataclasses import InitVar, dataclass
8
8
  from typing import Any, List, Mapping, MutableMapping, Optional, Union
9
9
 
10
10
  import dpath
@@ -13,9 +13,8 @@ from typing_extensions import deprecated
13
13
  from airbyte_cdk.sources.declarative.interpolation.interpolated_string import InterpolatedString
14
14
  from airbyte_cdk.sources.declarative.retrievers.retriever import Retriever
15
15
  from airbyte_cdk.sources.declarative.schema.schema_loader import SchemaLoader
16
- from airbyte_cdk.sources.declarative.transformations import RecordTransformation
17
16
  from airbyte_cdk.sources.source import ExperimentalClassWarning
18
- from airbyte_cdk.sources.types import Config, StreamSlice, StreamState
17
+ from airbyte_cdk.sources.types import Config
19
18
 
20
19
  AIRBYTE_DATA_TYPES: Mapping[str, Mapping[str, Any]] = {
21
20
  "string": {"type": ["null", "string"]},
@@ -104,7 +103,6 @@ class DynamicSchemaLoader(SchemaLoader):
104
103
  config: Config
105
104
  parameters: InitVar[Mapping[str, Any]]
106
105
  schema_type_identifier: SchemaTypeIdentifier
107
- schema_transformations: List[RecordTransformation] = field(default_factory=lambda: [])
108
106
 
109
107
  def get_json_schema(self) -> Mapping[str, Any]:
110
108
  """
@@ -130,27 +128,12 @@ class DynamicSchemaLoader(SchemaLoader):
130
128
  )
131
129
  properties[key] = value
132
130
 
133
- transformed_properties = self._transform(properties, {})
134
-
135
131
  return {
136
132
  "$schema": "http://json-schema.org/draft-07/schema#",
137
133
  "type": "object",
138
- "properties": transformed_properties,
134
+ "properties": properties,
139
135
  }
140
136
 
141
- def _transform(
142
- self,
143
- properties: Mapping[str, Any],
144
- stream_state: StreamState,
145
- stream_slice: Optional[StreamSlice] = None,
146
- ) -> Mapping[str, Any]:
147
- for transformation in self.schema_transformations:
148
- transformation.transform(
149
- properties, # type: ignore # properties has type Mapping[str, Any], but Dict[str, Any] expected
150
- config=self.config,
151
- )
152
- return properties
153
-
154
137
  def _get_key(
155
138
  self,
156
139
  raw_schema: MutableMapping[str, Any],
@@ -226,6 +226,7 @@ class ConcurrentCursor(Cursor):
226
226
  )
227
227
 
228
228
  def observe(self, record: Record) -> None:
229
+ print(f"Observing record: {record}")
229
230
  most_recent_cursor_value = self._most_recent_cursor_value_per_partition.get(
230
231
  record.associated_slice
231
232
  )
@@ -54,16 +54,7 @@ class AbstractOauth2Authenticator(AuthBase):
54
54
 
55
55
  def get_auth_header(self) -> Mapping[str, Any]:
56
56
  """HTTP header to set on the requests"""
57
- token = (
58
- self.access_token
59
- if (
60
- not self.get_token_refresh_endpoint()
61
- or not self.get_refresh_token()
62
- and self.access_token
63
- )
64
- else self.get_access_token()
65
- )
66
- return {"Authorization": f"Bearer {token}"}
57
+ return {"Authorization": f"Bearer {self.get_access_token()}"}
67
58
 
68
59
  def get_access_token(self) -> str:
69
60
  """Returns the access token"""
@@ -130,7 +121,7 @@ class AbstractOauth2Authenticator(AuthBase):
130
121
  try:
131
122
  response = requests.request(
132
123
  method="POST",
133
- url=self.get_token_refresh_endpoint(), # type: ignore # returns None, if not provided, but str | bytes is expected.
124
+ url=self.get_token_refresh_endpoint(),
134
125
  data=self.build_refresh_request_body(),
135
126
  )
136
127
  if response.ok:
@@ -207,7 +198,7 @@ class AbstractOauth2Authenticator(AuthBase):
207
198
  return None
208
199
 
209
200
  @abstractmethod
210
- def get_token_refresh_endpoint(self) -> Optional[str]:
201
+ def get_token_refresh_endpoint(self) -> str:
211
202
  """Returns the endpoint to refresh the access token"""
212
203
 
213
204
  @abstractmethod
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: airbyte-cdk
3
- Version: 6.12.3
3
+ Version: 6.12.4.dev0
4
4
  Summary: A framework for writing Airbyte Connectors.
5
5
  Home-page: https://airbyte.com
6
6
  License: MIT
@@ -57,7 +57,7 @@ Requires-Dist: python-calamine (==0.2.3) ; extra == "file-based"
57
57
  Requires-Dist: python-dateutil
58
58
  Requires-Dist: python-snappy (==0.7.3) ; extra == "file-based"
59
59
  Requires-Dist: python-ulid (>=3.0.0,<4.0.0)
60
- Requires-Dist: pytz (==2024.2)
60
+ Requires-Dist: pytz (==2024.1)
61
61
  Requires-Dist: rapidfuzz (>=3.10.1,<4.0.0)
62
62
  Requires-Dist: requests
63
63
  Requires-Dist: requests_cache
@@ -53,7 +53,7 @@ airbyte_cdk/sources/declarative/async_job/timer.py,sha256=Fb8P72CQ7jIzJyzMSSNuBf
53
53
  airbyte_cdk/sources/declarative/auth/__init__.py,sha256=hhiJV3kU5_fja7hQYWqbYjjtJPpaJdS2NiJpJLrG2uw,294
54
54
  airbyte_cdk/sources/declarative/auth/declarative_authenticator.py,sha256=nf-OmRUHYG4ORBwyb5CANzuHEssE-oNmL-Lccn41Td8,1099
55
55
  airbyte_cdk/sources/declarative/auth/jwt.py,sha256=7r5q1zOekjw8kEmEk1oUyovzVt3cbD6BuFnRILeLZi8,8250
56
- airbyte_cdk/sources/declarative/auth/oauth.py,sha256=Yr0ljFjln9FIWudQohXARyKEo6-4ACG840pZoi6JVrE,9165
56
+ airbyte_cdk/sources/declarative/auth/oauth.py,sha256=_4Kaa8ZfmvMzUyLeaWm03Aux9uVBh1ia-sSlUxVB24I,8480
57
57
  airbyte_cdk/sources/declarative/auth/selective_authenticator.py,sha256=qGwC6YsCldr1bIeKG6Qo-A9a5cTdHw-vcOn3OtQrS4c,1540
58
58
  airbyte_cdk/sources/declarative/auth/token.py,sha256=r4u3WXyVa7WmiSZ9-eZXlrUI-pS0D4YWJnwjLzwV-Fk,11210
59
59
  airbyte_cdk/sources/declarative/auth/token_provider.py,sha256=9oq3dcBPAPwXSfkISjhA05dMhIzxaDQTmwOydBrnsMk,3028
@@ -62,11 +62,11 @@ airbyte_cdk/sources/declarative/checks/check_stream.py,sha256=dAA-UhmMj0WLXCkRQr
62
62
  airbyte_cdk/sources/declarative/checks/connection_checker.py,sha256=MBRJo6WJlZQHpIfOGaNOkkHUmgUl_4wDM6VPo41z5Ss,1383
63
63
  airbyte_cdk/sources/declarative/concurrency_level/__init__.py,sha256=5XUqrmlstYlMM0j6crktlKQwALek0uiz2D3WdM46MyA,191
64
64
  airbyte_cdk/sources/declarative/concurrency_level/concurrency_level.py,sha256=YIwCTCpOr_QSNW4ltQK0yUGWInI8PKNY216HOOegYLk,2101
65
- airbyte_cdk/sources/declarative/concurrent_declarative_source.py,sha256=PxP4p2686wsf1gjsumGKnh2o2Jjnrqg8QLGijEIrp-A,23412
65
+ airbyte_cdk/sources/declarative/concurrent_declarative_source.py,sha256=Z7Sf-PRVdR_Pba9S_Mxq7X9VtzDYVv3Za41ibQLU7jc,26391
66
66
  airbyte_cdk/sources/declarative/datetime/__init__.py,sha256=l9LG7Qm6e5r_qgqfVKnx3mXYtg1I9MmMjomVIPfU4XA,177
67
67
  airbyte_cdk/sources/declarative/datetime/datetime_parser.py,sha256=SX9JjdesN1edN2WVUVMzU_ptqp2QB1OnsnjZ4mwcX7w,2579
68
68
  airbyte_cdk/sources/declarative/datetime/min_max_datetime.py,sha256=0BHBtDNQZfvwM45-tY5pNlTcKAFSGGNxemoi0Jic-0E,5785
69
- airbyte_cdk/sources/declarative/declarative_component_schema.yaml,sha256=11mRmSliG_WNgMNoLSwTuwtV8-ebT7ar2vaMJH-6SCI,129628
69
+ airbyte_cdk/sources/declarative/declarative_component_schema.yaml,sha256=WrcFuuXPCSnxGnczbJFYLX8rM0bBydeLQNljaZHjcBQ,128702
70
70
  airbyte_cdk/sources/declarative/declarative_source.py,sha256=nF7wBqFd3AQmEKAm4CnIo29CJoQL562cJGSCeL8U8bA,1531
71
71
  airbyte_cdk/sources/declarative/declarative_stream.py,sha256=JRyNeOIpsFu4ztVZsN6sncqUEIqIE-bUkD2TPgbMgk0,10375
72
72
  airbyte_cdk/sources/declarative/decoders/__init__.py,sha256=hNlhaB5FjNC6IfJyglj5ZJWkYD2nEAukMDmzRz5PC6o,671
@@ -80,14 +80,15 @@ airbyte_cdk/sources/declarative/extractors/__init__.py,sha256=YFuL4D4RuuB8E1DNSb
80
80
  airbyte_cdk/sources/declarative/extractors/dpath_extractor.py,sha256=wR4Ol4MG2lt5UlqXF5EU_k7qa5cN4_-luu3PJ1PlO3A,3131
81
81
  airbyte_cdk/sources/declarative/extractors/http_selector.py,sha256=2zWZ4ewTqQC8VwkjS0xD_u350Km3SiYP7hpOOgiLg5o,1169
82
82
  airbyte_cdk/sources/declarative/extractors/record_extractor.py,sha256=XJELMjahAsaomlvQgN2zrNO0DJX0G0fr9r682gUz7Pg,691
83
- airbyte_cdk/sources/declarative/extractors/record_filter.py,sha256=OJ9xmhNWNwwzxYOeIrDy1GINb1zH9MBy6suC5tm2LSk,3545
83
+ airbyte_cdk/sources/declarative/extractors/record_filter.py,sha256=yTdEkyDUSW2KbFkEwJJMlS963C955LgCCOVfTmmScpQ,3367
84
84
  airbyte_cdk/sources/declarative/extractors/record_selector.py,sha256=AkXPOWyp741cpYLBl9AbmVmOQmQ2BzZ2XjgsMEB6gGc,6583
85
85
  airbyte_cdk/sources/declarative/extractors/response_to_file_extractor.py,sha256=LhqGDfX06_dDYLKsIVnwQ_nAWCln-v8PV7Wgt_QVeTI,6533
86
- airbyte_cdk/sources/declarative/incremental/__init__.py,sha256=CmZl9ddwMZFo8L7mEl_OFHN3ahIFRSYrJjMbR_cJaFA,1006
86
+ airbyte_cdk/sources/declarative/incremental/__init__.py,sha256=zEERPIXz1WxCJypqlSXZCFIpT4-mIsjzRdmFlX2-nMg,1210
87
+ airbyte_cdk/sources/declarative/incremental/concurrent_partition_cursor.py,sha256=7E5UHVvYBIZE-NbGs4mffhyL4BaXWTDbQXbE5kZPSPE,15283
87
88
  airbyte_cdk/sources/declarative/incremental/datetime_based_cursor.py,sha256=_UzUnSIUsDbRgbFTXgSyZEFb4ws-KdhdQPWO8mFbV7U,22028
88
89
  airbyte_cdk/sources/declarative/incremental/declarative_cursor.py,sha256=5Bhw9VRPyIuCaD0wmmq_L3DZsa-rJgtKSEUzSd8YYD0,536
89
90
  airbyte_cdk/sources/declarative/incremental/global_substream_cursor.py,sha256=3_EEZop94bMitZaJd2PF5Q2Xt9v94tYg7p7YJz8tAFc,15869
90
- airbyte_cdk/sources/declarative/incremental/per_partition_cursor.py,sha256=hElcYijbOHjdLKOMA7W7aizEbf22r7OSApXALP875uI,15749
91
+ airbyte_cdk/sources/declarative/incremental/per_partition_cursor.py,sha256=LpBLehdJ0ffinyFadt2ZwhwYQ4Pu3yqyQrIAlOTNbvg,16265
91
92
  airbyte_cdk/sources/declarative/incremental/per_partition_with_global.py,sha256=2YBOA2NnwAeIKlIhSwUB_W-FaGnPcmrG_liY7b4mV2Y,8365
92
93
  airbyte_cdk/sources/declarative/incremental/resumable_full_refresh_cursor.py,sha256=10LFv1QPM-agVKl6eaANmEBOfd7gZgBrkoTcMggsieQ,4809
93
94
  airbyte_cdk/sources/declarative/interpolation/__init__.py,sha256=tjUJkn3B-iZ-p7RP2c3dVZejrGiQeooGmS5ibWTuUL4,437
@@ -104,14 +105,13 @@ airbyte_cdk/sources/declarative/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW
104
105
  airbyte_cdk/sources/declarative/migrations/legacy_to_per_partition_state_migration.py,sha256=iemy3fKLczcU0-Aor7tx5jcT6DRedKMqyK7kCOp01hg,3924
105
106
  airbyte_cdk/sources/declarative/migrations/state_migration.py,sha256=KWPjealMLKSMtajXgkdGgKg7EmTLR-CqqD7UIh0-eDU,794
106
107
  airbyte_cdk/sources/declarative/models/__init__.py,sha256=nUFxNCiKeYRVXuZEKA7GD-lTHxsiKcQ8FitZjKhPIvE,100
107
- airbyte_cdk/sources/declarative/models/declarative_component_schema.py,sha256=R52aqtbZs81CQvo9gappzLr9eu2_TJmuT7NSfMDdhXI,91100
108
+ airbyte_cdk/sources/declarative/models/declarative_component_schema.py,sha256=7-v-EuGDDi-kCXvGu3m0ZK2FHpsMExcPzqBI-hfoAzg,90364
108
109
  airbyte_cdk/sources/declarative/parsers/__init__.py,sha256=ZnqYNxHsKCgO38IwB34RQyRMXTs4GTvlRi3ImKnIioo,61
109
110
  airbyte_cdk/sources/declarative/parsers/custom_exceptions.py,sha256=Rir9_z3Kcd5Es0-LChrzk-0qubAsiK_RSEnLmK2OXm8,553
110
111
  airbyte_cdk/sources/declarative/parsers/manifest_component_transformer.py,sha256=CXwTfD3wSQq3okcqwigpprbHhSURUokh4GK2OmOyKC8,9132
111
112
  airbyte_cdk/sources/declarative/parsers/manifest_reference_resolver.py,sha256=IWUOdF03o-aQn0Occo1BJCxU0Pz-QILk5L67nzw2thw,6803
112
- airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py,sha256=aSJwsGHHjRUGbQNgqf53fVkZ-3PsTeIEcvzTw-s-KP0,106161
113
- airbyte_cdk/sources/declarative/partition_routers/__init__.py,sha256=974SY1RFwitUCiiDHuFHDGmSNu1D72z3bSTpvlBwAho,911
114
- airbyte_cdk/sources/declarative/partition_routers/async_job_partition_router.py,sha256=n82J15S8bjeMZ5uROu--P3hnbQoxkY5v7RPHYx7g7ro,2929
113
+ airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py,sha256=bvoj7fdaeuNuupVXOQQfeID84u6d-jki8D8P5d6JA-g,107281
114
+ airbyte_cdk/sources/declarative/partition_routers/__init__.py,sha256=1NjaZoGAIefvWwj6wx-LOKIXXWS-UnBlZFnuR7y6uYA,745
115
115
  airbyte_cdk/sources/declarative/partition_routers/cartesian_product_stream_slicer.py,sha256=c5cuVFM6NFkuQqG8Z5IwkBuwDrvXZN1CunUOM_L0ezg,6892
116
116
  airbyte_cdk/sources/declarative/partition_routers/list_partition_router.py,sha256=t7pRdFWfFWJtQQG19c9PVeMODyO2BknRTakpM5U9N-8,4844
117
117
  airbyte_cdk/sources/declarative/partition_routers/partition_router.py,sha256=YyEIzdmLd1FjbVP3QbQ2VFCLW_P-OGbVh6VpZShp54k,2218
@@ -156,14 +156,14 @@ airbyte_cdk/sources/declarative/requesters/requester.py,sha256=iVVpXQ4KEd9OyZNwm
156
156
  airbyte_cdk/sources/declarative/resolvers/__init__.py,sha256=RAwq1VrkC0kAaIkmKkL7so8ZeUzF0MgUQ0tciGkY7v4,1116
157
157
  airbyte_cdk/sources/declarative/resolvers/components_resolver.py,sha256=KPjKc0yb9artL4ZkeqN8RmEykHH6FJgqXD7fCEnh1X0,1936
158
158
  airbyte_cdk/sources/declarative/resolvers/config_components_resolver.py,sha256=dz4iJV9liD_LzY_Mn4XmAStoUll60R3MIGWV4aN3pgg,5223
159
- airbyte_cdk/sources/declarative/resolvers/http_components_resolver.py,sha256=AiojNs8wItJFrENZBFUaDvau3sgwudO6Wkra36upSPo,4639
159
+ airbyte_cdk/sources/declarative/resolvers/http_components_resolver.py,sha256=ZA2vrHQKfXNMcH3x1iuyFOTGNzYDhUFT2qcaiOzSK0A,4271
160
160
  airbyte_cdk/sources/declarative/retrievers/__init__.py,sha256=FVQpUGVwp2Gibk4gp07VmLKX5AafUlsZWFSrDpUDuJM,443
161
- airbyte_cdk/sources/declarative/retrievers/async_retriever.py,sha256=3jgor7a6_s_9KgqHmPk6cWMDZ-6OugFPjCajIkC3Onw,3721
161
+ airbyte_cdk/sources/declarative/retrievers/async_retriever.py,sha256=WDFnjrXLz3-YEjFhmlMkWAn9AJvnZ0mk9FyC8DAhEYk,4976
162
162
  airbyte_cdk/sources/declarative/retrievers/retriever.py,sha256=XPLs593Xv8c5cKMc37XzUAYmzlXd1a7eSsspM-CMuWA,1696
163
- airbyte_cdk/sources/declarative/retrievers/simple_retriever.py,sha256=N4swGw5mfuTXJ2R7AKX18CHzizsr69pXwt5uSHLPi48,24172
163
+ airbyte_cdk/sources/declarative/retrievers/simple_retriever.py,sha256=6IP6e9cjGEU2y77lcOKj1bqn3bYGBAsP8vJU4Skzp30,24182
164
164
  airbyte_cdk/sources/declarative/schema/__init__.py,sha256=Io9vninzlEjQ2uFmWklxfwNM0cXfljtzOz5zL1OVyT4,701
165
165
  airbyte_cdk/sources/declarative/schema/default_schema_loader.py,sha256=KTACrIE23a83wsm3Rd9Eb4K6-20lrGqYxTHNp9yxsso,1820
166
- airbyte_cdk/sources/declarative/schema/dynamic_schema_loader.py,sha256=H6A3NQ6kPPM-cUNPmdvDPc9xNzR1rQNrK95GbgCW334,8822
166
+ airbyte_cdk/sources/declarative/schema/dynamic_schema_loader.py,sha256=tP5DIEMn-k2JshWeXmo53ZEudDAVb4AJ50Z5tfme_ZU,8063
167
167
  airbyte_cdk/sources/declarative/schema/inline_schema_loader.py,sha256=bVETE10hRsatRJq3R3BeyRR0wIoK3gcP1gcpVRQ_P5U,464
168
168
  airbyte_cdk/sources/declarative/schema/json_file_schema_loader.py,sha256=5Wl-fqW-pVf_dxJ4yGHMAFfC4JjKHYJhqFJT1xA57F4,4177
169
169
  airbyte_cdk/sources/declarative/schema/schema_loader.py,sha256=kjt8v0N5wWKA5zyLnrDLxf1PJKdUqvQq2RVnAOAzNSY,379
@@ -253,7 +253,7 @@ airbyte_cdk/sources/streams/concurrent/abstract_stream.py,sha256=3OB5VsvOkJmCxIM
253
253
  airbyte_cdk/sources/streams/concurrent/abstract_stream_facade.py,sha256=QTry1QCBUwJDw1QSCEvz23s7zIEx_7QMxkPq9j-oPIQ,1358
254
254
  airbyte_cdk/sources/streams/concurrent/adapters.py,sha256=QP_64kQo-b3sRNHZA5aqrgCJqAhIVegRM3vJ8jGyuSY,15213
255
255
  airbyte_cdk/sources/streams/concurrent/availability_strategy.py,sha256=4La5v2UffSjGnhmF4kwNIKt_g3RXk2ux1mSHA1ejgYM,2898
256
- airbyte_cdk/sources/streams/concurrent/cursor.py,sha256=Hke6CpD8Sq1FS4g1Xuht39UN7hKkGy1mvOxvQrm1lLM,20810
256
+ airbyte_cdk/sources/streams/concurrent/cursor.py,sha256=-b7jjLbGBk3dvJLZiWG_Q_f1UmZc1Bp9VeFr4NYitCg,20855
257
257
  airbyte_cdk/sources/streams/concurrent/default_stream.py,sha256=K3rLMpYhS7nnmvwQ52lqBy7DQdFMJpvvT7sgBg_ckA8,3207
258
258
  airbyte_cdk/sources/streams/concurrent/exceptions.py,sha256=JOZ446MCLpmF26r9KfS6OO_6rGjcjgJNZdcw6jccjEI,468
259
259
  airbyte_cdk/sources/streams/concurrent/helpers.py,sha256=S6AW8TgIASCZ2UuUcQLE8OzgYUHWt2-KPOvNPwnQf-Q,1596
@@ -284,7 +284,7 @@ airbyte_cdk/sources/streams/http/http.py,sha256=JAMpiTdS9HFNOlwayWNvQdxoqs2rpW9w
284
284
  airbyte_cdk/sources/streams/http/http_client.py,sha256=tDE0ROtxjGMVphvsw8INvGMtZ97hIF-v47pZ3jIyiwc,23011
285
285
  airbyte_cdk/sources/streams/http/rate_limiting.py,sha256=IwdjrHKUnU97XO4qONgYRv4YYW51xQ8SJm4WLafXDB8,6351
286
286
  airbyte_cdk/sources/streams/http/requests_native_auth/__init__.py,sha256=RN0D3nOX1xLgwEwKWu6pkGy3XqBFzKSNZ8Lf6umU2eY,413
287
- airbyte_cdk/sources/streams/http/requests_native_auth/abstract_oauth.py,sha256=fnxafAc8qBFWVN_r7ViOWqDObfe3S_DWhnlNfabMWSI,10661
287
+ airbyte_cdk/sources/streams/http/requests_native_auth/abstract_oauth.py,sha256=nxI94yJ3bGfpDO8RR3QvOJ-PSW0n9CElSAkgl5ae80Y,10321
288
288
  airbyte_cdk/sources/streams/http/requests_native_auth/abstract_token.py,sha256=Y3n7J-sk5yGjv_OxtY6Z6k0PEsFZmtIRi-x0KCbaHdA,1010
289
289
  airbyte_cdk/sources/streams/http/requests_native_auth/oauth.py,sha256=ka-bBRWvIv09LmZNYl49p2lK9nd_Tvi2g0lIp3OkU40,14872
290
290
  airbyte_cdk/sources/streams/http/requests_native_auth/token.py,sha256=h5PTzcdH-RQLeCg7xZ45w_484OPUDSwNWl_iMJQmZoI,2526
@@ -339,8 +339,8 @@ airbyte_cdk/utils/slice_hasher.py,sha256=-pHexlNYoWYPnXNH-M7HEbjmeJe9Zk7SJijdQ7d
339
339
  airbyte_cdk/utils/spec_schema_transformations.py,sha256=-5HTuNsnDBAhj-oLeQXwpTGA0HdcjFOf2zTEMUTTg_Y,816
340
340
  airbyte_cdk/utils/stream_status_utils.py,sha256=ZmBoiy5HVbUEHAMrUONxZvxnvfV9CesmQJLDTAIWnWw,1171
341
341
  airbyte_cdk/utils/traced_exception.py,sha256=C8uIBuCL_E4WnBAOPSxBicD06JAldoN9fGsQDp463OY,6292
342
- airbyte_cdk-6.12.3.dist-info/LICENSE.txt,sha256=Wfe61S4BaGPj404v8lrAbvhjYR68SHlkzeYrg3_bbuM,1051
343
- airbyte_cdk-6.12.3.dist-info/METADATA,sha256=DdnFFX5s5OryiCi_NdkLKY0kaS73iI-GmSTbJuX-nVI,5988
344
- airbyte_cdk-6.12.3.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
345
- airbyte_cdk-6.12.3.dist-info/entry_points.txt,sha256=fj-e3PAQvsxsQzyyq8UkG1k8spunWnD4BAH2AwlR6NM,95
346
- airbyte_cdk-6.12.3.dist-info/RECORD,,
342
+ airbyte_cdk-6.12.4.dev0.dist-info/LICENSE.txt,sha256=Wfe61S4BaGPj404v8lrAbvhjYR68SHlkzeYrg3_bbuM,1051
343
+ airbyte_cdk-6.12.4.dev0.dist-info/METADATA,sha256=cJXPSxhnU8vhnxw7WA_Z9sIXzENf9UAG8IgEzLLcmvA,5993
344
+ airbyte_cdk-6.12.4.dev0.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
345
+ airbyte_cdk-6.12.4.dev0.dist-info/entry_points.txt,sha256=fj-e3PAQvsxsQzyyq8UkG1k8spunWnD4BAH2AwlR6NM,95
346
+ airbyte_cdk-6.12.4.dev0.dist-info/RECORD,,