From 72c91f48f7c06903d912ceb26ad6e025b78f2316 Mon Sep 17 00:00:00 2001 From: Stainless Bot Date: Thu, 26 Oct 2023 16:06:05 +0000 Subject: [PATCH] chore(internal): require explicit overrides --- pyproject.toml | 3 +++ src/lithic/_base_client.py | 4 +++- src/lithic/_client.py | 10 +++++++++- src/lithic/_models.py | 6 ++++++ src/lithic/_streaming.py | 2 ++ src/lithic/_types.py | 10 +++++++++- src/lithic/_utils/_proxy.py | 6 +++++- src/lithic/_utils/_transform.py | 3 ++- src/lithic/pagination.py | 10 +++++++++- 9 files changed, 48 insertions(+), 6 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index e60db8c4..8a5dccb7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -102,6 +102,9 @@ exclude = [ ".venv", ".nox", ] + +reportImplicitOverride = true + reportImportCycles = false reportPrivateUsage = false diff --git a/src/lithic/_base_client.py b/src/lithic/_base_client.py index f061e668..22516bbe 100644 --- a/src/lithic/_base_client.py +++ b/src/lithic/_base_client.py @@ -29,7 +29,7 @@ overload, ) from functools import lru_cache -from typing_extensions import Literal, get_args, get_origin +from typing_extensions import Literal, get_args, override, get_origin import anyio import httpx @@ -1588,6 +1588,7 @@ class OtherPlatform: def __init__(self, name: str) -> None: self.name = name + @override def __str__(self) -> str: return f"Other:{self.name}" @@ -1649,6 +1650,7 @@ class OtherArch: def __init__(self, name: str) -> None: self.name = name + @override def __str__(self) -> str: return f"other:{self.name}" diff --git a/src/lithic/_client.py b/src/lithic/_client.py index f449a0a6..d6a2f875 100644 --- a/src/lithic/_client.py +++ b/src/lithic/_client.py @@ -5,7 +5,7 @@ import os import asyncio from typing import Dict, Union, Mapping -from typing_extensions import Literal +from typing_extensions import Literal, override import httpx @@ -182,15 +182,18 @@ def __init__( self.digital_card_art = resources.DigitalCardArtResource(self) @property + @override def qs(self) -> Querystring: return Querystring(array_format="comma") @property + @override def auth_headers(self) -> dict[str, str]: api_key = self.api_key return {"Authorization": api_key} @property + @override def default_headers(self) -> dict[str, str | Omit]: return { **super().default_headers, @@ -302,6 +305,7 @@ def api_status( cast_to=APIStatus, ) + @override def _make_status_error( self, err_msg: str, @@ -460,15 +464,18 @@ def __init__( self.digital_card_art = resources.AsyncDigitalCardArtResource(self) @property + @override def qs(self) -> Querystring: return Querystring(array_format="comma") @property + @override def auth_headers(self) -> dict[str, str]: api_key = self.api_key return {"Authorization": api_key} @property + @override def default_headers(self) -> dict[str, str | Omit]: return { **super().default_headers, @@ -583,6 +590,7 @@ async def api_status( cast_to=APIStatus, ) + @override def _make_status_error( self, err_msg: str, diff --git a/src/lithic/_models.py b/src/lithic/_models.py index 4e4107f5..7b0772e4 100644 --- a/src/lithic/_models.py +++ b/src/lithic/_models.py @@ -11,6 +11,7 @@ Required, TypedDict, final, + override, runtime_checkable, ) @@ -59,6 +60,7 @@ class BaseModel(pydantic.BaseModel): else: @property + @override def model_fields_set(self) -> set[str]: # a forwards-compat shim for pydantic v2 return self.__fields_set__ # type: ignore @@ -66,6 +68,7 @@ def model_fields_set(self) -> set[str]: class Config(pydantic.BaseConfig): # pyright: ignore[reportDeprecated] extra: Any = pydantic.Extra.allow # type: ignore + @override def __str__(self) -> str: # mypy complains about an invalid self arg return f'{self.__repr_name__()}({self.__repr_str__(", ")})' # type: ignore[misc] @@ -73,6 +76,7 @@ def __str__(self) -> str: # Override the 'construct' method in a way that supports recursive parsing without validation. # Based on https://github.com/samuelcolvin/pydantic/issues/1168#issuecomment-817742836. @classmethod + @override def construct( cls: Type[ModelT], _fields_set: set[str] | None = None, @@ -139,6 +143,7 @@ def construct( # a specifc pydantic version as some users may not know which # pydantic version they are currently using + @override def model_dump( self, *, @@ -187,6 +192,7 @@ def model_dump( exclude_none=exclude_none, ) + @override def model_dump_json( self, *, diff --git a/src/lithic/_streaming.py b/src/lithic/_streaming.py index 18749b53..b0600fc9 100644 --- a/src/lithic/_streaming.py +++ b/src/lithic/_streaming.py @@ -3,6 +3,7 @@ import json from typing import TYPE_CHECKING, Any, Generic, Iterator, AsyncIterator +from typing_extensions import override import httpx @@ -123,6 +124,7 @@ def data(self) -> str: def json(self) -> Any: return json.loads(self.data) + @override def __repr__(self) -> str: return f"ServerSentEvent(event={self.event}, data={self.data}, id={self.id}, retry={self.retry})" diff --git a/src/lithic/_types.py b/src/lithic/_types.py index 54e6b0d9..2bc71c25 100644 --- a/src/lithic/_types.py +++ b/src/lithic/_types.py @@ -15,7 +15,14 @@ Optional, Sequence, ) -from typing_extensions import Literal, Protocol, TypeAlias, TypedDict, runtime_checkable +from typing_extensions import ( + Literal, + Protocol, + TypeAlias, + TypedDict, + override, + runtime_checkable, +) import httpx import pydantic @@ -119,6 +126,7 @@ def get(timeout: Union[int, NotGiven, None] = NotGiven()) -> Response: ... def __bool__(self) -> Literal[False]: return False + @override def __repr__(self) -> str: return "NOT_GIVEN" diff --git a/src/lithic/_utils/_proxy.py b/src/lithic/_utils/_proxy.py index fd85ebd5..aa934a3f 100644 --- a/src/lithic/_utils/_proxy.py +++ b/src/lithic/_utils/_proxy.py @@ -2,7 +2,7 @@ from abc import ABC, abstractmethod from typing import Generic, TypeVar, Iterable, cast -from typing_extensions import ClassVar +from typing_extensions import ClassVar, override T = TypeVar("T") @@ -21,16 +21,20 @@ def __init__(self) -> None: def __getattr__(self, attr: str) -> object: return getattr(self.__get_proxied__(), attr) + @override def __repr__(self) -> str: return repr(self.__get_proxied__()) + @override def __str__(self) -> str: return str(self.__get_proxied__()) + @override def __dir__(self) -> Iterable[str]: return self.__get_proxied__().__dir__() @property # type: ignore + @override def __class__(self) -> type: return self.__get_proxied__().__class__ diff --git a/src/lithic/_utils/_transform.py b/src/lithic/_utils/_transform.py index c007d8b0..d524b329 100644 --- a/src/lithic/_utils/_transform.py +++ b/src/lithic/_utils/_transform.py @@ -2,7 +2,7 @@ from typing import Any, List, Mapping, TypeVar, cast from datetime import date, datetime -from typing_extensions import Literal, get_args, get_type_hints +from typing_extensions import Literal, get_args, override, get_type_hints from ._utils import ( is_list, @@ -52,6 +52,7 @@ def __init__( self.format = format self.format_template = format_template + @override def __repr__(self) -> str: return f"{self.__class__.__name__}(alias='{self.alias}', format={self.format}, format_template='{self.format_template}')" diff --git a/src/lithic/pagination.py b/src/lithic/pagination.py index a847b2eb..0ed0e749 100644 --- a/src/lithic/pagination.py +++ b/src/lithic/pagination.py @@ -1,7 +1,7 @@ # File generated from our OpenAPI spec by Stainless. from typing import Any, List, Generic, TypeVar, Optional, cast -from typing_extensions import Protocol, runtime_checkable +from typing_extensions import Protocol, override, runtime_checkable from ._types import ModelT from ._models import BaseModel @@ -21,9 +21,11 @@ class SyncCursorPage(BaseSyncPage[ModelT], BasePage[ModelT], Generic[ModelT]): data: List[ModelT] has_more: bool + @override def _get_page_items(self) -> List[ModelT]: return self.data + @override def next_page_info(self) -> Optional[PageInfo]: is_forwards = not self._options.params.get("ending_before", False) @@ -48,9 +50,11 @@ class AsyncCursorPage(BaseAsyncPage[ModelT], BasePage[ModelT], Generic[ModelT]): data: List[ModelT] has_more: bool + @override def _get_page_items(self) -> List[ModelT]: return self.data + @override def next_page_info(self) -> Optional[PageInfo]: is_forwards = not self._options.params.get("ending_before", False) @@ -75,9 +79,11 @@ class SyncSinglePage(BaseSyncPage[ModelT], BasePage[ModelT], Generic[ModelT]): data: List[ModelT] has_more: bool + @override def _get_page_items(self) -> List[ModelT]: return self.data + @override def next_page_info(self) -> None: """ This page represents a response that isn't actually paginated at the API level @@ -90,9 +96,11 @@ class AsyncSinglePage(BaseAsyncPage[ModelT], BasePage[ModelT], Generic[ModelT]): data: List[ModelT] has_more: bool + @override def _get_page_items(self) -> List[ModelT]: return self.data + @override def next_page_info(self) -> None: """ This page represents a response that isn't actually paginated at the API level