airbyte-cdk 0.68.4__py3-none-any.whl → 0.69.1__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.
- airbyte_cdk/entrypoint.py +27 -7
- airbyte_cdk/sources/connector_state_manager.py +0 -1
- airbyte_cdk/sources/file_based/file_based_source.py +4 -2
- airbyte_cdk/sources/file_based/stream/concurrent/adapters.py +2 -2
- airbyte_cdk/sources/file_based/stream/concurrent/cursor/__init__.py +2 -2
- airbyte_cdk/sources/file_based/stream/concurrent/cursor/{file_based_noop_cursor.py → file_based_final_state_cursor.py} +21 -6
- airbyte_cdk/sources/streams/concurrent/adapters.py +2 -2
- airbyte_cdk/sources/streams/concurrent/cursor.py +27 -3
- airbyte_cdk/sources/streams/concurrent/default_stream.py +7 -3
- airbyte_cdk/test/entrypoint_wrapper.py +1 -1
- airbyte_cdk/utils/message_utils.py +17 -0
- {airbyte_cdk-0.68.4.dist-info → airbyte_cdk-0.69.1.dist-info}/METADATA +1 -1
- {airbyte_cdk-0.68.4.dist-info → airbyte_cdk-0.69.1.dist-info}/RECORD +30 -28
- {airbyte_cdk-0.68.4.dist-info → airbyte_cdk-0.69.1.dist-info}/WHEEL +1 -1
- unit_tests/sources/concurrent_source/test_concurrent_source_adapter.py +2 -2
- unit_tests/sources/file_based/scenarios/csv_scenarios.py +128 -37
- unit_tests/sources/file_based/stream/concurrent/test_adapters.py +3 -3
- unit_tests/sources/file_based/test_file_based_scenarios.py +13 -6
- unit_tests/sources/file_based/test_scenarios.py +32 -3
- unit_tests/sources/streams/concurrent/scenarios/stream_facade_builder.py +2 -2
- unit_tests/sources/streams/concurrent/scenarios/thread_based_concurrent_stream_scenarios.py +16 -14
- unit_tests/sources/streams/concurrent/scenarios/thread_based_concurrent_stream_source_builder.py +5 -4
- unit_tests/sources/streams/concurrent/test_default_stream.py +8 -6
- unit_tests/sources/streams/test_stream_read.py +3 -2
- unit_tests/sources/test_concurrent_source.py +7 -5
- unit_tests/sources/test_source_read.py +2 -3
- unit_tests/test/test_entrypoint_wrapper.py +9 -6
- unit_tests/utils/test_message_utils.py +91 -0
- {airbyte_cdk-0.68.4.dist-info → airbyte_cdk-0.69.1.dist-info}/LICENSE.txt +0 -0
- {airbyte_cdk-0.68.4.dist-info → airbyte_cdk-0.69.1.dist-info}/top_level.txt +0 -0
airbyte_cdk/entrypoint.py
CHANGED
@@ -10,23 +10,24 @@ import os.path
|
|
10
10
|
import socket
|
11
11
|
import sys
|
12
12
|
import tempfile
|
13
|
+
from collections import defaultdict
|
13
14
|
from functools import wraps
|
14
|
-
from typing import Any, Iterable, List, Mapping, MutableMapping, Optional, Union
|
15
|
+
from typing import Any, DefaultDict, Iterable, List, Mapping, MutableMapping, Optional, Union
|
15
16
|
from urllib.parse import urlparse
|
16
17
|
|
17
18
|
import requests
|
18
19
|
from airbyte_cdk.connector import TConfig
|
19
20
|
from airbyte_cdk.exception_handler import init_uncaught_exception_handler
|
20
21
|
from airbyte_cdk.logger import init_logger
|
21
|
-
from airbyte_cdk.models import AirbyteMessage, Status, Type
|
22
|
-
from airbyte_cdk.models.airbyte_protocol import ConnectorSpecification # type: ignore [attr-defined]
|
22
|
+
from airbyte_cdk.models import AirbyteMessage, FailureType, Status, Type
|
23
|
+
from airbyte_cdk.models.airbyte_protocol import AirbyteStateStats, ConnectorSpecification # type: ignore [attr-defined]
|
23
24
|
from airbyte_cdk.sources import Source
|
25
|
+
from airbyte_cdk.sources.connector_state_manager import HashableStreamDescriptor
|
24
26
|
from airbyte_cdk.sources.utils.schema_helpers import check_config_against_spec_or_exit, split_config
|
25
|
-
from airbyte_cdk.utils import is_cloud_environment
|
27
|
+
from airbyte_cdk.utils import is_cloud_environment, message_utils
|
26
28
|
from airbyte_cdk.utils.airbyte_secrets_utils import get_secrets, update_secrets
|
27
29
|
from airbyte_cdk.utils.constants import ENV_REQUEST_CACHE_PATH
|
28
30
|
from airbyte_cdk.utils.traced_exception import AirbyteTracedException
|
29
|
-
from airbyte_protocol.models import FailureType
|
30
31
|
from requests import PreparedRequest, Response, Session
|
31
32
|
|
32
33
|
logger = init_logger("airbyte")
|
@@ -160,8 +161,27 @@ class AirbyteEntrypoint(object):
|
|
160
161
|
if self.source.check_config_against_spec:
|
161
162
|
self.validate_connection(source_spec, config)
|
162
163
|
|
163
|
-
|
164
|
-
|
164
|
+
stream_message_counter: DefaultDict[HashableStreamDescriptor, int] = defaultdict(int)
|
165
|
+
for message in self.source.read(self.logger, config, catalog, state):
|
166
|
+
yield self.handle_record_counts(message, stream_message_counter)
|
167
|
+
for message in self._emit_queued_messages(self.source):
|
168
|
+
yield self.handle_record_counts(message, stream_message_counter)
|
169
|
+
|
170
|
+
@staticmethod
|
171
|
+
def handle_record_counts(message: AirbyteMessage, stream_message_count: DefaultDict[HashableStreamDescriptor, int]) -> AirbyteMessage:
|
172
|
+
if message.type == Type.RECORD:
|
173
|
+
stream_message_count[message_utils.get_stream_descriptor(message)] += 1
|
174
|
+
|
175
|
+
elif message.type == Type.STATE:
|
176
|
+
stream_descriptor = message_utils.get_stream_descriptor(message)
|
177
|
+
|
178
|
+
# Set record count from the counter onto the state message
|
179
|
+
message.state.sourceStats = message.state.sourceStats or AirbyteStateStats()
|
180
|
+
message.state.sourceStats.recordCount = stream_message_count.get(stream_descriptor, 0)
|
181
|
+
|
182
|
+
# Reset the counter
|
183
|
+
stream_message_count[stream_descriptor] = 0
|
184
|
+
return message
|
165
185
|
|
166
186
|
@staticmethod
|
167
187
|
def validate_connection(source_spec: ConnectorSpecification, config: TConfig) -> None:
|
@@ -82,7 +82,6 @@ class ConnectorStateManager:
|
|
82
82
|
Generates an AirbyteMessage using the current per-stream state of a specified stream in either the per-stream or legacy format
|
83
83
|
:param stream_name: The name of the stream for the message that is being created
|
84
84
|
:param namespace: The namespace of the stream for the message that is being created
|
85
|
-
:param send_per_stream_state: Decides which state format the message should be generated as
|
86
85
|
:return: The Airbyte state message to be emitted by the connector during a sync
|
87
86
|
"""
|
88
87
|
hashable_descriptor = HashableStreamDescriptor(name=stream_name, namespace=namespace)
|
@@ -36,7 +36,7 @@ from airbyte_cdk.sources.file_based.stream.concurrent.adapters import FileBasedS
|
|
36
36
|
from airbyte_cdk.sources.file_based.stream.concurrent.cursor import (
|
37
37
|
AbstractConcurrentFileBasedCursor,
|
38
38
|
FileBasedConcurrentCursor,
|
39
|
-
|
39
|
+
FileBasedFinalStateCursor,
|
40
40
|
)
|
41
41
|
from airbyte_cdk.sources.file_based.stream.cursor import AbstractFileBasedCursor
|
42
42
|
from airbyte_cdk.sources.message.repository import InMemoryMessageRepository, MessageRepository
|
@@ -170,7 +170,9 @@ class FileBasedSource(ConcurrentSourceAdapter, ABC):
|
|
170
170
|
sync_mode = self._get_sync_mode_from_catalog(stream_config.name)
|
171
171
|
|
172
172
|
if sync_mode == SyncMode.full_refresh and hasattr(self, "_concurrency_level") and self._concurrency_level is not None:
|
173
|
-
cursor =
|
173
|
+
cursor = FileBasedFinalStateCursor(
|
174
|
+
stream_config=stream_config, stream_namespace=None, message_repository=self.message_repository
|
175
|
+
)
|
174
176
|
stream = FileBasedStreamFacade.create_from_stream(
|
175
177
|
self._make_default_stream(stream_config, cursor), self, self.logger, stream_state, cursor
|
176
178
|
)
|
@@ -18,7 +18,7 @@ from airbyte_cdk.sources.file_based.config.file_based_stream_config import Prima
|
|
18
18
|
from airbyte_cdk.sources.file_based.file_types.file_type_parser import FileTypeParser
|
19
19
|
from airbyte_cdk.sources.file_based.remote_file import RemoteFile
|
20
20
|
from airbyte_cdk.sources.file_based.stream import AbstractFileBasedStream
|
21
|
-
from airbyte_cdk.sources.file_based.stream.concurrent.cursor import
|
21
|
+
from airbyte_cdk.sources.file_based.stream.concurrent.cursor import FileBasedFinalStateCursor
|
22
22
|
from airbyte_cdk.sources.file_based.stream.cursor import AbstractFileBasedCursor
|
23
23
|
from airbyte_cdk.sources.file_based.types import StreamSlice
|
24
24
|
from airbyte_cdk.sources.message import MessageRepository
|
@@ -71,7 +71,7 @@ class FileBasedStreamFacade(AbstractStreamFacade[DefaultStream], AbstractFileBas
|
|
71
71
|
partition_generator=FileBasedStreamPartitionGenerator(
|
72
72
|
stream,
|
73
73
|
message_repository,
|
74
|
-
SyncMode.full_refresh if isinstance(cursor,
|
74
|
+
SyncMode.full_refresh if isinstance(cursor, FileBasedFinalStateCursor) else SyncMode.incremental,
|
75
75
|
[cursor_field] if cursor_field is not None else None,
|
76
76
|
state,
|
77
77
|
cursor,
|
@@ -1,5 +1,5 @@
|
|
1
1
|
from .abstract_concurrent_file_based_cursor import AbstractConcurrentFileBasedCursor
|
2
2
|
from .file_based_concurrent_cursor import FileBasedConcurrentCursor
|
3
|
-
from .
|
3
|
+
from .file_based_final_state_cursor import FileBasedFinalStateCursor
|
4
4
|
|
5
|
-
__all__ = ["AbstractConcurrentFileBasedCursor", "FileBasedConcurrentCursor", "
|
5
|
+
__all__ = ["AbstractConcurrentFileBasedCursor", "FileBasedConcurrentCursor", "FileBasedFinalStateCursor"]
|
@@ -4,12 +4,15 @@
|
|
4
4
|
|
5
5
|
import logging
|
6
6
|
from datetime import datetime
|
7
|
-
from typing import TYPE_CHECKING, Any, Iterable, List, MutableMapping
|
7
|
+
from typing import TYPE_CHECKING, Any, Iterable, List, MutableMapping, Optional
|
8
8
|
|
9
|
+
from airbyte_cdk.sources.connector_state_manager import ConnectorStateManager
|
9
10
|
from airbyte_cdk.sources.file_based.config.file_based_stream_config import FileBasedStreamConfig
|
10
11
|
from airbyte_cdk.sources.file_based.remote_file import RemoteFile
|
11
12
|
from airbyte_cdk.sources.file_based.stream.concurrent.cursor.abstract_concurrent_file_based_cursor import AbstractConcurrentFileBasedCursor
|
12
13
|
from airbyte_cdk.sources.file_based.types import StreamState
|
14
|
+
from airbyte_cdk.sources.message import MessageRepository
|
15
|
+
from airbyte_cdk.sources.streams import FULL_REFRESH_SENTINEL_STATE_KEY
|
13
16
|
from airbyte_cdk.sources.streams.concurrent.partitions.partition import Partition
|
14
17
|
from airbyte_cdk.sources.streams.concurrent.partitions.record import Record
|
15
18
|
|
@@ -17,13 +20,23 @@ if TYPE_CHECKING:
|
|
17
20
|
from airbyte_cdk.sources.file_based.stream.concurrent.adapters import FileBasedStreamPartition
|
18
21
|
|
19
22
|
|
20
|
-
class
|
21
|
-
|
22
|
-
|
23
|
+
class FileBasedFinalStateCursor(AbstractConcurrentFileBasedCursor):
|
24
|
+
"""Cursor that is used to guarantee at least one state message is emitted for a concurrent file-based stream."""
|
25
|
+
|
26
|
+
def __init__(
|
27
|
+
self, stream_config: FileBasedStreamConfig, message_repository: MessageRepository, stream_namespace: Optional[str], **kwargs: Any
|
28
|
+
):
|
29
|
+
self._stream_name = stream_config.name
|
30
|
+
self._stream_namespace = stream_namespace
|
31
|
+
self._message_repository = message_repository
|
32
|
+
# Normally the connector state manager operates at the source-level. However, we only need it to write the sentinel
|
33
|
+
# state message rather than manage overall source state. This is also only temporary as we move to the resumable
|
34
|
+
# full refresh world where every stream uses a FileBasedConcurrentCursor with incremental state.
|
35
|
+
self._connector_state_manager = ConnectorStateManager(stream_instance_map={})
|
23
36
|
|
24
37
|
@property
|
25
38
|
def state(self) -> MutableMapping[str, Any]:
|
26
|
-
return {}
|
39
|
+
return {FULL_REFRESH_SENTINEL_STATE_KEY: True}
|
27
40
|
|
28
41
|
def observe(self, record: Record) -> None:
|
29
42
|
pass
|
@@ -53,4 +66,6 @@ class FileBasedNoopCursor(AbstractConcurrentFileBasedCursor):
|
|
53
66
|
pass
|
54
67
|
|
55
68
|
def ensure_at_least_one_state_emitted(self) -> None:
|
56
|
-
|
69
|
+
self._connector_state_manager.update_state_for_stream(self._stream_name, self._stream_namespace, self.state)
|
70
|
+
state_message = self._connector_state_manager.create_state_message(self._stream_name, self._stream_namespace)
|
71
|
+
self._message_repository.emit_message(state_message)
|
@@ -21,7 +21,7 @@ from airbyte_cdk.sources.streams.concurrent.availability_strategy import (
|
|
21
21
|
StreamAvailable,
|
22
22
|
StreamUnavailable,
|
23
23
|
)
|
24
|
-
from airbyte_cdk.sources.streams.concurrent.cursor import Cursor,
|
24
|
+
from airbyte_cdk.sources.streams.concurrent.cursor import Cursor, FinalStateCursor
|
25
25
|
from airbyte_cdk.sources.streams.concurrent.default_stream import DefaultStream
|
26
26
|
from airbyte_cdk.sources.streams.concurrent.exceptions import ExceptionWithDisplayMessage
|
27
27
|
from airbyte_cdk.sources.streams.concurrent.helpers import get_cursor_field_from_stream, get_primary_key_from_stream
|
@@ -77,7 +77,7 @@ class StreamFacade(AbstractStreamFacade[DefaultStream], Stream):
|
|
77
77
|
partition_generator=StreamPartitionGenerator(
|
78
78
|
stream,
|
79
79
|
message_repository,
|
80
|
-
SyncMode.full_refresh if isinstance(cursor,
|
80
|
+
SyncMode.full_refresh if isinstance(cursor, FinalStateCursor) else SyncMode.incremental,
|
81
81
|
[cursor_field] if cursor_field is not None else None,
|
82
82
|
state,
|
83
83
|
cursor,
|
@@ -8,6 +8,7 @@ from typing import Any, List, Mapping, MutableMapping, Optional, Protocol, Tuple
|
|
8
8
|
|
9
9
|
from airbyte_cdk.sources.connector_state_manager import ConnectorStateManager
|
10
10
|
from airbyte_cdk.sources.message import MessageRepository
|
11
|
+
from airbyte_cdk.sources.streams import FULL_REFRESH_SENTINEL_STATE_KEY
|
11
12
|
from airbyte_cdk.sources.streams.concurrent.partitions.partition import Partition
|
12
13
|
from airbyte_cdk.sources.streams.concurrent.partitions.record import Record
|
13
14
|
from airbyte_cdk.sources.streams.concurrent.state_converters.abstract_stream_state_converter import AbstractStreamStateConverter
|
@@ -65,10 +66,27 @@ class Cursor(ABC):
|
|
65
66
|
raise NotImplementedError()
|
66
67
|
|
67
68
|
|
68
|
-
class
|
69
|
+
class FinalStateCursor(Cursor):
|
70
|
+
"""Cursor that is used to guarantee at least one state message is emitted for a concurrent stream."""
|
71
|
+
|
72
|
+
def __init__(
|
73
|
+
self,
|
74
|
+
stream_name: str,
|
75
|
+
stream_namespace: Optional[str],
|
76
|
+
message_repository: MessageRepository,
|
77
|
+
) -> None:
|
78
|
+
self._stream_name = stream_name
|
79
|
+
self._stream_namespace = stream_namespace
|
80
|
+
self._message_repository = message_repository
|
81
|
+
# Normally the connector state manager operates at the source-level. However, we only need it to write the sentinel
|
82
|
+
# state message rather than manage overall source state. This is also only temporary as we move to the resumable
|
83
|
+
# full refresh world where every stream uses a FileBasedConcurrentCursor with incremental state.
|
84
|
+
self._connector_state_manager = ConnectorStateManager(stream_instance_map={})
|
85
|
+
self._has_closed_at_least_one_slice = False
|
86
|
+
|
69
87
|
@property
|
70
88
|
def state(self) -> MutableMapping[str, Any]:
|
71
|
-
return {}
|
89
|
+
return {FULL_REFRESH_SENTINEL_STATE_KEY: True}
|
72
90
|
|
73
91
|
def observe(self, record: Record) -> None:
|
74
92
|
pass
|
@@ -77,7 +95,13 @@ class NoopCursor(Cursor):
|
|
77
95
|
pass
|
78
96
|
|
79
97
|
def ensure_at_least_one_state_emitted(self) -> None:
|
80
|
-
|
98
|
+
"""
|
99
|
+
Used primarily for full refresh syncs that do not have a valid cursor value to emit at the end of a sync
|
100
|
+
"""
|
101
|
+
|
102
|
+
self._connector_state_manager.update_state_for_stream(self._stream_name, self._stream_namespace, self.state)
|
103
|
+
state_message = self._connector_state_manager.create_state_message(self._stream_name, self._stream_namespace)
|
104
|
+
self._message_repository.emit_message(state_message)
|
81
105
|
|
82
106
|
|
83
107
|
class ConcurrentCursor(Cursor):
|
@@ -9,7 +9,7 @@ from typing import Any, Iterable, List, Mapping, Optional
|
|
9
9
|
from airbyte_cdk.models import AirbyteStream, SyncMode
|
10
10
|
from airbyte_cdk.sources.streams.concurrent.abstract_stream import AbstractStream
|
11
11
|
from airbyte_cdk.sources.streams.concurrent.availability_strategy import AbstractAvailabilityStrategy, StreamAvailability
|
12
|
-
from airbyte_cdk.sources.streams.concurrent.cursor import Cursor
|
12
|
+
from airbyte_cdk.sources.streams.concurrent.cursor import Cursor
|
13
13
|
from airbyte_cdk.sources.streams.concurrent.partitions.partition import Partition
|
14
14
|
from airbyte_cdk.sources.streams.concurrent.partitions.partition_generator import PartitionGenerator
|
15
15
|
|
@@ -24,7 +24,7 @@ class DefaultStream(AbstractStream):
|
|
24
24
|
primary_key: List[str],
|
25
25
|
cursor_field: Optional[str],
|
26
26
|
logger: Logger,
|
27
|
-
cursor:
|
27
|
+
cursor: Cursor,
|
28
28
|
namespace: Optional[str] = None,
|
29
29
|
) -> None:
|
30
30
|
self._stream_partition_generator = partition_generator
|
@@ -34,7 +34,7 @@ class DefaultStream(AbstractStream):
|
|
34
34
|
self._primary_key = primary_key
|
35
35
|
self._cursor_field = cursor_field
|
36
36
|
self._logger = logger
|
37
|
-
self._cursor = cursor
|
37
|
+
self._cursor = cursor
|
38
38
|
self._namespace = namespace
|
39
39
|
|
40
40
|
def generate_partitions(self) -> Iterable[Partition]:
|
@@ -44,6 +44,10 @@ class DefaultStream(AbstractStream):
|
|
44
44
|
def name(self) -> str:
|
45
45
|
return self._name
|
46
46
|
|
47
|
+
@property
|
48
|
+
def namespace(self) -> Optional[str]:
|
49
|
+
return self._namespace
|
50
|
+
|
47
51
|
def check_availability(self) -> StreamAvailability:
|
48
52
|
return self._availability_strategy.check_availability(self._logger)
|
49
53
|
|
@@ -74,7 +74,7 @@ class EntrypointOutput:
|
|
74
74
|
state_messages = self._get_message_by_types([Type.STATE])
|
75
75
|
if not state_messages:
|
76
76
|
raise ValueError("Can't provide most recent state as there are no state messages")
|
77
|
-
return state_messages[-1].state.
|
77
|
+
return state_messages[-1].state.stream
|
78
78
|
|
79
79
|
@property
|
80
80
|
def logs(self) -> List[AirbyteMessage]:
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# Copyright (c) 2024 Airbyte, Inc., all rights reserved.
|
2
|
+
|
3
|
+
from airbyte_cdk.sources.connector_state_manager import HashableStreamDescriptor
|
4
|
+
from airbyte_protocol.models import AirbyteMessage, Type
|
5
|
+
|
6
|
+
|
7
|
+
def get_stream_descriptor(message: AirbyteMessage) -> HashableStreamDescriptor:
|
8
|
+
if message.type == Type.RECORD:
|
9
|
+
return HashableStreamDescriptor(name=message.record.stream, namespace=message.record.namespace)
|
10
|
+
elif message.type == Type.STATE:
|
11
|
+
if not message.state.stream or not message.state.stream.stream_descriptor:
|
12
|
+
raise ValueError("State message was not in per-stream state format, which is required for record counts.")
|
13
|
+
return HashableStreamDescriptor(
|
14
|
+
name=message.state.stream.stream_descriptor.name, namespace=message.state.stream.stream_descriptor.namespace
|
15
|
+
)
|
16
|
+
else:
|
17
|
+
raise NotImplementedError(f"get_stream_descriptor is not implemented for message type '{message.type}'.")
|
@@ -1,7 +1,7 @@
|
|
1
1
|
airbyte_cdk/__init__.py,sha256=OBQWv5rF_QTRpOiP6J8J8oTU-GGrfi18i1PRFpahKks,262
|
2
2
|
airbyte_cdk/config_observation.py,sha256=3kjxv8xTwCnub2_fTWnMPRx0E7vly1BUeyXOSK15Ql4,3610
|
3
3
|
airbyte_cdk/connector.py,sha256=LtTAmBFV1LBUz_fOEbQ_EvBhyUsz8AGOlDsvK8QOOo0,4396
|
4
|
-
airbyte_cdk/entrypoint.py,sha256
|
4
|
+
airbyte_cdk/entrypoint.py,sha256=K3pKgyqlUTn9zcOLh9b4HIzOd6HlX0CX16LDljwEh4o,14829
|
5
5
|
airbyte_cdk/exception_handler.py,sha256=Xa8rpWRB_JBMMdqwKhQGYLekuq5BpYot_Lwde4B7r4E,1485
|
6
6
|
airbyte_cdk/logger.py,sha256=4Mi2MEQi1uh59BP9Dxw_UEbZuxaJewqK_jvEU2b10nk,3985
|
7
7
|
airbyte_cdk/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -26,7 +26,7 @@ airbyte_cdk/models/well_known_types.py,sha256=KKfNbow2gdLoC1Z4hcXy_JR8m_acsB2ol7
|
|
26
26
|
airbyte_cdk/sources/__init__.py,sha256=Ov7Uf03KPSZUmMZqZfUAK3tQwsdKjDQUDvTb-H0JyfA,1141
|
27
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=Cq-wbK_IMElpMXO-66ReCdTTy5TBecsTRe5fMju6kps,9903
|
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
|
@@ -153,7 +153,7 @@ airbyte_cdk/sources/embedded/runner.py,sha256=kZ0CcUANuMjdZ4fmvp_w9P2IcsS9WSHxNq
|
|
153
153
|
airbyte_cdk/sources/embedded/tools.py,sha256=-Z4tZ4AP1OTi_zrqFM3YV8Rt7c60wvsrv0Dc-rTZ2uw,744
|
154
154
|
airbyte_cdk/sources/file_based/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
155
155
|
airbyte_cdk/sources/file_based/exceptions.py,sha256=-SjdDk-mbkp5qQVUESkn788W8NmGtC2LROkZRKS_Dxc,5613
|
156
|
-
airbyte_cdk/sources/file_based/file_based_source.py,sha256=
|
156
|
+
airbyte_cdk/sources/file_based/file_based_source.py,sha256=PMSHOHCOK8TagmYNi8vl4TerPCscZfFaWzGMgfmsnYE,13784
|
157
157
|
airbyte_cdk/sources/file_based/file_based_stream_reader.py,sha256=K9fFHcSL4E8v-X2l38wRAcZCjpyifr35orvby8vQt84,3749
|
158
158
|
airbyte_cdk/sources/file_based/remote_file.py,sha256=dtRX7X06Fug-XDz93a5lkwPQy5nQgxH0-ZcXW2HuMGI,312
|
159
159
|
airbyte_cdk/sources/file_based/schema_helpers.py,sha256=XBkOutIw_n6SNYU34qbyTbl0Ppt0i4k3sVFMSaX3wJo,9103
|
@@ -186,11 +186,11 @@ 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=
|
190
|
-
airbyte_cdk/sources/file_based/stream/concurrent/cursor/__init__.py,sha256=
|
189
|
+
airbyte_cdk/sources/file_based/stream/concurrent/adapters.py,sha256=xRjudyMlGcGOl_MQX1bBVC9azZFWnSnqj2PMKExROnE,12818
|
190
|
+
airbyte_cdk/sources/file_based/stream/concurrent/cursor/__init__.py,sha256=AtTntHQgspWt8vZ9cjIjSOO1YpH2OO-D8E78pAViE7k,329
|
191
191
|
airbyte_cdk/sources/file_based/stream/concurrent/cursor/abstract_concurrent_file_based_cursor.py,sha256=UYLE2A2RdV-5FaQ70naZZWY34l5AEJkIRlTH05-e_-k,1961
|
192
192
|
airbyte_cdk/sources/file_based/stream/concurrent/cursor/file_based_concurrent_cursor.py,sha256=Bs8e05pbY1OhTUsklhIqrfeCataME_fkg0ToakifHgY,14331
|
193
|
-
airbyte_cdk/sources/file_based/stream/concurrent/cursor/
|
193
|
+
airbyte_cdk/sources/file_based/stream/concurrent/cursor/file_based_final_state_cursor.py,sha256=nVuXxNhYasOE-0BdY13cEhujwX7G6ngbuVZROevnIcI,3174
|
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
|
196
196
|
airbyte_cdk/sources/file_based/stream/cursor/default_file_based_cursor.py,sha256=kuJRKgDYOGXRk0V0I8BpFxg0hGv7SfV_nBpmmn45F88,6815
|
@@ -206,10 +206,10 @@ airbyte_cdk/sources/streams/core.py,sha256=UdJfpc1jwT6igY-e5w-ow5ciT5feHq8F79Dxv
|
|
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=eHtv4qEFu3mapDRoCfePBIUTCPiuQNQrOF7E62dtkwY,16279
|
210
210
|
airbyte_cdk/sources/streams/concurrent/availability_strategy.py,sha256=8xDRpfktnARBbRi_RwznvKuoGrpPF2b6tQyloMwogkM,2013
|
211
|
-
airbyte_cdk/sources/streams/concurrent/cursor.py,sha256=
|
212
|
-
airbyte_cdk/sources/streams/concurrent/default_stream.py,sha256=
|
211
|
+
airbyte_cdk/sources/streams/concurrent/cursor.py,sha256=QlK1-kohTnYF6VakfzwC5A7MRrBmc8sHwstR7iNcLdM,11169
|
212
|
+
airbyte_cdk/sources/streams/concurrent/default_stream.py,sha256=YS7ZRpffwV7gw-oe6UUO9mVatKfu_rmG4QMhpvRqnBU,3059
|
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
|
215
215
|
airbyte_cdk/sources/streams/concurrent/partition_enqueuer.py,sha256=6n8xONInLt7u82zmnm9xU8U1qm3jejqzQ2SLtUNzCy8,3109
|
@@ -249,7 +249,7 @@ airbyte_cdk/sources/utils/transform.py,sha256=4GYmO6bq33HF-a1in0dKQKqUOYI1bWItyu
|
|
249
249
|
airbyte_cdk/sources/utils/types.py,sha256=41ZQR681t5TUnOScij58d088sb99klH_ZENFcaYro_g,175
|
250
250
|
airbyte_cdk/test/__init__.py,sha256=f_XdkOg4_63QT2k3BbKY34209lppwgw-svzfZstQEq4,199
|
251
251
|
airbyte_cdk/test/catalog_builder.py,sha256=cxhDAFpz9-AvMq81HHHK3u6TwdT16ngGUfrP3E53nNI,963
|
252
|
-
airbyte_cdk/test/entrypoint_wrapper.py,sha256
|
252
|
+
airbyte_cdk/test/entrypoint_wrapper.py,sha256=-fqWTOI1XWGqQdAxl0-nTNU48MZnJWd2CmOwZe7ol-U,7399
|
253
253
|
airbyte_cdk/test/state_builder.py,sha256=SlKadhKVi38ZSKMeceVAxjowxsDDT9vJoG6gU4zDrQE,705
|
254
254
|
airbyte_cdk/test/mock_http/__init__.py,sha256=uil6k-0NbUyDFZXtWw88HaS7r13i43VzA9H7hOHzZx8,322
|
255
255
|
airbyte_cdk/test/mock_http/matcher.py,sha256=J4C8g8PkdKo4OwHWMJGYJIyrLnQpXI5gXWUtyxsxHpM,1240
|
@@ -265,6 +265,7 @@ airbyte_cdk/utils/datetime_format_inferrer.py,sha256=gGKDQ3OdY18R5CVFhq4c7zB_E4C
|
|
265
265
|
airbyte_cdk/utils/event_timing.py,sha256=Hn5kCc9xGKLcV5EYpJCZwNiz9neKKu2WG8FJF_hy278,2377
|
266
266
|
airbyte_cdk/utils/is_cloud_environment.py,sha256=DayV32Irh-SdnJ0MnjvstwCJ66_l5oEsd8l85rZtHoc,574
|
267
267
|
airbyte_cdk/utils/mapping_helpers.py,sha256=tVkbgnxy12Ah2Jxh_3tKW7CTKTAVIcPexsBhsiyTbp4,1729
|
268
|
+
airbyte_cdk/utils/message_utils.py,sha256=s_hjuicv0xRMLo-WtecvnpTXrhqnooa6qM5QkdRuS2A,953
|
268
269
|
airbyte_cdk/utils/oneof_option_config.py,sha256=N8EmWdYdwt0FM7fuShh6H8nj_r4KEL9tb2DJJtwsPow,1180
|
269
270
|
airbyte_cdk/utils/schema_inferrer.py,sha256=D8vFVgeK6VLcAug4YVAHfa3D29On0A_nMlwq9SPlfPI,3799
|
270
271
|
airbyte_cdk/utils/spec_schema_transformations.py,sha256=LGjSSk8lmBiC0GiHqxDwu_iMN6bCe05UMpz9e7nCw5E,741
|
@@ -283,15 +284,15 @@ unit_tests/singer/test_singer_helpers.py,sha256=pZV6VxJuK-3-FICNGmoGbokrA_zkaFZE
|
|
283
284
|
unit_tests/singer/test_singer_source.py,sha256=edN_kv7dnYAdBveWdUYOs74ak0dK6p8uaX225h_ZILA,4442
|
284
285
|
unit_tests/sources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
285
286
|
unit_tests/sources/test_abstract_source.py,sha256=TZ9Mn_kT9A2A_CRJLS9OQjBnlWrPRqf8EyNd8eJ_ZrM,57197
|
286
|
-
unit_tests/sources/test_concurrent_source.py,sha256=
|
287
|
+
unit_tests/sources/test_concurrent_source.py,sha256=Vaq6Ilxw9OOinarr5Ll2mcO_feh1C1Y-Iu_6MQhh4Do,4008
|
287
288
|
unit_tests/sources/test_config.py,sha256=lxjeaf48pOMF4Pf3-Z1ux_tHTyjRFCdG_hpnxw3e7uQ,2839
|
288
289
|
unit_tests/sources/test_connector_state_manager.py,sha256=PGvBh90FAtG7vp_4y8nZxcjx1mEcFn382PCdBH-r9-I,19588
|
289
290
|
unit_tests/sources/test_http_logger.py,sha256=VT6DqgspI3DcRnoBQkkQX0z4dF_AOiYZ5P_zxmMW8oU,9004
|
290
291
|
unit_tests/sources/test_integration_source.py,sha256=qcWld9evB1rAjALWX8SDshGz7seYkN3HCamQ6KQ2Idw,4269
|
291
292
|
unit_tests/sources/test_source.py,sha256=zwyU7pLwQaEzeozxPJzNeRvZXb2xddeWO4bLqdMt9BM,28343
|
292
|
-
unit_tests/sources/test_source_read.py,sha256=
|
293
|
+
unit_tests/sources/test_source_read.py,sha256=n2KjGmqAkd1UDRD2vNXZ5NipkeAYpbd0cuv43ydOunM,17273
|
293
294
|
unit_tests/sources/concurrent_source/__init__.py,sha256=4Hw-PX1-VgESLF16cDdvuYCzGJtHntThLF4qIiULWeo,61
|
294
|
-
unit_tests/sources/concurrent_source/test_concurrent_source_adapter.py,sha256=
|
295
|
+
unit_tests/sources/concurrent_source/test_concurrent_source_adapter.py,sha256=_wEmtHTSSOQYXMynnat12JtNXYwbYR5Glk8laRurXEw,3783
|
295
296
|
unit_tests/sources/declarative/__init__.py,sha256=ZnqYNxHsKCgO38IwB34RQyRMXTs4GTvlRi3ImKnIioo,61
|
296
297
|
unit_tests/sources/declarative/external_component.py,sha256=lU2gL736bLEWtmrGm1B2k83RXt_3XkROimLIahZd5dg,293
|
297
298
|
unit_tests/sources/declarative/test_create_partial.py,sha256=s_KIywQqt8RlauOCWNJVk3HC3KBTAtSwFTN6JVQgu80,2636
|
@@ -372,9 +373,9 @@ unit_tests/sources/declarative/stream_slicers/test_cartesian_product_stream_slic
|
|
372
373
|
unit_tests/sources/file_based/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
373
374
|
unit_tests/sources/file_based/helpers.py,sha256=JSKXrPL7iSBSH7nkKde-jcylVuDohJid5Oi4YtVRPwg,2854
|
374
375
|
unit_tests/sources/file_based/in_memory_files_source.py,sha256=1UCfRMgaovPdhkORT5k5Izj6e0ldPp802iiaffG2ghk,8550
|
375
|
-
unit_tests/sources/file_based/test_file_based_scenarios.py,sha256=
|
376
|
+
unit_tests/sources/file_based/test_file_based_scenarios.py,sha256=q1rQ4tKoufuytYVZoAzFcn9BuLbSvjJ4vdlJobibeV8,15523
|
376
377
|
unit_tests/sources/file_based/test_file_based_stream_reader.py,sha256=P6yTp7tbPfREzi5SXg4SSSql5nxiRV571YdOmwb_SzY,9219
|
377
|
-
unit_tests/sources/file_based/test_scenarios.py,sha256=
|
378
|
+
unit_tests/sources/file_based/test_scenarios.py,sha256=Gpra74p6qJ9T4bObF7XxO8fnHPDRUhfaum5_PYyn1rY,10929
|
378
379
|
unit_tests/sources/file_based/test_schema_helpers.py,sha256=IYIDdLRK41RkSG_ZW2cagAt9krV4QLbkzu6r7vPx9Js,12047
|
379
380
|
unit_tests/sources/file_based/availability_strategy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
380
381
|
unit_tests/sources/file_based/availability_strategy/test_default_file_based_availability_strategy.py,sha256=14ffoRWC4RHPrmBFZpplnAd1Uezn8neuQrIyZqvjTK0,4964
|
@@ -394,7 +395,7 @@ unit_tests/sources/file_based/scenarios/__init__.py,sha256=47DEQpj8HBSa-_TImW-5J
|
|
394
395
|
unit_tests/sources/file_based/scenarios/avro_scenarios.py,sha256=oeQUmCV7d2aTShreYc-PvVb4cWqLSsVwHfg-lcKjzPs,30554
|
395
396
|
unit_tests/sources/file_based/scenarios/check_scenarios.py,sha256=0xkt21ASTnTAMP0RYJEsF3yMGsNN7wWOoG_tmzL9PYw,6750
|
396
397
|
unit_tests/sources/file_based/scenarios/concurrent_incremental_scenarios.py,sha256=EnVhPLSmUmB2lRc2ugb-HF7UkLFulj2EAHs4enAK5dI,102362
|
397
|
-
unit_tests/sources/file_based/scenarios/csv_scenarios.py,sha256=
|
398
|
+
unit_tests/sources/file_based/scenarios/csv_scenarios.py,sha256=LFmSWIguEGgzQJT_QNxmhVETYtmBW015tdW5D30TUxU,124852
|
398
399
|
unit_tests/sources/file_based/scenarios/file_based_source_builder.py,sha256=3gAFkguYH87v_WpV0lUttTKu7LG8a-viokDW232ecUw,4123
|
399
400
|
unit_tests/sources/file_based/scenarios/incremental_scenarios.py,sha256=7ZYe0tsoJ85rNT-s4Z9toXRp2BKmA1pxpPTCyTnNd_8,67340
|
400
401
|
unit_tests/sources/file_based/scenarios/jsonl_scenarios.py,sha256=quo_o8ofuv5LQ2eni6_HudbNq7IgAFQ5uzf_QTElLuY,31719
|
@@ -407,7 +408,7 @@ unit_tests/sources/file_based/stream/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeu
|
|
407
408
|
unit_tests/sources/file_based/stream/test_default_file_based_cursor.py,sha256=XhtCGvgSBFyeQwgqGciPsIB1HIlWqTcXROwnxrjutHc,13109
|
408
409
|
unit_tests/sources/file_based/stream/test_default_file_based_stream.py,sha256=IuAnysO7s3MXm6JViPSrlfIlpIYcqWpsKokRpABX39c,10075
|
409
410
|
unit_tests/sources/file_based/stream/concurrent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
410
|
-
unit_tests/sources/file_based/stream/concurrent/test_adapters.py,sha256=
|
411
|
+
unit_tests/sources/file_based/stream/concurrent/test_adapters.py,sha256=mMKdeS6ftmkX3WURbWy18b14HgnYj-oND_OYbmoqitE,14842
|
411
412
|
unit_tests/sources/file_based/stream/concurrent/test_file_based_concurrent_cursor.py,sha256=MuIE6y7b-7vF5vuwMozOxBDBLxSU_7dMmSwvK4vvm7U,19874
|
412
413
|
unit_tests/sources/fixtures/__init__.py,sha256=ZnqYNxHsKCgO38IwB34RQyRMXTs4GTvlRi3ImKnIioo,61
|
413
414
|
unit_tests/sources/fixtures/source_test_fixture.py,sha256=dvpISgio2sOp-U3bXudH_49vY4c68sO_PMs1JZTMaj0,5502
|
@@ -416,24 +417,24 @@ unit_tests/sources/message/test_repository.py,sha256=oiScwg4cAdnYDl7PPN1nZniDGpA
|
|
416
417
|
unit_tests/sources/streams/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
417
418
|
unit_tests/sources/streams/test_availability_strategy.py,sha256=vJrSEk9NwRghu0YsSNoMYHKWzA9UFemwyClpke8Mk2s,2315
|
418
419
|
unit_tests/sources/streams/test_call_rate.py,sha256=5QsokqxIFoR438QTd7p_eb0K-LW6awZXDtQiMTAb_Qo,13069
|
419
|
-
unit_tests/sources/streams/test_stream_read.py,sha256=
|
420
|
+
unit_tests/sources/streams/test_stream_read.py,sha256=PbnDqvQLdtr2nrlgI5qsZ9CmtXcEJXgOVREvBDQy_OI,16718
|
420
421
|
unit_tests/sources/streams/test_streams_core.py,sha256=YOC7XqWFJ13Z4YuO9Nh4AR4AwpJ-s111vqPplFfpxk4,5059
|
421
422
|
unit_tests/sources/streams/concurrent/__init__.py,sha256=4Hw-PX1-VgESLF16cDdvuYCzGJtHntThLF4qIiULWeo,61
|
422
423
|
unit_tests/sources/streams/concurrent/test_adapters.py,sha256=rIGY_V7D7-2TOcNopGxQySIPZsj62n2saijN2kl3oZM,14934
|
423
424
|
unit_tests/sources/streams/concurrent/test_concurrent_read_processor.py,sha256=qsoSin6ILGhhztEWF-WRdO6nvXJ-MfBH5CNpApEyKSc,27026
|
424
425
|
unit_tests/sources/streams/concurrent/test_cursor.py,sha256=9TmJUOHCsX8Acmm7yDvfcpB5WXwPBXP4d5dizRI-msw,5951
|
425
426
|
unit_tests/sources/streams/concurrent/test_datetime_state_converter.py,sha256=BWEKIT3a6B1NYAiXLZ-STgRu2kJ1T3QzEwQpfgsZkHs,14177
|
426
|
-
unit_tests/sources/streams/concurrent/test_default_stream.py,sha256=
|
427
|
+
unit_tests/sources/streams/concurrent/test_default_stream.py,sha256=btYMrOJez_8p9KEtKA8VuO-sWa-OPSo75Hsop39zsVk,7259
|
427
428
|
unit_tests/sources/streams/concurrent/test_partition_enqueuer.py,sha256=Vj8-aOZUlCfpndleNEMZlDSxYa_j4bEbr6TPiAS3SYU,4244
|
428
429
|
unit_tests/sources/streams/concurrent/test_partition_reader.py,sha256=bNFEQXqkSb1yBW5Nruar3HuVqx6r5hNXzU2VFtIRZgw,2544
|
429
430
|
unit_tests/sources/streams/concurrent/test_thread_pool_manager.py,sha256=l0rwdDX79MRip0IKTXKGIqEZy2NptMTUTPYYQQU5yjQ,4203
|
430
431
|
unit_tests/sources/streams/concurrent/scenarios/__init__.py,sha256=4Hw-PX1-VgESLF16cDdvuYCzGJtHntThLF4qIiULWeo,61
|
431
432
|
unit_tests/sources/streams/concurrent/scenarios/incremental_scenarios.py,sha256=pRbArlvAOglahwb_VHNqYOqfbn4DmJ3rtOCw-NyxJ2M,9858
|
432
|
-
unit_tests/sources/streams/concurrent/scenarios/stream_facade_builder.py,sha256=
|
433
|
+
unit_tests/sources/streams/concurrent/scenarios/stream_facade_builder.py,sha256=6CAs7gJmAlqkyj0thR6goBgaNfCvymFFh_DMP9IN5Dc,6353
|
433
434
|
unit_tests/sources/streams/concurrent/scenarios/stream_facade_scenarios.py,sha256=XIXBunoVtRfCvc-cOGbRtO0t6_km0uoKMFrtvymr28Q,13927
|
434
435
|
unit_tests/sources/streams/concurrent/scenarios/test_concurrent_scenarios.py,sha256=Z_4-ClsxBupmN7Pbl8lF9bkSA9wnjLtrgA9WR_8VRi8,3757
|
435
|
-
unit_tests/sources/streams/concurrent/scenarios/thread_based_concurrent_stream_scenarios.py,sha256=
|
436
|
-
unit_tests/sources/streams/concurrent/scenarios/thread_based_concurrent_stream_source_builder.py,sha256=
|
436
|
+
unit_tests/sources/streams/concurrent/scenarios/thread_based_concurrent_stream_scenarios.py,sha256=ZcI7aEdqPV_pe5i4KZRM2CqT34nQhAKn6CoV06O0_II,14074
|
437
|
+
unit_tests/sources/streams/concurrent/scenarios/thread_based_concurrent_stream_source_builder.py,sha256=w6rC11i79HIfyooUzPIcqQiZ4xkj_ATCpUxv1cRj3hM,6021
|
437
438
|
unit_tests/sources/streams/concurrent/scenarios/utils.py,sha256=Pl1F4asW8AvV6bV5W3Qg21GiLqfdMT_rOt1CsFA0aVM,1953
|
438
439
|
unit_tests/sources/streams/http/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
439
440
|
unit_tests/sources/streams/http/test_availability_strategy.py,sha256=kuQJ5FIc4lffpHmEUVzvoN1QXQzvz8WEkFvzHItiipg,6063
|
@@ -443,7 +444,7 @@ unit_tests/sources/streams/http/auth/test_auth.py,sha256=05jyXGhKxZrOLfR97weNDeg
|
|
443
444
|
unit_tests/sources/streams/http/requests_native_auth/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
444
445
|
unit_tests/sources/streams/http/requests_native_auth/test_requests_native_auth.py,sha256=FG9ug7xXyyWI0iS5ZsCzzrVNZMpq7EtVkQSx_cUbp68,19474
|
445
446
|
unit_tests/test/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
446
|
-
unit_tests/test/test_entrypoint_wrapper.py,sha256=
|
447
|
+
unit_tests/test/test_entrypoint_wrapper.py,sha256=WI46PODALY8IvDRreQiJyuFoxbimoiO62MP6NaBHInk,11178
|
447
448
|
unit_tests/test/mock_http/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
448
449
|
unit_tests/test/mock_http/test_matcher.py,sha256=dBndYzqvo3AdHRilLrqruXdPviwi91gWt-ubDsGb-yg,2327
|
449
450
|
unit_tests/test/mock_http/test_mocker.py,sha256=sOoWutnrPDKB99Y3bkEyr3HFELGivwuklVJ_ii8C-ew,8523
|
@@ -452,13 +453,14 @@ unit_tests/test/mock_http/test_response_builder.py,sha256=IxAww4gaOxG-9MW8kEZkRz
|
|
452
453
|
unit_tests/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
453
454
|
unit_tests/utils/test_datetime_format_inferrer.py,sha256=1EUW1_afccMDrZM6YZyyPqrdwsUxZTaBxJNVa4TjiN8,3616
|
454
455
|
unit_tests/utils/test_mapping_helpers.py,sha256=hqRppuban9hGKviiNFqp2fNdAz77d1_gjvgg8L7-jy8,1408
|
456
|
+
unit_tests/utils/test_message_utils.py,sha256=0roX-k-O4oiX0KwQoI_KpVop4ZXI57N0LCCO8Ww5tC8,3148
|
455
457
|
unit_tests/utils/test_rate_limiting.py,sha256=ESrPBH61EZSeAf-hYWnd49igCgkUWnT21rUHPQaOLQM,873
|
456
458
|
unit_tests/utils/test_schema_inferrer.py,sha256=Z2jHBZ540wnYkylIdV_2xr75Vtwlxuyg4MNPAG-xhpk,7817
|
457
459
|
unit_tests/utils/test_secret_utils.py,sha256=CdKK8A2-5XVxbXVtX22FK9dwwMeP5KNqDH6luWRXSNw,5256
|
458
460
|
unit_tests/utils/test_stream_status_utils.py,sha256=Xr8MZ2HWgTVIyMbywDvuYkRaUF4RZLQOT8-JjvcfR24,2970
|
459
461
|
unit_tests/utils/test_traced_exception.py,sha256=bDFP5zMBizFenz6V2WvEZTRCKGB5ijh3DBezjbfoYIs,4198
|
460
|
-
airbyte_cdk-0.
|
461
|
-
airbyte_cdk-0.
|
462
|
-
airbyte_cdk-0.
|
463
|
-
airbyte_cdk-0.
|
464
|
-
airbyte_cdk-0.
|
462
|
+
airbyte_cdk-0.69.1.dist-info/LICENSE.txt,sha256=Wfe61S4BaGPj404v8lrAbvhjYR68SHlkzeYrg3_bbuM,1051
|
463
|
+
airbyte_cdk-0.69.1.dist-info/METADATA,sha256=E5q4NBAl0Aq4UO700Bg2PYQcW-YH7ED4P7yUSPbhNWs,11074
|
464
|
+
airbyte_cdk-0.69.1.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
|
465
|
+
airbyte_cdk-0.69.1.dist-info/top_level.txt,sha256=edvsDKTnE6sD2wfCUaeTfKf5gQIL6CPVMwVL2sWZzqo,51
|
466
|
+
airbyte_cdk-0.69.1.dist-info/RECORD,,
|
@@ -20,7 +20,7 @@ from airbyte_cdk.sources.concurrent_source.concurrent_source_adapter import Conc
|
|
20
20
|
from airbyte_cdk.sources.message import InMemoryMessageRepository
|
21
21
|
from airbyte_cdk.sources.streams import Stream
|
22
22
|
from airbyte_cdk.sources.streams.concurrent.adapters import StreamFacade
|
23
|
-
from airbyte_cdk.sources.streams.concurrent.cursor import
|
23
|
+
from airbyte_cdk.sources.streams.concurrent.cursor import FinalStateCursor
|
24
24
|
|
25
25
|
|
26
26
|
class _MockSource(ConcurrentSourceAdapter):
|
@@ -36,7 +36,7 @@ class _MockSource(ConcurrentSourceAdapter):
|
|
36
36
|
|
37
37
|
def streams(self, config: Mapping[str, Any]) -> List[Stream]:
|
38
38
|
return [
|
39
|
-
StreamFacade.create_from_stream(s, self, self._logger, None,
|
39
|
+
StreamFacade.create_from_stream(s, self, self._logger, None, FinalStateCursor(stream_name=s.name, stream_namespace=s.namespace, message_repository=InMemoryMessageRepository())) if is_concurrent else s
|
40
40
|
for s, is_concurrent in self._streams_to_is_concurrent.items()
|
41
41
|
]
|
42
42
|
|