diff --git a/cookiecutter/tap-template/{{cookiecutter.tap_id}}/{{cookiecutter.library_name}}/rest-client.py b/cookiecutter/tap-template/{{cookiecutter.tap_id}}/{{cookiecutter.library_name}}/rest-client.py index f4edca913..fb805ad55 100644 --- a/cookiecutter/tap-template/{{cookiecutter.tap_id}}/{{cookiecutter.library_name}}/rest-client.py +++ b/cookiecutter/tap-template/{{cookiecutter.tap_id}}/{{cookiecutter.library_name}}/rest-client.py @@ -6,9 +6,8 @@ {%- if cookiecutter.auth_method in ("OAuth2", "JWT") %} from functools import cached_property {%- endif %} -from typing import TYPE_CHECKING, Any, Callable, Iterable +from typing import TYPE_CHECKING, Any, Iterable -import requests {% if cookiecutter.auth_method == "API Key" -%} from singer_sdk.authenticators import APIKeyAuthenticator from singer_sdk.helpers.jsonpath import extract_jsonpath @@ -47,11 +46,14 @@ import importlib_resources if TYPE_CHECKING: + import requests + {%- if cookiecutter.auth_method in ("OAuth2", "JWT") %} + from singer_sdk.helpers.types import Auth, Context + {%- else %} from singer_sdk.helpers.types import Context + {%- endif %} -_Auth = Callable[[requests.PreparedRequest], requests.PreparedRequest] - # TODO: Delete this is if not using json files for schema definition SCHEMAS_DIR = importlib_resources.files(__package__) / "schemas" @@ -74,7 +76,7 @@ def url_base(self) -> str: {%- if cookiecutter.auth_method in ("OAuth2", "JWT") %} @cached_property - def authenticator(self) -> _Auth: + def authenticator(self) -> Auth: """Return a new authenticator object. Returns: diff --git a/noxfile.py b/noxfile.py index d0d5fbd89..40875be38 100644 --- a/noxfile.py +++ b/noxfile.py @@ -25,6 +25,8 @@ RUFF_OVERRIDES = """\ extend = "./pyproject.toml" + +[lint] extend-ignore = ["TD002", "TD003", "FIX002"] """ diff --git a/singer_sdk/helpers/types.py b/singer_sdk/helpers/types.py index 715f5309a..39aaefef5 100644 --- a/singer_sdk/helpers/types.py +++ b/singer_sdk/helpers/types.py @@ -5,6 +5,8 @@ import sys import typing as t +import requests + if sys.version_info < (3, 9): from typing import Mapping # noqa: ICN003 else: @@ -15,6 +17,7 @@ else: from typing import TypeAlias # noqa: ICN003 + __all__ = [ "Context", "Record", @@ -22,3 +25,4 @@ Context: TypeAlias = Mapping[str, t.Any] Record: TypeAlias = t.Dict[str, t.Any] +Auth: TypeAlias = t.Callable[[requests.PreparedRequest], requests.PreparedRequest] diff --git a/singer_sdk/streams/rest.py b/singer_sdk/streams/rest.py index c65ee3f56..559389e8c 100644 --- a/singer_sdk/streams/rest.py +++ b/singer_sdk/streams/rest.py @@ -26,25 +26,18 @@ from singer_sdk.streams.core import Stream if t.TYPE_CHECKING: - import sys from datetime import datetime from backoff.types import Details from singer_sdk._singerlib import Schema - from singer_sdk.helpers.types import Context + from singer_sdk.helpers.types import Auth, Context from singer_sdk.tap_base import Tap - if sys.version_info >= (3, 10): - from typing import TypeAlias # noqa: ICN003 - else: - from typing_extensions import TypeAlias - DEFAULT_PAGE_SIZE = 1000 DEFAULT_REQUEST_TIMEOUT = 300 # 5 minutes _TToken = t.TypeVar("_TToken") -_Auth: TypeAlias = t.Callable[[requests.PreparedRequest], requests.PreparedRequest] class RESTStream(Stream, t.Generic[_TToken], metaclass=abc.ABCMeta): # noqa: PLR0904 @@ -610,7 +603,7 @@ def parse_response(self, response: requests.Response) -> t.Iterable[dict]: # Abstract methods: @property - def authenticator(self) -> _Auth: + def authenticator(self) -> Auth: """Return or set the authenticator for managing HTTP auth headers. If an authenticator is not specified, REST-based taps will simply pass