airbyte-cdk 6.20.1__py3-none-any.whl → 6.21.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.
@@ -1513,6 +1513,7 @@ definitions:
1513
1513
  anyOf:
1514
1514
  - "$ref": "#/definitions/JsonDecoder"
1515
1515
  - "$ref": "#/definitions/XmlDecoder"
1516
+ - "$ref": "#/definitions/CompositeRawDecoder"
1516
1517
  $parameters:
1517
1518
  type: object
1518
1519
  additionalProperties: true
@@ -2071,6 +2072,26 @@ definitions:
2071
2072
  $parameters:
2072
2073
  type: object
2073
2074
  additionalProperties: true
2075
+ ZipfileDecoder:
2076
+ title: Zipfile Decoder
2077
+ description: Decoder for response data that is returned as zipfile(s).
2078
+ type: object
2079
+ additionalProperties: true
2080
+ required:
2081
+ - type
2082
+ - parser
2083
+ properties:
2084
+ type:
2085
+ type: string
2086
+ enum: [ZipfileDecoder]
2087
+ parser:
2088
+ title: Parser
2089
+ description: Parser to parse the decompressed data from the zipfile(s).
2090
+ anyOf:
2091
+ - "$ref": "#/definitions/GzipParser"
2092
+ - "$ref": "#/definitions/JsonParser"
2093
+ - "$ref": "#/definitions/JsonLineParser"
2094
+ - "$ref": "#/definitions/CsvParser"
2074
2095
  ListPartitionRouter:
2075
2096
  title: List Partition Router
2076
2097
  description: A Partition router that specifies a list of attributes where each attribute describes a portion of the complete data set for a stream. During a sync, each value is iterated over and can be used as input to outbound API requests.
@@ -2899,6 +2920,7 @@ definitions:
2899
2920
  - "$ref": "#/definitions/XmlDecoder"
2900
2921
  - "$ref": "#/definitions/GzipJsonDecoder"
2901
2922
  - "$ref": "#/definitions/CompositeRawDecoder"
2923
+ - "$ref": "#/definitions/ZipfileDecoder"
2902
2924
  $parameters:
2903
2925
  type: object
2904
2926
  additionalProperties: true
@@ -3097,6 +3119,8 @@ definitions:
3097
3119
  - "$ref": "#/definitions/IterableDecoder"
3098
3120
  - "$ref": "#/definitions/XmlDecoder"
3099
3121
  - "$ref": "#/definitions/GzipJsonDecoder"
3122
+ - "$ref": "#/definitions/CompositeRawDecoder"
3123
+ - "$ref": "#/definitions/ZipfileDecoder"
3100
3124
  download_decoder:
3101
3125
  title: Download Decoder
3102
3126
  description: Component decoding the download response so records can be extracted.
@@ -3107,6 +3131,8 @@ definitions:
3107
3131
  - "$ref": "#/definitions/IterableDecoder"
3108
3132
  - "$ref": "#/definitions/XmlDecoder"
3109
3133
  - "$ref": "#/definitions/GzipJsonDecoder"
3134
+ - "$ref": "#/definitions/CompositeRawDecoder"
3135
+ - "$ref": "#/definitions/ZipfileDecoder"
3110
3136
  $parameters:
3111
3137
  type: object
3112
3138
  additionalProperties: true
@@ -2,7 +2,12 @@
2
2
  # Copyright (c) 2023 Airbyte, Inc., all rights reserved.
3
3
  #
4
4
 
5
- from airbyte_cdk.sources.declarative.decoders.composite_raw_decoder import CompositeRawDecoder
5
+ from airbyte_cdk.sources.declarative.decoders.composite_raw_decoder import (
6
+ CompositeRawDecoder,
7
+ GzipParser,
8
+ JsonParser,
9
+ Parser,
10
+ )
6
11
  from airbyte_cdk.sources.declarative.decoders.decoder import Decoder
7
12
  from airbyte_cdk.sources.declarative.decoders.json_decoder import (
8
13
  GzipJsonDecoder,
@@ -15,15 +20,18 @@ from airbyte_cdk.sources.declarative.decoders.pagination_decoder_decorator impor
15
20
  PaginationDecoderDecorator,
16
21
  )
17
22
  from airbyte_cdk.sources.declarative.decoders.xml_decoder import XmlDecoder
23
+ from airbyte_cdk.sources.declarative.decoders.zipfile_decoder import ZipfileDecoder
18
24
 
19
25
  __all__ = [
20
26
  "Decoder",
21
27
  "CompositeRawDecoder",
22
28
  "JsonDecoder",
29
+ "JsonParser",
23
30
  "JsonlDecoder",
24
31
  "IterableDecoder",
25
32
  "GzipJsonDecoder",
26
33
  "NoopDecoder",
27
34
  "PaginationDecoderDecorator",
28
35
  "XmlDecoder",
36
+ "ZipfileDecoder",
29
37
  ]
@@ -0,0 +1,59 @@
1
+ #
2
+ # Copyright (c) 2024 Airbyte, Inc., all rights reserved.
3
+ #
4
+
5
+ import logging
6
+ import zipfile
7
+ from dataclasses import dataclass
8
+ from io import BytesIO
9
+ from typing import Any, Generator, MutableMapping
10
+
11
+ import orjson
12
+ import requests
13
+
14
+ from airbyte_cdk.models import FailureType
15
+ from airbyte_cdk.sources.declarative.decoders import Decoder
16
+ from airbyte_cdk.sources.declarative.decoders.composite_raw_decoder import (
17
+ Parser,
18
+ )
19
+ from airbyte_cdk.utils import AirbyteTracedException
20
+
21
+ logger = logging.getLogger("airbyte")
22
+
23
+
24
+ @dataclass
25
+ class ZipfileDecoder(Decoder):
26
+ parser: Parser
27
+
28
+ def is_stream_response(self) -> bool:
29
+ return False
30
+
31
+ def decode(
32
+ self, response: requests.Response
33
+ ) -> Generator[MutableMapping[str, Any], None, None]:
34
+ try:
35
+ with zipfile.ZipFile(BytesIO(response.content)) as zip_file:
36
+ for file_name in zip_file.namelist():
37
+ unzipped_content = zip_file.read(file_name)
38
+ buffered_content = BytesIO(unzipped_content)
39
+ try:
40
+ yield from self.parser.parse(buffered_content)
41
+ except Exception as e:
42
+ logger.error(
43
+ f"Failed to parse file: {file_name} from zip file: {response.request.url} with exception {e}."
44
+ )
45
+ raise AirbyteTracedException(
46
+ message=f"Failed to parse file: {file_name} from zip file.",
47
+ internal_message=f"Failed to parse file: {file_name} from zip file: {response.request.url}.",
48
+ failure_type=FailureType.system_error,
49
+ ) from e
50
+ except zipfile.BadZipFile as e:
51
+ logger.error(
52
+ f"Received an invalid zip file in response to URL: {response.request.url}. "
53
+ f"The size of the response body is: {len(response.content)}"
54
+ )
55
+ raise AirbyteTracedException(
56
+ message="Received an invalid zip file in response.",
57
+ internal_message=f"Received an invalid zip file in response to URL: {response.request.url}.",
58
+ failure_type=FailureType.system_error,
59
+ ) from e
@@ -1223,9 +1223,6 @@ class LegacySessionTokenAuthenticator(BaseModel):
1223
1223
 
1224
1224
 
1225
1225
  class JsonParser(BaseModel):
1226
- class Config:
1227
- extra = Extra.allow
1228
-
1229
1226
  type: Literal["JsonParser"]
1230
1227
  encoding: Optional[str] = "utf-8"
1231
1228
 
@@ -1661,6 +1658,18 @@ class CompositeErrorHandler(BaseModel):
1661
1658
  parameters: Optional[Dict[str, Any]] = Field(None, alias="$parameters")
1662
1659
 
1663
1660
 
1661
+ class ZipfileDecoder(BaseModel):
1662
+ class Config:
1663
+ extra = Extra.allow
1664
+
1665
+ type: Literal["ZipfileDecoder"]
1666
+ parser: Union[GzipParser, JsonParser, JsonLineParser, CsvParser] = Field(
1667
+ ...,
1668
+ description="Parser to parse the decompressed data from the zipfile(s).",
1669
+ title="Parser",
1670
+ )
1671
+
1672
+
1664
1673
  class CompositeRawDecoder(BaseModel):
1665
1674
  type: Literal["CompositeRawDecoder"]
1666
1675
  parser: Union[GzipParser, JsonParser, JsonLineParser, CsvParser]
@@ -1866,7 +1875,7 @@ class SessionTokenAuthenticator(BaseModel):
1866
1875
  description="Authentication method to use for requests sent to the API, specifying how to inject the session token.",
1867
1876
  title="Data Request Authentication",
1868
1877
  )
1869
- decoder: Optional[Union[JsonDecoder, XmlDecoder]] = Field(
1878
+ decoder: Optional[Union[JsonDecoder, XmlDecoder, CompositeRawDecoder]] = Field(
1870
1879
  None, description="Component used to decode the response.", title="Decoder"
1871
1880
  )
1872
1881
  parameters: Optional[Dict[str, Any]] = Field(None, alias="$parameters")
@@ -2071,6 +2080,7 @@ class SimpleRetriever(BaseModel):
2071
2080
  XmlDecoder,
2072
2081
  GzipJsonDecoder,
2073
2082
  CompositeRawDecoder,
2083
+ ZipfileDecoder,
2074
2084
  ]
2075
2085
  ] = Field(
2076
2086
  None,
@@ -2147,6 +2157,8 @@ class AsyncRetriever(BaseModel):
2147
2157
  IterableDecoder,
2148
2158
  XmlDecoder,
2149
2159
  GzipJsonDecoder,
2160
+ CompositeRawDecoder,
2161
+ ZipfileDecoder,
2150
2162
  ]
2151
2163
  ] = Field(
2152
2164
  None,
@@ -2161,6 +2173,8 @@ class AsyncRetriever(BaseModel):
2161
2173
  IterableDecoder,
2162
2174
  XmlDecoder,
2163
2175
  GzipJsonDecoder,
2176
+ CompositeRawDecoder,
2177
+ ZipfileDecoder,
2164
2178
  ]
2165
2179
  ] = Field(
2166
2180
  None,
@@ -66,6 +66,7 @@ from airbyte_cdk.sources.declarative.decoders import (
66
66
  JsonlDecoder,
67
67
  PaginationDecoderDecorator,
68
68
  XmlDecoder,
69
+ ZipfileDecoder,
69
70
  )
70
71
  from airbyte_cdk.sources.declarative.decoders.composite_raw_decoder import (
71
72
  CompositeRawDecoder,
@@ -356,6 +357,9 @@ from airbyte_cdk.sources.declarative.models.declarative_component_schema import
356
357
  from airbyte_cdk.sources.declarative.models.declarative_component_schema import (
357
358
  XmlDecoder as XmlDecoderModel,
358
359
  )
360
+ from airbyte_cdk.sources.declarative.models.declarative_component_schema import (
361
+ ZipfileDecoder as ZipfileDecoderModel,
362
+ )
359
363
  from airbyte_cdk.sources.declarative.partition_routers import (
360
364
  CartesianProductStreamSlicer,
361
365
  ListPartitionRouter,
@@ -571,6 +575,7 @@ class ModelToComponentFactory:
571
575
  ConfigComponentsResolverModel: self.create_config_components_resolver,
572
576
  StreamConfigModel: self.create_stream_config,
573
577
  ComponentMappingDefinitionModel: self.create_components_mapping_definition,
578
+ ZipfileDecoderModel: self.create_zipfile_decoder,
574
579
  }
575
580
 
576
581
  # Needed for the case where we need to perform a second parse on the fields of a custom component
@@ -1800,6 +1805,12 @@ class ModelToComponentFactory:
1800
1805
  ) -> GzipJsonDecoder:
1801
1806
  return GzipJsonDecoder(parameters={}, encoding=model.encoding)
1802
1807
 
1808
+ def create_zipfile_decoder(
1809
+ self, model: ZipfileDecoderModel, config: Config, **kwargs: Any
1810
+ ) -> ZipfileDecoder:
1811
+ parser = self._create_component_from_model(model=model.parser, config=config)
1812
+ return ZipfileDecoder(parser=parser)
1813
+
1803
1814
  def create_gzip_parser(
1804
1815
  self, model: GzipParserModel, config: Config, **kwargs: Any
1805
1816
  ) -> GzipParser:
@@ -9,6 +9,7 @@ from typing import Any, Callable, Dict, Generator, Mapping, Optional, cast
9
9
 
10
10
  from jsonschema import Draft7Validator, RefResolver, ValidationError, Validator, validators
11
11
 
12
+ MAX_NESTING_DEPTH = 3
12
13
  json_to_python_simple = {
13
14
  "string": str,
14
15
  "number": float,
@@ -225,6 +226,31 @@ class TypeTransformer:
225
226
  logger.warning(self.get_error_message(e))
226
227
 
227
228
  def get_error_message(self, e: ValidationError) -> str:
228
- instance_json_type = python_to_json[type(e.instance)]
229
- key_path = "." + ".".join(map(str, e.path))
230
- return f"Failed to transform value {repr(e.instance)} of type '{instance_json_type}' to '{e.validator_value}', key path: '{key_path}'"
229
+ """
230
+ Construct a sanitized error message from a ValidationError instance.
231
+ """
232
+ field_path = ".".join(map(str, e.path))
233
+ type_structure = self._get_type_structure(e.instance)
234
+
235
+ return f"Failed to transform value from type '{type_structure}' to type '{e.validator_value}' at path: '{field_path}'"
236
+
237
+ def _get_type_structure(self, input_data: Any, current_depth: int = 0) -> Any:
238
+ """
239
+ Get the structure of a given input data for use in error message construction.
240
+ """
241
+ # Handle null values
242
+ if input_data is None:
243
+ return "null"
244
+
245
+ # Avoid recursing too deep
246
+ if current_depth >= MAX_NESTING_DEPTH:
247
+ return "object" if isinstance(input_data, dict) else python_to_json[type(input_data)]
248
+
249
+ if isinstance(input_data, dict):
250
+ return {
251
+ key: self._get_type_structure(field_value, current_depth + 1)
252
+ for key, field_value in input_data.items()
253
+ }
254
+
255
+ else:
256
+ return python_to_json[type(input_data)]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: airbyte-cdk
3
- Version: 6.20.1
3
+ Version: 6.21.0
4
4
  Summary: A framework for writing Airbyte Connectors.
5
5
  License: MIT
6
6
  Keywords: airbyte,connector-development-kit,cdk
@@ -67,16 +67,17 @@ airbyte_cdk/sources/declarative/concurrent_declarative_source.py,sha256=tSTCSmyM
67
67
  airbyte_cdk/sources/declarative/datetime/__init__.py,sha256=l9LG7Qm6e5r_qgqfVKnx3mXYtg1I9MmMjomVIPfU4XA,177
68
68
  airbyte_cdk/sources/declarative/datetime/datetime_parser.py,sha256=SX9JjdesN1edN2WVUVMzU_ptqp2QB1OnsnjZ4mwcX7w,2579
69
69
  airbyte_cdk/sources/declarative/datetime/min_max_datetime.py,sha256=0BHBtDNQZfvwM45-tY5pNlTcKAFSGGNxemoi0Jic-0E,5785
70
- airbyte_cdk/sources/declarative/declarative_component_schema.yaml,sha256=JR_papKSYoUZC0YozAN4iTZuW7OKTeKPQP_DdZsKU_I,136098
70
+ airbyte_cdk/sources/declarative/declarative_component_schema.yaml,sha256=PxY_V8vGyNdUMw3vjhqFbqjRNgYs_-0-0xeSTGkLSBw,137031
71
71
  airbyte_cdk/sources/declarative/declarative_source.py,sha256=nF7wBqFd3AQmEKAm4CnIo29CJoQL562cJGSCeL8U8bA,1531
72
72
  airbyte_cdk/sources/declarative/declarative_stream.py,sha256=JRyNeOIpsFu4ztVZsN6sncqUEIqIE-bUkD2TPgbMgk0,10375
73
- airbyte_cdk/sources/declarative/decoders/__init__.py,sha256=edGj4fGxznBk4xzRQyCA1rGfbpqe7z-RE0K3kQQWbgA,858
73
+ airbyte_cdk/sources/declarative/decoders/__init__.py,sha256=KSpQetKGqPCv-38QgcVJ5kzM5nzbFldTSsYDCS3Xf0Y,1035
74
74
  airbyte_cdk/sources/declarative/decoders/composite_raw_decoder.py,sha256=kQfUVMVhChKe5OngwIQrs0F9KGnRUN-CKVFakCU23DQ,4354
75
75
  airbyte_cdk/sources/declarative/decoders/decoder.py,sha256=sl-Gt8lXi7yD2Q-sD8je5QS2PbgrgsYjxRLWsay7DMc,826
76
76
  airbyte_cdk/sources/declarative/decoders/json_decoder.py,sha256=qdbjeR6RffKaah_iWvMsOcDolYuxJY5DaI3b9AMTZXg,3327
77
77
  airbyte_cdk/sources/declarative/decoders/noop_decoder.py,sha256=iZh0yKY_JzgBnJWiubEusf5c0o6Khd-8EWFWT-8EgFo,542
78
78
  airbyte_cdk/sources/declarative/decoders/pagination_decoder_decorator.py,sha256=ZVBZhAOl0I0MymXN5CKTC-kIXG4GuUQAEyn0XpUDuSE,1081
79
79
  airbyte_cdk/sources/declarative/decoders/xml_decoder.py,sha256=EU-7t-5vIGRHZ14h-f0GUE4V5-eTM9Flux-A8xgI1Rc,3117
80
+ airbyte_cdk/sources/declarative/decoders/zipfile_decoder.py,sha256=OTGeNh-Zkab9JwCTgiHtLH1IS6PiVO9jnr82c0vrHbw,2269
80
81
  airbyte_cdk/sources/declarative/exceptions.py,sha256=kTPUA4I2NV4J6HDz-mKPGMrfuc592akJnOyYx38l_QM,176
81
82
  airbyte_cdk/sources/declarative/extractors/__init__.py,sha256=RmV-IkO1YLj0PSOrrqC9AV1gO8-90t8UTDVfJGshN9E,754
82
83
  airbyte_cdk/sources/declarative/extractors/dpath_extractor.py,sha256=wR4Ol4MG2lt5UlqXF5EU_k7qa5cN4_-luu3PJ1PlO3A,3131
@@ -107,12 +108,12 @@ airbyte_cdk/sources/declarative/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW
107
108
  airbyte_cdk/sources/declarative/migrations/legacy_to_per_partition_state_migration.py,sha256=iemy3fKLczcU0-Aor7tx5jcT6DRedKMqyK7kCOp01hg,3924
108
109
  airbyte_cdk/sources/declarative/migrations/state_migration.py,sha256=KWPjealMLKSMtajXgkdGgKg7EmTLR-CqqD7UIh0-eDU,794
109
110
  airbyte_cdk/sources/declarative/models/__init__.py,sha256=nUFxNCiKeYRVXuZEKA7GD-lTHxsiKcQ8FitZjKhPIvE,100
110
- airbyte_cdk/sources/declarative/models/declarative_component_schema.py,sha256=Gif9VFysx-c6m1LJqmNpIterZ6crFyAytePTZZhqtpc,95805
111
+ airbyte_cdk/sources/declarative/models/declarative_component_schema.py,sha256=57IP4WKtwsoVvWpJKFTTsWMR58nzPIwVvzAehYJ0BrA,96250
111
112
  airbyte_cdk/sources/declarative/parsers/__init__.py,sha256=ZnqYNxHsKCgO38IwB34RQyRMXTs4GTvlRi3ImKnIioo,61
112
113
  airbyte_cdk/sources/declarative/parsers/custom_exceptions.py,sha256=Rir9_z3Kcd5Es0-LChrzk-0qubAsiK_RSEnLmK2OXm8,553
113
114
  airbyte_cdk/sources/declarative/parsers/manifest_component_transformer.py,sha256=CXwTfD3wSQq3okcqwigpprbHhSURUokh4GK2OmOyKC8,9132
114
115
  airbyte_cdk/sources/declarative/parsers/manifest_reference_resolver.py,sha256=IWUOdF03o-aQn0Occo1BJCxU0Pz-QILk5L67nzw2thw,6803
115
- airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py,sha256=-rkDtlbDWtdhKNB1xD6HgK38Uq38b9oKuA_zh1YvTO8,112306
116
+ airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py,sha256=ZIl9MKlzOPzo-iMWwcJorGboWuCi8ZMy65YW04TS6UM,112776
116
117
  airbyte_cdk/sources/declarative/partition_routers/__init__.py,sha256=HJ-Syp3p7RpyR_OK0X_a2kSyISfu3W-PKrRI16iY0a8,957
117
118
  airbyte_cdk/sources/declarative/partition_routers/async_job_partition_router.py,sha256=n82J15S8bjeMZ5uROu--P3hnbQoxkY5v7RPHYx7g7ro,2929
118
119
  airbyte_cdk/sources/declarative/partition_routers/cartesian_product_stream_slicer.py,sha256=c5cuVFM6NFkuQqG8Z5IwkBuwDrvXZN1CunUOM_L0ezg,6892
@@ -300,7 +301,7 @@ airbyte_cdk/sources/utils/casing.py,sha256=QC-gV1O4e8DR4-bhdXieUPKm_JamzslVyfABL
300
301
  airbyte_cdk/sources/utils/record_helper.py,sha256=jeB0mucudzna7Zvj-pCBbwFrbLJ36SlAWZTh5O4Fb9Y,2168
301
302
  airbyte_cdk/sources/utils/schema_helpers.py,sha256=bR3I70-e11S6B8r6VK-pthQXtcYrXojgXFvuK7lRrpg,8545
302
303
  airbyte_cdk/sources/utils/slice_logger.py,sha256=qWWeFLAvigFz0b4O1_O3QDM1cy8PqZAMMgVPR2hEeb8,1778
303
- airbyte_cdk/sources/utils/transform.py,sha256=zXlZ00akGt0OpiuYQf6FCDL0eI_Qdo1tWPKxA88RTwk,10168
304
+ airbyte_cdk/sources/utils/transform.py,sha256=Sks6kiRbef1W-5I6PRqnFxksJe2NOPKCRXQLudaltf8,11015
304
305
  airbyte_cdk/sources/utils/types.py,sha256=41ZQR681t5TUnOScij58d088sb99klH_ZENFcaYro_g,175
305
306
  airbyte_cdk/sql/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
306
307
  airbyte_cdk/sql/_util/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -344,8 +345,8 @@ airbyte_cdk/utils/slice_hasher.py,sha256=-pHexlNYoWYPnXNH-M7HEbjmeJe9Zk7SJijdQ7d
344
345
  airbyte_cdk/utils/spec_schema_transformations.py,sha256=-5HTuNsnDBAhj-oLeQXwpTGA0HdcjFOf2zTEMUTTg_Y,816
345
346
  airbyte_cdk/utils/stream_status_utils.py,sha256=ZmBoiy5HVbUEHAMrUONxZvxnvfV9CesmQJLDTAIWnWw,1171
346
347
  airbyte_cdk/utils/traced_exception.py,sha256=C8uIBuCL_E4WnBAOPSxBicD06JAldoN9fGsQDp463OY,6292
347
- airbyte_cdk-6.20.1.dist-info/LICENSE.txt,sha256=Wfe61S4BaGPj404v8lrAbvhjYR68SHlkzeYrg3_bbuM,1051
348
- airbyte_cdk-6.20.1.dist-info/METADATA,sha256=v6NwQSfbvaLEacCvookkp82DipX0fR09nStYrbKM17E,6000
349
- airbyte_cdk-6.20.1.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
350
- airbyte_cdk-6.20.1.dist-info/entry_points.txt,sha256=fj-e3PAQvsxsQzyyq8UkG1k8spunWnD4BAH2AwlR6NM,95
351
- airbyte_cdk-6.20.1.dist-info/RECORD,,
348
+ airbyte_cdk-6.21.0.dist-info/LICENSE.txt,sha256=Wfe61S4BaGPj404v8lrAbvhjYR68SHlkzeYrg3_bbuM,1051
349
+ airbyte_cdk-6.21.0.dist-info/METADATA,sha256=6djJTSQ0PJieSZE0V6_FAaDKlwVCELJ0_YyMsez9oLE,6000
350
+ airbyte_cdk-6.21.0.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
351
+ airbyte_cdk-6.21.0.dist-info/entry_points.txt,sha256=fj-e3PAQvsxsQzyyq8UkG1k8spunWnD4BAH2AwlR6NM,95
352
+ airbyte_cdk-6.21.0.dist-info/RECORD,,