Skip to content

Commit 9ffdf66

Browse files
chore(internal): require explicit overrides (#153)
1 parent b43da35 commit 9ffdf66

File tree

9 files changed

+54
-4
lines changed

9 files changed

+54
-4
lines changed

pyproject.toml

+3
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,9 @@ exclude = [
102102
".venv",
103103
".nox",
104104
]
105+
106+
reportImplicitOverride = true
107+
105108
reportImportCycles = false
106109
reportPrivateUsage = false
107110

src/finch/_base_client.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
overload,
3030
)
3131
from functools import lru_cache
32-
from typing_extensions import Literal, get_args, get_origin
32+
from typing_extensions import Literal, get_args, override, get_origin
3333

3434
import anyio
3535
import httpx
@@ -1588,6 +1588,7 @@ class OtherPlatform:
15881588
def __init__(self, name: str) -> None:
15891589
self.name = name
15901590

1591+
@override
15911592
def __str__(self) -> str:
15921593
return f"Other:{self.name}"
15931594

@@ -1649,6 +1650,7 @@ class OtherArch:
16491650
def __init__(self, name: str) -> None:
16501651
self.name = name
16511652

1653+
@override
16521654
def __str__(self) -> str:
16531655
return f"other:{self.name}"
16541656

src/finch/_client.py

+11
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import os
66
import asyncio
77
from typing import Union, Mapping
8+
from typing_extensions import override
89

910
import httpx
1011

@@ -134,24 +135,28 @@ def __init__(
134135
self.request_forwarding = resources.RequestForwarding(self)
135136

136137
@property
138+
@override
137139
def qs(self) -> Querystring:
138140
return Querystring(array_format="comma")
139141

140142
@property
143+
@override
141144
def auth_headers(self) -> dict[str, str]:
142145
access_token = self.access_token
143146
if access_token is None:
144147
return {}
145148
return {"Authorization": f"Bearer {access_token}"}
146149

147150
@property
151+
@override
148152
def default_headers(self) -> dict[str, str | Omit]:
149153
return {
150154
**super().default_headers,
151155
"Finch-API-Version": "2020-09-17",
152156
**self._custom_headers,
153157
}
154158

159+
@override
155160
def _validate_headers(self, headers: Headers, custom_headers: Headers) -> None:
156161
if self.access_token and headers.get("Authorization"):
157162
return
@@ -308,6 +313,7 @@ def get_auth_url(
308313
)
309314
)
310315

316+
@override
311317
def _make_status_error(
312318
self,
313319
err_msg: str,
@@ -429,24 +435,28 @@ def __init__(
429435
self.request_forwarding = resources.AsyncRequestForwarding(self)
430436

431437
@property
438+
@override
432439
def qs(self) -> Querystring:
433440
return Querystring(array_format="comma")
434441

435442
@property
443+
@override
436444
def auth_headers(self) -> dict[str, str]:
437445
access_token = self.access_token
438446
if access_token is None:
439447
return {}
440448
return {"Authorization": f"Bearer {access_token}"}
441449

442450
@property
451+
@override
443452
def default_headers(self) -> dict[str, str | Omit]:
444453
return {
445454
**super().default_headers,
446455
"Finch-API-Version": "2020-09-17",
447456
**self._custom_headers,
448457
}
449458

459+
@override
450460
def _validate_headers(self, headers: Headers, custom_headers: Headers) -> None:
451461
if self.access_token and headers.get("Authorization"):
452462
return
@@ -606,6 +616,7 @@ def get_auth_url(
606616
)
607617
)
608618

619+
@override
609620
def _make_status_error(
610621
self,
611622
err_msg: str,

src/finch/_models.py

+6
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
Required,
1212
TypedDict,
1313
final,
14+
override,
1415
runtime_checkable,
1516
)
1617

@@ -59,20 +60,23 @@ class BaseModel(pydantic.BaseModel):
5960
else:
6061

6162
@property
63+
@override
6264
def model_fields_set(self) -> set[str]:
6365
# a forwards-compat shim for pydantic v2
6466
return self.__fields_set__ # type: ignore
6567

6668
class Config(pydantic.BaseConfig): # pyright: ignore[reportDeprecated]
6769
extra: Any = pydantic.Extra.allow # type: ignore
6870

71+
@override
6972
def __str__(self) -> str:
7073
# mypy complains about an invalid self arg
7174
return f'{self.__repr_name__()}({self.__repr_str__(", ")})' # type: ignore[misc]
7275

7376
# Override the 'construct' method in a way that supports recursive parsing without validation.
7477
# Based on https://github.com/samuelcolvin/pydantic/issues/1168#issuecomment-817742836.
7578
@classmethod
79+
@override
7680
def construct(
7781
cls: Type[ModelT],
7882
_fields_set: set[str] | None = None,
@@ -139,6 +143,7 @@ def construct(
139143
# a specifc pydantic version as some users may not know which
140144
# pydantic version they are currently using
141145

146+
@override
142147
def model_dump(
143148
self,
144149
*,
@@ -187,6 +192,7 @@ def model_dump(
187192
exclude_none=exclude_none,
188193
)
189194

195+
@override
190196
def model_dump_json(
191197
self,
192198
*,

src/finch/_streaming.py

+2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
import json
55
from typing import TYPE_CHECKING, Any, Generic, Iterator, AsyncIterator
6+
from typing_extensions import override
67

78
import httpx
89

@@ -123,6 +124,7 @@ def data(self) -> str:
123124
def json(self) -> Any:
124125
return json.loads(self.data)
125126

127+
@override
126128
def __repr__(self) -> str:
127129
return f"ServerSentEvent(event={self.event}, data={self.data}, id={self.id}, retry={self.retry})"
128130

src/finch/_types.py

+9-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,14 @@
1515
Optional,
1616
Sequence,
1717
)
18-
from typing_extensions import Literal, Protocol, TypeAlias, TypedDict, runtime_checkable
18+
from typing_extensions import (
19+
Literal,
20+
Protocol,
21+
TypeAlias,
22+
TypedDict,
23+
override,
24+
runtime_checkable,
25+
)
1926

2027
import httpx
2128
import pydantic
@@ -119,6 +126,7 @@ def get(timeout: Union[int, NotGiven, None] = NotGiven()) -> Response: ...
119126
def __bool__(self) -> Literal[False]:
120127
return False
121128

129+
@override
122130
def __repr__(self) -> str:
123131
return "NOT_GIVEN"
124132

src/finch/_utils/_proxy.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
from abc import ABC, abstractmethod
44
from typing import Generic, TypeVar, Iterable, cast
5-
from typing_extensions import ClassVar
5+
from typing_extensions import ClassVar, override
66

77
T = TypeVar("T")
88

@@ -21,16 +21,20 @@ def __init__(self) -> None:
2121
def __getattr__(self, attr: str) -> object:
2222
return getattr(self.__get_proxied__(), attr)
2323

24+
@override
2425
def __repr__(self) -> str:
2526
return repr(self.__get_proxied__())
2627

28+
@override
2729
def __str__(self) -> str:
2830
return str(self.__get_proxied__())
2931

32+
@override
3033
def __dir__(self) -> Iterable[str]:
3134
return self.__get_proxied__().__dir__()
3235

3336
@property # type: ignore
37+
@override
3438
def __class__(self) -> type:
3539
return self.__get_proxied__().__class__
3640

src/finch/_utils/_transform.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
from typing import Any, List, Mapping, TypeVar, cast
44
from datetime import date, datetime
5-
from typing_extensions import Literal, get_args, get_type_hints
5+
from typing_extensions import Literal, get_args, override, get_type_hints
66

77
from ._utils import (
88
is_list,
@@ -52,6 +52,7 @@ def __init__(
5252
self.format = format
5353
self.format_template = format_template
5454

55+
@override
5556
def __repr__(self) -> str:
5657
return f"{self.__class__.__name__}(alias='{self.alias}', format={self.format}, format_template='{self.format_template}')"
5758

src/finch/pagination.py

+13
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# File generated from our OpenAPI spec by Stainless.
22

33
from typing import Any, List, Type, Generic, Mapping, TypeVar, Optional, cast
4+
from typing_extensions import override
45

56
from httpx import Response
67

@@ -25,9 +26,11 @@
2526
class SyncSinglePage(BaseSyncPage[ModelT], BasePage[ModelT], Generic[ModelT]):
2627
items: List[ModelT]
2728

29+
@override
2830
def _get_page_items(self) -> List[ModelT]:
2931
return self.items
3032

33+
@override
3134
def next_page_info(self) -> None:
3235
"""
3336
This page represents a response that isn't actually paginated at the API level
@@ -47,9 +50,11 @@ def build(cls: Type[_BaseModelT], *, response: Response, data: object) -> _BaseM
4750
class AsyncSinglePage(BaseAsyncPage[ModelT], BasePage[ModelT], Generic[ModelT]):
4851
items: List[ModelT]
4952

53+
@override
5054
def _get_page_items(self) -> List[ModelT]:
5155
return self.items
5256

57+
@override
5358
def next_page_info(self) -> None:
5459
"""
5560
This page represents a response that isn't actually paginated at the API level
@@ -69,9 +74,11 @@ def build(cls: Type[_BaseModelT], *, response: Response, data: object) -> _BaseM
6974
class SyncResponsesPage(BaseSyncPage[ModelT], BasePage[ModelT], Generic[ModelT]):
7075
responses: List[ModelT]
7176

77+
@override
7278
def _get_page_items(self) -> List[ModelT]:
7379
return self.responses
7480

81+
@override
7582
def next_page_info(self) -> None:
7683
"""
7784
This page represents a response that isn't actually paginated at the API level
@@ -83,9 +90,11 @@ def next_page_info(self) -> None:
8390
class AsyncResponsesPage(BaseAsyncPage[ModelT], BasePage[ModelT], Generic[ModelT]):
8491
responses: List[ModelT]
8592

93+
@override
8694
def _get_page_items(self) -> List[ModelT]:
8795
return self.responses
8896

97+
@override
8998
def next_page_info(self) -> None:
9099
"""
91100
This page represents a response that isn't actually paginated at the API level
@@ -102,9 +111,11 @@ class SyncIndividualsPage(BaseSyncPage[ModelT], BasePage[ModelT], Generic[ModelT
102111
individuals: List[ModelT]
103112
paging: Paging
104113

114+
@override
105115
def _get_page_items(self) -> List[ModelT]:
106116
return self.individuals
107117

118+
@override
108119
def next_page_info(self) -> Optional[PageInfo]:
109120
offset = self.paging.offset
110121
if offset is None:
@@ -127,9 +138,11 @@ class AsyncIndividualsPage(BaseAsyncPage[ModelT], BasePage[ModelT], Generic[Mode
127138
individuals: List[ModelT]
128139
paging: Paging
129140

141+
@override
130142
def _get_page_items(self) -> List[ModelT]:
131143
return self.individuals
132144

145+
@override
133146
def next_page_info(self) -> Optional[PageInfo]:
134147
offset = self.paging.offset
135148
if offset is None:

0 commit comments

Comments
 (0)