Skip to content

Commit e78eaff

Browse files
fix(airbyte-cdk): unable to create custom retriever (airbytehq#198)
1 parent 3344441 commit e78eaff

File tree

2 files changed

+46
-5
lines changed

2 files changed

+46
-5
lines changed

airbyte_cdk/sources/declarative/parsers/model_to_component_factory.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1574,7 +1574,12 @@ def create_exponential_backoff_strategy(
15741574
)
15751575

15761576
def create_http_requester(
1577-
self, model: HttpRequesterModel, decoder: Decoder, config: Config, *, name: str
1577+
self,
1578+
model: HttpRequesterModel,
1579+
config: Config,
1580+
decoder: Decoder = JsonDecoder(parameters={}),
1581+
*,
1582+
name: str,
15781583
) -> HttpRequester:
15791584
authenticator = (
15801585
self._create_component_from_model(
@@ -1990,9 +1995,9 @@ def create_record_selector(
19901995
config: Config,
19911996
*,
19921997
name: str,
1993-
transformations: List[RecordTransformation],
1994-
decoder: Optional[Decoder] = None,
1995-
client_side_incremental_sync: Optional[Dict[str, Any]] = None,
1998+
transformations: List[RecordTransformation] | None = None,
1999+
decoder: Decoder | None = None,
2000+
client_side_incremental_sync: Dict[str, Any] | None = None,
19962001
**kwargs: Any,
19972002
) -> RecordSelector:
19982003
assert model.schema_normalization is not None # for mypy
@@ -2022,7 +2027,7 @@ def create_record_selector(
20222027
name=name,
20232028
config=config,
20242029
record_filter=record_filter,
2025-
transformations=transformations,
2030+
transformations=transformations or [],
20262031
schema_normalization=schema_normalization,
20272032
parameters=model.parameters or {},
20282033
)

unit_tests/sources/declarative/parsers/test_model_to_component_factory.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2634,6 +2634,42 @@ def test_create_custom_schema_loader():
26342634
assert isinstance(component, MyCustomSchemaLoader)
26352635

26362636

2637+
class MyCustomRetriever(SimpleRetriever):
2638+
pass
2639+
2640+
2641+
def test_create_custom_retriever():
2642+
stream_model = {
2643+
"type": "DeclarativeStream",
2644+
"retriever": {
2645+
"type": "CustomRetriever",
2646+
"class_name": "unit_tests.sources.declarative.parsers.test_model_to_component_factory.MyCustomRetriever",
2647+
"record_selector": {
2648+
"type": "RecordSelector",
2649+
"extractor": {
2650+
"type": "DpathExtractor",
2651+
"field_path": [],
2652+
},
2653+
"$parameters": {"name": ""},
2654+
},
2655+
"requester": {
2656+
"type": "HttpRequester",
2657+
"name": "list",
2658+
"url_base": "orange.com",
2659+
"path": "/v1/api",
2660+
"$parameters": {"name": ""},
2661+
},
2662+
},
2663+
}
2664+
2665+
stream = factory.create_component(
2666+
model_type=DeclarativeStreamModel, component_definition=stream_model, config=input_config
2667+
)
2668+
2669+
assert isinstance(stream, DeclarativeStream)
2670+
assert isinstance(stream.retriever, MyCustomRetriever)
2671+
2672+
26372673
@freezegun.freeze_time("2021-01-01 00:00:00")
26382674
@pytest.mark.parametrize(
26392675
"config, manifest, expected",

0 commit comments

Comments
 (0)