134 lines
4.8 KiB
Python
134 lines
4.8 KiB
Python
#
|
|
# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
|
|
#
|
|
|
|
from abc import abstractmethod
|
|
from enum import Enum
|
|
from typing import Any, Callable, Mapping, MutableMapping, Optional, Union
|
|
|
|
import requests
|
|
from airbyte_cdk.sources.declarative.auth.declarative_authenticator import DeclarativeAuthenticator
|
|
from airbyte_cdk.sources.declarative.requesters.request_options.request_options_provider import RequestOptionsProvider
|
|
from airbyte_cdk.sources.types import StreamSlice, StreamState
|
|
|
|
|
|
class HttpMethod(Enum):
|
|
"""
|
|
Http Method to use when submitting an outgoing HTTP request
|
|
"""
|
|
|
|
GET = "GET"
|
|
POST = "POST"
|
|
|
|
|
|
class Requester(RequestOptionsProvider):
|
|
@abstractmethod
|
|
def get_authenticator(self) -> DeclarativeAuthenticator:
|
|
"""
|
|
Specifies the authenticator to use when submitting requests
|
|
"""
|
|
pass
|
|
|
|
@abstractmethod
|
|
def get_url_base(self) -> str:
|
|
"""
|
|
:return: URL base for the API endpoint e.g: if you wanted to hit https://myapi.com/v1/some_entity then this should return "https://myapi.com/v1/"
|
|
"""
|
|
|
|
@abstractmethod
|
|
def get_path(
|
|
self,
|
|
*,
|
|
stream_state: Optional[StreamState],
|
|
stream_slice: Optional[StreamSlice],
|
|
next_page_token: Optional[Mapping[str, Any]],
|
|
) -> str:
|
|
"""
|
|
Returns the URL path for the API endpoint e.g: if you wanted to hit https://myapi.com/v1/some_entity then this should return "some_entity"
|
|
"""
|
|
|
|
@abstractmethod
|
|
def get_method(self) -> HttpMethod:
|
|
"""
|
|
Specifies the HTTP method to use
|
|
"""
|
|
|
|
@abstractmethod
|
|
def get_request_params(
|
|
self,
|
|
*,
|
|
stream_state: Optional[StreamState] = None,
|
|
stream_slice: Optional[StreamSlice] = None,
|
|
next_page_token: Optional[Mapping[str, Any]] = None,
|
|
) -> MutableMapping[str, Any]:
|
|
"""
|
|
Specifies the query parameters that should be set on an outgoing HTTP request given the inputs.
|
|
|
|
E.g: you might want to define query parameters for paging if next_page_token is not None.
|
|
"""
|
|
|
|
@abstractmethod
|
|
def get_request_headers(
|
|
self,
|
|
*,
|
|
stream_state: Optional[StreamState] = None,
|
|
stream_slice: Optional[StreamSlice] = None,
|
|
next_page_token: Optional[Mapping[str, Any]] = None,
|
|
) -> Mapping[str, Any]:
|
|
"""
|
|
Return any non-auth headers. Authentication headers will overwrite any overlapping headers returned from this method.
|
|
"""
|
|
|
|
@abstractmethod
|
|
def get_request_body_data(
|
|
self,
|
|
*,
|
|
stream_state: Optional[StreamState] = None,
|
|
stream_slice: Optional[StreamSlice] = None,
|
|
next_page_token: Optional[Mapping[str, Any]] = None,
|
|
) -> Union[Mapping[str, Any], str]:
|
|
"""
|
|
Specifies how to populate the body of the request with a non-JSON payload.
|
|
|
|
If returns a ready text that it will be sent as is.
|
|
If returns a dict that it will be converted to a urlencoded form.
|
|
E.g. {"key1": "value1", "key2": "value2"} => "key1=value1&key2=value2"
|
|
|
|
At the same time only one of the 'request_body_data' and 'request_body_json' functions can be overridden.
|
|
"""
|
|
|
|
@abstractmethod
|
|
def get_request_body_json(
|
|
self,
|
|
*,
|
|
stream_state: Optional[StreamState] = None,
|
|
stream_slice: Optional[StreamSlice] = None,
|
|
next_page_token: Optional[Mapping[str, Any]] = None,
|
|
) -> Mapping[str, Any]:
|
|
"""
|
|
Specifies how to populate the body of the request with a JSON payload.
|
|
|
|
At the same time only one of the 'request_body_data' and 'request_body_json' functions can be overridden.
|
|
"""
|
|
|
|
@abstractmethod
|
|
def send_request(
|
|
self,
|
|
stream_state: Optional[StreamState] = None,
|
|
stream_slice: Optional[StreamSlice] = None,
|
|
next_page_token: Optional[Mapping[str, Any]] = None,
|
|
path: Optional[str] = None,
|
|
request_headers: Optional[Mapping[str, Any]] = None,
|
|
request_params: Optional[Mapping[str, Any]] = None,
|
|
request_body_data: Optional[Union[Mapping[str, Any], str]] = None,
|
|
request_body_json: Optional[Mapping[str, Any]] = None,
|
|
log_formatter: Optional[Callable[[requests.Response], Any]] = None,
|
|
) -> Optional[requests.Response]:
|
|
"""
|
|
Sends a request and returns the response. Might return no response if the error handler chooses to ignore the response or throw an exception in case of an error.
|
|
If path is set, the path configured on the requester itself is ignored.
|
|
If header, params and body are set, they are merged with the ones configured on the requester itself.
|
|
|
|
If a log formatter is provided, it's used to log the performed request and response. If it's not provided, no logging is performed.
|
|
"""
|