* checkout from alex/cac * checkout from alex/cac * checkout from alex/cac * Add missing tests * Add missing files * Add missing tests * add missing file * missing file * missing file * rename * doc * doc * remove broken test * rename * jinja dependency * Add comment * comment * comment * pyjq dependency * rename file * delete unused file * Revert "delete unused file" This reverts commit758e939367. * fix * rename * abstract property * delete unused field * delete unused field * rename * pass kwargs directly * isort * Revert "isort" This reverts commit4a79223944. * isort * update state * fix imports * update dependency * format * rename file * decoder * Use decoder * Update comment * dict_state is actually backed by a dict * Add a comment * update state takes kwargs * move state out of offset paginator * update jq parameter order * update * remove incremental mixin * delete comment * update comments * update comments * remove no_state * rename package * checkout from alex/cac * Add missing tests * Add missing files * missing file * rename * jinja dependency * Add comment * comment * comment * Revert "delete unused file" This reverts commit758e939367. * delete unused field * delete unused field * rename * pass kwargs directly * isort * Revert "isort" This reverts commit4a79223944. * format * decoder * better error handling * remove nostate * isort * remove print * move test * delete duplicates * delete dead code * Update mapping type to [str, Any] * add comment * Add comment * pass parameters through kwargs * pass parameters through kwargs * update interface to pass source in interface * update interface to pass source in interface * rename to stream_slicer * Allow passing a string or an enum * Define StateType enum * convert state_type if not of type type * convert state_type if not of type type * Low code connectors: string interpolation with jinja (#12852) * checkout from alex/cac * Add missing tests * Add missing files * missing file * rename * jinja dependency * Add comment * comment * comment * Revert "delete unused file" This reverts commit758e939367. * delete unused field * delete unused field * rename * pass kwargs directly * isort * Revert "isort" This reverts commit4a79223944. * format * decoder * better error handling * remove nostate * isort * delete dead code * Update mapping type to [str, Any] * add comment * Add comment * pass parameters through kwargs * move test to right module * Add missing test * Use authbase instead of deprecated class * leverage generator * Delete dead code * rename methods * rename to declarative * rename the classes too * Try to install packages to build jq * isort * only automake * Revert "only automake" This reverts commitc8fe154ffc. * remove git * format * Add jq dependency * Use request header provider * rename * rename field * remove get_context method * rename
117 lines
4.4 KiB
Python
117 lines
4.4 KiB
Python
#
|
|
# Copyright (c) 2022 Airbyte, Inc., all rights reserved.
|
|
#
|
|
|
|
from typing import Any, Mapping, MutableMapping, Optional, Union
|
|
|
|
import requests
|
|
from airbyte_cdk.sources.declarative.interpolation.interpolated_string import InterpolatedString
|
|
from airbyte_cdk.sources.declarative.requesters.request_headers.request_header_provider import RequestHeaderProvider
|
|
from airbyte_cdk.sources.declarative.requesters.request_params.request_parameters_provider import RequestParameterProvider
|
|
from airbyte_cdk.sources.declarative.requesters.requester import HttpMethod, Requester
|
|
from airbyte_cdk.sources.declarative.requesters.retriers.retrier import Retrier
|
|
from airbyte_cdk.sources.declarative.types import Config
|
|
from airbyte_cdk.sources.streams.http.auth import HttpAuthenticator
|
|
|
|
|
|
class HttpRequester(Requester):
|
|
def __init__(
|
|
self,
|
|
*,
|
|
name: str,
|
|
url_base: [str, InterpolatedString],
|
|
path: [str, InterpolatedString],
|
|
http_method: Union[str, HttpMethod],
|
|
request_parameters_provider: RequestParameterProvider,
|
|
request_headers_provider: RequestHeaderProvider,
|
|
authenticator: HttpAuthenticator,
|
|
retrier: Retrier,
|
|
config: Config,
|
|
):
|
|
self._name = name
|
|
self._authenticator = authenticator
|
|
if type(url_base) == str:
|
|
url_base = InterpolatedString(url_base)
|
|
self._url_base = url_base
|
|
if type(path) == str:
|
|
path = InterpolatedString(path)
|
|
self._path: InterpolatedString = path
|
|
if type(http_method) == str:
|
|
http_method = HttpMethod[http_method]
|
|
self._method = http_method
|
|
self._request_parameters_provider = request_parameters_provider
|
|
self._request_headers_provider = request_headers_provider
|
|
self._retrier = retrier
|
|
self._config = config
|
|
|
|
def request_params(
|
|
self, stream_state: Mapping[str, Any], stream_slice: Mapping[str, Any] = None, next_page_token: Mapping[str, Any] = None
|
|
) -> MutableMapping[str, Any]:
|
|
return self._request_parameters_provider.request_params(stream_state, stream_slice, next_page_token)
|
|
|
|
def get_authenticator(self):
|
|
return self._authenticator
|
|
|
|
def get_url_base(self):
|
|
return self._url_base.eval(self._config)
|
|
|
|
def get_path(self, *, stream_state: Mapping[str, Any], stream_slice: Mapping[str, Any], next_page_token: Mapping[str, Any]) -> str:
|
|
kwargs = {"stream_state": stream_state, "stream_slice": stream_slice, "next_page_token": next_page_token}
|
|
path = self._path.eval(self._config, **kwargs)
|
|
return path
|
|
|
|
def get_method(self):
|
|
return self._method
|
|
|
|
@property
|
|
def raise_on_http_errors(self) -> bool:
|
|
# TODO this should be declarative
|
|
return True
|
|
|
|
@property
|
|
def max_retries(self) -> Union[int, None]:
|
|
return self._retrier.max_retries
|
|
|
|
@property
|
|
def retry_factor(self) -> float:
|
|
return self._retrier.retry_factor
|
|
|
|
def should_retry(self, response: requests.Response) -> bool:
|
|
return self._retrier.should_retry(response)
|
|
|
|
def backoff_time(self, response: requests.Response) -> Optional[float]:
|
|
return self._retrier.backoff_time(response)
|
|
|
|
def request_headers(
|
|
self, stream_state: Mapping[str, Any], stream_slice: Mapping[str, Any] = None, next_page_token: Mapping[str, Any] = None
|
|
) -> Mapping[str, Any]:
|
|
return self._request_headers_provider.request_headers(stream_state, stream_slice, next_page_token)
|
|
|
|
def request_body_data(
|
|
self, stream_state: Mapping[str, Any], stream_slice: Mapping[str, Any] = None, next_page_token: Mapping[str, Any] = None
|
|
) -> Optional[Union[Mapping, str]]:
|
|
# FIXME: this should be declarative
|
|
return dict()
|
|
|
|
def request_body_json(
|
|
self, stream_state: Mapping[str, Any], stream_slice: Mapping[str, Any] = None, next_page_token: Mapping[str, Any] = None
|
|
) -> Optional[Mapping]:
|
|
# FIXME: this should be declarative
|
|
return dict()
|
|
|
|
def request_kwargs(
|
|
self, stream_state: Mapping[str, Any], stream_slice: Mapping[str, Any] = None, next_page_token: Mapping[str, Any] = None
|
|
) -> Mapping[str, Any]:
|
|
# FIXME: this should be declarative
|
|
return dict()
|
|
|
|
@property
|
|
def cache_filename(self) -> str:
|
|
# FIXME: this should be declarative
|
|
return f"{self._name}.yml"
|
|
|
|
@property
|
|
def use_cache(self) -> bool:
|
|
# FIXME: this should be declarative
|
|
return False
|