airbyte-cdk 0.31.1__py3-none-any.whl → 0.32.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- airbyte_cdk/connector_builder/message_grouper.py +13 -5
- airbyte_cdk/sources/abstract_source.py +3 -7
- {airbyte_cdk-0.31.1.dist-info → airbyte_cdk-0.32.0.dist-info}/METADATA +1 -1
- {airbyte_cdk-0.31.1.dist-info → airbyte_cdk-0.32.0.dist-info}/RECORD +8 -8
- unit_tests/sources/test_abstract_source.py +6 -8
- {airbyte_cdk-0.31.1.dist-info → airbyte_cdk-0.32.0.dist-info}/LICENSE.txt +0 -0
- {airbyte_cdk-0.31.1.dist-info → airbyte_cdk-0.32.0.dist-info}/WHEEL +0 -0
- {airbyte_cdk-0.31.1.dist-info → airbyte_cdk-0.32.0.dist-info}/top_level.txt +0 -0
@@ -6,10 +6,18 @@ import json
|
|
6
6
|
import logging
|
7
7
|
from copy import deepcopy
|
8
8
|
from json import JSONDecodeError
|
9
|
-
from typing import Any, Iterable, Iterator, Mapping, Optional, Union
|
9
|
+
from typing import Any, Iterable, Iterator, List, Mapping, Optional, Union
|
10
10
|
from urllib.parse import parse_qs, urlparse
|
11
11
|
|
12
|
-
from airbyte_cdk.connector_builder.models import
|
12
|
+
from airbyte_cdk.connector_builder.models import (
|
13
|
+
HttpRequest,
|
14
|
+
HttpResponse,
|
15
|
+
LogMessage,
|
16
|
+
StreamRead,
|
17
|
+
StreamReadPages,
|
18
|
+
StreamReadSlices,
|
19
|
+
StreamReadSlicesInner,
|
20
|
+
)
|
13
21
|
from airbyte_cdk.sources.declarative.declarative_source import DeclarativeSource
|
14
22
|
from airbyte_cdk.utils import AirbyteTracedException
|
15
23
|
from airbyte_cdk.utils.schema_inferrer import SchemaInferrer
|
@@ -133,7 +141,7 @@ class MessageGrouper:
|
|
133
141
|
yield StreamReadSlices(pages=current_slice_pages)
|
134
142
|
|
135
143
|
@staticmethod
|
136
|
-
def _need_to_close_page(at_least_one_page_in_group, message) -> bool:
|
144
|
+
def _need_to_close_page(at_least_one_page_in_group: bool, message: AirbyteMessage) -> bool:
|
137
145
|
return (
|
138
146
|
at_least_one_page_in_group
|
139
147
|
and message.type == MessageType.LOG
|
@@ -155,7 +163,7 @@ class MessageGrouper:
|
|
155
163
|
)
|
156
164
|
current_page_records.clear()
|
157
165
|
|
158
|
-
def _read_stream(self, source, config, configured_catalog) -> Iterator[AirbyteMessage]:
|
166
|
+
def _read_stream(self, source: DeclarativeSource, config: Mapping[str, Any], configured_catalog: ConfiguredAirbyteCatalog) -> Iterator[AirbyteMessage]:
|
159
167
|
# the generator can raise an exception
|
160
168
|
# iterate over the generated messages. if next raise an exception, catch it and yield it as an AirbyteLogMessage
|
161
169
|
try:
|
@@ -198,7 +206,7 @@ class MessageGrouper:
|
|
198
206
|
self.logger.warning(f"Failed to parse log message into response object with error: {error}")
|
199
207
|
return None
|
200
208
|
|
201
|
-
def _has_reached_limit(self, slices):
|
209
|
+
def _has_reached_limit(self, slices: List[StreamReadSlicesInner]):
|
202
210
|
if len(slices) >= self._max_slices:
|
203
211
|
return True
|
204
212
|
|
@@ -79,13 +79,9 @@ class AbstractSource(Source, ABC):
|
|
79
79
|
"""Implements the Check Connection operation from the Airbyte Specification.
|
80
80
|
See https://docs.airbyte.com/understanding-airbyte/airbyte-protocol/#check.
|
81
81
|
"""
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
return AirbyteConnectionStatus(status=Status.FAILED, message=repr(error))
|
86
|
-
except Exception as e:
|
87
|
-
return AirbyteConnectionStatus(status=Status.FAILED, message=repr(e))
|
88
|
-
|
82
|
+
check_succeeded, error = self.check_connection(logger, config)
|
83
|
+
if not check_succeeded:
|
84
|
+
return AirbyteConnectionStatus(status=Status.FAILED, message=repr(error))
|
89
85
|
return AirbyteConnectionStatus(status=Status.SUCCEEDED)
|
90
86
|
|
91
87
|
def read(
|
@@ -8,7 +8,7 @@ airbyte_cdk/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
8
8
|
airbyte_cdk/connector_builder/__init__.py,sha256=4Hw-PX1-VgESLF16cDdvuYCzGJtHntThLF4qIiULWeo,61
|
9
9
|
airbyte_cdk/connector_builder/connector_builder_handler.py,sha256=9iG2hmaJyBtLDtdwtQp8M19pG2HQjR7Yy6jnBDggXMk,4160
|
10
10
|
airbyte_cdk/connector_builder/main.py,sha256=IOijgSQ4A9KhqJplHSVPTrxH_cyGWW_9uNmSIwBo0l0,3021
|
11
|
-
airbyte_cdk/connector_builder/message_grouper.py,sha256
|
11
|
+
airbyte_cdk/connector_builder/message_grouper.py,sha256=M58VVaoMYtDVyFnQkqgOyFxVYvxeR2vpnG0kCN3YE1Q,11149
|
12
12
|
airbyte_cdk/connector_builder/models.py,sha256=y0PJ-LwJk3e1RzRmMfjQSBP9ENx_a0wBcWNCjlW72Ks,1832
|
13
13
|
airbyte_cdk/destinations/__init__.py,sha256=0Uxmz3iBAyZJdk_bqUVt2pb0UwRTpFjTnFE6fQFbWKY,126
|
14
14
|
airbyte_cdk/destinations/destination.py,sha256=_tIMnKcRQbtIsjVvNOVjfbIxgCNLuBXQwQj8MyVm3BI,5420
|
@@ -16,7 +16,7 @@ airbyte_cdk/models/__init__.py,sha256=LPQcYdDPwrCXiBPe_jexO4UAcbovIb1V9tHB6I7Un3
|
|
16
16
|
airbyte_cdk/models/airbyte_protocol.py,sha256=wKXV_4sCzmUyPndiW7HWAj_A6EDRJyk9cA88xvXGQN0,117
|
17
17
|
airbyte_cdk/models/well_known_types.py,sha256=KKfNbow2gdLoC1Z4hcXy_JR8m_acsB2ol7gQuEgjobw,117
|
18
18
|
airbyte_cdk/sources/__init__.py,sha256=4j6fLtoRCjcZnojpise4EMmQtV1RepBxoGTBgpz80JA,218
|
19
|
-
airbyte_cdk/sources/abstract_source.py,sha256=
|
19
|
+
airbyte_cdk/sources/abstract_source.py,sha256=KfUAOvsicxAQFrHNXgC0lgDFxB8e6MJBpZPa0ZjqyqU,15895
|
20
20
|
airbyte_cdk/sources/config.py,sha256=PYsY7y2u3EUwxLiEb96JnuKwH_E8CuxKggsRO2ZPSRc,856
|
21
21
|
airbyte_cdk/sources/connector_state_manager.py,sha256=_R-2QnMGimKL0t5aV4f6P1dgd--TB3abY5Seg1xddXk,10469
|
22
22
|
airbyte_cdk/sources/source.py,sha256=N3vHZzdUsBETFsql-YpO-LcgjolT_jcnAuHBhGD6Hqk,4278
|
@@ -169,7 +169,7 @@ unit_tests/singer/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU
|
|
169
169
|
unit_tests/singer/test_singer_helpers.py,sha256=pZV6VxJuK-3-FICNGmoGbokrA_zkaFZEd4rYZCVpSRU,1762
|
170
170
|
unit_tests/singer/test_singer_source.py,sha256=edN_kv7dnYAdBveWdUYOs74ak0dK6p8uaX225h_ZILA,4442
|
171
171
|
unit_tests/sources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
172
|
-
unit_tests/sources/test_abstract_source.py,sha256=
|
172
|
+
unit_tests/sources/test_abstract_source.py,sha256=ED6OjhaM60YQVV6c6ycRqjwWN0hHfLk_7pyzlaWrqKk,39753
|
173
173
|
unit_tests/sources/test_config.py,sha256=gFXqU_6OjwHXkV4JHMqQUznxmvTWN8nAv0w0-FFpugc,2477
|
174
174
|
unit_tests/sources/test_connector_state_manager.py,sha256=ynFxA63Cxe6t-wMMh9C6ByTlMAuk8W7H2FikDhnUEQ0,24264
|
175
175
|
unit_tests/sources/test_source.py,sha256=xE8LZrvsIp-mbsZmLQMOu3PVC2RmtIQZxjdYbNF4CGg,24151
|
@@ -257,8 +257,8 @@ unit_tests/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,
|
|
257
257
|
unit_tests/utils/test_schema_inferrer.py,sha256=ckl17GlNOZInqgxni7Z2A0bg_p6JDy0GVFAG8ph67pw,3288
|
258
258
|
unit_tests/utils/test_secret_utils.py,sha256=XKe0f1RHYii8iwE6ATmBr5JGDI1pzzrnZUGdUSMJQP4,4886
|
259
259
|
unit_tests/utils/test_traced_exception.py,sha256=bDFP5zMBizFenz6V2WvEZTRCKGB5ijh3DBezjbfoYIs,4198
|
260
|
-
airbyte_cdk-0.
|
261
|
-
airbyte_cdk-0.
|
262
|
-
airbyte_cdk-0.
|
263
|
-
airbyte_cdk-0.
|
264
|
-
airbyte_cdk-0.
|
260
|
+
airbyte_cdk-0.32.0.dist-info/LICENSE.txt,sha256=Wfe61S4BaGPj404v8lrAbvhjYR68SHlkzeYrg3_bbuM,1051
|
261
|
+
airbyte_cdk-0.32.0.dist-info/METADATA,sha256=qSn-QH6VCzY6qd1MjE0AEqjOSZXe8vcqLhZFWqo_XW8,8902
|
262
|
+
airbyte_cdk-0.32.0.dist-info/WHEEL,sha256=pkctZYzUS4AYVn6dJ-7367OJZivF2e8RA9b_ZBjif18,92
|
263
|
+
airbyte_cdk-0.32.0.dist-info/top_level.txt,sha256=edvsDKTnE6sD2wfCUaeTfKf5gQIL6CPVMwVL2sWZzqo,51
|
264
|
+
airbyte_cdk-0.32.0.dist-info/RECORD,,
|
@@ -104,10 +104,11 @@ def test_failed_check():
|
|
104
104
|
assert expected == MockSource(check_lambda=lambda: (False, "womp womp")).check(logger, {})
|
105
105
|
|
106
106
|
|
107
|
-
def test_raising_check():
|
107
|
+
def test_raising_check(mocker):
|
108
108
|
"""Tests that if a source raises an unexpected exception the appropriate connectionStatus failure message is returned."""
|
109
|
-
|
110
|
-
|
109
|
+
check_lambda = mocker.Mock(side_effect=BaseException("this should fail"))
|
110
|
+
with pytest.raises(BaseException):
|
111
|
+
MockSource(check_lambda=check_lambda).check(logger, {})
|
111
112
|
|
112
113
|
|
113
114
|
class MockStream(Stream):
|
@@ -334,10 +335,7 @@ def test_valid_full_refresh_read_with_slices(mocker):
|
|
334
335
|
|
335
336
|
@pytest.mark.parametrize(
|
336
337
|
"slices",
|
337
|
-
[
|
338
|
-
[{"1": "1"}, {"2": "2"}],
|
339
|
-
[{"date": datetime.date(year=2023, month=1, day=1)}, {"date": datetime.date(year=2023, month=1, day=1)}]
|
340
|
-
]
|
338
|
+
[[{"1": "1"}, {"2": "2"}], [{"date": datetime.date(year=2023, month=1, day=1)}, {"date": datetime.date(year=2023, month=1, day=1)}]],
|
341
339
|
)
|
342
340
|
def test_read_full_refresh_with_slices_sends_slice_messages(mocker, slices):
|
343
341
|
"""Given the logger is debug and a full refresh, AirbyteMessages are sent for slices"""
|
@@ -369,7 +367,7 @@ def test_read_incremental_with_slices_sends_slice_messages(mocker):
|
|
369
367
|
debug_logger.setLevel(logging.DEBUG)
|
370
368
|
slices = [{"1": "1"}, {"2": "2"}]
|
371
369
|
stream = MockStream(
|
372
|
-
[({"sync_mode": SyncMode.incremental, "stream_slice": s,
|
370
|
+
[({"sync_mode": SyncMode.incremental, "stream_slice": s, "stream_state": {}}, [s]) for s in slices],
|
373
371
|
name="s1",
|
374
372
|
)
|
375
373
|
|
File without changes
|
File without changes
|
File without changes
|