airbyte-cdk 6.48.8__py3-none-any.whl → 6.48.10__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.
@@ -43,6 +43,7 @@ from click import style
43
43
  from rich.console import Console
44
44
  from rich.table import Table
45
45
 
46
+ from airbyte_cdk.cli.airbyte_cdk.exceptions import ConnectorSecretWithNoValidVersionsError
46
47
  from airbyte_cdk.utils.connector_paths import (
47
48
  resolve_connector_name,
48
49
  resolve_connector_name_and_directory,
@@ -131,24 +132,46 @@ def fetch(
131
132
  )
132
133
  # Fetch and write secrets
133
134
  secret_count = 0
135
+ exceptions = []
136
+
134
137
  for secret in secrets:
135
138
  secret_file_path = _get_secret_filepath(
136
139
  secrets_dir=secrets_dir,
137
140
  secret=secret,
138
141
  )
139
- _write_secret_file(
140
- secret=secret,
141
- client=client,
142
- file_path=secret_file_path,
142
+ try:
143
+ _write_secret_file(
144
+ secret=secret,
145
+ client=client,
146
+ file_path=secret_file_path,
147
+ connector_name=connector_name,
148
+ gcp_project_id=gcp_project_id,
149
+ )
150
+ click.echo(f"Secret written to: {secret_file_path.absolute()!s}", err=True)
151
+ secret_count += 1
152
+ except ConnectorSecretWithNoValidVersionsError as e:
153
+ exceptions.append(e)
154
+ click.echo(
155
+ f"Failed to retrieve secret '{e.secret_name}': No enabled version found", err=True
156
+ )
157
+
158
+ if secret_count == 0 and not exceptions:
159
+ click.echo(
160
+ f"No secrets found for connector: '{connector_name}'",
161
+ err=True,
143
162
  )
144
- click.echo(f"Secret written to: {secret_file_path.absolute()!s}", err=True)
145
- secret_count += 1
146
163
 
147
- if secret_count == 0:
164
+ if exceptions:
165
+ error_message = f"Failed to retrieve {len(exceptions)} secret(s)"
148
166
  click.echo(
149
- f"No secrets found for connector: '{connector_name}'",
167
+ style(
168
+ error_message,
169
+ fg="red",
170
+ ),
150
171
  err=True,
151
172
  )
173
+ if secret_count == 0:
174
+ raise exceptions[0]
152
175
 
153
176
  if not print_ci_secrets_masks:
154
177
  return
@@ -230,9 +253,8 @@ def list_(
230
253
  table.add_column("Created", justify="left", style="blue", overflow="fold")
231
254
  for secret in secrets:
232
255
  full_secret_name = secret.name
233
- secret_name = full_secret_name.split("/secrets/")[-1] # Removes project prefix
234
- # E.g. https://console.cloud.google.com/security/secret-manager/secret/SECRET_SOURCE-SHOPIFY__CREDS/versions?hl=en&project=<gcp_project_id>
235
- secret_url = f"https://console.cloud.google.com/security/secret-manager/secret/{secret_name}/versions?hl=en&project={gcp_project_id}"
256
+ secret_name = _extract_secret_name(full_secret_name)
257
+ secret_url = _get_secret_url(secret_name, gcp_project_id)
236
258
  table.add_row(
237
259
  f"[link={secret_url}]{secret_name}[/link]",
238
260
  "\n".join([f"{k}={v}" for k, v in secret.labels.items()]),
@@ -242,6 +264,43 @@ def list_(
242
264
  console.print(table)
243
265
 
244
266
 
267
+ def _extract_secret_name(secret_name: str) -> str:
268
+ """Extract the secret name from a fully qualified secret path.
269
+
270
+ Handles different formats of secret names:
271
+ - Full path: "projects/project-id/secrets/SECRET_NAME"
272
+ - Already extracted: "SECRET_NAME"
273
+
274
+ Args:
275
+ secret_name: The secret name or path
276
+
277
+ Returns:
278
+ str: The extracted secret name without project prefix
279
+ """
280
+ if "/secrets/" in secret_name:
281
+ return secret_name.split("/secrets/")[-1]
282
+ return secret_name
283
+
284
+
285
+ def _get_secret_url(secret_name: str, gcp_project_id: str) -> str:
286
+ """Generate a URL for a secret in the GCP Secret Manager console.
287
+
288
+ Note: This URL itself does not contain secrets or sensitive information.
289
+ The URL itself is only useful for valid logged-in users of the project, and it
290
+ safe to print this URL in logs.
291
+
292
+ Args:
293
+ secret_name: The name of the secret in GCP.
294
+ gcp_project_id: The GCP project ID.
295
+
296
+ Returns:
297
+ str: URL to the secret in the GCP console
298
+ """
299
+ # Ensure we have just the secret name without the project prefix
300
+ secret_name = _extract_secret_name(secret_name)
301
+ return f"https://console.cloud.google.com/security/secret-manager/secret/{secret_name}/versions?hl=en&project={gcp_project_id}"
302
+
303
+
245
304
  def _fetch_secret_handles(
246
305
  connector_name: str,
247
306
  gcp_project_id: str = AIRBYTE_INTERNAL_GCP_PROJECT,
@@ -272,9 +331,44 @@ def _write_secret_file(
272
331
  secret: "Secret", # type: ignore
273
332
  client: "secretmanager.SecretManagerServiceClient", # type: ignore
274
333
  file_path: Path,
334
+ connector_name: str,
335
+ gcp_project_id: str,
275
336
  ) -> None:
276
- version_name = f"{secret.name}/versions/latest"
277
- response = client.access_secret_version(name=version_name)
337
+ """Write the most recent enabled version of a secret to a file.
338
+
339
+ Lists all enabled versions of the secret and selects the most recent one.
340
+ Raises ConnectorSecretWithNoValidVersionsError if no enabled versions are found.
341
+
342
+ Args:
343
+ secret: The secret to write to a file
344
+ client: The Secret Manager client
345
+ file_path: The path to write the secret to
346
+ connector_name: The name of the connector
347
+ gcp_project_id: The GCP project ID
348
+
349
+ Raises:
350
+ ConnectorSecretWithNoValidVersionsError: If no enabled version is found
351
+ """
352
+ # List all enabled versions of the secret.
353
+ response = client.list_secret_versions(
354
+ request={"parent": secret.name, "filter": "state:ENABLED"}
355
+ )
356
+
357
+ # The API returns versions pre-sorted in descending order, with the
358
+ # 0th item being the latest version.
359
+ versions = list(response)
360
+
361
+ if not versions:
362
+ secret_name = _extract_secret_name(secret.name)
363
+ raise ConnectorSecretWithNoValidVersionsError(
364
+ connector_name=connector_name,
365
+ secret_name=secret_name,
366
+ gcp_project_id=gcp_project_id,
367
+ )
368
+
369
+ enabled_version = versions[0]
370
+
371
+ response = client.access_secret_version(name=enabled_version.name)
278
372
  file_path.write_text(response.payload.data.decode("UTF-8"))
279
373
  file_path.chmod(0o600) # default to owner read/write only
280
374
 
@@ -0,0 +1,23 @@
1
+ # Copyright (c) 2025 Airbyte, Inc., all rights reserved.
2
+ """Exceptions for the Airbyte CDK CLI."""
3
+
4
+ from dataclasses import dataclass
5
+
6
+
7
+ @dataclass(kw_only=True)
8
+ class ConnectorSecretWithNoValidVersionsError(Exception):
9
+ """Error when a connector secret has no valid versions."""
10
+
11
+ connector_name: str
12
+ secret_name: str
13
+ gcp_project_id: str
14
+
15
+ def __str__(self) -> str:
16
+ """Return a string representation of the exception."""
17
+ from airbyte_cdk.cli.airbyte_cdk._secrets import _get_secret_url
18
+
19
+ url = _get_secret_url(self.secret_name, self.gcp_project_id)
20
+ return (
21
+ f"No valid versions found for secret '{self.secret_name}' in connector '{self.connector_name}'. "
22
+ f"Please check the following URL for more information:\n- {url}"
23
+ )
@@ -1421,12 +1421,22 @@ definitions:
1421
1421
  default: ""
1422
1422
  schema_loader:
1423
1423
  title: Schema Loader
1424
- description: Component used to retrieve the schema for the current stream.
1424
+ description:
1425
+ One or many schema loaders can be used to retrieve the schema for the current stream. When
1426
+ multiple schema loaders are defined, schema properties will be merged together. Schema
1427
+ loaders defined first taking precedence in the event of a conflict.
1425
1428
  anyOf:
1426
1429
  - "$ref": "#/definitions/InlineSchemaLoader"
1427
1430
  - "$ref": "#/definitions/DynamicSchemaLoader"
1428
1431
  - "$ref": "#/definitions/JsonFileSchemaLoader"
1429
1432
  - "$ref": "#/definitions/CustomSchemaLoader"
1433
+ - type: array
1434
+ items:
1435
+ anyOf:
1436
+ - "$ref": "#/definitions/InlineSchemaLoader"
1437
+ - "$ref": "#/definitions/DynamicSchemaLoader"
1438
+ - "$ref": "#/definitions/JsonFileSchemaLoader"
1439
+ - "$ref": "#/definitions/CustomSchemaLoader"
1430
1440
  # TODO we have move the transformation to the RecordSelector level in the code but kept this here for
1431
1441
  # compatibility reason. We should eventually move this to align with the code.
1432
1442
  transformations:
@@ -4362,4 +4372,4 @@ interpolation:
4362
4372
  regex: The regular expression to search for. It must include a capture group.
4363
4373
  return_type: str
4364
4374
  examples:
4365
- - '{{ "goodbye, cruel world" | regex_search("goodbye,\s(.*)$") }} -> "cruel world"'
4375
+ - '{{ "goodbye, cruel world" | regex_search("goodbye,\s(.*)$") }} -> "cruel world"'
@@ -1,3 +1,5 @@
1
+ # Copyright (c) 2025 Airbyte, Inc., all rights reserved.
2
+
1
3
  # generated by datamodel-codegen:
2
4
  # filename: declarative_component_schema.yaml
3
5
 
@@ -2151,6 +2153,14 @@ class DeclarativeStream(BaseModel):
2151
2153
  DynamicSchemaLoader,
2152
2154
  JsonFileSchemaLoader,
2153
2155
  CustomSchemaLoader,
2156
+ List[
2157
+ Union[
2158
+ InlineSchemaLoader,
2159
+ DynamicSchemaLoader,
2160
+ JsonFileSchemaLoader,
2161
+ CustomSchemaLoader,
2162
+ ]
2163
+ ],
2154
2164
  ]
2155
2165
  ] = Field(
2156
2166
  None,
@@ -504,6 +504,7 @@ from airbyte_cdk.sources.declarative.schema import (
504
504
  SchemaTypeIdentifier,
505
505
  TypesMap,
506
506
  )
507
+ from airbyte_cdk.sources.declarative.schema.composite_schema_loader import CompositeSchemaLoader
507
508
  from airbyte_cdk.sources.declarative.spec import Spec
508
509
  from airbyte_cdk.sources.declarative.stream_slicers import StreamSlicer
509
510
  from airbyte_cdk.sources.declarative.transformations import (
@@ -1914,9 +1915,25 @@ class ModelToComponentFactory:
1914
1915
  else:
1915
1916
  state_transformations = []
1916
1917
 
1917
- if model.schema_loader:
1918
+ schema_loader: Union[
1919
+ CompositeSchemaLoader,
1920
+ DefaultSchemaLoader,
1921
+ DynamicSchemaLoader,
1922
+ InlineSchemaLoader,
1923
+ JsonFileSchemaLoader,
1924
+ ]
1925
+ if model.schema_loader and isinstance(model.schema_loader, list):
1926
+ nested_schema_loaders = [
1927
+ self._create_component_from_model(model=nested_schema_loader, config=config)
1928
+ for nested_schema_loader in model.schema_loader
1929
+ ]
1930
+ schema_loader = CompositeSchemaLoader(
1931
+ schema_loaders=nested_schema_loaders, parameters={}
1932
+ )
1933
+ elif model.schema_loader:
1918
1934
  schema_loader = self._create_component_from_model(
1919
- model=model.schema_loader, config=config
1935
+ model=model.schema_loader, # type: ignore # If defined, schema_loader is guaranteed not to be a list and will be one of the existing base models
1936
+ config=config,
1920
1937
  )
1921
1938
  else:
1922
1939
  options = model.parameters or {}
@@ -0,0 +1,31 @@
1
+ #
2
+ # Copyright (c) 2025 Airbyte, Inc., all rights reserved.
3
+ #
4
+
5
+ from dataclasses import InitVar, dataclass
6
+ from typing import Any, Dict, List, Mapping
7
+
8
+ from airbyte_cdk.sources.declarative.schema.schema_loader import SchemaLoader
9
+
10
+
11
+ @dataclass
12
+ class CompositeSchemaLoader(SchemaLoader):
13
+ """
14
+ Schema loader that consists of multiple schema loaders that are combined into a single
15
+ schema. Subsequent schemas do not overwrite existing values so the schema loaders with
16
+ a higher priority should be defined first.
17
+ """
18
+
19
+ schema_loaders: List[SchemaLoader]
20
+ parameters: InitVar[Mapping[str, Any]]
21
+
22
+ def get_json_schema(self) -> Mapping[str, Any]:
23
+ combined_schema: Dict[str, Any] = {
24
+ "$schema": "http://json-schema.org/draft-07/schema#",
25
+ "type": ["null", "object"],
26
+ "properties": {},
27
+ }
28
+ for schema_loader in self.schema_loaders:
29
+ schema_properties = schema_loader.get_json_schema()["properties"]
30
+ combined_schema["properties"] = {**schema_properties, **combined_schema["properties"]}
31
+ return combined_schema
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: airbyte-cdk
3
- Version: 6.48.8
3
+ Version: 6.48.10
4
4
  Summary: A framework for writing Airbyte Connectors.
5
5
  Home-page: https://airbyte.com
6
6
  License: MIT
@@ -4,8 +4,9 @@ airbyte_cdk/cli/airbyte_cdk/__init__.py,sha256=8IoEcbdYr7CMAh97Xut5__uHH9vV4LKUt
4
4
  airbyte_cdk/cli/airbyte_cdk/_connector.py,sha256=drKb_EXJOFX-cSeLwJB8WXE-lesOL0dx2ziWSmW3Jkg,5187
5
5
  airbyte_cdk/cli/airbyte_cdk/_image.py,sha256=AkBEZrRYXEwvhW7hPOPRWeYEZutzi2PIzjpl7_yaE8I,2890
6
6
  airbyte_cdk/cli/airbyte_cdk/_manifest.py,sha256=aFdeeWgek7oXR3YfZPxk7kBZ64Blmsr0dAXN6BVGiIA,482
7
- airbyte_cdk/cli/airbyte_cdk/_secrets.py,sha256=u8-G44SoVg19FCWjcNDT0brFUZa6g_-He58Nd-VuZHI,13991
7
+ airbyte_cdk/cli/airbyte_cdk/_secrets.py,sha256=1IqVz-csoMJoKajSX4DzoWrngswuNHBPkzzchQggAeE,17010
8
8
  airbyte_cdk/cli/airbyte_cdk/_version.py,sha256=ohZNIktLFk91sdzqFW5idaNrZAPX2dIRnz---_fcKOE,352
9
+ airbyte_cdk/cli/airbyte_cdk/exceptions.py,sha256=bsGmlWN6cXL2jCD1WYAZMqFmK1OLg2xLrcC_60KHSeA,803
9
10
  airbyte_cdk/cli/source_declarative_manifest/__init__.py,sha256=-0ST722Nj65bgRokzpzPkD1NBBW5CytEHFUe38cB86Q,91
10
11
  airbyte_cdk/cli/source_declarative_manifest/_run.py,sha256=9qtbjt-I_stGWzWX6yVUKO_eE-Ga7g-uTuibML9qLBs,8330
11
12
  airbyte_cdk/cli/source_declarative_manifest/spec.json,sha256=Earc1L6ngcdIr514oFQlUoOxdF4RHqtUyStSIAquXdY,554
@@ -88,7 +89,7 @@ airbyte_cdk/sources/declarative/concurrent_declarative_source.py,sha256=GoZJ8Oxb
88
89
  airbyte_cdk/sources/declarative/datetime/__init__.py,sha256=4Hw-PX1-VgESLF16cDdvuYCzGJtHntThLF4qIiULWeo,61
89
90
  airbyte_cdk/sources/declarative/datetime/datetime_parser.py,sha256=_zGNGq31RNy_0QBLt_EcTvgPyhj7urPdx6oA3M5-r3o,3150
90
91
  airbyte_cdk/sources/declarative/datetime/min_max_datetime.py,sha256=0BHBtDNQZfvwM45-tY5pNlTcKAFSGGNxemoi0Jic-0E,5785
91
- airbyte_cdk/sources/declarative/declarative_component_schema.yaml,sha256=iWOtZ5staQtx0FZ4CSruEqyxdSO3-4SfwIQ1nw_bY_w,166744
92
+ airbyte_cdk/sources/declarative/declarative_component_schema.yaml,sha256=7tB0-d4lbI97GB5lBI6-qezxLoKZN4QeN_4Vht9TDFo,167270
92
93
  airbyte_cdk/sources/declarative/declarative_source.py,sha256=qmyMnnet92eGc3C22yBtpvD5UZjqdhsAafP_zxI5wp8,1814
93
94
  airbyte_cdk/sources/declarative/declarative_stream.py,sha256=dCRlddBUSaJmBNBz1pSO1r2rTw8AP5d2_vlmIeGs2gg,10767
94
95
  airbyte_cdk/sources/declarative/decoders/__init__.py,sha256=JHb_0d3SE6kNY10mxA5YBEKPeSbsWYjByq1gUQxepoE,953
@@ -132,14 +133,14 @@ airbyte_cdk/sources/declarative/migrations/legacy_to_per_partition_state_migrati
132
133
  airbyte_cdk/sources/declarative/migrations/state_migration.py,sha256=KWPjealMLKSMtajXgkdGgKg7EmTLR-CqqD7UIh0-eDU,794
133
134
  airbyte_cdk/sources/declarative/models/__init__.py,sha256=nUFxNCiKeYRVXuZEKA7GD-lTHxsiKcQ8FitZjKhPIvE,100
134
135
  airbyte_cdk/sources/declarative/models/base_model_with_deprecations.py,sha256=Imnj3yef0aqRdLfaUxkIYISUb8YkiPrRH_wBd-x8HjM,5999
135
- airbyte_cdk/sources/declarative/models/declarative_component_schema.py,sha256=P0l-NiKm873uBZ0x6vRJK2u4P-XPTGeTWMnhafKryRw,117940
136
+ airbyte_cdk/sources/declarative/models/declarative_component_schema.py,sha256=FjZ2WrItKCqMVxc14XRbMPu11Jhl1Ds3Lugy_2wPoQ8,118235
136
137
  airbyte_cdk/sources/declarative/parsers/__init__.py,sha256=ZnqYNxHsKCgO38IwB34RQyRMXTs4GTvlRi3ImKnIioo,61
137
138
  airbyte_cdk/sources/declarative/parsers/custom_code_compiler.py,sha256=nlVvHC511NUyDEEIRBkoeDTAvLqKNp-hRy8D19z8tdk,5941
138
139
  airbyte_cdk/sources/declarative/parsers/custom_exceptions.py,sha256=wnRUP0Xeru9Rbu5OexXSDN9QWDo8YU4tT9M2LDVOgGA,802
139
140
  airbyte_cdk/sources/declarative/parsers/manifest_component_transformer.py,sha256=RUyFZS0zslLb7UfQrvqMC--k5CVLNSp7zHw6kbosvKE,9688
140
141
  airbyte_cdk/sources/declarative/parsers/manifest_normalizer.py,sha256=laBy7ebjA-PiNwc-50U4FHvMqS_mmHvnabxgFs4CjGw,17069
141
142
  airbyte_cdk/sources/declarative/parsers/manifest_reference_resolver.py,sha256=pJmg78vqE5VfUrF_KJnWjucQ4k9IWFULeAxHCowrHXE,6806
142
- airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py,sha256=YZ7WtSFKZ-0HfBq6l-OvmLGkcKcPSg-9wwYMRGYBU0g,166254
143
+ airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py,sha256=88ko64Gdfipyg9Uegz-XVCErWms0x5nHNZHCO7CRhVA,167112
143
144
  airbyte_cdk/sources/declarative/partition_routers/__init__.py,sha256=TBC9AkGaUqHm2IKHMPN6punBIcY5tWGULowcLoAVkfw,1109
144
145
  airbyte_cdk/sources/declarative/partition_routers/async_job_partition_router.py,sha256=VelO7zKqKtzMJ35jyFeg0ypJLQC0plqqIBNXoBW1G2E,3001
145
146
  airbyte_cdk/sources/declarative/partition_routers/cartesian_product_stream_slicer.py,sha256=c5cuVFM6NFkuQqG8Z5IwkBuwDrvXZN1CunUOM_L0ezg,6892
@@ -208,6 +209,7 @@ airbyte_cdk/sources/declarative/retrievers/file_uploader/noop_file_writer.py,sha
208
209
  airbyte_cdk/sources/declarative/retrievers/retriever.py,sha256=XPLs593Xv8c5cKMc37XzUAYmzlXd1a7eSsspM-CMuWA,1696
209
210
  airbyte_cdk/sources/declarative/retrievers/simple_retriever.py,sha256=O7qpM71L1_ATIbEKa8y658jdiSJSPw0KmuGKgnaruQU,31008
210
211
  airbyte_cdk/sources/declarative/schema/__init__.py,sha256=xU45UvM5O4c1PSM13UHpCdh5hpW3HXy9vRRGEiAC1rg,795
212
+ airbyte_cdk/sources/declarative/schema/composite_schema_loader.py,sha256=ymGbvxS_QyGc4nnjEyRo5ch8bVedELO41PAUxKXZyMw,1113
211
213
  airbyte_cdk/sources/declarative/schema/default_schema_loader.py,sha256=UnbzlExmwoQiVV8zDg4lhAEaqA_0pRfwbMRe8yqOuWk,1834
212
214
  airbyte_cdk/sources/declarative/schema/dynamic_schema_loader.py,sha256=J8Q_iJYhcSQLWyt0bTZCbDAGpxt9G8FCc6Q9jtGsNzw,10703
213
215
  airbyte_cdk/sources/declarative/schema/inline_schema_loader.py,sha256=bVETE10hRsatRJq3R3BeyRR0wIoK3gcP1gcpVRQ_P5U,464
@@ -406,9 +408,9 @@ airbyte_cdk/utils/slice_hasher.py,sha256=EDxgROHDbfG-QKQb59m7h_7crN1tRiawdf5uU7G
406
408
  airbyte_cdk/utils/spec_schema_transformations.py,sha256=-5HTuNsnDBAhj-oLeQXwpTGA0HdcjFOf2zTEMUTTg_Y,816
407
409
  airbyte_cdk/utils/stream_status_utils.py,sha256=ZmBoiy5HVbUEHAMrUONxZvxnvfV9CesmQJLDTAIWnWw,1171
408
410
  airbyte_cdk/utils/traced_exception.py,sha256=C8uIBuCL_E4WnBAOPSxBicD06JAldoN9fGsQDp463OY,6292
409
- airbyte_cdk-6.48.8.dist-info/LICENSE.txt,sha256=Wfe61S4BaGPj404v8lrAbvhjYR68SHlkzeYrg3_bbuM,1051
410
- airbyte_cdk-6.48.8.dist-info/LICENSE_SHORT,sha256=aqF6D1NcESmpn-cqsxBtszTEnHKnlsp8L4x9wAh3Nxg,55
411
- airbyte_cdk-6.48.8.dist-info/METADATA,sha256=gQiRbc6HRb4QPQI11ZgGUycoAiYz1PCR0eJM_WQTTw8,6343
412
- airbyte_cdk-6.48.8.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
413
- airbyte_cdk-6.48.8.dist-info/entry_points.txt,sha256=AKWbEkHfpzzk9nF9tqBUaw1MbvTM4mGtEzmZQm0ZWvM,139
414
- airbyte_cdk-6.48.8.dist-info/RECORD,,
411
+ airbyte_cdk-6.48.10.dist-info/LICENSE.txt,sha256=Wfe61S4BaGPj404v8lrAbvhjYR68SHlkzeYrg3_bbuM,1051
412
+ airbyte_cdk-6.48.10.dist-info/LICENSE_SHORT,sha256=aqF6D1NcESmpn-cqsxBtszTEnHKnlsp8L4x9wAh3Nxg,55
413
+ airbyte_cdk-6.48.10.dist-info/METADATA,sha256=j6-W6yWj9uT1PuC976m8r6xZy0S1ifMec_7m7qIRLF8,6344
414
+ airbyte_cdk-6.48.10.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
415
+ airbyte_cdk-6.48.10.dist-info/entry_points.txt,sha256=AKWbEkHfpzzk9nF9tqBUaw1MbvTM4mGtEzmZQm0ZWvM,139
416
+ airbyte_cdk-6.48.10.dist-info/RECORD,,