airbyte-cdk 6.10.0__py3-none-any.whl → 6.11.0__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.
@@ -30,7 +30,7 @@ class SelectiveAuthenticator(DeclarativeAuthenticator):
30
30
  try:
31
31
  selected_key = str(
32
32
  dpath.get(
33
- config, # type: ignore [arg-type] # Dpath wants mutable mapping but doesn't need it.
33
+ config, # type: ignore[arg-type] # Dpath wants mutable mapping but doesn't need it.
34
34
  authenticator_selection_path,
35
35
  )
36
36
  )
@@ -1218,6 +1218,7 @@ definitions:
1218
1218
  title: Schema Loader
1219
1219
  description: Component used to retrieve the schema for the current stream.
1220
1220
  anyOf:
1221
+ - "$ref": "#/definitions/DynamicSchemaLoader"
1221
1222
  - "$ref": "#/definitions/InlineSchemaLoader"
1222
1223
  - "$ref": "#/definitions/JsonFileSchemaLoader"
1223
1224
  - "$ref": "#/definitions/CustomSchemaLoader"
@@ -1684,6 +1685,92 @@ definitions:
1684
1685
  $parameters:
1685
1686
  type: object
1686
1687
  additionalProperties: true
1688
+ TypesMap:
1689
+ title: Types Map
1690
+ description: (This component is experimental. Use at your own risk.) Represents a mapping between a current type and its corresponding target type.
1691
+ type: object
1692
+ required:
1693
+ - target_type
1694
+ - current_type
1695
+ properties:
1696
+ target_type:
1697
+ anyOf:
1698
+ - type: string
1699
+ - type: array
1700
+ items:
1701
+ type: string
1702
+ current_type:
1703
+ anyOf:
1704
+ - type: string
1705
+ - type: array
1706
+ items:
1707
+ type: string
1708
+ SchemaTypeIdentifier:
1709
+ title: Schema Type Identifier
1710
+ description: (This component is experimental. Use at your own risk.) Identifies schema details for dynamic schema extraction and processing.
1711
+ type: object
1712
+ required:
1713
+ - key_pointer
1714
+ properties:
1715
+ type:
1716
+ type: string
1717
+ enum: [SchemaTypeIdentifier]
1718
+ schema_pointer:
1719
+ title: Schema Path
1720
+ description: List of nested fields defining the schema field path to extract. Defaults to [].
1721
+ type: array
1722
+ default: []
1723
+ items:
1724
+ - type: string
1725
+ interpolation_context:
1726
+ - config
1727
+ key_pointer:
1728
+ title: Key Path
1729
+ description: List of potentially nested fields describing the full path of the field key to extract.
1730
+ type: array
1731
+ items:
1732
+ - type: string
1733
+ interpolation_context:
1734
+ - config
1735
+ type_pointer:
1736
+ title: Type Path
1737
+ description: List of potentially nested fields describing the full path of the field type to extract.
1738
+ type: array
1739
+ items:
1740
+ - type: string
1741
+ interpolation_context:
1742
+ - config
1743
+ types_mapping:
1744
+ type: array
1745
+ items:
1746
+ - "$ref": "#/definitions/TypesMap"
1747
+ $parameters:
1748
+ type: object
1749
+ additionalProperties: true
1750
+ DynamicSchemaLoader:
1751
+ title: Dynamic Schema Loader
1752
+ description: (This component is experimental. Use at your own risk.) Loads a schema by extracting data from retrieved records.
1753
+ type: object
1754
+ required:
1755
+ - type
1756
+ - retriever
1757
+ - schema_type_identifier
1758
+ properties:
1759
+ type:
1760
+ type: string
1761
+ enum: [DynamicSchemaLoader]
1762
+ retriever:
1763
+ title: Retriever
1764
+ description: Component used to coordinate how records are extracted across stream slices and request pages.
1765
+ anyOf:
1766
+ - "$ref": "#/definitions/AsyncRetriever"
1767
+ - "$ref": "#/definitions/CustomRetriever"
1768
+ - "$ref": "#/definitions/SimpleRetriever"
1769
+ schema_type_identifier:
1770
+ "$ref": "#/definitions/SchemaTypeIdentifier"
1771
+ $parameters:
1772
+ type: object
1773
+ additionalProperties: true
1687
1774
  InlineSchemaLoader:
1688
1775
  title: Inline Schema Loader
1689
1776
  description: Loads a schema that is defined directly in the manifest file.
@@ -2928,8 +3015,10 @@ definitions:
2928
3015
  examples:
2929
3016
  - ["data"]
2930
3017
  - ["data", "records"]
2931
- - ["data", "{{ parameters.name }}"]
3018
+ - ["data", 1, "name"]
3019
+ - ["data", "{{ components_values.name }}"]
2932
3020
  - ["data", "*", "record"]
3021
+ - ["*", "**", "name"]
2933
3022
  value:
2934
3023
  title: Value
2935
3024
  description: The dynamic or static value to assign to the key. Interpolated values can be used to dynamically determine the value during runtime.
@@ -2974,6 +3063,52 @@ definitions:
2974
3063
  - type
2975
3064
  - retriever
2976
3065
  - components_mapping
3066
+ StreamConfig:
3067
+ title: Stream Config
3068
+ description: (This component is experimental. Use at your own risk.) Describes how to get streams config from the source config.
3069
+ type: object
3070
+ required:
3071
+ - type
3072
+ - configs_pointer
3073
+ properties:
3074
+ type:
3075
+ type: string
3076
+ enum: [StreamConfig]
3077
+ configs_pointer:
3078
+ title: Configs Pointer
3079
+ description: A list of potentially nested fields indicating the full path in source config file where streams configs located.
3080
+ type: array
3081
+ items:
3082
+ - type: string
3083
+ interpolation_context:
3084
+ - parameters
3085
+ examples:
3086
+ - ["data"]
3087
+ - ["data", "streams"]
3088
+ - ["data", "{{ parameters.name }}"]
3089
+ $parameters:
3090
+ type: object
3091
+ additionalProperties: true
3092
+ ConfigComponentsResolver:
3093
+ type: object
3094
+ description: (This component is experimental. Use at your own risk.) Resolves and populates stream templates with components fetched from the source config.
3095
+ properties:
3096
+ type:
3097
+ type: string
3098
+ enum: [ConfigComponentsResolver]
3099
+ stream_config:
3100
+ "$ref": "#/definitions/StreamConfig"
3101
+ components_mapping:
3102
+ type: array
3103
+ items:
3104
+ "$ref": "#/definitions/ComponentMappingDefinition"
3105
+ $parameters:
3106
+ type: object
3107
+ additionalProperties: true
3108
+ required:
3109
+ - type
3110
+ - stream_config
3111
+ - components_mapping
2977
3112
  DynamicDeclarativeStream:
2978
3113
  type: object
2979
3114
  description: (This component is experimental. Use at your own risk.) A component that described how will be created declarative streams based on stream template.
@@ -2988,7 +3123,9 @@ definitions:
2988
3123
  components_resolver:
2989
3124
  title: Components Resolver
2990
3125
  description: Component resolve and populates stream templates with components values.
2991
- "$ref": "#/definitions/HttpComponentsResolver"
3126
+ anyOf:
3127
+ - "$ref": "#/definitions/HttpComponentsResolver"
3128
+ - "$ref": "#/definitions/ConfigComponentsResolver"
2992
3129
  required:
2993
3130
  - type
2994
3131
  - stream_template
@@ -7,7 +7,7 @@ import logging
7
7
  import pkgutil
8
8
  from copy import deepcopy
9
9
  from importlib import metadata
10
- from typing import Any, Dict, Iterator, List, Mapping, Optional
10
+ from typing import Any, Dict, Iterator, List, Mapping, Optional, Set
11
11
 
12
12
  import yaml
13
13
  from jsonschema.exceptions import ValidationError
@@ -20,6 +20,7 @@ from airbyte_cdk.models import (
20
20
  AirbyteStateMessage,
21
21
  ConfiguredAirbyteCatalog,
22
22
  ConnectorSpecification,
23
+ FailureType,
23
24
  )
24
25
  from airbyte_cdk.sources.declarative.checks.connection_checker import ConnectionChecker
25
26
  from airbyte_cdk.sources.declarative.declarative_source import DeclarativeSource
@@ -48,6 +49,7 @@ from airbyte_cdk.sources.utils.slice_logger import (
48
49
  DebugSliceLogger,
49
50
  SliceLogger,
50
51
  )
52
+ from airbyte_cdk.utils.traced_exception import AirbyteTracedException
51
53
 
52
54
 
53
55
  class ManifestDeclarativeSource(DeclarativeSource):
@@ -313,6 +315,7 @@ class ManifestDeclarativeSource(DeclarativeSource):
313
315
  ) -> List[Dict[str, Any]]:
314
316
  dynamic_stream_definitions: List[Dict[str, Any]] = manifest.get("dynamic_streams", [])
315
317
  dynamic_stream_configs: List[Dict[str, Any]] = []
318
+ seen_dynamic_streams: Set[str] = set()
316
319
 
317
320
  for dynamic_definition in dynamic_stream_definitions:
318
321
  components_resolver_config = dynamic_definition["components_resolver"]
@@ -350,6 +353,24 @@ class ManifestDeclarativeSource(DeclarativeSource):
350
353
  if "type" not in dynamic_stream:
351
354
  dynamic_stream["type"] = "DeclarativeStream"
352
355
 
356
+ # Ensure that each stream is created with a unique name
357
+ name = dynamic_stream.get("name")
358
+
359
+ if name in seen_dynamic_streams:
360
+ error_message = f"Dynamic streams list contains a duplicate name: {name}. Please contact Airbyte Support."
361
+ failure_type = FailureType.system_error
362
+
363
+ if resolver_type == "ConfigComponentsResolver":
364
+ error_message = f"Dynamic streams list contains a duplicate name: {name}. Please check your configuration."
365
+ failure_type = FailureType.config_error
366
+
367
+ raise AirbyteTracedException(
368
+ message=error_message,
369
+ internal_message=error_message,
370
+ failure_type=failure_type,
371
+ )
372
+
373
+ seen_dynamic_streams.add(name)
353
374
  dynamic_stream_configs.append(dynamic_stream)
354
375
 
355
376
  return dynamic_stream_configs
@@ -650,6 +650,32 @@ class HttpResponseFilter(BaseModel):
650
650
  parameters: Optional[Dict[str, Any]] = Field(None, alias="$parameters")
651
651
 
652
652
 
653
+ class TypesMap(BaseModel):
654
+ target_type: Union[str, List[str]]
655
+ current_type: Union[str, List[str]]
656
+
657
+
658
+ class SchemaTypeIdentifier(BaseModel):
659
+ type: Optional[Literal["SchemaTypeIdentifier"]] = None
660
+ schema_pointer: Optional[List[str]] = Field(
661
+ [],
662
+ description="List of nested fields defining the schema field path to extract. Defaults to [].",
663
+ title="Schema Path",
664
+ )
665
+ key_pointer: List[str] = Field(
666
+ ...,
667
+ description="List of potentially nested fields describing the full path of the field key to extract.",
668
+ title="Key Path",
669
+ )
670
+ type_pointer: Optional[List[str]] = Field(
671
+ None,
672
+ description="List of potentially nested fields describing the full path of the field type to extract.",
673
+ title="Type Path",
674
+ )
675
+ types_mapping: Optional[List[TypesMap]] = None
676
+ parameters: Optional[Dict[str, Any]] = Field(None, alias="$parameters")
677
+
678
+
653
679
  class InlineSchemaLoader(BaseModel):
654
680
  type: Literal["InlineSchemaLoader"]
655
681
  schema_: Optional[Dict[str, Any]] = Field(
@@ -822,13 +848,13 @@ class OauthConnectorInputSpecification(BaseModel):
822
848
  )
823
849
  extract_output: List[str] = Field(
824
850
  ...,
825
- description="The DeclarativeOAuth Specific list of strings to indicate which keys should be extracted and returned back to the input config. ",
851
+ description="The DeclarativeOAuth Specific list of strings to indicate which keys should be extracted and returned back to the input config.",
826
852
  examples=[{"extract_output": ["access_token", "refresh_token", "other_field"]}],
827
853
  title="DeclarativeOAuth Extract Output",
828
854
  )
829
855
  state: Optional[State] = Field(
830
856
  None,
831
- description="The DeclarativeOAuth Specific object to provide the criteria of how the `state` query param should be constructed,\nincluding length and complexity. ",
857
+ description="The DeclarativeOAuth Specific object to provide the criteria of how the `state` query param should be constructed,\nincluding length and complexity.",
832
858
  examples=[{"state": {"min": 7, "max": 128}}],
833
859
  title="(Optional) DeclarativeOAuth Configurable State Query Param",
834
860
  )
@@ -852,13 +878,13 @@ class OauthConnectorInputSpecification(BaseModel):
852
878
  )
853
879
  state_key: Optional[str] = Field(
854
880
  None,
855
- description="The DeclarativeOAuth Specific optional override to provide the custom `state` key name, if required by data-provider. ",
881
+ description="The DeclarativeOAuth Specific optional override to provide the custom `state` key name, if required by data-provider.",
856
882
  examples=[{"state_key": "my_custom_state_key_key_name"}],
857
883
  title="(Optional) DeclarativeOAuth State Key Override",
858
884
  )
859
885
  auth_code_key: Optional[str] = Field(
860
886
  None,
861
- description="The DeclarativeOAuth Specific optional override to provide the custom `code` key name to something like `auth_code` or `custom_auth_code`, if required by data-provider. ",
887
+ description="The DeclarativeOAuth Specific optional override to provide the custom `code` key name to something like `auth_code` or `custom_auth_code`, if required by data-provider.",
862
888
  examples=[{"auth_code_key": "my_custom_auth_code_key_name"}],
863
889
  title="(Optional) DeclarativeOAuth Auth Code Key Override",
864
890
  )
@@ -1166,8 +1192,10 @@ class ComponentMappingDefinition(BaseModel):
1166
1192
  examples=[
1167
1193
  ["data"],
1168
1194
  ["data", "records"],
1169
- ["data", "{{ parameters.name }}"],
1195
+ ["data", 1, "name"],
1196
+ ["data", "{{ components_values.name }}"],
1170
1197
  ["data", "*", "record"],
1198
+ ["*", "**", "name"],
1171
1199
  ],
1172
1200
  title="Field Path",
1173
1201
  )
@@ -1189,6 +1217,24 @@ class ComponentMappingDefinition(BaseModel):
1189
1217
  parameters: Optional[Dict[str, Any]] = Field(None, alias="$parameters")
1190
1218
 
1191
1219
 
1220
+ class StreamConfig(BaseModel):
1221
+ type: Literal["StreamConfig"]
1222
+ configs_pointer: List[str] = Field(
1223
+ ...,
1224
+ description="A list of potentially nested fields indicating the full path in source config file where streams configs located.",
1225
+ examples=[["data"], ["data", "streams"], ["data", "{{ parameters.name }}"]],
1226
+ title="Configs Pointer",
1227
+ )
1228
+ parameters: Optional[Dict[str, Any]] = Field(None, alias="$parameters")
1229
+
1230
+
1231
+ class ConfigComponentsResolver(BaseModel):
1232
+ type: Literal["ConfigComponentsResolver"]
1233
+ stream_config: StreamConfig
1234
+ components_mapping: List[ComponentMappingDefinition]
1235
+ parameters: Optional[Dict[str, Any]] = Field(None, alias="$parameters")
1236
+
1237
+
1192
1238
  class AddedFieldDefinition(BaseModel):
1193
1239
  type: Literal["AddedFieldDefinition"]
1194
1240
  path: List[str] = Field(
@@ -1609,12 +1655,17 @@ class DeclarativeStream(BaseModel):
1609
1655
  primary_key: Optional[PrimaryKey] = Field(
1610
1656
  "", description="The primary key of the stream.", title="Primary Key"
1611
1657
  )
1612
- schema_loader: Optional[Union[InlineSchemaLoader, JsonFileSchemaLoader, CustomSchemaLoader]] = (
1613
- Field(
1614
- None,
1615
- description="Component used to retrieve the schema for the current stream.",
1616
- title="Schema Loader",
1617
- )
1658
+ schema_loader: Optional[
1659
+ Union[
1660
+ DynamicSchemaLoader,
1661
+ InlineSchemaLoader,
1662
+ JsonFileSchemaLoader,
1663
+ CustomSchemaLoader,
1664
+ ]
1665
+ ] = Field(
1666
+ None,
1667
+ description="Component used to retrieve the schema for the current stream.",
1668
+ title="Schema Loader",
1618
1669
  )
1619
1670
  transformations: Optional[
1620
1671
  List[Union[AddFields, CustomTransformation, RemoveFields, KeysToLower]]
@@ -1774,6 +1825,17 @@ class HttpRequester(BaseModel):
1774
1825
  parameters: Optional[Dict[str, Any]] = Field(None, alias="$parameters")
1775
1826
 
1776
1827
 
1828
+ class DynamicSchemaLoader(BaseModel):
1829
+ type: Literal["DynamicSchemaLoader"]
1830
+ retriever: Union[AsyncRetriever, CustomRetriever, SimpleRetriever] = Field(
1831
+ ...,
1832
+ description="Component used to coordinate how records are extracted across stream slices and request pages.",
1833
+ title="Retriever",
1834
+ )
1835
+ schema_type_identifier: SchemaTypeIdentifier
1836
+ parameters: Optional[Dict[str, Any]] = Field(None, alias="$parameters")
1837
+
1838
+
1777
1839
  class ParentStreamConfig(BaseModel):
1778
1840
  type: Literal["ParentStreamConfig"]
1779
1841
  parent_key: str = Field(
@@ -1968,7 +2030,7 @@ class DynamicDeclarativeStream(BaseModel):
1968
2030
  stream_template: DeclarativeStream = Field(
1969
2031
  ..., description="Reference to the stream template.", title="Stream Template"
1970
2032
  )
1971
- components_resolver: HttpComponentsResolver = Field(
2033
+ components_resolver: Union[HttpComponentsResolver, ConfigComponentsResolver] = Field(
1972
2034
  ...,
1973
2035
  description="Component resolve and populates stream templates with components values.",
1974
2036
  title="Components Resolver",
@@ -1981,5 +2043,6 @@ DeclarativeSource2.update_forward_refs()
1981
2043
  SelectiveAuthenticator.update_forward_refs()
1982
2044
  DeclarativeStream.update_forward_refs()
1983
2045
  SessionTokenAuthenticator.update_forward_refs()
2046
+ DynamicSchemaLoader.update_forward_refs()
1984
2047
  SimpleRetriever.update_forward_refs()
1985
2048
  AsyncRetriever.update_forward_refs()
@@ -33,10 +33,13 @@ DEFAULT_MODEL_TYPES: Mapping[str, str] = {
33
33
  "DeclarativeStream.schema_loader": "JsonFileSchemaLoader",
34
34
  # DynamicDeclarativeStream
35
35
  "DynamicDeclarativeStream.stream_template": "DeclarativeStream",
36
- "DynamicDeclarativeStream.components_resolver": "HttpComponentsResolver",
36
+ "DynamicDeclarativeStream.components_resolver": "ConfigComponentResolver",
37
37
  # HttpComponentsResolver
38
38
  "HttpComponentsResolver.retriever": "SimpleRetriever",
39
39
  "HttpComponentsResolver.components_mapping": "ComponentMappingDefinition",
40
+ # ConfigComponentResolver
41
+ "ConfigComponentsResolver.stream_config": "StreamConfig",
42
+ "ConfigComponentsResolver.components_mapping": "ComponentMappingDefinition",
40
43
  # DefaultErrorHandler
41
44
  "DefaultErrorHandler.response_filters": "HttpResponseFilter",
42
45
  # DefaultPaginator
@@ -64,6 +67,10 @@ DEFAULT_MODEL_TYPES: Mapping[str, str] = {
64
67
  "AddFields.fields": "AddedFieldDefinition",
65
68
  # CustomPartitionRouter
66
69
  "CustomPartitionRouter.parent_stream_configs": "ParentStreamConfig",
70
+ # DynamicSchemaLoader
71
+ "DynamicSchemaLoader.retriever": "SimpleRetriever",
72
+ # SchemaTypeIdentifier
73
+ "SchemaTypeIdentifier.types_map": "TypesMap",
67
74
  }
68
75
 
69
76
  # We retain a separate registry for custom components to automatically insert the type if it is missing. This is intended to
@@ -128,6 +128,9 @@ from airbyte_cdk.sources.declarative.models.declarative_component_schema import
128
128
  from airbyte_cdk.sources.declarative.models.declarative_component_schema import (
129
129
  ConcurrencyLevel as ConcurrencyLevelModel,
130
130
  )
131
+ from airbyte_cdk.sources.declarative.models.declarative_component_schema import (
132
+ ConfigComponentsResolver as ConfigComponentsResolverModel,
133
+ )
131
134
  from airbyte_cdk.sources.declarative.models.declarative_component_schema import (
132
135
  ConstantBackoffStrategy as ConstantBackoffStrategyModel,
133
136
  )
@@ -188,6 +191,9 @@ from airbyte_cdk.sources.declarative.models.declarative_component_schema import
188
191
  from airbyte_cdk.sources.declarative.models.declarative_component_schema import (
189
192
  DpathExtractor as DpathExtractorModel,
190
193
  )
194
+ from airbyte_cdk.sources.declarative.models.declarative_component_schema import (
195
+ DynamicSchemaLoader as DynamicSchemaLoaderModel,
196
+ )
191
197
  from airbyte_cdk.sources.declarative.models.declarative_component_schema import (
192
198
  ExponentialBackoffStrategy as ExponentialBackoffStrategyModel,
193
199
  )
@@ -278,6 +284,9 @@ from airbyte_cdk.sources.declarative.models.declarative_component_schema import
278
284
  from airbyte_cdk.sources.declarative.models.declarative_component_schema import (
279
285
  ResponseToFileExtractor as ResponseToFileExtractorModel,
280
286
  )
287
+ from airbyte_cdk.sources.declarative.models.declarative_component_schema import (
288
+ SchemaTypeIdentifier as SchemaTypeIdentifierModel,
289
+ )
281
290
  from airbyte_cdk.sources.declarative.models.declarative_component_schema import (
282
291
  SelectiveAuthenticator as SelectiveAuthenticatorModel,
283
292
  )
@@ -288,9 +297,15 @@ from airbyte_cdk.sources.declarative.models.declarative_component_schema import
288
297
  SimpleRetriever as SimpleRetrieverModel,
289
298
  )
290
299
  from airbyte_cdk.sources.declarative.models.declarative_component_schema import Spec as SpecModel
300
+ from airbyte_cdk.sources.declarative.models.declarative_component_schema import (
301
+ StreamConfig as StreamConfigModel,
302
+ )
291
303
  from airbyte_cdk.sources.declarative.models.declarative_component_schema import (
292
304
  SubstreamPartitionRouter as SubstreamPartitionRouterModel,
293
305
  )
306
+ from airbyte_cdk.sources.declarative.models.declarative_component_schema import (
307
+ TypesMap as TypesMapModel,
308
+ )
294
309
  from airbyte_cdk.sources.declarative.models.declarative_component_schema import ValueType
295
310
  from airbyte_cdk.sources.declarative.models.declarative_component_schema import (
296
311
  WaitTimeFromHeader as WaitTimeFromHeaderModel,
@@ -347,7 +362,9 @@ from airbyte_cdk.sources.declarative.requesters.request_path import RequestPath
347
362
  from airbyte_cdk.sources.declarative.requesters.requester import HttpMethod
348
363
  from airbyte_cdk.sources.declarative.resolvers import (
349
364
  ComponentMappingDefinition,
365
+ ConfigComponentsResolver,
350
366
  HttpComponentsResolver,
367
+ StreamConfig,
351
368
  )
352
369
  from airbyte_cdk.sources.declarative.retrievers import (
353
370
  AsyncRetriever,
@@ -356,8 +373,11 @@ from airbyte_cdk.sources.declarative.retrievers import (
356
373
  )
357
374
  from airbyte_cdk.sources.declarative.schema import (
358
375
  DefaultSchemaLoader,
376
+ DynamicSchemaLoader,
359
377
  InlineSchemaLoader,
360
378
  JsonFileSchemaLoader,
379
+ SchemaTypeIdentifier,
380
+ TypesMap,
361
381
  )
362
382
  from airbyte_cdk.sources.declarative.spec import Spec
363
383
  from airbyte_cdk.sources.declarative.stream_slicers import StreamSlicer
@@ -455,6 +475,9 @@ class ModelToComponentFactory:
455
475
  IterableDecoderModel: self.create_iterable_decoder,
456
476
  XmlDecoderModel: self.create_xml_decoder,
457
477
  JsonFileSchemaLoaderModel: self.create_json_file_schema_loader,
478
+ DynamicSchemaLoaderModel: self.create_dynamic_schema_loader,
479
+ SchemaTypeIdentifierModel: self.create_schema_type_identifier,
480
+ TypesMapModel: self.create_types_map,
458
481
  JwtAuthenticatorModel: self.create_jwt_authenticator,
459
482
  LegacyToPerPartitionStateMigrationModel: self.create_legacy_to_per_partition_state_migration,
460
483
  ListPartitionRouterModel: self.create_list_partition_router,
@@ -479,6 +502,8 @@ class ModelToComponentFactory:
479
502
  WaitUntilTimeFromHeaderModel: self.create_wait_until_time_from_header,
480
503
  AsyncRetrieverModel: self.create_async_retriever,
481
504
  HttpComponentsResolverModel: self.create_http_components_resolver,
505
+ ConfigComponentsResolverModel: self.create_config_components_resolver,
506
+ StreamConfigModel: self.create_stream_config,
482
507
  ComponentMappingDefinitionModel: self.create_components_mapping_definition,
483
508
  }
484
509
 
@@ -1574,6 +1599,63 @@ class ModelToComponentFactory:
1574
1599
  ) -> InlineSchemaLoader:
1575
1600
  return InlineSchemaLoader(schema=model.schema_ or {}, parameters={})
1576
1601
 
1602
+ @staticmethod
1603
+ def create_types_map(model: TypesMapModel, **kwargs: Any) -> TypesMap:
1604
+ return TypesMap(target_type=model.target_type, current_type=model.current_type)
1605
+
1606
+ def create_schema_type_identifier(
1607
+ self, model: SchemaTypeIdentifierModel, config: Config, **kwargs: Any
1608
+ ) -> SchemaTypeIdentifier:
1609
+ types_mapping = []
1610
+ if model.types_mapping:
1611
+ types_mapping.extend(
1612
+ [
1613
+ self._create_component_from_model(types_map, config=config)
1614
+ for types_map in model.types_mapping
1615
+ ]
1616
+ )
1617
+ model_schema_pointer: List[Union[InterpolatedString, str]] = (
1618
+ [x for x in model.schema_pointer] if model.schema_pointer else []
1619
+ )
1620
+ model_key_pointer: List[Union[InterpolatedString, str]] = [x for x in model.key_pointer]
1621
+ model_type_pointer: Optional[List[Union[InterpolatedString, str]]] = (
1622
+ [x for x in model.type_pointer] if model.type_pointer else None
1623
+ )
1624
+
1625
+ return SchemaTypeIdentifier(
1626
+ schema_pointer=model_schema_pointer,
1627
+ key_pointer=model_key_pointer,
1628
+ type_pointer=model_type_pointer,
1629
+ types_mapping=types_mapping,
1630
+ parameters=model.parameters or {},
1631
+ )
1632
+
1633
+ def create_dynamic_schema_loader(
1634
+ self, model: DynamicSchemaLoaderModel, config: Config, **kwargs: Any
1635
+ ) -> DynamicSchemaLoader:
1636
+ stream_slicer = self._build_stream_slicer_from_partition_router(model.retriever, config)
1637
+ combined_slicers = self._build_resumable_cursor_from_paginator(
1638
+ model.retriever, stream_slicer
1639
+ )
1640
+
1641
+ retriever = self._create_component_from_model(
1642
+ model=model.retriever,
1643
+ config=config,
1644
+ name="",
1645
+ primary_key=None,
1646
+ stream_slicer=combined_slicers,
1647
+ transformations=[],
1648
+ )
1649
+ schema_type_identifier = self._create_component_from_model(
1650
+ model.schema_type_identifier, config=config, parameters=model.parameters or {}
1651
+ )
1652
+ return DynamicSchemaLoader(
1653
+ retriever=retriever,
1654
+ config=config,
1655
+ schema_type_identifier=schema_type_identifier,
1656
+ parameters=model.parameters or {},
1657
+ )
1658
+
1577
1659
  @staticmethod
1578
1660
  def create_json_decoder(model: JsonDecoderModel, config: Config, **kwargs: Any) -> JsonDecoder:
1579
1661
  return JsonDecoder(parameters={})
@@ -1812,8 +1894,8 @@ class ModelToComponentFactory:
1812
1894
  self,
1813
1895
  model: RecordSelectorModel,
1814
1896
  config: Config,
1815
- name: str,
1816
1897
  *,
1898
+ name: str,
1817
1899
  transformations: List[RecordTransformation],
1818
1900
  decoder: Optional[Decoder] = None,
1819
1901
  client_side_incremental_sync: Optional[Dict[str, Any]] = None,
@@ -2292,3 +2374,41 @@ class ModelToComponentFactory:
2292
2374
  components_mapping=components_mapping,
2293
2375
  parameters=model.parameters or {},
2294
2376
  )
2377
+
2378
+ @staticmethod
2379
+ def create_stream_config(
2380
+ model: StreamConfigModel, config: Config, **kwargs: Any
2381
+ ) -> StreamConfig:
2382
+ model_configs_pointer: List[Union[InterpolatedString, str]] = (
2383
+ [x for x in model.configs_pointer] if model.configs_pointer else []
2384
+ )
2385
+
2386
+ return StreamConfig(
2387
+ configs_pointer=model_configs_pointer,
2388
+ parameters=model.parameters or {},
2389
+ )
2390
+
2391
+ def create_config_components_resolver(
2392
+ self, model: ConfigComponentsResolverModel, config: Config
2393
+ ) -> Any:
2394
+ stream_config = self._create_component_from_model(
2395
+ model.stream_config, config=config, parameters=model.parameters or {}
2396
+ )
2397
+
2398
+ components_mapping = [
2399
+ self._create_component_from_model(
2400
+ model=components_mapping_definition_model,
2401
+ value_type=ModelToComponentFactory._json_schema_type_name_to_type(
2402
+ components_mapping_definition_model.value_type
2403
+ ),
2404
+ config=config,
2405
+ )
2406
+ for components_mapping_definition_model in model.components_mapping
2407
+ ]
2408
+
2409
+ return ConfigComponentsResolver(
2410
+ stream_config=stream_config,
2411
+ config=config,
2412
+ components_mapping=components_mapping,
2413
+ parameters=model.parameters or {},
2414
+ )
@@ -4,10 +4,15 @@
4
4
 
5
5
  from airbyte_cdk.sources.declarative.resolvers.components_resolver import ComponentsResolver, ComponentMappingDefinition, ResolvedComponentMappingDefinition
6
6
  from airbyte_cdk.sources.declarative.resolvers.http_components_resolver import HttpComponentsResolver
7
+ from airbyte_cdk.sources.declarative.resolvers.config_components_resolver import ConfigComponentsResolver, StreamConfig
7
8
  from airbyte_cdk.sources.declarative.models import HttpComponentsResolver as HttpComponentsResolverModel
9
+ from airbyte_cdk.sources.declarative.models import ConfigComponentsResolver as ConfigComponentsResolverModel
10
+ from pydantic.v1 import BaseModel
11
+ from typing import Mapping
8
12
 
9
- COMPONENTS_RESOLVER_TYPE_MAPPING = {
10
- "HttpComponentsResolver": HttpComponentsResolverModel
13
+ COMPONENTS_RESOLVER_TYPE_MAPPING: Mapping[str, type[BaseModel]] = {
14
+ "HttpComponentsResolver": HttpComponentsResolverModel,
15
+ "ConfigComponentsResolver": ConfigComponentsResolverModel
11
16
  }
12
17
 
13
- __all__ = ["ComponentsResolver", "HttpComponentsResolver", "ComponentMappingDefinition", "ResolvedComponentMappingDefinition", "COMPONENTS_RESOLVER_TYPE_MAPPING"]
18
+ __all__ = ["ComponentsResolver", "HttpComponentsResolver", "ComponentMappingDefinition", "ResolvedComponentMappingDefinition", "StreamConfig", "ConfigComponentsResolver", "COMPONENTS_RESOLVER_TYPE_MAPPING"]
@@ -0,0 +1,136 @@
1
+ #
2
+ # Copyright (c) 2024 Airbyte, Inc., all rights reserved.
3
+ #
4
+
5
+ from copy import deepcopy
6
+ from dataclasses import InitVar, dataclass, field
7
+ from typing import Any, Dict, Iterable, List, Mapping, Union
8
+
9
+ import dpath
10
+ from typing_extensions import deprecated
11
+
12
+ from airbyte_cdk.sources.declarative.interpolation import InterpolatedString
13
+ from airbyte_cdk.sources.declarative.resolvers.components_resolver import (
14
+ ComponentMappingDefinition,
15
+ ComponentsResolver,
16
+ ResolvedComponentMappingDefinition,
17
+ )
18
+ from airbyte_cdk.sources.source import ExperimentalClassWarning
19
+ from airbyte_cdk.sources.types import Config
20
+
21
+
22
+ @deprecated("This class is experimental. Use at your own risk.", category=ExperimentalClassWarning)
23
+ @dataclass
24
+ class StreamConfig:
25
+ """
26
+ Identifies stream config details for dynamic schema extraction and processing.
27
+ """
28
+
29
+ configs_pointer: List[Union[InterpolatedString, str]]
30
+ parameters: InitVar[Mapping[str, Any]]
31
+
32
+ def __post_init__(self, parameters: Mapping[str, Any]) -> None:
33
+ self.configs_pointer = [
34
+ InterpolatedString.create(path, parameters=parameters) for path in self.configs_pointer
35
+ ]
36
+
37
+
38
+ @deprecated("This class is experimental. Use at your own risk.", category=ExperimentalClassWarning)
39
+ @dataclass
40
+ class ConfigComponentsResolver(ComponentsResolver):
41
+ """
42
+ Resolves and populates stream templates with components fetched via source config.
43
+
44
+ Attributes:
45
+ stream_config (StreamConfig): The description of stream configuration used to fetch stream config from source config.
46
+ config (Config): Configuration object for the resolver.
47
+ components_mapping (List[ComponentMappingDefinition]): List of mappings to resolve.
48
+ parameters (InitVar[Mapping[str, Any]]): Additional parameters for interpolation.
49
+ """
50
+
51
+ stream_config: StreamConfig
52
+ config: Config
53
+ components_mapping: List[ComponentMappingDefinition]
54
+ parameters: InitVar[Mapping[str, Any]]
55
+ _resolved_components: List[ResolvedComponentMappingDefinition] = field(
56
+ init=False, repr=False, default_factory=list
57
+ )
58
+
59
+ def __post_init__(self, parameters: Mapping[str, Any]) -> None:
60
+ """
61
+ Initializes and parses component mappings, converting them to resolved definitions.
62
+
63
+ Args:
64
+ parameters (Mapping[str, Any]): Parameters for interpolation.
65
+ """
66
+
67
+ for component_mapping in self.components_mapping:
68
+ if isinstance(component_mapping.value, (str, InterpolatedString)):
69
+ interpolated_value = (
70
+ InterpolatedString.create(component_mapping.value, parameters=parameters)
71
+ if isinstance(component_mapping.value, str)
72
+ else component_mapping.value
73
+ )
74
+
75
+ field_path = [
76
+ InterpolatedString.create(path, parameters=parameters)
77
+ for path in component_mapping.field_path
78
+ ]
79
+
80
+ self._resolved_components.append(
81
+ ResolvedComponentMappingDefinition(
82
+ field_path=field_path,
83
+ value=interpolated_value,
84
+ value_type=component_mapping.value_type,
85
+ parameters=parameters,
86
+ )
87
+ )
88
+ else:
89
+ raise ValueError(
90
+ f"Expected a string or InterpolatedString for value in mapping: {component_mapping}"
91
+ )
92
+
93
+ @property
94
+ def _stream_config(self) -> Iterable[Mapping[str, Any]]:
95
+ path = [
96
+ node.eval(self.config) if not isinstance(node, str) else node
97
+ for node in self.stream_config.configs_pointer
98
+ ]
99
+ stream_config = dpath.get(dict(self.config), path, default=[])
100
+
101
+ if not isinstance(stream_config, list):
102
+ stream_config = [stream_config]
103
+
104
+ return stream_config
105
+
106
+ def resolve_components(
107
+ self, stream_template_config: Dict[str, Any]
108
+ ) -> Iterable[Dict[str, Any]]:
109
+ """
110
+ Resolves components in the stream template configuration by populating values.
111
+
112
+ Args:
113
+ stream_template_config (Dict[str, Any]): Stream template to populate.
114
+
115
+ Yields:
116
+ Dict[str, Any]: Updated configurations with resolved components.
117
+ """
118
+ kwargs = {"stream_template_config": stream_template_config}
119
+
120
+ for components_values in self._stream_config:
121
+ updated_config = deepcopy(stream_template_config)
122
+ kwargs["components_values"] = components_values # type: ignore[assignment] # component_values will always be of type Mapping[str, Any]
123
+
124
+ for resolved_component in self._resolved_components:
125
+ valid_types = (
126
+ (resolved_component.value_type,) if resolved_component.value_type else None
127
+ )
128
+ value = resolved_component.value.eval(
129
+ self.config, valid_types=valid_types, **kwargs
130
+ )
131
+
132
+ path = [path.eval(self.config, **kwargs) for path in resolved_component.field_path]
133
+
134
+ dpath.set(updated_config, path, value)
135
+
136
+ yield updated_config
@@ -6,5 +6,6 @@ from airbyte_cdk.sources.declarative.schema.default_schema_loader import Default
6
6
  from airbyte_cdk.sources.declarative.schema.inline_schema_loader import InlineSchemaLoader
7
7
  from airbyte_cdk.sources.declarative.schema.json_file_schema_loader import JsonFileSchemaLoader
8
8
  from airbyte_cdk.sources.declarative.schema.schema_loader import SchemaLoader
9
+ from airbyte_cdk.sources.declarative.schema.dynamic_schema_loader import DynamicSchemaLoader, TypesMap, SchemaTypeIdentifier
9
10
 
10
- __all__ = ["JsonFileSchemaLoader", "DefaultSchemaLoader", "SchemaLoader", "InlineSchemaLoader"]
11
+ __all__ = ["JsonFileSchemaLoader", "DefaultSchemaLoader", "SchemaLoader", "InlineSchemaLoader", "DynamicSchemaLoader", "TypesMap", "SchemaTypeIdentifier"]
@@ -0,0 +1,219 @@
1
+ #
2
+ # Copyright (c) 2024 Airbyte, Inc., all rights reserved.
3
+ #
4
+
5
+
6
+ from copy import deepcopy
7
+ from dataclasses import InitVar, dataclass
8
+ from typing import Any, List, Mapping, MutableMapping, Optional, Union
9
+
10
+ import dpath
11
+ from typing_extensions import deprecated
12
+
13
+ from airbyte_cdk.sources.declarative.interpolation.interpolated_string import InterpolatedString
14
+ from airbyte_cdk.sources.declarative.retrievers.retriever import Retriever
15
+ from airbyte_cdk.sources.declarative.schema.schema_loader import SchemaLoader
16
+ from airbyte_cdk.sources.source import ExperimentalClassWarning
17
+ from airbyte_cdk.sources.types import Config
18
+
19
+ AIRBYTE_DATA_TYPES: Mapping[str, Mapping[str, Any]] = {
20
+ "string": {"type": ["null", "string"]},
21
+ "boolean": {"type": ["null", "boolean"]},
22
+ "date": {"type": ["null", "string"], "format": "date"},
23
+ "timestamp_without_timezone": {
24
+ "type": ["null", "string"],
25
+ "format": "date-time",
26
+ "airbyte_type": "timestamp_without_timezone",
27
+ },
28
+ "timestamp_with_timezone": {"type": ["null", "string"], "format": "date-time"},
29
+ "time_without_timezone": {
30
+ "type": ["null", "string"],
31
+ "format": "time",
32
+ "airbyte_type": "time_without_timezone",
33
+ },
34
+ "time_with_timezone": {
35
+ "type": ["null", "string"],
36
+ "format": "time",
37
+ "airbyte_type": "time_with_timezone",
38
+ },
39
+ "integer": {"type": ["null", "integer"]},
40
+ "number": {"type": ["null", "number"]},
41
+ "array": {"type": ["null", "array"]},
42
+ "object": {"type": ["null", "object"]},
43
+ }
44
+
45
+
46
+ @deprecated("This class is experimental. Use at your own risk.", category=ExperimentalClassWarning)
47
+ @dataclass(frozen=True)
48
+ class TypesMap:
49
+ """
50
+ Represents a mapping between a current type and its corresponding target type.
51
+ """
52
+
53
+ target_type: Union[List[str], str]
54
+ current_type: Union[List[str], str]
55
+
56
+
57
+ @deprecated("This class is experimental. Use at your own risk.", category=ExperimentalClassWarning)
58
+ @dataclass
59
+ class SchemaTypeIdentifier:
60
+ """
61
+ Identifies schema details for dynamic schema extraction and processing.
62
+ """
63
+
64
+ key_pointer: List[Union[InterpolatedString, str]]
65
+ parameters: InitVar[Mapping[str, Any]]
66
+ type_pointer: Optional[List[Union[InterpolatedString, str]]] = None
67
+ types_mapping: Optional[List[TypesMap]] = None
68
+ schema_pointer: Optional[List[Union[InterpolatedString, str]]] = None
69
+
70
+ def __post_init__(self, parameters: Mapping[str, Any]) -> None:
71
+ self.schema_pointer = (
72
+ self._update_pointer(self.schema_pointer, parameters) if self.schema_pointer else []
73
+ ) # type: ignore[assignment] # This is reqired field in model
74
+ self.key_pointer = self._update_pointer(self.key_pointer, parameters) # type: ignore[assignment] # This is reqired field in model
75
+ self.type_pointer = (
76
+ self._update_pointer(self.type_pointer, parameters) if self.type_pointer else None
77
+ )
78
+
79
+ @staticmethod
80
+ def _update_pointer(
81
+ pointer: Optional[List[Union[InterpolatedString, str]]], parameters: Mapping[str, Any]
82
+ ) -> Optional[List[Union[InterpolatedString, str]]]:
83
+ return (
84
+ [
85
+ InterpolatedString.create(path, parameters=parameters)
86
+ if isinstance(path, str)
87
+ else path
88
+ for path in pointer
89
+ ]
90
+ if pointer
91
+ else None
92
+ )
93
+
94
+
95
+ @deprecated("This class is experimental. Use at your own risk.", category=ExperimentalClassWarning)
96
+ @dataclass
97
+ class DynamicSchemaLoader(SchemaLoader):
98
+ """
99
+ Dynamically loads a JSON Schema by extracting data from retrieved records.
100
+ """
101
+
102
+ retriever: Retriever
103
+ config: Config
104
+ parameters: InitVar[Mapping[str, Any]]
105
+ schema_type_identifier: SchemaTypeIdentifier
106
+
107
+ def get_json_schema(self) -> Mapping[str, Any]:
108
+ """
109
+ Constructs a JSON Schema based on retrieved data.
110
+ """
111
+ properties = {}
112
+ retrieved_record = next(self.retriever.read_records({}), None) # type: ignore[call-overload] # read_records return Iterable data type
113
+
114
+ raw_schema = (
115
+ self._extract_data(
116
+ retrieved_record, # type: ignore[arg-type] # Expected that retrieved_record will be only Mapping[str, Any]
117
+ self.schema_type_identifier.schema_pointer,
118
+ )
119
+ if retrieved_record
120
+ else []
121
+ )
122
+
123
+ for property_definition in raw_schema:
124
+ key = self._get_key(property_definition, self.schema_type_identifier.key_pointer)
125
+ value = self._get_type(
126
+ property_definition,
127
+ self.schema_type_identifier.type_pointer,
128
+ )
129
+ properties[key] = value
130
+
131
+ return {
132
+ "$schema": "http://json-schema.org/draft-07/schema#",
133
+ "type": "object",
134
+ "properties": properties,
135
+ }
136
+
137
+ def _get_key(
138
+ self,
139
+ raw_schema: MutableMapping[str, Any],
140
+ field_key_path: List[Union[InterpolatedString, str]],
141
+ ) -> str:
142
+ """
143
+ Extracts the key field from the schema using the specified path.
144
+ """
145
+ field_key = self._extract_data(raw_schema, field_key_path)
146
+ if not isinstance(field_key, str):
147
+ raise ValueError(f"Expected key to be a string. Got {field_key}")
148
+ return field_key
149
+
150
+ def _get_type(
151
+ self,
152
+ raw_schema: MutableMapping[str, Any],
153
+ field_type_path: Optional[List[Union[InterpolatedString, str]]],
154
+ ) -> Union[Mapping[str, Any], List[Mapping[str, Any]]]:
155
+ """
156
+ Determines the JSON Schema type for a field, supporting nullable and combined types.
157
+ """
158
+ raw_field_type = (
159
+ self._extract_data(raw_schema, field_type_path, default="string")
160
+ if field_type_path
161
+ else "string"
162
+ )
163
+ mapped_field_type = self._replace_type_if_not_valid(raw_field_type)
164
+ if (
165
+ isinstance(mapped_field_type, list)
166
+ and len(mapped_field_type) == 2
167
+ and all(isinstance(item, str) for item in mapped_field_type)
168
+ ):
169
+ first_type = self._get_airbyte_type(mapped_field_type[0])
170
+ second_type = self._get_airbyte_type(mapped_field_type[1])
171
+ return {"oneOf": [first_type, second_type]}
172
+ elif isinstance(mapped_field_type, str):
173
+ return self._get_airbyte_type(mapped_field_type)
174
+ else:
175
+ raise ValueError(
176
+ f"Invalid data type. Available string or two items list of string. Got {mapped_field_type}."
177
+ )
178
+
179
+ def _replace_type_if_not_valid(
180
+ self, field_type: Union[List[str], str]
181
+ ) -> Union[List[str], str]:
182
+ """
183
+ Replaces a field type if it matches a type mapping in `types_map`.
184
+ """
185
+ if self.schema_type_identifier.types_mapping:
186
+ for types_map in self.schema_type_identifier.types_mapping:
187
+ if field_type == types_map.current_type:
188
+ return types_map.target_type
189
+ return field_type
190
+
191
+ @staticmethod
192
+ def _get_airbyte_type(field_type: str) -> Mapping[str, Any]:
193
+ """
194
+ Maps a field type to its corresponding Airbyte type definition.
195
+ """
196
+ if field_type not in AIRBYTE_DATA_TYPES:
197
+ raise ValueError(f"Invalid Airbyte data type: {field_type}")
198
+
199
+ return deepcopy(AIRBYTE_DATA_TYPES[field_type])
200
+
201
+ def _extract_data(
202
+ self,
203
+ body: Mapping[str, Any],
204
+ extraction_path: Optional[List[Union[InterpolatedString, str]]] = None,
205
+ default: Any = None,
206
+ ) -> Any:
207
+ """
208
+ Extracts data from the body based on the provided extraction path.
209
+ """
210
+
211
+ if not extraction_path:
212
+ return body
213
+
214
+ path = [
215
+ node.eval(self.config) if not isinstance(node, str) else node
216
+ for node in extraction_path
217
+ ]
218
+
219
+ return dpath.get(body, path, default=default) # type: ignore # extracted will be a MutableMapping, given input data structure
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: airbyte-cdk
3
- Version: 6.10.0
3
+ Version: 6.11.0
4
4
  Summary: A framework for writing Airbyte Connectors.
5
5
  Home-page: https://airbyte.com
6
6
  License: MIT
@@ -54,7 +54,7 @@ airbyte_cdk/sources/declarative/auth/__init__.py,sha256=hhiJV3kU5_fja7hQYWqbYjjt
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
56
  airbyte_cdk/sources/declarative/auth/oauth.py,sha256=_4Kaa8ZfmvMzUyLeaWm03Aux9uVBh1ia-sSlUxVB24I,8480
57
- airbyte_cdk/sources/declarative/auth/selective_authenticator.py,sha256=iCEUSmbW-C8mmNOwdAFG885mnI8iWBkywrlPE6x3Ko0,1541
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
60
60
  airbyte_cdk/sources/declarative/checks/__init__.py,sha256=WWXMfvKkndqwAUZdgSr7xVHVXDFTKCUQ9EubqT7H4QE,274
@@ -66,7 +66,7 @@ airbyte_cdk/sources/declarative/concurrent_declarative_source.py,sha256=PxP4p268
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=Z1v19wOXYpuffvcmZ5TZyU4kSCFyt3Hba7qfY-2o46U,124229
69
+ airbyte_cdk/sources/declarative/declarative_component_schema.yaml,sha256=bmuzrO0q4yeRXXkAMAFdzgtDx2gF8-k8ERq2MqVMgq4,128593
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
@@ -99,17 +99,17 @@ airbyte_cdk/sources/declarative/interpolation/interpolated_string.py,sha256=LYEZ
99
99
  airbyte_cdk/sources/declarative/interpolation/interpolation.py,sha256=-V5UddGm69UKEB6o_O1EIES9kfY8FV_X4Ji8w1yOuSA,981
100
100
  airbyte_cdk/sources/declarative/interpolation/jinja.py,sha256=BtsY_jtT4MihFqeQgc05HXj3Ndt-e2ESQgGwbg3Sdxc,6430
101
101
  airbyte_cdk/sources/declarative/interpolation/macros.py,sha256=jf24RK-1fBhTYDpcGEakZtGNNJfG5NS8CCF5bEgNmRo,3977
102
- airbyte_cdk/sources/declarative/manifest_declarative_source.py,sha256=-v3GvuTVHwUonrfUwDj3wYKaZjX6hTyKmMBRgEzj-j0,15201
102
+ airbyte_cdk/sources/declarative/manifest_declarative_source.py,sha256=wX_dQ401siuwh3zHgSHRnSN1vIojI4Nufg3BwzZAzk0,16239
103
103
  airbyte_cdk/sources/declarative/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
104
104
  airbyte_cdk/sources/declarative/migrations/legacy_to_per_partition_state_migration.py,sha256=iemy3fKLczcU0-Aor7tx5jcT6DRedKMqyK7kCOp01hg,3924
105
105
  airbyte_cdk/sources/declarative/migrations/state_migration.py,sha256=KWPjealMLKSMtajXgkdGgKg7EmTLR-CqqD7UIh0-eDU,794
106
106
  airbyte_cdk/sources/declarative/models/__init__.py,sha256=nUFxNCiKeYRVXuZEKA7GD-lTHxsiKcQ8FitZjKhPIvE,100
107
- airbyte_cdk/sources/declarative/models/declarative_component_schema.py,sha256=6iAzpGmUrhwEUQcCL5bW-FXuLXPMeFqs_GR4B1rS3ZE,88511
107
+ airbyte_cdk/sources/declarative/models/declarative_component_schema.py,sha256=-XTzt8EY23Qel7KZINQIbQOoBWqdiK6am-p7A615AI0,90753
108
108
  airbyte_cdk/sources/declarative/parsers/__init__.py,sha256=ZnqYNxHsKCgO38IwB34RQyRMXTs4GTvlRi3ImKnIioo,61
109
109
  airbyte_cdk/sources/declarative/parsers/custom_exceptions.py,sha256=Rir9_z3Kcd5Es0-LChrzk-0qubAsiK_RSEnLmK2OXm8,553
110
- airbyte_cdk/sources/declarative/parsers/manifest_component_transformer.py,sha256=0jfi-ogL-rOVORTIYnu64wNfh1L8fYaLVDWzJ2zGdi8,8799
110
+ airbyte_cdk/sources/declarative/parsers/manifest_component_transformer.py,sha256=CXwTfD3wSQq3okcqwigpprbHhSURUokh4GK2OmOyKC8,9132
111
111
  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=lS2oKfkND54u66hocc2BycS-AIYIbkn4npq6CFRNokc,99573
112
+ airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py,sha256=UWUlj6m2WT9SspMtvvhni31FoQBrkqnHGzrwFKem-Qc,104367
113
113
  airbyte_cdk/sources/declarative/partition_routers/__init__.py,sha256=1NjaZoGAIefvWwj6wx-LOKIXXWS-UnBlZFnuR7y6uYA,745
114
114
  airbyte_cdk/sources/declarative/partition_routers/cartesian_product_stream_slicer.py,sha256=c5cuVFM6NFkuQqG8Z5IwkBuwDrvXZN1CunUOM_L0ezg,6892
115
115
  airbyte_cdk/sources/declarative/partition_routers/list_partition_router.py,sha256=t7pRdFWfFWJtQQG19c9PVeMODyO2BknRTakpM5U9N-8,4844
@@ -152,15 +152,17 @@ airbyte_cdk/sources/declarative/requesters/request_options/interpolated_request_
152
152
  airbyte_cdk/sources/declarative/requesters/request_options/request_options_provider.py,sha256=8YRiDzjYvqJ-aMmKFcjqzv_-e8OZ5QG_TbpZ-nuCu6s,2590
153
153
  airbyte_cdk/sources/declarative/requesters/request_path.py,sha256=S3MeFvcaQrMbOkSY2W2VbXLNomqt_3eXqVd9ZhgNwUs,299
154
154
  airbyte_cdk/sources/declarative/requesters/requester.py,sha256=iVVpXQ4KEd9OyZNwmOofMvx7_06i8ZRxGo3aNTrEQLM,4946
155
- airbyte_cdk/sources/declarative/resolvers/__init__.py,sha256=8cL--3WCJvtKVIIAqKWoIEhmmf3FemB7PlsnO0Mx_cY,688
155
+ airbyte_cdk/sources/declarative/resolvers/__init__.py,sha256=RAwq1VrkC0kAaIkmKkL7so8ZeUzF0MgUQ0tciGkY7v4,1116
156
156
  airbyte_cdk/sources/declarative/resolvers/components_resolver.py,sha256=KPjKc0yb9artL4ZkeqN8RmEykHH6FJgqXD7fCEnh1X0,1936
157
+ airbyte_cdk/sources/declarative/resolvers/config_components_resolver.py,sha256=dz4iJV9liD_LzY_Mn4XmAStoUll60R3MIGWV4aN3pgg,5223
157
158
  airbyte_cdk/sources/declarative/resolvers/http_components_resolver.py,sha256=ZA2vrHQKfXNMcH3x1iuyFOTGNzYDhUFT2qcaiOzSK0A,4271
158
159
  airbyte_cdk/sources/declarative/retrievers/__init__.py,sha256=FVQpUGVwp2Gibk4gp07VmLKX5AafUlsZWFSrDpUDuJM,443
159
160
  airbyte_cdk/sources/declarative/retrievers/async_retriever.py,sha256=WDFnjrXLz3-YEjFhmlMkWAn9AJvnZ0mk9FyC8DAhEYk,4976
160
161
  airbyte_cdk/sources/declarative/retrievers/retriever.py,sha256=XPLs593Xv8c5cKMc37XzUAYmzlXd1a7eSsspM-CMuWA,1696
161
162
  airbyte_cdk/sources/declarative/retrievers/simple_retriever.py,sha256=N4swGw5mfuTXJ2R7AKX18CHzizsr69pXwt5uSHLPi48,24172
162
- airbyte_cdk/sources/declarative/schema/__init__.py,sha256=ul8L9S0-__AMEdbCLHBq-PMEeA928NVp8BB83BMotfU,517
163
+ airbyte_cdk/sources/declarative/schema/__init__.py,sha256=Io9vninzlEjQ2uFmWklxfwNM0cXfljtzOz5zL1OVyT4,701
163
164
  airbyte_cdk/sources/declarative/schema/default_schema_loader.py,sha256=KTACrIE23a83wsm3Rd9Eb4K6-20lrGqYxTHNp9yxsso,1820
165
+ airbyte_cdk/sources/declarative/schema/dynamic_schema_loader.py,sha256=tP5DIEMn-k2JshWeXmo53ZEudDAVb4AJ50Z5tfme_ZU,8063
164
166
  airbyte_cdk/sources/declarative/schema/inline_schema_loader.py,sha256=bVETE10hRsatRJq3R3BeyRR0wIoK3gcP1gcpVRQ_P5U,464
165
167
  airbyte_cdk/sources/declarative/schema/json_file_schema_loader.py,sha256=5Wl-fqW-pVf_dxJ4yGHMAFfC4JjKHYJhqFJT1xA57F4,4177
166
168
  airbyte_cdk/sources/declarative/schema/schema_loader.py,sha256=kjt8v0N5wWKA5zyLnrDLxf1PJKdUqvQq2RVnAOAzNSY,379
@@ -334,8 +336,8 @@ airbyte_cdk/utils/slice_hasher.py,sha256=-pHexlNYoWYPnXNH-M7HEbjmeJe9Zk7SJijdQ7d
334
336
  airbyte_cdk/utils/spec_schema_transformations.py,sha256=-5HTuNsnDBAhj-oLeQXwpTGA0HdcjFOf2zTEMUTTg_Y,816
335
337
  airbyte_cdk/utils/stream_status_utils.py,sha256=ZmBoiy5HVbUEHAMrUONxZvxnvfV9CesmQJLDTAIWnWw,1171
336
338
  airbyte_cdk/utils/traced_exception.py,sha256=C8uIBuCL_E4WnBAOPSxBicD06JAldoN9fGsQDp463OY,6292
337
- airbyte_cdk-6.10.0.dist-info/LICENSE.txt,sha256=Wfe61S4BaGPj404v8lrAbvhjYR68SHlkzeYrg3_bbuM,1051
338
- airbyte_cdk-6.10.0.dist-info/METADATA,sha256=BvuCAHh26Vy7ycWP-SM1bZwvICnuHq-yHDH_-7pwgWo,5950
339
- airbyte_cdk-6.10.0.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
340
- airbyte_cdk-6.10.0.dist-info/entry_points.txt,sha256=fj-e3PAQvsxsQzyyq8UkG1k8spunWnD4BAH2AwlR6NM,95
341
- airbyte_cdk-6.10.0.dist-info/RECORD,,
339
+ airbyte_cdk-6.11.0.dist-info/LICENSE.txt,sha256=Wfe61S4BaGPj404v8lrAbvhjYR68SHlkzeYrg3_bbuM,1051
340
+ airbyte_cdk-6.11.0.dist-info/METADATA,sha256=S3t70lGuk6FXmjQiFBtjcSdC_y4Ctzq2LIB8Nqgv_Lk,5950
341
+ airbyte_cdk-6.11.0.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
342
+ airbyte_cdk-6.11.0.dist-info/entry_points.txt,sha256=fj-e3PAQvsxsQzyyq8UkG1k8spunWnD4BAH2AwlR6NM,95
343
+ airbyte_cdk-6.11.0.dist-info/RECORD,,