Marco Ricci commited on 2025-01-07 22:44:39
Zeige 6 geänderte Dateien mit 18 Einfügungen und 16 Löschungen.
The remaining re-linting changes pertain to new linting codes: * TC006/runtime-cast-value (formerly TCH006) suggests that cast calls use stringified type declarations. Implemented. * B033/duplicate-value requires sets not to contain duplicate values. This is used in the `_types.js_truthiness` function to both test against and to document all of the falsy values except NaN. Ignored. * RUF043/pytest-raises-ambiguous-pattern requires patterns in the `match` argument of `pytest.raises` to be either raw strings, or passed through `re.escape`. Implemented. * RUF046/unnecessary-cast-to-int forbids explicitly casting the result of `math.ceil` to int. I believe `mypy`/`typeshed` originally had problems with this, but this no longer appears to be the case. Implemented.
... | ... |
@@ -163,7 +163,7 @@ class TranslatedString: |
163 | 163 |
if isinstance( |
164 | 164 |
template, (Label, InfoMsgTemplate, WarnMsgTemplate, ErrMsgTemplate) |
165 | 165 |
): |
166 |
- template = cast(TranslatableString, template.value) |
|
166 |
+ template = cast('TranslatableString', template.value) |
|
167 | 167 |
self.template = template |
168 | 168 |
self.kwargs = {**args_dict, **kwargs} |
169 | 169 |
self._rendered: str | None = None |
... | ... |
@@ -10,6 +10,7 @@ import collections |
10 | 10 |
import enum |
11 | 11 |
import json |
12 | 12 |
import math |
13 |
+import string |
|
13 | 14 |
from typing import TYPE_CHECKING |
14 | 15 |
|
15 | 16 |
from typing_extensions import ( |
... | ... |
@@ -195,11 +196,11 @@ def json_path(path: Sequence[str | int], /) -> str: |
195 | 196 |
|
196 | 197 |
def needs_longhand(x: str | int) -> bool: |
197 | 198 |
initial = ( |
198 |
- frozenset('abcdefghijklmnopqrstuvwxyz') |
|
199 |
- | frozenset('ABCDEFGHIJKLMNOPQRSTUVWXYZ') |
|
199 |
+ frozenset(string.ascii_lowercase) |
|
200 |
+ | frozenset(string.ascii_uppercase) |
|
200 | 201 |
| frozenset('_') |
201 | 202 |
) |
202 |
- chars = initial | frozenset('0123456789') |
|
203 |
+ chars = initial | frozenset(string.digits) |
|
203 | 204 |
return not ( |
204 | 205 |
isinstance(x, str) |
205 | 206 |
and x |
... | ... |
@@ -413,7 +414,7 @@ def js_truthiness(value: Any, /) -> bool: # noqa: ANN401 |
413 | 414 |
|
414 | 415 |
""" # noqa: RUF002 |
415 | 416 |
try: |
416 |
- if value in {None, False, 0, 0.0, ''}: |
|
417 |
+ if value in {None, False, 0, 0.0, ''}: # noqa: B033 |
|
417 | 418 |
return False |
418 | 419 |
except TypeError: |
419 | 420 |
# All falsy values are hashable, so this can't be falsy. |
... | ... |
@@ -2041,7 +2041,7 @@ def _prompt_for_passphrase() -> str: |
2041 | 2041 |
|
2042 | 2042 |
""" |
2043 | 2043 |
return cast( |
2044 |
- str, |
|
2044 |
+ 'str', |
|
2045 | 2045 |
click.prompt( |
2046 | 2046 |
'Passphrase', |
2047 | 2047 |
default='', |
... | ... |
@@ -3042,7 +3042,7 @@ def derivepassphrase_vault( # noqa: C901,PLR0912,PLR0913,PLR0914,PLR0915 |
3042 | 3042 |
assert service is not None |
3043 | 3043 |
configuration = get_config() |
3044 | 3044 |
text = DEFAULT_NOTES_TEMPLATE + configuration['services'].get( |
3045 |
- service, cast(_types.VaultConfigServicesSettings, {}) |
|
3045 |
+ service, cast('_types.VaultConfigServicesSettings', {}) |
|
3046 | 3046 |
).get('notes', '') |
3047 | 3047 |
notes_value = click.edit(text=text) |
3048 | 3048 |
if notes_value is not None: |
... | ... |
@@ -3081,7 +3081,7 @@ def derivepassphrase_vault( # noqa: C901,PLR0912,PLR0913,PLR0914,PLR0915 |
3081 | 3081 |
# TODO(the-13th-letter): keep track of auto-close; try |
3082 | 3082 |
# os.dup if feasible |
3083 | 3083 |
infile = cast( |
3084 |
- TextIO, |
|
3084 |
+ 'TextIO', |
|
3085 | 3085 |
( |
3086 | 3086 |
import_settings |
3087 | 3087 |
if hasattr(import_settings, 'close') |
... | ... |
@@ -3167,14 +3167,14 @@ def derivepassphrase_vault( # noqa: C901,PLR0912,PLR0913,PLR0914,PLR0915 |
3167 | 3167 |
try: |
3168 | 3168 |
_check_for_misleading_passphrase( |
3169 | 3169 |
('global',), |
3170 |
- cast(dict[str, Any], maybe_config.get('global', {})), |
|
3170 |
+ cast('dict[str, Any]', maybe_config.get('global', {})), |
|
3171 | 3171 |
main_config=user_config, |
3172 | 3172 |
ctx=ctx, |
3173 | 3173 |
) |
3174 | 3174 |
for key, value in maybe_config['services'].items(): |
3175 | 3175 |
_check_for_misleading_passphrase( |
3176 | 3176 |
('services', key), |
3177 |
- cast(dict[str, Any], value), |
|
3177 |
+ cast('dict[str, Any]', value), |
|
3178 | 3178 |
main_config=user_config, |
3179 | 3179 |
ctx=ctx, |
3180 | 3180 |
) |
... | ... |
@@ -3243,7 +3243,7 @@ def derivepassphrase_vault( # noqa: C901,PLR0912,PLR0913,PLR0914,PLR0915 |
3243 | 3243 |
# TODO(the-13th-letter): keep track of auto-close; try |
3244 | 3244 |
# os.dup if feasible |
3245 | 3245 |
outfile = cast( |
3246 |
- TextIO, |
|
3246 |
+ 'TextIO', |
|
3247 | 3247 |
( |
3248 | 3248 |
export_settings |
3249 | 3249 |
if hasattr(export_settings, 'close') |
... | ... |
@@ -3308,10 +3308,10 @@ def derivepassphrase_vault( # noqa: C901,PLR0912,PLR0913,PLR0914,PLR0915 |
3308 | 3308 |
if k in service_keys and v is not None |
3309 | 3309 |
}, |
3310 | 3310 |
cast( |
3311 |
- dict[str, Any], |
|
3311 |
+ 'dict[str, Any]', |
|
3312 | 3312 |
configuration['services'].get(service, {}) if service else {}, |
3313 | 3313 |
), |
3314 |
- cast(dict[str, Any], configuration.get('global', {})), |
|
3314 |
+ cast('dict[str, Any]', configuration.get('global', {})), |
|
3315 | 3315 |
) |
3316 | 3316 |
if not store_config_only and not service: |
3317 | 3317 |
err_msg = _msg.TranslatedString( |
... | ... |
@@ -253,7 +253,7 @@ class Vault: |
253 | 253 |
raise ValueError(msg) |
254 | 254 |
# Ensure the bound is strictly positive. |
255 | 255 |
entropy_bound = max(1, self._entropy()) |
256 |
- return int(math.ceil(safety_factor * entropy_bound / 8)) |
|
256 |
+ return math.ceil(safety_factor * entropy_bound / 8) |
|
257 | 257 |
|
258 | 258 |
@staticmethod |
259 | 259 |
def _get_binary_string(s: bytes | bytearray | str, /) -> bytes: |
... | ... |
@@ -97,7 +97,7 @@ class Test001ExporterUtils: |
97 | 97 |
) -> None: |
98 | 98 |
monkeypatch.setattr(os.path, 'expanduser', lambda x: x) |
99 | 99 |
with pytest.raises( |
100 |
- RuntimeError, match='[Cc]annot determine home directory' |
|
100 |
+ RuntimeError, match=r'[Cc]annot determine home directory' |
|
101 | 101 |
): |
102 | 102 |
exporter.get_vault_path() |
103 | 103 |
|
... | ... |
@@ -659,7 +659,8 @@ class TestAgentInteraction: |
659 | 659 |
client = stack.enter_context(ssh_agent.SSHAgentClient()) |
660 | 660 |
monkeypatch2.setattr(client, 'request', request) |
661 | 661 |
with pytest.raises( |
662 |
- RuntimeError, match='Malformed response|does not match request' |
|
662 |
+ RuntimeError, |
|
663 |
+ match=r'Malformed response|does not match request', |
|
663 | 664 |
): |
664 | 665 |
client.query_extensions() |
665 | 666 |
|
666 | 667 |