airbyte-cdk 0.67.0__py3-none-any.whl → 0.67.2__py3-none-any.whl
Sign up to get free protection for your applications and to get access to all the features.
- airbyte_cdk/sources/abstract_source.py +30 -69
- airbyte_cdk/sources/connector_state_manager.py +12 -26
- airbyte_cdk/sources/declarative/models/declarative_component_schema.py +552 -524
- airbyte_cdk/sources/file_based/config/csv_format.py +2 -0
- airbyte_cdk/sources/file_based/file_types/parquet_parser.py +32 -14
- airbyte_cdk/sources/file_based/stream/concurrent/adapters.py +3 -19
- airbyte_cdk/sources/file_based/stream/concurrent/cursor/file_based_concurrent_cursor.py +1 -3
- airbyte_cdk/sources/streams/__init__.py +2 -2
- airbyte_cdk/sources/streams/concurrent/adapters.py +3 -19
- airbyte_cdk/sources/streams/concurrent/cursor.py +1 -3
- airbyte_cdk/sources/streams/core.py +36 -34
- {airbyte_cdk-0.67.0.dist-info → airbyte_cdk-0.67.2.dist-info}/METADATA +3 -2
- {airbyte_cdk-0.67.0.dist-info → airbyte_cdk-0.67.2.dist-info}/RECORD +31 -31
- unit_tests/sources/concurrent_source/test_concurrent_source_adapter.py +2 -1
- unit_tests/sources/file_based/config/test_csv_format.py +6 -1
- unit_tests/sources/file_based/file_types/test_parquet_parser.py +51 -6
- unit_tests/sources/file_based/scenarios/concurrent_incremental_scenarios.py +139 -199
- unit_tests/sources/file_based/scenarios/incremental_scenarios.py +91 -133
- unit_tests/sources/file_based/stream/concurrent/test_adapters.py +2 -13
- unit_tests/sources/file_based/stream/concurrent/test_file_based_concurrent_cursor.py +2 -2
- unit_tests/sources/file_based/test_scenarios.py +2 -2
- unit_tests/sources/streams/concurrent/scenarios/incremental_scenarios.py +9 -9
- unit_tests/sources/streams/concurrent/scenarios/stream_facade_scenarios.py +5 -5
- unit_tests/sources/streams/concurrent/test_adapters.py +2 -13
- unit_tests/sources/streams/test_stream_read.py +221 -11
- unit_tests/sources/test_abstract_source.py +142 -130
- unit_tests/sources/test_connector_state_manager.py +3 -124
- unit_tests/sources/test_source.py +18 -14
- {airbyte_cdk-0.67.0.dist-info → airbyte_cdk-0.67.2.dist-info}/LICENSE.txt +0 -0
- {airbyte_cdk-0.67.0.dist-info → airbyte_cdk-0.67.2.dist-info}/WHEEL +0 -0
- {airbyte_cdk-0.67.0.dist-info → airbyte_cdk-0.67.2.dist-info}/top_level.txt +0 -0
@@ -5,7 +5,7 @@
|
|
5
5
|
import json
|
6
6
|
import logging
|
7
7
|
import os
|
8
|
-
from typing import Any, Dict, Iterable, List, Mapping, Optional, Tuple
|
8
|
+
from typing import Any, Dict, Iterable, List, Mapping, Optional, Tuple, Union
|
9
9
|
from urllib.parse import unquote
|
10
10
|
|
11
11
|
import pyarrow as pa
|
@@ -16,7 +16,7 @@ from airbyte_cdk.sources.file_based.file_based_stream_reader import AbstractFile
|
|
16
16
|
from airbyte_cdk.sources.file_based.file_types.file_type_parser import FileTypeParser
|
17
17
|
from airbyte_cdk.sources.file_based.remote_file import RemoteFile
|
18
18
|
from airbyte_cdk.sources.file_based.schema_helpers import SchemaType
|
19
|
-
from pyarrow import Scalar
|
19
|
+
from pyarrow import DictionaryArray, Scalar
|
20
20
|
|
21
21
|
|
22
22
|
class ParquetParser(FileTypeParser):
|
@@ -95,10 +95,23 @@ class ParquetParser(FileTypeParser):
|
|
95
95
|
return FileReadMode.READ_BINARY
|
96
96
|
|
97
97
|
@staticmethod
|
98
|
-
def _to_output_value(parquet_value: Scalar, parquet_format: ParquetFormat) -> Any:
|
98
|
+
def _to_output_value(parquet_value: Union[Scalar, DictionaryArray], parquet_format: ParquetFormat) -> Any:
|
99
|
+
"""
|
100
|
+
Convert an entry in a pyarrow table to a value that can be output by the source.
|
101
|
+
"""
|
102
|
+
if isinstance(parquet_value, DictionaryArray):
|
103
|
+
return ParquetParser._dictionary_array_to_python_value(parquet_value)
|
104
|
+
else:
|
105
|
+
return ParquetParser._scalar_to_python_value(parquet_value, parquet_format)
|
106
|
+
|
107
|
+
@staticmethod
|
108
|
+
def _scalar_to_python_value(parquet_value: Scalar, parquet_format: ParquetFormat) -> Any:
|
99
109
|
"""
|
100
110
|
Convert a pyarrow scalar to a value that can be output by the source.
|
101
111
|
"""
|
112
|
+
if parquet_value.as_py() is None:
|
113
|
+
return None
|
114
|
+
|
102
115
|
# Convert date and datetime objects to isoformat strings
|
103
116
|
if pa.types.is_time(parquet_value.type) or pa.types.is_timestamp(parquet_value.type) or pa.types.is_date(parquet_value.type):
|
104
117
|
return parquet_value.as_py().isoformat()
|
@@ -109,23 +122,14 @@ class ParquetParser(FileTypeParser):
|
|
109
122
|
|
110
123
|
# Decode binary strings to utf-8
|
111
124
|
if ParquetParser._is_binary(parquet_value.type):
|
112
|
-
|
113
|
-
|
114
|
-
return py_value
|
115
|
-
return py_value.decode("utf-8")
|
125
|
+
return parquet_value.as_py().decode("utf-8")
|
126
|
+
|
116
127
|
if pa.types.is_decimal(parquet_value.type):
|
117
128
|
if parquet_format.decimal_as_float:
|
118
129
|
return parquet_value.as_py()
|
119
130
|
else:
|
120
131
|
return str(parquet_value.as_py())
|
121
132
|
|
122
|
-
# Dictionaries are stored as two columns: indices and values
|
123
|
-
# The indices column is an array of integers that maps to the values column
|
124
|
-
if pa.types.is_dictionary(parquet_value.type):
|
125
|
-
return {
|
126
|
-
"indices": parquet_value.indices.tolist(),
|
127
|
-
"values": parquet_value.dictionary.tolist(),
|
128
|
-
}
|
129
133
|
if pa.types.is_map(parquet_value.type):
|
130
134
|
return {k: v for k, v in parquet_value.as_py()}
|
131
135
|
|
@@ -149,6 +153,20 @@ class ParquetParser(FileTypeParser):
|
|
149
153
|
else:
|
150
154
|
return parquet_value.as_py()
|
151
155
|
|
156
|
+
@staticmethod
|
157
|
+
def _dictionary_array_to_python_value(parquet_value: DictionaryArray) -> Dict[str, Any]:
|
158
|
+
"""
|
159
|
+
Convert a pyarrow dictionary array to a value that can be output by the source.
|
160
|
+
|
161
|
+
Dictionaries are stored as two columns: indices and values
|
162
|
+
The indices column is an array of integers that maps to the values column
|
163
|
+
"""
|
164
|
+
|
165
|
+
return {
|
166
|
+
"indices": parquet_value.indices.tolist(),
|
167
|
+
"values": parquet_value.dictionary.tolist(),
|
168
|
+
}
|
169
|
+
|
152
170
|
@staticmethod
|
153
171
|
def parquet_type_to_schema_type(parquet_type: pa.DataType, parquet_format: ParquetFormat) -> Mapping[str, str]:
|
154
172
|
"""
|
@@ -7,7 +7,7 @@ import logging
|
|
7
7
|
from functools import lru_cache
|
8
8
|
from typing import TYPE_CHECKING, Any, Iterable, List, Mapping, MutableMapping, Optional, Union
|
9
9
|
|
10
|
-
from airbyte_cdk.models import AirbyteLogMessage, AirbyteMessage, Level, SyncMode, Type
|
10
|
+
from airbyte_cdk.models import AirbyteLogMessage, AirbyteMessage, ConfiguredAirbyteStream, Level, SyncMode, Type
|
11
11
|
from airbyte_cdk.sources import AbstractSource
|
12
12
|
from airbyte_cdk.sources.connector_state_manager import ConnectorStateManager
|
13
13
|
from airbyte_cdk.sources.file_based.availability_strategy import (
|
@@ -156,29 +156,13 @@ class FileBasedStreamFacade(AbstractStreamFacade[DefaultStream], AbstractFileBas
|
|
156
156
|
def get_underlying_stream(self) -> DefaultStream:
|
157
157
|
return self._abstract_stream
|
158
158
|
|
159
|
-
def
|
159
|
+
def read(
|
160
160
|
self,
|
161
|
-
|
162
|
-
logger: logging.Logger,
|
163
|
-
slice_logger: SliceLogger,
|
164
|
-
) -> Iterable[StreamData]:
|
165
|
-
"""
|
166
|
-
Read full refresh. Delegate to the underlying AbstractStream, ignoring all the parameters
|
167
|
-
:param cursor_field: (ignored)
|
168
|
-
:param logger: (ignored)
|
169
|
-
:param slice_logger: (ignored)
|
170
|
-
:return: Iterable of StreamData
|
171
|
-
"""
|
172
|
-
yield from self._read_records()
|
173
|
-
|
174
|
-
def read_incremental(
|
175
|
-
self,
|
176
|
-
cursor_field: Optional[List[str]],
|
161
|
+
configured_stream: ConfiguredAirbyteStream,
|
177
162
|
logger: logging.Logger,
|
178
163
|
slice_logger: SliceLogger,
|
179
164
|
stream_state: MutableMapping[str, Any],
|
180
165
|
state_manager: ConnectorStateManager,
|
181
|
-
per_stream_state_enabled: bool,
|
182
166
|
internal_config: InternalConfig,
|
183
167
|
) -> Iterable[StreamData]:
|
184
168
|
yield from self._read_records()
|
@@ -155,9 +155,7 @@ class FileBasedConcurrentCursor(AbstractConcurrentFileBasedCursor):
|
|
155
155
|
self._stream_namespace,
|
156
156
|
new_state,
|
157
157
|
)
|
158
|
-
state_message = self._connector_state_manager.create_state_message(
|
159
|
-
self._stream_name, self._stream_namespace, send_per_stream_state=True
|
160
|
-
)
|
158
|
+
state_message = self._connector_state_manager.create_state_message(self._stream_name, self._stream_namespace)
|
161
159
|
self._message_repository.emit_message(state_message)
|
162
160
|
|
163
161
|
def _get_new_cursor_value(self) -> str:
|
@@ -3,6 +3,6 @@
|
|
3
3
|
#
|
4
4
|
|
5
5
|
# Initialize Streams Package
|
6
|
-
from .core import IncrementalMixin, Stream
|
6
|
+
from .core import FULL_REFRESH_SENTINEL_STATE_KEY, IncrementalMixin, Stream
|
7
7
|
|
8
|
-
__all__ = ["IncrementalMixin", "Stream"]
|
8
|
+
__all__ = ["FULL_REFRESH_SENTINEL_STATE_KEY", "IncrementalMixin", "Stream"]
|
@@ -8,7 +8,7 @@ import logging
|
|
8
8
|
from functools import lru_cache
|
9
9
|
from typing import Any, Iterable, List, Mapping, MutableMapping, Optional, Tuple, Union
|
10
10
|
|
11
|
-
from airbyte_cdk.models import AirbyteLogMessage, AirbyteMessage, AirbyteStream, Level, SyncMode, Type
|
11
|
+
from airbyte_cdk.models import AirbyteLogMessage, AirbyteMessage, AirbyteStream, ConfiguredAirbyteStream, Level, SyncMode, Type
|
12
12
|
from airbyte_cdk.sources import AbstractSource, Source
|
13
13
|
from airbyte_cdk.sources.connector_state_manager import ConnectorStateManager
|
14
14
|
from airbyte_cdk.sources.message import MessageRepository
|
@@ -116,29 +116,13 @@ class StreamFacade(AbstractStreamFacade[DefaultStream], Stream):
|
|
116
116
|
self._slice_logger = slice_logger
|
117
117
|
self._logger = logger
|
118
118
|
|
119
|
-
def
|
119
|
+
def read(
|
120
120
|
self,
|
121
|
-
|
122
|
-
logger: logging.Logger,
|
123
|
-
slice_logger: SliceLogger,
|
124
|
-
) -> Iterable[StreamData]:
|
125
|
-
"""
|
126
|
-
Read full refresh. Delegate to the underlying AbstractStream, ignoring all the parameters
|
127
|
-
:param cursor_field: (ignored)
|
128
|
-
:param logger: (ignored)
|
129
|
-
:param slice_logger: (ignored)
|
130
|
-
:return: Iterable of StreamData
|
131
|
-
"""
|
132
|
-
yield from self._read_records()
|
133
|
-
|
134
|
-
def read_incremental(
|
135
|
-
self,
|
136
|
-
cursor_field: Optional[List[str]],
|
121
|
+
configured_stream: ConfiguredAirbyteStream,
|
137
122
|
logger: logging.Logger,
|
138
123
|
slice_logger: SliceLogger,
|
139
124
|
stream_state: MutableMapping[str, Any],
|
140
125
|
state_manager: ConnectorStateManager,
|
141
|
-
per_stream_state_enabled: bool,
|
142
126
|
internal_config: InternalConfig,
|
143
127
|
) -> Iterable[StreamData]:
|
144
128
|
yield from self._read_records()
|
@@ -184,9 +184,7 @@ class ConcurrentCursor(Cursor):
|
|
184
184
|
# TODO: if we migrate stored state to the concurrent state format
|
185
185
|
# (aka stop calling self._connector_state_converter.convert_to_sequential_state`), we'll need to cast datetimes to string or
|
186
186
|
# int before emitting state
|
187
|
-
state_message = self._connector_state_manager.create_state_message(
|
188
|
-
self._stream_name, self._stream_namespace, send_per_stream_state=True
|
189
|
-
)
|
187
|
+
state_message = self._connector_state_manager.create_state_message(self._stream_name, self._stream_namespace)
|
190
188
|
self._message_repository.emit_message(state_message)
|
191
189
|
|
192
190
|
def _merge_partitions(self) -> None:
|
@@ -11,7 +11,7 @@ from functools import lru_cache
|
|
11
11
|
from typing import Any, Iterable, List, Mapping, MutableMapping, Optional, Tuple, Union
|
12
12
|
|
13
13
|
import airbyte_cdk.sources.utils.casing as casing
|
14
|
-
from airbyte_cdk.models import AirbyteMessage, AirbyteStream, SyncMode
|
14
|
+
from airbyte_cdk.models import AirbyteMessage, AirbyteStream, ConfiguredAirbyteStream, SyncMode
|
15
15
|
from airbyte_cdk.models import Type as MessageType
|
16
16
|
|
17
17
|
# list of all possible HTTP methods which can be used for sending of request bodies
|
@@ -31,6 +31,10 @@ StreamData = Union[Mapping[str, Any], AirbyteMessage]
|
|
31
31
|
|
32
32
|
JsonSchema = Mapping[str, Any]
|
33
33
|
|
34
|
+
# Streams that only support full refresh don't have a suitable cursor so this sentinel
|
35
|
+
# value is used to indicate that stream should not load the incoming state value
|
36
|
+
FULL_REFRESH_SENTINEL_STATE_KEY = "__ab_full_refresh_state_message"
|
37
|
+
|
34
38
|
|
35
39
|
def package_name_from_class(cls: object) -> str:
|
36
40
|
"""Find the package name given a class name"""
|
@@ -107,39 +111,24 @@ class Stream(ABC):
|
|
107
111
|
"""
|
108
112
|
return None
|
109
113
|
|
110
|
-
def
|
111
|
-
self,
|
112
|
-
cursor_field: Optional[List[str]],
|
113
|
-
logger: logging.Logger,
|
114
|
-
slice_logger: SliceLogger,
|
115
|
-
) -> Iterable[StreamData]:
|
116
|
-
slices = self.stream_slices(sync_mode=SyncMode.full_refresh, cursor_field=cursor_field)
|
117
|
-
logger.debug(f"Processing stream slices for {self.name} (sync_mode: full_refresh)", extra={"stream_slices": slices})
|
118
|
-
for _slice in slices:
|
119
|
-
if slice_logger.should_log_slice_message(logger):
|
120
|
-
yield slice_logger.create_slice_log_message(_slice)
|
121
|
-
yield from self.read_records(
|
122
|
-
stream_slice=_slice,
|
123
|
-
sync_mode=SyncMode.full_refresh,
|
124
|
-
cursor_field=cursor_field,
|
125
|
-
)
|
126
|
-
|
127
|
-
def read_incremental( # type: ignore # ignoring typing for ConnectorStateManager because of circular dependencies
|
114
|
+
def read( # type: ignore # ignoring typing for ConnectorStateManager because of circular dependencies
|
128
115
|
self,
|
129
|
-
|
116
|
+
configured_stream: ConfiguredAirbyteStream,
|
130
117
|
logger: logging.Logger,
|
131
118
|
slice_logger: SliceLogger,
|
132
119
|
stream_state: MutableMapping[str, Any],
|
133
120
|
state_manager,
|
134
|
-
per_stream_state_enabled: bool,
|
135
121
|
internal_config: InternalConfig,
|
136
122
|
) -> Iterable[StreamData]:
|
123
|
+
sync_mode = configured_stream.sync_mode
|
124
|
+
cursor_field = configured_stream.cursor_field
|
125
|
+
|
137
126
|
slices = self.stream_slices(
|
138
127
|
cursor_field=cursor_field,
|
139
|
-
sync_mode=
|
128
|
+
sync_mode=sync_mode, # todo: change this interface to no longer rely on sync_mode for behavior
|
140
129
|
stream_state=stream_state,
|
141
130
|
)
|
142
|
-
logger.debug(f"Processing stream slices for {self.name} (sync_mode:
|
131
|
+
logger.debug(f"Processing stream slices for {self.name} (sync_mode: {sync_mode.name})", extra={"stream_slices": slices})
|
143
132
|
|
144
133
|
has_slices = False
|
145
134
|
record_counter = 0
|
@@ -148,7 +137,7 @@ class Stream(ABC):
|
|
148
137
|
if slice_logger.should_log_slice_message(logger):
|
149
138
|
yield slice_logger.create_slice_log_message(_slice)
|
150
139
|
records = self.read_records(
|
151
|
-
sync_mode=
|
140
|
+
sync_mode=sync_mode, # todo: change this interface to no longer rely on sync_mode for behavior
|
152
141
|
stream_slice=_slice,
|
153
142
|
stream_state=stream_state,
|
154
143
|
cursor_field=cursor_field or None,
|
@@ -160,20 +149,34 @@ class Stream(ABC):
|
|
160
149
|
):
|
161
150
|
record_data = record_data_or_message if isinstance(record_data_or_message, Mapping) else record_data_or_message.record
|
162
151
|
stream_state = self.get_updated_state(stream_state, record_data)
|
163
|
-
checkpoint_interval = self.state_checkpoint_interval
|
164
152
|
record_counter += 1
|
165
|
-
|
166
|
-
|
153
|
+
|
154
|
+
if sync_mode == SyncMode.incremental:
|
155
|
+
# Checkpoint intervals are a bit controversial, but see below comment about why we're gating it right now
|
156
|
+
checkpoint_interval = self.state_checkpoint_interval
|
157
|
+
if checkpoint_interval and record_counter % checkpoint_interval == 0:
|
158
|
+
airbyte_state_message = self._checkpoint_state(stream_state, state_manager)
|
159
|
+
yield airbyte_state_message
|
167
160
|
|
168
161
|
if internal_config.is_limit_reached(record_counter):
|
169
162
|
break
|
170
163
|
|
171
|
-
|
164
|
+
if sync_mode == SyncMode.incremental:
|
165
|
+
# Even though right now, only incremental streams running as incremental mode will emit periodic checkpoints. Rather than
|
166
|
+
# overhaul how refresh interacts with the platform, this positions the code so that once we want to start emitting
|
167
|
+
# periodic checkpoints in full refresh mode it can be done here
|
168
|
+
airbyte_state_message = self._checkpoint_state(stream_state, state_manager)
|
169
|
+
yield airbyte_state_message
|
170
|
+
|
171
|
+
if not has_slices or sync_mode == SyncMode.full_refresh:
|
172
|
+
if sync_mode == SyncMode.full_refresh:
|
173
|
+
# We use a dummy state if there is no suitable value provided by full_refresh streams that do not have a valid cursor.
|
174
|
+
# Incremental streams running full_refresh mode emit a meaningful state
|
175
|
+
stream_state = stream_state or {FULL_REFRESH_SENTINEL_STATE_KEY: True}
|
172
176
|
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
yield checkpoint
|
177
|
+
# We should always emit a final state message for full refresh sync or streams that do not have any slices
|
178
|
+
airbyte_state_message = self._checkpoint_state(stream_state, state_manager)
|
179
|
+
yield airbyte_state_message
|
177
180
|
|
178
181
|
@abstractmethod
|
179
182
|
def read_records(
|
@@ -361,7 +364,6 @@ class Stream(ABC):
|
|
361
364
|
self,
|
362
365
|
stream_state: Mapping[str, Any],
|
363
366
|
state_manager,
|
364
|
-
per_stream_state_enabled: bool,
|
365
367
|
) -> AirbyteMessage:
|
366
368
|
# First attempt to retrieve the current state using the stream's state property. We receive an AttributeError if the state
|
367
369
|
# property is not implemented by the stream instance and as a fallback, use the stream_state retrieved from the stream
|
@@ -373,4 +375,4 @@ class Stream(ABC):
|
|
373
375
|
|
374
376
|
except AttributeError:
|
375
377
|
state_manager.update_state_for_stream(self.name, self.namespace, stream_state)
|
376
|
-
return state_manager.create_state_message(self.name, self.namespace
|
378
|
+
return state_manager.create_state_message(self.name, self.namespace)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: airbyte-cdk
|
3
|
-
Version: 0.67.
|
3
|
+
Version: 0.67.2
|
4
4
|
Summary: A framework for writing Airbyte Connectors.
|
5
5
|
Home-page: https://github.com/airbytehq/airbyte
|
6
6
|
Author: Airbyte
|
@@ -147,7 +147,8 @@ pip install -e ".[dev]" # [dev] installs development-only dependencies
|
|
147
147
|
If the iteration you are working on includes changes to the models, you might want to regenerate them. In order to do that, you can run:
|
148
148
|
|
149
149
|
```bash
|
150
|
-
|
150
|
+
cd airbyte-cdk/python
|
151
|
+
./gradlew build
|
151
152
|
```
|
152
153
|
|
153
154
|
This will generate the files based on the schemas, add the license information and format the code. If you want to only do the former and rely on
|
@@ -24,9 +24,9 @@ airbyte_cdk/models/__init__.py,sha256=Kg8YHBqUsNWHlAw-u3ZGdG4dxLh7qBlHhqMRfamNCR
|
|
24
24
|
airbyte_cdk/models/airbyte_protocol.py,sha256=DoJvnmGM3xMAZFTwA6_RGMiKSFqfE3ib_Ru0KJ65Ag4,100
|
25
25
|
airbyte_cdk/models/well_known_types.py,sha256=KKfNbow2gdLoC1Z4hcXy_JR8m_acsB2ol7gQuEgjobw,117
|
26
26
|
airbyte_cdk/sources/__init__.py,sha256=Ov7Uf03KPSZUmMZqZfUAK3tQwsdKjDQUDvTb-H0JyfA,1141
|
27
|
-
airbyte_cdk/sources/abstract_source.py,sha256=
|
27
|
+
airbyte_cdk/sources/abstract_source.py,sha256=vcYtKYZkQnKQamj7lB11xU32yFkZSlCrN7Z1n2iGKXM,15033
|
28
28
|
airbyte_cdk/sources/config.py,sha256=PYsY7y2u3EUwxLiEb96JnuKwH_E8CuxKggsRO2ZPSRc,856
|
29
|
-
airbyte_cdk/sources/connector_state_manager.py,sha256=
|
29
|
+
airbyte_cdk/sources/connector_state_manager.py,sha256=rMb8roMcupsKtTXbGsufVl6bq-XVGBTxyTqTOuluMQs,10003
|
30
30
|
airbyte_cdk/sources/http_config.py,sha256=OBZeuyFilm6NlDlBhFQvHhTWabEvZww6OHDIlZujIS0,730
|
31
31
|
airbyte_cdk/sources/http_logger.py,sha256=v0kkpDtA0GUOgj6_3AayrYaBrSHBqG4t3MGbrtxaNmU,1437
|
32
32
|
airbyte_cdk/sources/source.py,sha256=dk50z8Roc28MJ8FxWe652B-GwItO__bTZqFm7WOtHnw,4412
|
@@ -80,7 +80,7 @@ airbyte_cdk/sources/declarative/interpolation/interpolation.py,sha256=dyIM-bzh54
|
|
80
80
|
airbyte_cdk/sources/declarative/interpolation/jinja.py,sha256=8bUH6xJRkao8BanwzBFj-1CDj7RR2xPO5u_-FfyRNks,5128
|
81
81
|
airbyte_cdk/sources/declarative/interpolation/macros.py,sha256=V6WGKJ9cXX1rjuM4bK3Cs9xEryMlkY2U3FMsSBhrgC8,3098
|
82
82
|
airbyte_cdk/sources/declarative/models/__init__.py,sha256=EiYnzwCHZV7EYqMJqcy6xKSeHvTKZBsQndjbEwmiTW4,93
|
83
|
-
airbyte_cdk/sources/declarative/models/declarative_component_schema.py,sha256=
|
83
|
+
airbyte_cdk/sources/declarative/models/declarative_component_schema.py,sha256=YBz0FIS8crj3bJ8sErWtCRol-6he1fewoMgQtAWj2XM,60991
|
84
84
|
airbyte_cdk/sources/declarative/parsers/__init__.py,sha256=ZnqYNxHsKCgO38IwB34RQyRMXTs4GTvlRi3ImKnIioo,61
|
85
85
|
airbyte_cdk/sources/declarative/parsers/class_types_registry.py,sha256=5vOvMuyWlpALrOq2ehLxa7wO6tlFIlgUNtMYrMCKIjE,6092
|
86
86
|
airbyte_cdk/sources/declarative/parsers/custom_exceptions.py,sha256=y7_G5mM07zxT5YG975kdC2PAja-Uc83pYp8WrV3GNdo,522
|
@@ -164,7 +164,7 @@ airbyte_cdk/sources/file_based/availability_strategy/default_file_based_availabi
|
|
164
164
|
airbyte_cdk/sources/file_based/config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
165
165
|
airbyte_cdk/sources/file_based/config/abstract_file_based_spec.py,sha256=dgOoQuoi7-7wdTMSP7wz4ENXIDT49Ew4FoAxnnplGGc,4956
|
166
166
|
airbyte_cdk/sources/file_based/config/avro_format.py,sha256=q1I2G9bGNy3ADds35PfWT7Mss6fjYzUtYDkUYvh5v7s,712
|
167
|
-
airbyte_cdk/sources/file_based/config/csv_format.py,sha256=
|
167
|
+
airbyte_cdk/sources/file_based/config/csv_format.py,sha256=XcKuM2xa0OZErSDdOdeAx79KZV52lKvVXXuRDYLKVuk,7526
|
168
168
|
airbyte_cdk/sources/file_based/config/file_based_stream_config.py,sha256=l9DFyttYbxY9exwy67WzRXySEk_yKV2G_THRA_Sq1I4,4229
|
169
169
|
airbyte_cdk/sources/file_based/config/jsonl_format.py,sha256=fAPzZnoghGgHjaDvx6Qo68C8j54mBxo1NTdpwSI0VZo,374
|
170
170
|
airbyte_cdk/sources/file_based/config/parquet_format.py,sha256=yKHgXYu3zJWrGfBlJ3JQZ3gVFPumF-K4rjVPNoYTUZ0,737
|
@@ -177,7 +177,7 @@ airbyte_cdk/sources/file_based/file_types/avro_parser.py,sha256=FC3L6D32SzhAv4jy
|
|
177
177
|
airbyte_cdk/sources/file_based/file_types/csv_parser.py,sha256=biq2Fi7Nw5K1hIX_MelctEfpC5BEbGRqHL8rkCjS9ng,18414
|
178
178
|
airbyte_cdk/sources/file_based/file_types/file_type_parser.py,sha256=Gbn-8v1-jLhKpJXTNOOc5PZT1Jzah6G-INCZt4snLdQ,2819
|
179
179
|
airbyte_cdk/sources/file_based/file_types/jsonl_parser.py,sha256=MkjK_J2OqzqRPyGeQFQFADxgwqsRaNtoawB7dwKxWb0,5666
|
180
|
-
airbyte_cdk/sources/file_based/file_types/parquet_parser.py,sha256=
|
180
|
+
airbyte_cdk/sources/file_based/file_types/parquet_parser.py,sha256=xktrUFFzBD-mlnu0MMa0O6HIrZBmaQCAqDgi28tPzOc,9998
|
181
181
|
airbyte_cdk/sources/file_based/file_types/unstructured_parser.py,sha256=omYdo6daIHI-YWF9WsKFdFHRXTFWgJjJ3OqegiN345k,16736
|
182
182
|
airbyte_cdk/sources/file_based/schema_validation_policies/__init__.py,sha256=sEVnRhZ8x9f7PNjo6lewxid9z0PI8eSj7gSoFC3MH1Y,527
|
183
183
|
airbyte_cdk/sources/file_based/schema_validation_policies/abstract_schema_validation_policy.py,sha256=uwk6Ugf23xKG4PRPVVRVwpcNjTwPgxejl03vLSEzK0s,604
|
@@ -186,10 +186,10 @@ airbyte_cdk/sources/file_based/stream/__init__.py,sha256=QPDqdgjsabOQD93dSFqHGaF
|
|
186
186
|
airbyte_cdk/sources/file_based/stream/abstract_file_based_stream.py,sha256=cmO1SQt5PIQRNNoh2KBv6aeY8NEY9x2dlmiRwGwU1vg,6557
|
187
187
|
airbyte_cdk/sources/file_based/stream/default_file_based_stream.py,sha256=qS0DJzXlVew6armFDJ0eNcSxRCmkA7JWQYFl6gcv3dU,13113
|
188
188
|
airbyte_cdk/sources/file_based/stream/concurrent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
189
|
-
airbyte_cdk/sources/file_based/stream/concurrent/adapters.py,sha256=
|
189
|
+
airbyte_cdk/sources/file_based/stream/concurrent/adapters.py,sha256=G93wu1oo1OOUWrl3z16wISYN8JyqJitkpfeqv5016vc,12806
|
190
190
|
airbyte_cdk/sources/file_based/stream/concurrent/cursor/__init__.py,sha256=4gi-_oETrHYZClD12okh13INBsI2OfugKhToXtohRTs,310
|
191
191
|
airbyte_cdk/sources/file_based/stream/concurrent/cursor/abstract_concurrent_file_based_cursor.py,sha256=UYLE2A2RdV-5FaQ70naZZWY34l5AEJkIRlTH05-e_-k,1961
|
192
|
-
airbyte_cdk/sources/file_based/stream/concurrent/cursor/file_based_concurrent_cursor.py,sha256=
|
192
|
+
airbyte_cdk/sources/file_based/stream/concurrent/cursor/file_based_concurrent_cursor.py,sha256=Bs8e05pbY1OhTUsklhIqrfeCataME_fkg0ToakifHgY,14331
|
193
193
|
airbyte_cdk/sources/file_based/stream/concurrent/cursor/file_based_noop_cursor.py,sha256=wblXBgNw-QLVPNOAL8DihlQBXbvPC1zCdDWMsPdZPzQ,1852
|
194
194
|
airbyte_cdk/sources/file_based/stream/cursor/__init__.py,sha256=MhFB5hOo8sjwvCh8gangaymdg3EJWYt_72brFOZt068,191
|
195
195
|
airbyte_cdk/sources/file_based/stream/cursor/abstract_file_based_cursor.py,sha256=i-FPeK8lwCzX34GCcmvL5Yvdh8-uu7FeCVYDoFbD7IY,1920
|
@@ -199,16 +199,16 @@ airbyte_cdk/sources/message/repository.py,sha256=tQOmtWxrAp1CMiOKi5SdIEWzcmgnCUY
|
|
199
199
|
airbyte_cdk/sources/singer/__init__.py,sha256=D3zQSiWT0B9t0kKE4JPZjrcDnP2YnFNJ3dfYqSaxo9w,246
|
200
200
|
airbyte_cdk/sources/singer/singer_helpers.py,sha256=q1LmgjFxSnN-dobMy7nikUwcK-9FvW5QQfgTqiclbAE,15649
|
201
201
|
airbyte_cdk/sources/singer/source.py,sha256=3YY8UTOXmctvMVUnYmIegmL3_IxF55iGP_bc_s2MZdY,8530
|
202
|
-
airbyte_cdk/sources/streams/__init__.py,sha256=
|
202
|
+
airbyte_cdk/sources/streams/__init__.py,sha256=VBGcpSl-SdcY5ajsHe99GLNC4NXAYIm1k1MZxWYllAE,244
|
203
203
|
airbyte_cdk/sources/streams/availability_strategy.py,sha256=7BM0qLvXS0QrlKvnVkBEw4Cw8i7PCENCBLcIAcuD3nY,1007
|
204
204
|
airbyte_cdk/sources/streams/call_rate.py,sha256=5T4J8WxMNov76iXRUtD5KlM1CsROxuAQPwGQAZyvpHg,20555
|
205
|
-
airbyte_cdk/sources/streams/core.py,sha256=
|
205
|
+
airbyte_cdk/sources/streams/core.py,sha256=UdJfpc1jwT6igY-e5w-ow5ciT5feHq8F79Dxvpc1Sss,16741
|
206
206
|
airbyte_cdk/sources/streams/concurrent/__init__.py,sha256=4Hw-PX1-VgESLF16cDdvuYCzGJtHntThLF4qIiULWeo,61
|
207
207
|
airbyte_cdk/sources/streams/concurrent/abstract_stream.py,sha256=HlnmAh-LcQbs9g1r0iUAUe3IN0RmUSZits5Nyers51g,3792
|
208
208
|
airbyte_cdk/sources/streams/concurrent/abstract_stream_facade.py,sha256=QTry1QCBUwJDw1QSCEvz23s7zIEx_7QMxkPq9j-oPIQ,1358
|
209
|
-
airbyte_cdk/sources/streams/concurrent/adapters.py,sha256=
|
209
|
+
airbyte_cdk/sources/streams/concurrent/adapters.py,sha256=ok68ZE2tYH3XR0Ti3mwSsCO_WQSGyqTCXTFI5Gc5WZk,16267
|
210
210
|
airbyte_cdk/sources/streams/concurrent/availability_strategy.py,sha256=8xDRpfktnARBbRi_RwznvKuoGrpPF2b6tQyloMwogkM,2013
|
211
|
-
airbyte_cdk/sources/streams/concurrent/cursor.py,sha256=
|
211
|
+
airbyte_cdk/sources/streams/concurrent/cursor.py,sha256=KaLdNz5auNIOtLPF94g4un-BVUH9JHSvw3UrCwBUqAg,9732
|
212
212
|
airbyte_cdk/sources/streams/concurrent/default_stream.py,sha256=qPhMaLxGdR29kyMeA-YrHg-XePgPNDjactQPKbp56RA,3009
|
213
213
|
airbyte_cdk/sources/streams/concurrent/exceptions.py,sha256=-WETGIY5_QFmVeDFiqm4WhRJ_nNCkfcDwOQqx6cSqrI,365
|
214
214
|
airbyte_cdk/sources/streams/concurrent/helpers.py,sha256=FPdGovWg0_hPxoTCAJnqs2SEqEq32pRGKlvPMP7hGWo,1290
|
@@ -282,16 +282,16 @@ unit_tests/singer/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU
|
|
282
282
|
unit_tests/singer/test_singer_helpers.py,sha256=pZV6VxJuK-3-FICNGmoGbokrA_zkaFZEd4rYZCVpSRU,1762
|
283
283
|
unit_tests/singer/test_singer_source.py,sha256=edN_kv7dnYAdBveWdUYOs74ak0dK6p8uaX225h_ZILA,4442
|
284
284
|
unit_tests/sources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
285
|
-
unit_tests/sources/test_abstract_source.py,sha256=
|
285
|
+
unit_tests/sources/test_abstract_source.py,sha256=TZ9Mn_kT9A2A_CRJLS9OQjBnlWrPRqf8EyNd8eJ_ZrM,57197
|
286
286
|
unit_tests/sources/test_concurrent_source.py,sha256=3i7pSRetKSoP6LBpXyuXpWi2_VOwta_aTm_kgnDaLqk,3704
|
287
287
|
unit_tests/sources/test_config.py,sha256=lxjeaf48pOMF4Pf3-Z1ux_tHTyjRFCdG_hpnxw3e7uQ,2839
|
288
|
-
unit_tests/sources/test_connector_state_manager.py,sha256=
|
288
|
+
unit_tests/sources/test_connector_state_manager.py,sha256=PGvBh90FAtG7vp_4y8nZxcjx1mEcFn382PCdBH-r9-I,19588
|
289
289
|
unit_tests/sources/test_http_logger.py,sha256=VT6DqgspI3DcRnoBQkkQX0z4dF_AOiYZ5P_zxmMW8oU,9004
|
290
290
|
unit_tests/sources/test_integration_source.py,sha256=qcWld9evB1rAjALWX8SDshGz7seYkN3HCamQ6KQ2Idw,4269
|
291
|
-
unit_tests/sources/test_source.py,sha256=
|
291
|
+
unit_tests/sources/test_source.py,sha256=zwyU7pLwQaEzeozxPJzNeRvZXb2xddeWO4bLqdMt9BM,28343
|
292
292
|
unit_tests/sources/test_source_read.py,sha256=n9XpVQLfsQH8eh6D99MDiNVBBKcf6UtouThDJcGH6SU,17186
|
293
293
|
unit_tests/sources/concurrent_source/__init__.py,sha256=4Hw-PX1-VgESLF16cDdvuYCzGJtHntThLF4qIiULWeo,61
|
294
|
-
unit_tests/sources/concurrent_source/test_concurrent_source_adapter.py,sha256=
|
294
|
+
unit_tests/sources/concurrent_source/test_concurrent_source_adapter.py,sha256=ZEJzOm9pVFHrXBS3cT43XdK_vopICZmoqzFsTE2E8Tk,3675
|
295
295
|
unit_tests/sources/declarative/__init__.py,sha256=ZnqYNxHsKCgO38IwB34RQyRMXTs4GTvlRi3ImKnIioo,61
|
296
296
|
unit_tests/sources/declarative/external_component.py,sha256=lU2gL736bLEWtmrGm1B2k83RXt_3XkROimLIahZd5dg,293
|
297
297
|
unit_tests/sources/declarative/test_create_partial.py,sha256=s_KIywQqt8RlauOCWNJVk3HC3KBTAtSwFTN6JVQgu80,2636
|
@@ -373,13 +373,13 @@ unit_tests/sources/file_based/helpers.py,sha256=JSKXrPL7iSBSH7nkKde-jcylVuDohJid
|
|
373
373
|
unit_tests/sources/file_based/in_memory_files_source.py,sha256=1UCfRMgaovPdhkORT5k5Izj6e0ldPp802iiaffG2ghk,8550
|
374
374
|
unit_tests/sources/file_based/test_file_based_scenarios.py,sha256=llrPRotbYvUrORrqOFH8nMqQZ_QSs4sYwwgvqzkQsvc,15355
|
375
375
|
unit_tests/sources/file_based/test_file_based_stream_reader.py,sha256=P6yTp7tbPfREzi5SXg4SSSql5nxiRV571YdOmwb_SzY,9219
|
376
|
-
unit_tests/sources/file_based/test_scenarios.py,sha256=
|
376
|
+
unit_tests/sources/file_based/test_scenarios.py,sha256=85qb_CXTGNTS7pk-N73EGd55J0Cnky8i1G900cs4sek,9405
|
377
377
|
unit_tests/sources/file_based/test_schema_helpers.py,sha256=IYIDdLRK41RkSG_ZW2cagAt9krV4QLbkzu6r7vPx9Js,12047
|
378
378
|
unit_tests/sources/file_based/availability_strategy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
379
379
|
unit_tests/sources/file_based/availability_strategy/test_default_file_based_availability_strategy.py,sha256=14ffoRWC4RHPrmBFZpplnAd1Uezn8neuQrIyZqvjTK0,4964
|
380
380
|
unit_tests/sources/file_based/config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
381
381
|
unit_tests/sources/file_based/config/test_abstract_file_based_spec.py,sha256=_9Gr1r0dR-dpqQlciG8VuS6ziuCYBjpPvGEiYvS7s7w,1169
|
382
|
-
unit_tests/sources/file_based/config/test_csv_format.py,sha256=
|
382
|
+
unit_tests/sources/file_based/config/test_csv_format.py,sha256=zFgnyJnCQeqsqHH31ZerVeC_km32wU4Sbe-OKoR7wNY,1282
|
383
383
|
unit_tests/sources/file_based/config/test_file_based_stream_config.py,sha256=aDVLvD5ngKJiLMyAO5tSJFCc026tVlqTUGGASnTeKBI,3320
|
384
384
|
unit_tests/sources/file_based/discovery_policy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
385
385
|
unit_tests/sources/file_based/discovery_policy/test_default_discovery_policy.py,sha256=RTbPxseKWNLzASeOSxxX72APJoIFm8VpQM9Ok7NE5C0,1132
|
@@ -387,15 +387,15 @@ unit_tests/sources/file_based/file_types/__init__.py,sha256=47DEQpj8HBSa-_TImW-5
|
|
387
387
|
unit_tests/sources/file_based/file_types/test_avro_parser.py,sha256=LCoGa0fvOberrnDu7-Ox_gVNHj_6ERLoWionz0sD0eU,11177
|
388
388
|
unit_tests/sources/file_based/file_types/test_csv_parser.py,sha256=qgTT67wVgbhcvwuxbzr2UykRGIhsOYCTYdEcvgI4q_s,22615
|
389
389
|
unit_tests/sources/file_based/file_types/test_jsonl_parser.py,sha256=foTf9U9LyAS8OR0BonwNgFWPqTrmzFV2lpPUfRMrioE,6134
|
390
|
-
unit_tests/sources/file_based/file_types/test_parquet_parser.py,sha256=
|
390
|
+
unit_tests/sources/file_based/file_types/test_parquet_parser.py,sha256=HXNpISvdV0ePYj59c_EzczOj-ZqPWh7sOSEEaKKIEk8,18163
|
391
391
|
unit_tests/sources/file_based/file_types/test_unstructured_parser.py,sha256=wJ9J9SbE6gq5ZEnGrDmtKNIimn9xwma06vKsIYa7SDc,23689
|
392
392
|
unit_tests/sources/file_based/scenarios/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
393
393
|
unit_tests/sources/file_based/scenarios/avro_scenarios.py,sha256=oeQUmCV7d2aTShreYc-PvVb4cWqLSsVwHfg-lcKjzPs,30554
|
394
394
|
unit_tests/sources/file_based/scenarios/check_scenarios.py,sha256=0xkt21ASTnTAMP0RYJEsF3yMGsNN7wWOoG_tmzL9PYw,6750
|
395
|
-
unit_tests/sources/file_based/scenarios/concurrent_incremental_scenarios.py,sha256=
|
395
|
+
unit_tests/sources/file_based/scenarios/concurrent_incremental_scenarios.py,sha256=EnVhPLSmUmB2lRc2ugb-HF7UkLFulj2EAHs4enAK5dI,102362
|
396
396
|
unit_tests/sources/file_based/scenarios/csv_scenarios.py,sha256=2tyWtFOtbxPh24qAhKMZcVsoSsmnFT3k6MBGzRmx3lU,121727
|
397
397
|
unit_tests/sources/file_based/scenarios/file_based_source_builder.py,sha256=3gAFkguYH87v_WpV0lUttTKu7LG8a-viokDW232ecUw,4123
|
398
|
-
unit_tests/sources/file_based/scenarios/incremental_scenarios.py,sha256=
|
398
|
+
unit_tests/sources/file_based/scenarios/incremental_scenarios.py,sha256=7ZYe0tsoJ85rNT-s4Z9toXRp2BKmA1pxpPTCyTnNd_8,67340
|
399
399
|
unit_tests/sources/file_based/scenarios/jsonl_scenarios.py,sha256=quo_o8ofuv5LQ2eni6_HudbNq7IgAFQ5uzf_QTElLuY,31719
|
400
400
|
unit_tests/sources/file_based/scenarios/parquet_scenarios.py,sha256=0DZbrb2wbaGSQ3OjD8gCH673dPqtVcLCR_LVkA_qVpA,26658
|
401
401
|
unit_tests/sources/file_based/scenarios/scenario_builder.py,sha256=ynywaMWNvPnJ8Mg2h3vYZPLfaOzHcSFYj7e8bmY_0gY,9894
|
@@ -406,8 +406,8 @@ unit_tests/sources/file_based/stream/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeu
|
|
406
406
|
unit_tests/sources/file_based/stream/test_default_file_based_cursor.py,sha256=XhtCGvgSBFyeQwgqGciPsIB1HIlWqTcXROwnxrjutHc,13109
|
407
407
|
unit_tests/sources/file_based/stream/test_default_file_based_stream.py,sha256=IuAnysO7s3MXm6JViPSrlfIlpIYcqWpsKokRpABX39c,10075
|
408
408
|
unit_tests/sources/file_based/stream/concurrent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
409
|
-
unit_tests/sources/file_based/stream/concurrent/test_adapters.py,sha256=
|
410
|
-
unit_tests/sources/file_based/stream/concurrent/test_file_based_concurrent_cursor.py,sha256=
|
409
|
+
unit_tests/sources/file_based/stream/concurrent/test_adapters.py,sha256=ptjPNSLh_2Z1GFN82gkC1lH4Ov5h5UyEr3AO7CO2fqM,14760
|
410
|
+
unit_tests/sources/file_based/stream/concurrent/test_file_based_concurrent_cursor.py,sha256=MuIE6y7b-7vF5vuwMozOxBDBLxSU_7dMmSwvK4vvm7U,19874
|
411
411
|
unit_tests/sources/fixtures/__init__.py,sha256=ZnqYNxHsKCgO38IwB34RQyRMXTs4GTvlRi3ImKnIioo,61
|
412
412
|
unit_tests/sources/fixtures/source_test_fixture.py,sha256=dvpISgio2sOp-U3bXudH_49vY4c68sO_PMs1JZTMaj0,5502
|
413
413
|
unit_tests/sources/message/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -415,10 +415,10 @@ unit_tests/sources/message/test_repository.py,sha256=oiScwg4cAdnYDl7PPN1nZniDGpA
|
|
415
415
|
unit_tests/sources/streams/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
416
416
|
unit_tests/sources/streams/test_availability_strategy.py,sha256=vJrSEk9NwRghu0YsSNoMYHKWzA9UFemwyClpke8Mk2s,2315
|
417
417
|
unit_tests/sources/streams/test_call_rate.py,sha256=5QsokqxIFoR438QTd7p_eb0K-LW6awZXDtQiMTAb_Qo,13069
|
418
|
-
unit_tests/sources/streams/test_stream_read.py,sha256=
|
418
|
+
unit_tests/sources/streams/test_stream_read.py,sha256=MpRVbr_uCnpEiVHGuKQzuOzCYVUPwhBwA-ISr4GxHm0,16571
|
419
419
|
unit_tests/sources/streams/test_streams_core.py,sha256=YOC7XqWFJ13Z4YuO9Nh4AR4AwpJ-s111vqPplFfpxk4,5059
|
420
420
|
unit_tests/sources/streams/concurrent/__init__.py,sha256=4Hw-PX1-VgESLF16cDdvuYCzGJtHntThLF4qIiULWeo,61
|
421
|
-
unit_tests/sources/streams/concurrent/test_adapters.py,sha256=
|
421
|
+
unit_tests/sources/streams/concurrent/test_adapters.py,sha256=rIGY_V7D7-2TOcNopGxQySIPZsj62n2saijN2kl3oZM,14934
|
422
422
|
unit_tests/sources/streams/concurrent/test_concurrent_read_processor.py,sha256=qsoSin6ILGhhztEWF-WRdO6nvXJ-MfBH5CNpApEyKSc,27026
|
423
423
|
unit_tests/sources/streams/concurrent/test_cursor.py,sha256=9TmJUOHCsX8Acmm7yDvfcpB5WXwPBXP4d5dizRI-msw,5951
|
424
424
|
unit_tests/sources/streams/concurrent/test_datetime_state_converter.py,sha256=BWEKIT3a6B1NYAiXLZ-STgRu2kJ1T3QzEwQpfgsZkHs,14177
|
@@ -427,9 +427,9 @@ unit_tests/sources/streams/concurrent/test_partition_enqueuer.py,sha256=Vj8-aOZU
|
|
427
427
|
unit_tests/sources/streams/concurrent/test_partition_reader.py,sha256=bNFEQXqkSb1yBW5Nruar3HuVqx6r5hNXzU2VFtIRZgw,2544
|
428
428
|
unit_tests/sources/streams/concurrent/test_thread_pool_manager.py,sha256=l0rwdDX79MRip0IKTXKGIqEZy2NptMTUTPYYQQU5yjQ,4203
|
429
429
|
unit_tests/sources/streams/concurrent/scenarios/__init__.py,sha256=4Hw-PX1-VgESLF16cDdvuYCzGJtHntThLF4qIiULWeo,61
|
430
|
-
unit_tests/sources/streams/concurrent/scenarios/incremental_scenarios.py,sha256=
|
430
|
+
unit_tests/sources/streams/concurrent/scenarios/incremental_scenarios.py,sha256=pRbArlvAOglahwb_VHNqYOqfbn4DmJ3rtOCw-NyxJ2M,9858
|
431
431
|
unit_tests/sources/streams/concurrent/scenarios/stream_facade_builder.py,sha256=HKtWlCbx81CdS8hqCs-d43JndiLL6Tp4K0Yf8VdycDg,6239
|
432
|
-
unit_tests/sources/streams/concurrent/scenarios/stream_facade_scenarios.py,sha256=
|
432
|
+
unit_tests/sources/streams/concurrent/scenarios/stream_facade_scenarios.py,sha256=XIXBunoVtRfCvc-cOGbRtO0t6_km0uoKMFrtvymr28Q,13927
|
433
433
|
unit_tests/sources/streams/concurrent/scenarios/test_concurrent_scenarios.py,sha256=Z_4-ClsxBupmN7Pbl8lF9bkSA9wnjLtrgA9WR_8VRi8,3757
|
434
434
|
unit_tests/sources/streams/concurrent/scenarios/thread_based_concurrent_stream_scenarios.py,sha256=Qa1z48QLKy8xOViyiqpkIEhREF4rZHqJh8FwJ8fzqiQ,13435
|
435
435
|
unit_tests/sources/streams/concurrent/scenarios/thread_based_concurrent_stream_source_builder.py,sha256=dY9iAX8YlJcQ2nyPePPCjj6VXzUN_wmJ3bGz6wZQzFE,5734
|
@@ -456,8 +456,8 @@ unit_tests/utils/test_schema_inferrer.py,sha256=Z2jHBZ540wnYkylIdV_2xr75Vtwlxuyg
|
|
456
456
|
unit_tests/utils/test_secret_utils.py,sha256=CdKK8A2-5XVxbXVtX22FK9dwwMeP5KNqDH6luWRXSNw,5256
|
457
457
|
unit_tests/utils/test_stream_status_utils.py,sha256=Xr8MZ2HWgTVIyMbywDvuYkRaUF4RZLQOT8-JjvcfR24,2970
|
458
458
|
unit_tests/utils/test_traced_exception.py,sha256=bDFP5zMBizFenz6V2WvEZTRCKGB5ijh3DBezjbfoYIs,4198
|
459
|
-
airbyte_cdk-0.67.
|
460
|
-
airbyte_cdk-0.67.
|
461
|
-
airbyte_cdk-0.67.
|
462
|
-
airbyte_cdk-0.67.
|
463
|
-
airbyte_cdk-0.67.
|
459
|
+
airbyte_cdk-0.67.2.dist-info/LICENSE.txt,sha256=Wfe61S4BaGPj404v8lrAbvhjYR68SHlkzeYrg3_bbuM,1051
|
460
|
+
airbyte_cdk-0.67.2.dist-info/METADATA,sha256=ZtTIvhUGdmrevYVp8JtOUbobpySWO91ui3_FzJd5Yfc,11074
|
461
|
+
airbyte_cdk-0.67.2.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
|
462
|
+
airbyte_cdk-0.67.2.dist-info/top_level.txt,sha256=edvsDKTnE6sD2wfCUaeTfKf5gQIL6CPVMwVL2sWZzqo,51
|
463
|
+
airbyte_cdk-0.67.2.dist-info/RECORD,,
|
@@ -81,13 +81,14 @@ def test_concurrent_source_adapter():
|
|
81
81
|
def _mock_stream(name: str, data=[], available: bool = True):
|
82
82
|
s = Mock()
|
83
83
|
s.name = name
|
84
|
+
s.namespace = None
|
84
85
|
s.as_airbyte_stream.return_value = AirbyteStream(
|
85
86
|
name=name,
|
86
87
|
json_schema={},
|
87
88
|
supported_sync_modes=[SyncMode.full_refresh],
|
88
89
|
)
|
89
90
|
s.check_availability.return_value = (True, None) if available else (False, "not available")
|
90
|
-
s.
|
91
|
+
s.read.return_value = iter(data)
|
91
92
|
s.primary_key = None
|
92
93
|
return s
|
93
94
|
|
@@ -5,7 +5,7 @@
|
|
5
5
|
import unittest
|
6
6
|
|
7
7
|
import pytest
|
8
|
-
from airbyte_cdk.sources.file_based.config.csv_format import CsvHeaderAutogenerated, CsvHeaderFromCsv, CsvHeaderUserProvided
|
8
|
+
from airbyte_cdk.sources.file_based.config.csv_format import CsvFormat, CsvHeaderAutogenerated, CsvHeaderFromCsv, CsvHeaderUserProvided
|
9
9
|
from pydantic import ValidationError
|
10
10
|
|
11
11
|
|
@@ -26,3 +26,8 @@ class CsvHeaderDefinitionTest(unittest.TestCase):
|
|
26
26
|
|
27
27
|
def test_given_from_csv_then_csv_has_header_row(self) -> None:
|
28
28
|
assert CsvHeaderFromCsv().has_header_row()
|
29
|
+
|
30
|
+
|
31
|
+
class CsvDelimiterTest(unittest.TestCase):
|
32
|
+
def test_tab_delimter(self):
|
33
|
+
assert CsvFormat(delimiter=r"\t").delimiter == '\\t'
|