airbyte-cdk 0.68.4__py3-none-any.whl → 0.69.1__py3-none-any.whl
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
|