Marco Ricci commited on 2025-01-21 21:02:31
Zeige 1 geänderte Dateien mit 21 Einfügungen und 2 Löschungen.
The `warnings.deprecated` decorator sadly does not do anything at runtime if merely one of several overloads is deprecated. And it seems to fail even if the deprecated signature is actively used; see `_types.is_vault_config`. Implement a known working solution to check if the deprecated keyword argument was supplied. (No tests yet, so excluded from coverage.)
... | ... |
@@ -11,6 +11,7 @@ import enum |
11 | 11 |
import json |
12 | 12 |
import math |
13 | 13 |
import string |
14 |
+import warnings |
|
14 | 15 |
from typing import TYPE_CHECKING, Generic, TypeVar |
15 | 16 |
|
16 | 17 |
from typing_extensions import ( |
... | ... |
@@ -19,6 +20,7 @@ from typing_extensions import ( |
19 | 20 |
NotRequired, |
20 | 21 |
TypedDict, |
21 | 22 |
deprecated, |
23 |
+ get_overloads, |
|
22 | 24 |
overload, |
23 | 25 |
) |
24 | 26 |
|
... | ... |
@@ -41,6 +43,14 @@ __all__ = ( |
41 | 43 |
) |
42 | 44 |
|
43 | 45 |
|
46 |
+class _Omitted: # pragma: no cover |
|
47 |
+ def __bool__(self) -> bool: |
|
48 |
+ return False |
|
49 |
+ |
|
50 |
+ def __repr__(self) -> str: |
|
51 |
+ return '...' |
|
52 |
+ |
|
53 |
+ |
|
44 | 54 |
class VaultConfigGlobalSettings(TypedDict, total=False): |
45 | 55 |
r"""Configuration for vault: global settings. |
46 | 56 |
|
... | ... |
@@ -244,7 +254,7 @@ def validate_vault_config( # noqa: C901,PLR0912 |
244 | 254 |
/, |
245 | 255 |
*, |
246 | 256 |
allow_unknown_settings: bool = False, |
247 |
- allow_derivepassphrase_extensions: bool = False, |
|
257 |
+ allow_derivepassphrase_extensions: bool = _Omitted(), # type: ignore[assignment] |
|
248 | 258 |
) -> None: |
249 | 259 |
"""Check that `obj` is a valid vault config. |
250 | 260 |
|
... | ... |
@@ -271,6 +281,16 @@ def validate_vault_config( # noqa: C901,PLR0912 |
271 | 281 |
specified `derivepassphrase` extensions. |
272 | 282 |
|
273 | 283 |
""" |
284 |
+ # TODO(the-13th-letter): Add tests that trigger the deprecation warning, |
|
285 |
+ # then include this in coverage. |
|
286 |
+ if not isinstance( |
|
287 |
+ allow_derivepassphrase_extensions, _Omitted |
|
288 |
+ ): # pragma: no cover |
|
289 |
+ warnings.warn( |
|
290 |
+ get_overloads(validate_vault_config)[0].__deprecated__, # type: ignore[attr-defined] |
|
291 |
+ DeprecationWarning, |
|
292 |
+ stacklevel=2, |
|
293 |
+ ) |
|
274 | 294 |
err_obj_not_a_dict = 'vault config is not a dict' |
275 | 295 |
err_non_str_service_name = ( |
276 | 296 |
'vault config contains non-string service name {!r}' |
... | ... |
@@ -377,7 +397,6 @@ def is_vault_config(obj: Any) -> TypeIs[VaultConfig]: # noqa: ANN401 |
377 | 397 |
validate_vault_config( |
378 | 398 |
obj, |
379 | 399 |
allow_unknown_settings=True, |
380 |
- allow_derivepassphrase_extensions=True, |
|
381 | 400 |
) |
382 | 401 |
except (TypeError, ValueError) as exc: |
383 | 402 |
if 'vault config ' not in str(exc): # pragma: no cover |
384 | 403 |