140
140
StopConditionPaginationStrategyDecorator ,
141
141
)
142
142
from airbyte_cdk .sources .declarative .requesters .request_option import RequestOptionType
143
- from airbyte_cdk .sources .declarative .requesters .request_options import InterpolatedRequestOptionsProvider
143
+ from airbyte_cdk .sources .declarative .requesters .request_options import (
144
+ DatetimeBasedRequestOptionsProvider ,
145
+ DefaultRequestOptionsProvider ,
146
+ InterpolatedRequestOptionsProvider ,
147
+ RequestOptionsProvider ,
148
+ )
144
149
from airbyte_cdk .sources .declarative .requesters .request_path import RequestPath
145
150
from airbyte_cdk .sources .declarative .requesters .requester import HttpMethod
146
151
from airbyte_cdk .sources .declarative .retrievers import AsyncRetriever , SimpleRetriever , SimpleRetrieverTestReadDecorator
@@ -653,6 +658,40 @@ def create_declarative_stream(self, model: DeclarativeStreamModel, config: Confi
653
658
"per_partition_cursor" : combined_slicers if isinstance (combined_slicers , PerPartitionCursor ) else None ,
654
659
"is_global_substream_cursor" : isinstance (combined_slicers , GlobalSubstreamCursor ),
655
660
}
661
+
662
+ if model .incremental_sync and isinstance (model .incremental_sync , DatetimeBasedCursorModel ):
663
+ cursor_model = model .incremental_sync
664
+
665
+ end_time_option = (
666
+ RequestOption (
667
+ inject_into = RequestOptionType (cursor_model .end_time_option .inject_into .value ),
668
+ field_name = cursor_model .end_time_option .field_name ,
669
+ parameters = cursor_model .parameters or {},
670
+ )
671
+ if cursor_model .end_time_option
672
+ else None
673
+ )
674
+ start_time_option = (
675
+ RequestOption (
676
+ inject_into = RequestOptionType (cursor_model .start_time_option .inject_into .value ),
677
+ field_name = cursor_model .start_time_option .field_name ,
678
+ parameters = cursor_model .parameters or {},
679
+ )
680
+ if cursor_model .start_time_option
681
+ else None
682
+ )
683
+
684
+ request_options_provider = DatetimeBasedRequestOptionsProvider (
685
+ start_time_option = start_time_option ,
686
+ end_time_option = end_time_option ,
687
+ partition_field_start = cursor_model .partition_field_end ,
688
+ partition_field_end = cursor_model .partition_field_end ,
689
+ config = config ,
690
+ parameters = model .parameters or {},
691
+ )
692
+ else :
693
+ request_options_provider = None
694
+
656
695
transformations = []
657
696
if model .transformations :
658
697
for transformation_model in model .transformations :
@@ -663,6 +702,7 @@ def create_declarative_stream(self, model: DeclarativeStreamModel, config: Confi
663
702
name = model .name ,
664
703
primary_key = primary_key ,
665
704
stream_slicer = combined_slicers ,
705
+ request_options_provider = request_options_provider ,
666
706
stop_condition_on_cursor = stop_condition_on_cursor ,
667
707
client_side_incremental_sync = client_side_incremental_sync ,
668
708
transformations = transformations ,
@@ -1126,6 +1166,7 @@ def create_simple_retriever(
1126
1166
name : str ,
1127
1167
primary_key : Optional [Union [str , List [str ], List [List [str ]]]],
1128
1168
stream_slicer : Optional [StreamSlicer ],
1169
+ request_options_provider : Optional [RequestOptionsProvider ] = None ,
1129
1170
stop_condition_on_cursor : bool = False ,
1130
1171
client_side_incremental_sync : Optional [Dict [str , Any ]] = None ,
1131
1172
transformations : List [RecordTransformation ],
@@ -1140,11 +1181,21 @@ def create_simple_retriever(
1140
1181
client_side_incremental_sync = client_side_incremental_sync ,
1141
1182
)
1142
1183
url_base = model .requester .url_base if hasattr (model .requester , "url_base" ) else requester .get_url_base ()
1143
- stream_slicer = stream_slicer or SinglePartitionRouter (parameters = {})
1144
1184
1145
1185
# Define cursor only if per partition or common incremental support is needed
1146
1186
cursor = stream_slicer if isinstance (stream_slicer , DeclarativeCursor ) else None
1147
1187
1188
+ if not isinstance (stream_slicer , DatetimeBasedCursor ) or type (stream_slicer ) is not DatetimeBasedCursor :
1189
+ # Many of the custom component implementations of DatetimeBasedCursor override get_request_params() (or other methods).
1190
+ # Because we're decoupling RequestOptionsProvider from the Cursor, custom components will eventually need to reimplement
1191
+ # their own RequestOptionsProvider. However, right now the existing StreamSlicer/Cursor still can act as the SimpleRetriever's
1192
+ # request_options_provider
1193
+ request_options_provider = stream_slicer or DefaultRequestOptionsProvider (parameters = {})
1194
+ elif not request_options_provider :
1195
+ request_options_provider = DefaultRequestOptionsProvider (parameters = {})
1196
+
1197
+ stream_slicer = stream_slicer or SinglePartitionRouter (parameters = {})
1198
+
1148
1199
cursor_used_for_stop_condition = cursor if stop_condition_on_cursor else None
1149
1200
paginator = (
1150
1201
self ._create_component_from_model (
@@ -1168,6 +1219,7 @@ def create_simple_retriever(
1168
1219
requester = requester ,
1169
1220
record_selector = record_selector ,
1170
1221
stream_slicer = stream_slicer ,
1222
+ request_option_provider = request_options_provider ,
1171
1223
cursor = cursor ,
1172
1224
config = config ,
1173
1225
maximum_number_of_slices = self ._limit_slices_fetched or 5 ,
@@ -1181,6 +1233,7 @@ def create_simple_retriever(
1181
1233
requester = requester ,
1182
1234
record_selector = record_selector ,
1183
1235
stream_slicer = stream_slicer ,
1236
+ request_option_provider = request_options_provider ,
1184
1237
cursor = cursor ,
1185
1238
config = config ,
1186
1239
ignore_stream_slicer_parameters_on_paginated_requests = ignore_stream_slicer_parameters_on_paginated_requests ,
0 commit comments