airbyte-cdk 6.13.1.dev41012__py3-none-any.whl → 6.14.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.
@@ -94,6 +94,26 @@ def max(*args: typing.Any) -> typing.Any:
94
94
  return builtins.max(*args)
95
95
 
96
96
 
97
+ def min(*args: typing.Any) -> typing.Any:
98
+ """
99
+ Returns smallest object of an iterable, or two or more arguments.
100
+
101
+ min(iterable, *[, default=obj, key=func]) -> value
102
+ min(arg1, arg2, *args, *[, key=func]) -> value
103
+
104
+ Usage:
105
+ `"{{ min(2,3) }}"
106
+
107
+ With a single iterable argument, return its smallest item. The
108
+ default keyword-only argument specifies an object to return if
109
+ the provided iterable is empty.
110
+ With two or more arguments, return the smallest argument.
111
+ :param args: args to compare
112
+ :return: smallest argument
113
+ """
114
+ return builtins.min(*args)
115
+
116
+
97
117
  def day_delta(num_days: int, format: str = "%Y-%m-%dT%H:%M:%S.%f%z") -> str:
98
118
  """
99
119
  Returns datetime of now() + num_days
@@ -147,6 +167,7 @@ _macros_list = [
147
167
  today_utc,
148
168
  timestamp,
149
169
  max,
170
+ min,
150
171
  day_delta,
151
172
  duration,
152
173
  format_datetime,
@@ -83,7 +83,9 @@ class OffsetIncrement(PaginationStrategy):
83
83
  return self._offset
84
84
 
85
85
  def reset(self, reset_value: Optional[Any] = 0) -> None:
86
- if not isinstance(reset_value, int):
86
+ if reset_value is None:
87
+ self._offset = 0
88
+ elif not isinstance(reset_value, int):
87
89
  raise ValueError(
88
90
  f"Reset value {reset_value} for OffsetIncrement pagination strategy was not an integer"
89
91
  )
@@ -53,7 +53,10 @@ class StopConditionPaginationStrategyDecorator(PaginationStrategy):
53
53
  return self._delegate.next_page_token(response, last_page_size, last_record)
54
54
 
55
55
  def reset(self, reset_value: Optional[Any] = None) -> None:
56
- self._delegate.reset(reset_value)
56
+ if reset_value:
57
+ self._delegate.reset(reset_value)
58
+ else:
59
+ self._delegate.reset()
57
60
 
58
61
  def get_page_size(self) -> Optional[int]:
59
62
  return self._delegate.get_page_size()
@@ -31,12 +31,6 @@ class DeliverRawFiles(BaseModel):
31
31
 
32
32
  delivery_type: Literal["use_file_transfer"] = Field("use_file_transfer", const=True)
33
33
 
34
- preserve_subdirectories_directories: bool = Field(
35
- title="Preserve Subdirectories in File Paths",
36
- description="If enabled replicate source folder structure",
37
- default=True,
38
- )
39
-
40
34
 
41
35
  class AbstractFileBasedSpec(BaseModel):
42
36
  """
@@ -111,10 +111,6 @@ class ErrorListingFiles(BaseFileBasedSourceError):
111
111
  pass
112
112
 
113
113
 
114
- class DuplicatedFilesError(BaseFileBasedSourceError):
115
- pass
116
-
117
-
118
114
  class CustomFileBasedException(AirbyteTracedException):
119
115
  """
120
116
  A specialized exception for file-based connectors.
@@ -127,25 +123,3 @@ class CustomFileBasedException(AirbyteTracedException):
127
123
 
128
124
  class FileSizeLimitError(CustomFileBasedException):
129
125
  pass
130
-
131
-
132
- def format_duplicate_files_error_message(
133
- stream_name: str, duplicated_files_names: List[dict[str, List[str]]]
134
- ) -> str:
135
- duplicated_files_messages = []
136
- for duplicated_file in duplicated_files_names:
137
- for duplicated_file_name, file_paths in duplicated_file.items():
138
- file_duplicated_message = (
139
- f"{len(file_paths)} duplicates found for file name {duplicated_file_name}:\n\n"
140
- + "".join(f"\n - {file_paths}")
141
- )
142
- duplicated_files_messages.append(file_duplicated_message)
143
-
144
- error_message = (
145
- f"ERROR: Duplicate filenames found for stream {stream_name}. "
146
- "Duplicate file names are not allowed if the Preserve Subdirectories in File Paths option is disabled. "
147
- "Please remove or rename the duplicate files before attempting to re-run the sync.\n\n"
148
- + "\n".join(duplicated_files_messages)
149
- )
150
-
151
- return error_message
@@ -242,7 +242,7 @@ class FileBasedSource(ConcurrentSourceAdapter, ABC):
242
242
  stream=self._make_default_stream(
243
243
  stream_config=stream_config,
244
244
  cursor=cursor,
245
- parsed_config=parsed_config,
245
+ use_file_transfer=self._use_file_transfer(parsed_config),
246
246
  ),
247
247
  source=self,
248
248
  logger=self.logger,
@@ -273,7 +273,7 @@ class FileBasedSource(ConcurrentSourceAdapter, ABC):
273
273
  stream=self._make_default_stream(
274
274
  stream_config=stream_config,
275
275
  cursor=cursor,
276
- parsed_config=parsed_config,
276
+ use_file_transfer=self._use_file_transfer(parsed_config),
277
277
  ),
278
278
  source=self,
279
279
  logger=self.logger,
@@ -285,7 +285,7 @@ class FileBasedSource(ConcurrentSourceAdapter, ABC):
285
285
  stream = self._make_default_stream(
286
286
  stream_config=stream_config,
287
287
  cursor=cursor,
288
- parsed_config=parsed_config,
288
+ use_file_transfer=self._use_file_transfer(parsed_config),
289
289
  )
290
290
 
291
291
  streams.append(stream)
@@ -298,7 +298,7 @@ class FileBasedSource(ConcurrentSourceAdapter, ABC):
298
298
  self,
299
299
  stream_config: FileBasedStreamConfig,
300
300
  cursor: Optional[AbstractFileBasedCursor],
301
- parsed_config: AbstractFileBasedSpec,
301
+ use_file_transfer: bool = False,
302
302
  ) -> AbstractFileBasedStream:
303
303
  return DefaultFileBasedStream(
304
304
  config=stream_config,
@@ -310,10 +310,7 @@ class FileBasedSource(ConcurrentSourceAdapter, ABC):
310
310
  validation_policy=self._validate_and_get_validation_policy(stream_config),
311
311
  errors_collector=self.errors_collector,
312
312
  cursor=cursor,
313
- use_file_transfer=self._use_file_transfer(parsed_config),
314
- preserve_subdirectories_directories=self._preserve_subdirectories_directories(
315
- parsed_config
316
- ),
313
+ use_file_transfer=use_file_transfer,
317
314
  )
318
315
 
319
316
  def _get_stream_from_catalog(
@@ -388,14 +385,3 @@ class FileBasedSource(ConcurrentSourceAdapter, ABC):
388
385
  and parsed_config.delivery_method.delivery_type == "use_file_transfer"
389
386
  )
390
387
  return use_file_transfer
391
-
392
- @staticmethod
393
- def _preserve_subdirectories_directories(parsed_config: AbstractFileBasedSpec) -> bool:
394
- # fall back to preserve subdirectories if config is not present or incomplete
395
- if (
396
- FileBasedSource._use_file_transfer(parsed_config)
397
- and hasattr(parsed_config.delivery_method, "preserve_subdirectories_directories")
398
- and parsed_config.delivery_method.preserve_subdirectories_directories is not None
399
- ):
400
- return parsed_config.delivery_method.preserve_subdirectories_directories
401
- return True
@@ -135,16 +135,6 @@ class AbstractFileBasedStreamReader(ABC):
135
135
  return use_file_transfer
136
136
  return False
137
137
 
138
- def preserve_subdirectories_directories(self) -> bool:
139
- # fall back to preserve subdirectories if config is not present or incomplete
140
- if (
141
- self.use_file_transfer()
142
- and hasattr(self.config.delivery_method, "preserve_subdirectories_directories")
143
- and self.config.delivery_method.preserve_subdirectories_directories is not None
144
- ):
145
- return self.config.delivery_method.preserve_subdirectories_directories
146
- return True
147
-
148
138
  @abstractmethod
149
139
  def get_file(
150
140
  self, file: RemoteFile, local_directory: str, logger: logging.Logger
@@ -169,13 +159,10 @@ class AbstractFileBasedStreamReader(ABC):
169
159
  """
170
160
  ...
171
161
 
172
- def _get_file_transfer_paths(self, file: RemoteFile, local_directory: str) -> List[str]:
173
- preserve_subdirectories_directories = self.preserve_subdirectories_directories()
174
- if preserve_subdirectories_directories:
175
- # Remove left slashes from source path format to make relative path for writing locally
176
- file_relative_path = file.uri.lstrip("/")
177
- else:
178
- file_relative_path = path.basename(file.uri)
162
+ @staticmethod
163
+ def _get_file_transfer_paths(file: RemoteFile, local_directory: str) -> List[str]:
164
+ # Remove left slashes from source path format to make relative path for writing locally
165
+ file_relative_path = file.uri.lstrip("/")
179
166
  local_file_path = path.join(local_directory, file_relative_path)
180
167
 
181
168
  # Ensure the local directory exists
@@ -5,24 +5,20 @@
5
5
  import asyncio
6
6
  import itertools
7
7
  import traceback
8
- from collections import defaultdict
9
8
  from copy import deepcopy
10
9
  from functools import cache
11
- from os import path
12
- from typing import Any, Dict, Iterable, List, Mapping, MutableMapping, Optional, Set, Tuple, Union
10
+ from typing import Any, Dict, Iterable, List, Mapping, MutableMapping, Optional, Set, Union
13
11
 
14
12
  from airbyte_cdk.models import AirbyteLogMessage, AirbyteMessage, FailureType, Level
15
13
  from airbyte_cdk.models import Type as MessageType
16
14
  from airbyte_cdk.sources.file_based.config.file_based_stream_config import PrimaryKeyType
17
15
  from airbyte_cdk.sources.file_based.exceptions import (
18
- DuplicatedFilesError,
19
16
  FileBasedSourceError,
20
17
  InvalidSchemaError,
21
18
  MissingSchemaError,
22
19
  RecordParseError,
23
20
  SchemaInferenceError,
24
21
  StopSyncPerValidationPolicy,
25
- format_duplicate_files_error_message,
26
22
  )
27
23
  from airbyte_cdk.sources.file_based.file_types import FileTransfer
28
24
  from airbyte_cdk.sources.file_based.remote_file import RemoteFile
@@ -47,8 +43,6 @@ class DefaultFileBasedStream(AbstractFileBasedStream, IncrementalMixin):
47
43
  """
48
44
 
49
45
  FILE_TRANSFER_KW = "use_file_transfer"
50
- PRESERVE_SUBDIRECTORIES_KW = "preserve_subdirectories_directories"
51
- FILES_KEY = "files"
52
46
  DATE_TIME_FORMAT = "%Y-%m-%dT%H:%M:%S.%fZ"
53
47
  ab_last_mod_col = "_ab_source_file_last_modified"
54
48
  ab_file_name_col = "_ab_source_file_url"
@@ -56,14 +50,10 @@ class DefaultFileBasedStream(AbstractFileBasedStream, IncrementalMixin):
56
50
  source_file_url = "source_file_url"
57
51
  airbyte_columns = [ab_last_mod_col, ab_file_name_col]
58
52
  use_file_transfer = False
59
- preserve_subdirectories_directories = True
60
53
 
61
54
  def __init__(self, **kwargs: Any):
62
55
  if self.FILE_TRANSFER_KW in kwargs:
63
56
  self.use_file_transfer = kwargs.pop(self.FILE_TRANSFER_KW, False)
64
- self.preserve_subdirectories_directories = kwargs.pop(
65
- self.PRESERVE_SUBDIRECTORIES_KW, True
66
- )
67
57
  super().__init__(**kwargs)
68
58
 
69
59
  @property
@@ -108,43 +98,15 @@ class DefaultFileBasedStream(AbstractFileBasedStream, IncrementalMixin):
108
98
  else:
109
99
  return super()._filter_schema_invalid_properties(configured_catalog_json_schema)
110
100
 
111
- def _duplicated_files_names(
112
- self, slices: List[dict[str, List[RemoteFile]]]
113
- ) -> List[dict[str, List[str]]]:
114
- seen_file_names = set()
115
- duplicates_file_names = set()
116
- file_paths = defaultdict(list)
117
- for file_slice in slices:
118
- for file_found in file_slice[self.FILES_KEY]:
119
- file_name = path.basename(file_found.uri)
120
- if file_name not in seen_file_names:
121
- seen_file_names.add(file_name)
122
- else:
123
- duplicates_file_names.add(file_name)
124
- file_paths[file_name].append(file_found.uri)
125
- return [
126
- {duplicated_file: file_paths[duplicated_file]}
127
- for duplicated_file in duplicates_file_names
128
- ]
129
-
130
101
  def compute_slices(self) -> Iterable[Optional[Mapping[str, Any]]]:
131
102
  # Sort files by last_modified, uri and return them grouped by last_modified
132
103
  all_files = self.list_files()
133
104
  files_to_read = self._cursor.get_files_to_sync(all_files, self.logger)
134
105
  sorted_files_to_read = sorted(files_to_read, key=lambda f: (f.last_modified, f.uri))
135
106
  slices = [
136
- {self.FILES_KEY: list(group[1])}
107
+ {"files": list(group[1])}
137
108
  for group in itertools.groupby(sorted_files_to_read, lambda f: f.last_modified)
138
109
  ]
139
- if slices and not self.preserve_subdirectories_directories:
140
- duplicated_files_names = self._duplicated_files_names(slices)
141
- if duplicated_files_names:
142
- raise DuplicatedFilesError(
143
- format_duplicate_files_error_message(
144
- stream_name=self.name, duplicated_files_names=duplicated_files_names
145
- ),
146
- stream=self.name,
147
- )
148
110
  return slices
149
111
 
150
112
  def transform_record(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: airbyte-cdk
3
- Version: 6.13.1.dev41012
3
+ Version: 6.14.0
4
4
  Summary: A framework for writing Airbyte Connectors.
5
5
  Home-page: https://airbyte.com
6
6
  License: MIT
@@ -99,7 +99,7 @@ airbyte_cdk/sources/declarative/interpolation/interpolated_nested_mapping.py,sha
99
99
  airbyte_cdk/sources/declarative/interpolation/interpolated_string.py,sha256=LYEZnZ_hB7rvBSZxG9s0RSrzsOkDWbBY0_P6qu5lEfc,3212
100
100
  airbyte_cdk/sources/declarative/interpolation/interpolation.py,sha256=-V5UddGm69UKEB6o_O1EIES9kfY8FV_X4Ji8w1yOuSA,981
101
101
  airbyte_cdk/sources/declarative/interpolation/jinja.py,sha256=BtsY_jtT4MihFqeQgc05HXj3Ndt-e2ESQgGwbg3Sdxc,6430
102
- airbyte_cdk/sources/declarative/interpolation/macros.py,sha256=jf24RK-1fBhTYDpcGEakZtGNNJfG5NS8CCF5bEgNmRo,3977
102
+ airbyte_cdk/sources/declarative/interpolation/macros.py,sha256=Y5AWYxbJTUtJ_Jm7DV9qrZDiymFR9LST7fBt4piT2-U,4585
103
103
  airbyte_cdk/sources/declarative/manifest_declarative_source.py,sha256=wX_dQ401siuwh3zHgSHRnSN1vIojI4Nufg3BwzZAzk0,16239
104
104
  airbyte_cdk/sources/declarative/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
105
105
  airbyte_cdk/sources/declarative/migrations/legacy_to_per_partition_state_migration.py,sha256=iemy3fKLczcU0-Aor7tx5jcT6DRedKMqyK7kCOp01hg,3924
@@ -140,10 +140,10 @@ airbyte_cdk/sources/declarative/requesters/paginators/no_pagination.py,sha256=-P
140
140
  airbyte_cdk/sources/declarative/requesters/paginators/paginator.py,sha256=ZgyvH7DOrASQ5K__J5SRAXH3REUW2n3yPHnFW9xq4NU,1972
141
141
  airbyte_cdk/sources/declarative/requesters/paginators/strategies/__init__.py,sha256=2gly8fuZpDNwtu1Qg6oE2jBLGqQRdzSLJdnpk_iDV6I,767
142
142
  airbyte_cdk/sources/declarative/requesters/paginators/strategies/cursor_pagination_strategy.py,sha256=vFzpNv8BdgXrYO5qhi2_Un4x4y-EAQWxinZtEPWz5KI,3654
143
- airbyte_cdk/sources/declarative/requesters/paginators/strategies/offset_increment.py,sha256=pMPi6iQrhtrI9VRPj218QNM_OqD8lX8P3Tr9yloKoE8,3367
143
+ airbyte_cdk/sources/declarative/requesters/paginators/strategies/offset_increment.py,sha256=TKG4Mp1t8MfmFJDeHtXmxCp_ibRK03J5O04N5HVtBvE,3430
144
144
  airbyte_cdk/sources/declarative/requesters/paginators/strategies/page_increment.py,sha256=kQGpfr-dOwarxTIf2S4sHVulBzm8zSwQXBM7rOhkafA,2491
145
145
  airbyte_cdk/sources/declarative/requesters/paginators/strategies/pagination_strategy.py,sha256=ABpO4t0UUziBZnyml8UT_NhlF6loekhQji57TpKnaiY,1290
146
- airbyte_cdk/sources/declarative/requesters/paginators/strategies/stop_condition.py,sha256=-8NwokW-aKwv8DdeHh1ssODTobBYSOmIhH2-IjSjlNA,2213
146
+ airbyte_cdk/sources/declarative/requesters/paginators/strategies/stop_condition.py,sha256=2b005ulACvHgIL8ktTWwposu4umowyu0iGV2mGOb_Tg,2290
147
147
  airbyte_cdk/sources/declarative/requesters/request_option.py,sha256=_qmv8CLQQ3fERt6BuMZeRu6tZXscPoeARx1VJdWMQ_M,1055
148
148
  airbyte_cdk/sources/declarative/requesters/request_options/__init__.py,sha256=WCwpKqM4wKqy-DHJaCHbKAlFqRVOqMi9K5qonxIfi_Y,809
149
149
  airbyte_cdk/sources/declarative/requesters/request_options/datetime_based_request_options_provider.py,sha256=FLkg0uzC9bc-zFnALWr0FLYpKsz8iK2xQsd4UOyeW08,3706
@@ -193,7 +193,7 @@ airbyte_cdk/sources/file_based/availability_strategy/__init__.py,sha256=ddKQfUmk
193
193
  airbyte_cdk/sources/file_based/availability_strategy/abstract_file_based_availability_strategy.py,sha256=01Nd4b7ERAbp-OZo_8rrAzFXWPTMwr02SnWiN17nx8Q,2363
194
194
  airbyte_cdk/sources/file_based/availability_strategy/default_file_based_availability_strategy.py,sha256=j9T5TimfWFUz7nqsaj-83G3xWmDpsmeSbDnaUNmz0UM,5849
195
195
  airbyte_cdk/sources/file_based/config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
196
- airbyte_cdk/sources/file_based/config/abstract_file_based_spec.py,sha256=gigLToFfWcRhE2ppPFyojW2S1boMc5dtrO4w7BZjaks,6662
196
+ airbyte_cdk/sources/file_based/config/abstract_file_based_spec.py,sha256=tj-M1L5BTa5yIQ3jHo09CtCTSq_eR-68zgyOPqwsurw,6455
197
197
  airbyte_cdk/sources/file_based/config/avro_format.py,sha256=NxTF96ewzn6HuhgodsY7Rpb-ybr1ZEWW5d4Vid64g5A,716
198
198
  airbyte_cdk/sources/file_based/config/csv_format.py,sha256=NWekkyT8dTwiVK0mwa_krQD4FJPHSDfILo8kPAg3-Vs,8006
199
199
  airbyte_cdk/sources/file_based/config/excel_format.py,sha256=9qAmTsT6SoVzNfNv0oBVkVCmiyqQuVAbfRKajjoa7Js,378
@@ -204,9 +204,9 @@ airbyte_cdk/sources/file_based/config/unstructured_format.py,sha256=tIbB9Pn1HqU6
204
204
  airbyte_cdk/sources/file_based/discovery_policy/__init__.py,sha256=gl3ey6mZbyfraB9P3pFhf9UJp2JeTZ1SUFAopy2iBvY,301
205
205
  airbyte_cdk/sources/file_based/discovery_policy/abstract_discovery_policy.py,sha256=dCfXX529Rd5rtopg4VeEgTPJjFtqjtjzPq6LCw18Wt0,605
206
206
  airbyte_cdk/sources/file_based/discovery_policy/default_discovery_policy.py,sha256=-xujTidtrq6HC00WKbjQh1CZdT5LMuzkp5BLjqDmfTY,1007
207
- airbyte_cdk/sources/file_based/exceptions.py,sha256=KfOgQgssBKgsv3h5po2IG1DhZcH664Zf_fx96mBlPSg,6761
208
- airbyte_cdk/sources/file_based/file_based_source.py,sha256=0rKW1XQjj6Up-e_y5ls5b9k7dWAASQHkuWy7RaDxs9Y,17303
209
- airbyte_cdk/sources/file_based/file_based_stream_reader.py,sha256=99CiCmsTj9LzO0QR90lB0vKTBR5TTCAyDCO8PURCris,6877
207
+ airbyte_cdk/sources/file_based/exceptions.py,sha256=AEELNIRzKPX6eopKd_2jhE7WiNeR0Aw7nQWVOL8fvkc,5760
208
+ airbyte_cdk/sources/file_based/file_based_source.py,sha256=RfpctRNLJ_EHKKEc2E1EZGYRfhG0Z9o6TgsKS4XrSNY,16652
209
+ airbyte_cdk/sources/file_based/file_based_stream_reader.py,sha256=ohxKlqPuV7TGwjyRy_gaWUol8QN5lBSoCYoaqBtRh1c,6179
210
210
  airbyte_cdk/sources/file_based/file_types/__init__.py,sha256=blCLn0-2LC-ZdgcNyDEhqM2RiUvEjEBh-G4-t32ZtuM,1268
211
211
  airbyte_cdk/sources/file_based/file_types/avro_parser.py,sha256=XNx-JC-sgzH9u3nOJ2M59FxBXvtig8LN6BIkeDOavZA,10858
212
212
  airbyte_cdk/sources/file_based/file_types/csv_parser.py,sha256=QlCXB-ry3np67Q_VerQEPoWDOTcPTB6Go4ydZxY9ae4,20445
@@ -232,7 +232,7 @@ airbyte_cdk/sources/file_based/stream/concurrent/cursor/file_based_final_state_c
232
232
  airbyte_cdk/sources/file_based/stream/cursor/__init__.py,sha256=MhFB5hOo8sjwvCh8gangaymdg3EJWYt_72brFOZt068,191
233
233
  airbyte_cdk/sources/file_based/stream/cursor/abstract_file_based_cursor.py,sha256=om-x3gZFPgWDpi15S9RxZmR36VHnk8sytgN6LlBQhAw,1934
234
234
  airbyte_cdk/sources/file_based/stream/cursor/default_file_based_cursor.py,sha256=VGV7xLyBribuBMVrXtO1xqkWJD86bl7yhXtjnwLMohM,7051
235
- airbyte_cdk/sources/file_based/stream/default_file_based_stream.py,sha256=HRjR0rQGc8cYK2PxpLgAvZQ--jvtV8QgS1QIxkemnko,18413
235
+ airbyte_cdk/sources/file_based/stream/default_file_based_stream.py,sha256=rpwU6AOyhFLuXtcFKkcOHFWbRQ4kLCOKzAjcID_M87k,16770
236
236
  airbyte_cdk/sources/file_based/types.py,sha256=INxG7OPnkdUP69oYNKMAbwhvV1AGvLRHs1J6pIia2FI,218
237
237
  airbyte_cdk/sources/http_config.py,sha256=OBZeuyFilm6NlDlBhFQvHhTWabEvZww6OHDIlZujIS0,730
238
238
  airbyte_cdk/sources/http_logger.py,sha256=TyBmtRA6D9g0XDkKGvdM415b36RXDjgfkwRewDsH8-0,1576
@@ -340,8 +340,8 @@ airbyte_cdk/utils/slice_hasher.py,sha256=-pHexlNYoWYPnXNH-M7HEbjmeJe9Zk7SJijdQ7d
340
340
  airbyte_cdk/utils/spec_schema_transformations.py,sha256=-5HTuNsnDBAhj-oLeQXwpTGA0HdcjFOf2zTEMUTTg_Y,816
341
341
  airbyte_cdk/utils/stream_status_utils.py,sha256=ZmBoiy5HVbUEHAMrUONxZvxnvfV9CesmQJLDTAIWnWw,1171
342
342
  airbyte_cdk/utils/traced_exception.py,sha256=C8uIBuCL_E4WnBAOPSxBicD06JAldoN9fGsQDp463OY,6292
343
- airbyte_cdk-6.13.1.dev41012.dist-info/LICENSE.txt,sha256=Wfe61S4BaGPj404v8lrAbvhjYR68SHlkzeYrg3_bbuM,1051
344
- airbyte_cdk-6.13.1.dev41012.dist-info/METADATA,sha256=HsxDkbakEzPNjuI4b9lbu35vVlb-tvTb2rwv9yddG88,5997
345
- airbyte_cdk-6.13.1.dev41012.dist-info/WHEEL,sha256=RaoafKOydTQ7I_I3JTrPCg6kUmTgtm4BornzOqyEfJ8,88
346
- airbyte_cdk-6.13.1.dev41012.dist-info/entry_points.txt,sha256=fj-e3PAQvsxsQzyyq8UkG1k8spunWnD4BAH2AwlR6NM,95
347
- airbyte_cdk-6.13.1.dev41012.dist-info/RECORD,,
343
+ airbyte_cdk-6.14.0.dist-info/LICENSE.txt,sha256=Wfe61S4BaGPj404v8lrAbvhjYR68SHlkzeYrg3_bbuM,1051
344
+ airbyte_cdk-6.14.0.dist-info/METADATA,sha256=9K6E6L2q8Vn8wNuU-ZHjoxjiEwQX0_Xzb2vwyJzabbY,5988
345
+ airbyte_cdk-6.14.0.dist-info/WHEEL,sha256=RaoafKOydTQ7I_I3JTrPCg6kUmTgtm4BornzOqyEfJ8,88
346
+ airbyte_cdk-6.14.0.dist-info/entry_points.txt,sha256=fj-e3PAQvsxsQzyyq8UkG1k8spunWnD4BAH2AwlR6NM,95
347
+ airbyte_cdk-6.14.0.dist-info/RECORD,,