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.
Files changed (30) hide show
  1. airbyte_cdk/entrypoint.py +27 -7
  2. airbyte_cdk/sources/connector_state_manager.py +0 -1
  3. airbyte_cdk/sources/file_based/file_based_source.py +4 -2
  4. airbyte_cdk/sources/file_based/stream/concurrent/adapters.py +2 -2
  5. airbyte_cdk/sources/file_based/stream/concurrent/cursor/__init__.py +2 -2
  6. airbyte_cdk/sources/file_based/stream/concurrent/cursor/{file_based_noop_cursor.py → file_based_final_state_cursor.py} +21 -6
  7. airbyte_cdk/sources/streams/concurrent/adapters.py +2 -2
  8. airbyte_cdk/sources/streams/concurrent/cursor.py +27 -3
  9. airbyte_cdk/sources/streams/concurrent/default_stream.py +7 -3
  10. airbyte_cdk/test/entrypoint_wrapper.py +1 -1
  11. airbyte_cdk/utils/message_utils.py +17 -0
  12. {airbyte_cdk-0.68.4.dist-info → airbyte_cdk-0.69.1.dist-info}/METADATA +1 -1
  13. {airbyte_cdk-0.68.4.dist-info → airbyte_cdk-0.69.1.dist-info}/RECORD +30 -28
  14. {airbyte_cdk-0.68.4.dist-info → airbyte_cdk-0.69.1.dist-info}/WHEEL +1 -1
  15. unit_tests/sources/concurrent_source/test_concurrent_source_adapter.py +2 -2
  16. unit_tests/sources/file_based/scenarios/csv_scenarios.py +128 -37
  17. unit_tests/sources/file_based/stream/concurrent/test_adapters.py +3 -3
  18. unit_tests/sources/file_based/test_file_based_scenarios.py +13 -6
  19. unit_tests/sources/file_based/test_scenarios.py +32 -3
  20. unit_tests/sources/streams/concurrent/scenarios/stream_facade_builder.py +2 -2
  21. unit_tests/sources/streams/concurrent/scenarios/thread_based_concurrent_stream_scenarios.py +16 -14
  22. unit_tests/sources/streams/concurrent/scenarios/thread_based_concurrent_stream_source_builder.py +5 -4
  23. unit_tests/sources/streams/concurrent/test_default_stream.py +8 -6
  24. unit_tests/sources/streams/test_stream_read.py +3 -2
  25. unit_tests/sources/test_concurrent_source.py +7 -5
  26. unit_tests/sources/test_source_read.py +2 -3
  27. unit_tests/test/test_entrypoint_wrapper.py +9 -6
  28. unit_tests/utils/test_message_utils.py +91 -0
  29. {airbyte_cdk-0.68.4.dist-info → airbyte_cdk-0.69.1.dist-info}/LICENSE.txt +0 -0
  30. {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
- yield from self.source.read(self.logger, config, catalog, state)
164
- yield from self._emit_queued_messages(self.source)
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
- FileBasedNoopCursor,
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 = FileBasedNoopCursor(stream_config)
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 FileBasedNoopCursor
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, FileBasedNoopCursor) else SyncMode.incremental,
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 .file_based_noop_cursor import FileBasedNoopCursor
3
+ from .file_based_final_state_cursor import FileBasedFinalStateCursor
4
4
 
5
- __all__ = ["AbstractConcurrentFileBasedCursor", "FileBasedConcurrentCursor", "FileBasedNoopCursor"]
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 FileBasedNoopCursor(AbstractConcurrentFileBasedCursor):
21
- def __init__(self, stream_config: FileBasedStreamConfig, **kwargs: Any):
22
- pass
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
- pass
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, NoopCursor
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, NoopCursor) else SyncMode.incremental,
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 NoopCursor(Cursor):
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
- pass
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, NoopCursor
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: Optional[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 or NoopCursor()
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.data
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,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: airbyte-cdk
3
- Version: 0.68.4
3
+ Version: 0.69.1
4
4
  Summary: A framework for writing Airbyte Connectors.
5
5
  Home-page: https://github.com/airbytehq/airbyte
6
6
  Author: Airbyte
@@ -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=-e7kRCh1bvO1STQM2jA__p8ePEwrU8ZBFTooOVMHYKg,13669
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=rMb8roMcupsKtTXbGsufVl6bq-XVGBTxyTqTOuluMQs,10003
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=WH-BCGu5vWB0WjAI54Q30uHSkX9J5QgIpBwWI5Gx7ag,13645
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=G93wu1oo1OOUWrl3z16wISYN8JyqJitkpfeqv5016vc,12806
190
- airbyte_cdk/sources/file_based/stream/concurrent/cursor/__init__.py,sha256=4gi-_oETrHYZClD12okh13INBsI2OfugKhToXtohRTs,310
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/file_based_noop_cursor.py,sha256=wblXBgNw-QLVPNOAL8DihlQBXbvPC1zCdDWMsPdZPzQ,1852
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=ok68ZE2tYH3XR0Ti3mwSsCO_WQSGyqTCXTFI5Gc5WZk,16267
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=KaLdNz5auNIOtLPF94g4un-BVUH9JHSvw3UrCwBUqAg,9732
212
- airbyte_cdk/sources/streams/concurrent/default_stream.py,sha256=qPhMaLxGdR29kyMeA-YrHg-XePgPNDjactQPKbp56RA,3009
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=uTOEYoWkYnbkooPJ4a4gZ-NEll5j1tTCAzIG5lBroI4,7397
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=3i7pSRetKSoP6LBpXyuXpWi2_VOwta_aTm_kgnDaLqk,3704
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=n9XpVQLfsQH8eh6D99MDiNVBBKcf6UtouThDJcGH6SU,17186
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=ZEJzOm9pVFHrXBS3cT43XdK_vopICZmoqzFsTE2E8Tk,3675
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=llrPRotbYvUrORrqOFH8nMqQZ_QSs4sYwwgvqzkQsvc,15355
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=85qb_CXTGNTS7pk-N73EGd55J0Cnky8i1G900cs4sek,9405
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=2tyWtFOtbxPh24qAhKMZcVsoSsmnFT3k6MBGzRmx3lU,121727
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=ptjPNSLh_2Z1GFN82gkC1lH4Ov5h5UyEr3AO7CO2fqM,14760
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=MpRVbr_uCnpEiVHGuKQzuOzCYVUPwhBwA-ISr4GxHm0,16571
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=krXLLyFNLmggGHqga_3OkqVx-GgSVdQckGkD_DpLEoU,6644
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=HKtWlCbx81CdS8hqCs-d43JndiLL6Tp4K0Yf8VdycDg,6239
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=Qa1z48QLKy8xOViyiqpkIEhREF4rZHqJh8FwJ8fzqiQ,13435
436
- unit_tests/sources/streams/concurrent/scenarios/thread_based_concurrent_stream_source_builder.py,sha256=dY9iAX8YlJcQ2nyPePPCjj6VXzUN_wmJ3bGz6wZQzFE,5734
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=hFr-pWqJz1VsIkwh1O6BrPl2rH09_sAz_mZeWV9iSBo,10807
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.68.4.dist-info/LICENSE.txt,sha256=Wfe61S4BaGPj404v8lrAbvhjYR68SHlkzeYrg3_bbuM,1051
461
- airbyte_cdk-0.68.4.dist-info/METADATA,sha256=S7rHnZUSW1wnf2XL2M_OmH9cEpfRbDrkrty_L6Kkb2o,11074
462
- airbyte_cdk-0.68.4.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
463
- airbyte_cdk-0.68.4.dist-info/top_level.txt,sha256=edvsDKTnE6sD2wfCUaeTfKf5gQIL6CPVMwVL2sWZzqo,51
464
- airbyte_cdk-0.68.4.dist-info/RECORD,,
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,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.42.0)
2
+ Generator: bdist_wheel (0.43.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -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 NoopCursor
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, NoopCursor()) if is_concurrent else s
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