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