airbyte-cdk 0.69.0__py3-none-any.whl → 0.69.2__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
@@ -319,7 +319,7 @@ class ModelToComponentFactory:
319
319
  )
320
320
  if model.request_authentication.type == "Bearer":
321
321
  return ModelToComponentFactory.create_bearer_authenticator(
322
- BearerAuthenticatorModel(type="BearerAuthenticator", api_token=""),
322
+ BearerAuthenticatorModel(type="BearerAuthenticator", api_token=""), # type: ignore # $parameters has a default value
323
323
  config,
324
324
  token_provider=token_provider, # type: ignore # $parameters defaults to None
325
325
  )
@@ -431,11 +431,14 @@ class ModelToComponentFactory:
431
431
  return custom_component_class(**kwargs)
432
432
 
433
433
  @staticmethod
434
- def _get_class_from_fully_qualified_class_name(class_name: str) -> Any:
435
- split = class_name.split(".")
434
+ def _get_class_from_fully_qualified_class_name(full_qualified_class_name: str) -> Any:
435
+ split = full_qualified_class_name.split(".")
436
436
  module = ".".join(split[:-1])
437
437
  class_name = split[-1]
438
- return getattr(importlib.import_module(module), class_name)
438
+ try:
439
+ return getattr(importlib.import_module(module), class_name)
440
+ except AttributeError:
441
+ raise ValueError(f"Could not load class {full_qualified_class_name}.")
439
442
 
440
443
  @staticmethod
441
444
  def _derive_component_type_from_type_hints(field_type: Any) -> Optional[str]:
@@ -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]:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: airbyte-cdk
3
- Version: 0.69.0
3
+ Version: 0.69.2
4
4
  Summary: A framework for writing Airbyte Connectors.
5
5
  Home-page: https://github.com/airbytehq/airbyte
6
6
  Author: Airbyte
@@ -87,7 +87,7 @@ airbyte_cdk/sources/declarative/parsers/custom_exceptions.py,sha256=y7_G5mM07zxT
87
87
  airbyte_cdk/sources/declarative/parsers/default_implementation_registry.py,sha256=W8BcK4KOg4ifNXgsdeIoV4oneHjXBKcPHEZHIC4r-hM,3801
88
88
  airbyte_cdk/sources/declarative/parsers/manifest_component_transformer.py,sha256=i2yUdrdlPUHI0dSQX0zBT8WSg912SMiCF8qkQ8VvlA4,8287
89
89
  airbyte_cdk/sources/declarative/parsers/manifest_reference_resolver.py,sha256=6ukHx0bBrCJm9rek1l_MEfS3U_gdJcM4pJRyifJEOp0,6412
90
- airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py,sha256=zKhclxenhHM5lq1-dap4eL4sTaaHnat1XvzPAo9iiqU,59105
90
+ airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py,sha256=_jX1sPW5SA51nHoxpoVktC3jdO8PR4cGrQfZftcVSLo,59316
91
91
  airbyte_cdk/sources/declarative/partition_routers/__init__.py,sha256=27sOWhw2LBQs62HchURakHQ2M_mtnOatNgU6q8RUtpU,476
92
92
  airbyte_cdk/sources/declarative/partition_routers/list_partition_router.py,sha256=L22D-up7W2HahZZo2dA-IbRSs7qJEahU6O6bU0eiIt8,4324
93
93
  airbyte_cdk/sources/declarative/partition_routers/single_partition_router.py,sha256=cl-TQdu_m6_IF20gdD1jll0SpejIyMZHvyGXx2NafuI,1611
@@ -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
@@ -329,7 +329,7 @@ unit_tests/sources/declarative/interpolation/test_macros.py,sha256=vEZmHQ0KsfQUz
329
329
  unit_tests/sources/declarative/parsers/__init__.py,sha256=ZnqYNxHsKCgO38IwB34RQyRMXTs4GTvlRi3ImKnIioo,61
330
330
  unit_tests/sources/declarative/parsers/test_manifest_component_transformer.py,sha256=egePHWYcXprfPtoHhiquWAXuJkDr-DB_RakKhdyaoHs,14316
331
331
  unit_tests/sources/declarative/parsers/test_manifest_reference_resolver.py,sha256=K3q9eyx-sJFQ8nGYjAgS7fxau4sX_FlNreEAjiCYOeE,5306
332
- unit_tests/sources/declarative/parsers/test_model_to_component_factory.py,sha256=A9xe7CPavPfvSSY_ngbKbdNW4LbE2i6Ahj0ZVhpOd-8,75128
332
+ unit_tests/sources/declarative/parsers/test_model_to_component_factory.py,sha256=WIUygDJvNGEIzNdlarkYymTTgRtiXlR6IOjwnsqlC3E,75683
333
333
  unit_tests/sources/declarative/parsers/testing_components.py,sha256=_yUijmYRM-yYHPGDB2JsfEiOuVrgexGW9QwHf1xxNW8,1326
334
334
  unit_tests/sources/declarative/partition_routers/__init__.py,sha256=O8MZg4Bv_DghdRy9BoJCPIqdV75VtiUrhEkExQgb2nE,61
335
335
  unit_tests/sources/declarative/partition_routers/test_list_partition_router.py,sha256=WKdbAQCHfCVOyoAFM_kbHsbqAF_e5FX5Zvou5ARsJZ4,6572
@@ -444,7 +444,7 @@ unit_tests/sources/streams/http/auth/test_auth.py,sha256=05jyXGhKxZrOLfR97weNDeg
444
444
  unit_tests/sources/streams/http/requests_native_auth/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
445
445
  unit_tests/sources/streams/http/requests_native_auth/test_requests_native_auth.py,sha256=FG9ug7xXyyWI0iS5ZsCzzrVNZMpq7EtVkQSx_cUbp68,19474
446
446
  unit_tests/test/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
447
- unit_tests/test/test_entrypoint_wrapper.py,sha256=hFr-pWqJz1VsIkwh1O6BrPl2rH09_sAz_mZeWV9iSBo,10807
447
+ unit_tests/test/test_entrypoint_wrapper.py,sha256=WI46PODALY8IvDRreQiJyuFoxbimoiO62MP6NaBHInk,11178
448
448
  unit_tests/test/mock_http/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
449
449
  unit_tests/test/mock_http/test_matcher.py,sha256=dBndYzqvo3AdHRilLrqruXdPviwi91gWt-ubDsGb-yg,2327
450
450
  unit_tests/test/mock_http/test_mocker.py,sha256=sOoWutnrPDKB99Y3bkEyr3HFELGivwuklVJ_ii8C-ew,8523
@@ -459,8 +459,8 @@ unit_tests/utils/test_schema_inferrer.py,sha256=Z2jHBZ540wnYkylIdV_2xr75Vtwlxuyg
459
459
  unit_tests/utils/test_secret_utils.py,sha256=CdKK8A2-5XVxbXVtX22FK9dwwMeP5KNqDH6luWRXSNw,5256
460
460
  unit_tests/utils/test_stream_status_utils.py,sha256=Xr8MZ2HWgTVIyMbywDvuYkRaUF4RZLQOT8-JjvcfR24,2970
461
461
  unit_tests/utils/test_traced_exception.py,sha256=bDFP5zMBizFenz6V2WvEZTRCKGB5ijh3DBezjbfoYIs,4198
462
- airbyte_cdk-0.69.0.dist-info/LICENSE.txt,sha256=Wfe61S4BaGPj404v8lrAbvhjYR68SHlkzeYrg3_bbuM,1051
463
- airbyte_cdk-0.69.0.dist-info/METADATA,sha256=3qyDXSdVmneP0TAlzZpHoNcRH4n5DbMOtIHwFlf0gxY,11074
464
- airbyte_cdk-0.69.0.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
465
- airbyte_cdk-0.69.0.dist-info/top_level.txt,sha256=edvsDKTnE6sD2wfCUaeTfKf5gQIL6CPVMwVL2sWZzqo,51
466
- airbyte_cdk-0.69.0.dist-info/RECORD,,
462
+ airbyte_cdk-0.69.2.dist-info/LICENSE.txt,sha256=Wfe61S4BaGPj404v8lrAbvhjYR68SHlkzeYrg3_bbuM,1051
463
+ airbyte_cdk-0.69.2.dist-info/METADATA,sha256=wnxHVH0ud4kbRmo5hNf_qy0Gae-ahhomVw8RRAUKbls,11074
464
+ airbyte_cdk-0.69.2.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
465
+ airbyte_cdk-0.69.2.dist-info/top_level.txt,sha256=edvsDKTnE6sD2wfCUaeTfKf5gQIL6CPVMwVL2sWZzqo,51
466
+ airbyte_cdk-0.69.2.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
 
@@ -1239,6 +1239,20 @@ def test_create_default_paginator():
1239
1239
  ValueError,
1240
1240
  id="test_create_custom_component_missing_required_field_emits_error",
1241
1241
  ),
1242
+ pytest.param(
1243
+ {
1244
+ "type": "CustomErrorHandler",
1245
+ "class_name": "unit_tests.sources.declarative.parsers.testing_components.NonExistingClass",
1246
+ "paginator": {
1247
+ "type": "DefaultPaginator",
1248
+ "pagination_strategy": {"type": "OffsetIncrement", "page_size": 10},
1249
+ },
1250
+ },
1251
+ "paginator",
1252
+ None,
1253
+ ValueError,
1254
+ id="test_create_custom_component_non_existing_class_raises_value_error",
1255
+ ),
1242
1256
  ],
1243
1257
  )
1244
1258
  def test_create_custom_components(manifest, field_name, expected_value, expected_error):
@@ -3,7 +3,7 @@
3
3
  import json
4
4
  import logging
5
5
  import os
6
- from typing import Any, Iterator, List
6
+ from typing import Any, Iterator, List, Mapping
7
7
  from unittest import TestCase
8
8
  from unittest.mock import Mock, patch
9
9
 
@@ -16,7 +16,9 @@ from airbyte_protocol.models import (
16
16
  AirbyteLogMessage,
17
17
  AirbyteMessage,
18
18
  AirbyteRecordMessage,
19
+ AirbyteStateBlob,
19
20
  AirbyteStateMessage,
21
+ AirbyteStreamState,
20
22
  AirbyteStreamStatus,
21
23
  AirbyteStreamStatusTraceMessage,
22
24
  AirbyteTraceMessage,
@@ -28,8 +30,8 @@ from airbyte_protocol.models import (
28
30
  )
29
31
 
30
32
 
31
- def _a_state_message(state: Any) -> AirbyteMessage:
32
- return AirbyteMessage(type=Type.STATE, state=AirbyteStateMessage(data=state))
33
+ def _a_state_message(stream_name: str, stream_state: Mapping[str, Any]) -> AirbyteMessage:
34
+ return AirbyteMessage(type=Type.STATE, state=AirbyteStateMessage(stream=AirbyteStreamState(stream_descriptor=StreamDescriptor(name=stream_name), stream_state=AirbyteStateBlob(**stream_state))))
33
35
 
34
36
 
35
37
  def _a_status_message(stream_name: str, status: AirbyteStreamStatus) -> AirbyteMessage:
@@ -49,7 +51,7 @@ def _a_status_message(stream_name: str, status: AirbyteStreamStatus) -> AirbyteM
49
51
  _A_RECORD = AirbyteMessage(
50
52
  type=Type.RECORD, record=AirbyteRecordMessage(stream="stream", data={"record key": "record value"}, emitted_at=0)
51
53
  )
52
- _A_STATE_MESSAGE = _a_state_message({"state key": "state value for _A_STATE_MESSAGE"})
54
+ _A_STATE_MESSAGE = _a_state_message("stream_name", {"state key": "state value for _A_STATE_MESSAGE"})
53
55
  _A_LOG = AirbyteMessage(type=Type.LOG, log=AirbyteLogMessage(level=Level.INFO, message="This is an Airbyte log message"))
54
56
  _AN_ERROR_MESSAGE = AirbyteMessage(
55
57
  type=Type.TRACE,
@@ -176,8 +178,9 @@ class EntrypointWrapperTest(TestCase):
176
178
 
177
179
  @patch("airbyte_cdk.test.entrypoint_wrapper.AirbyteEntrypoint")
178
180
  def test_given_many_state_messages_and_records_when_read_then_output_has_records_and_state_message(self, entrypoint):
179
- last_emitted_state = {"last state key": "last state value"}
180
- entrypoint.return_value.run.return_value = _to_entrypoint_output([_A_STATE_MESSAGE, _a_state_message(last_emitted_state)])
181
+ state_value = {"state_key": "last state value"}
182
+ last_emitted_state = AirbyteStreamState(stream_descriptor=StreamDescriptor(name="stream_name"), stream_state=AirbyteStateBlob(**state_value))
183
+ entrypoint.return_value.run.return_value = _to_entrypoint_output([_A_STATE_MESSAGE, _a_state_message("stream_name", state_value)])
181
184
 
182
185
  output = read(self._a_source, _A_CONFIG, _A_CATALOG, _A_STATE)
183
186