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.
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