diff options
| author | Christophe Besson <cbesson@gmail.com> | 2026-09-19 14:24:13 +0200 |
|---|---|---|
| committer | Christophe Besson <cbesson@gmail.com> | 2026-09-19 14:24:13 +0200 |
| commit | 86188385cbdae1ee90c1dca7a7b9db2edef1ecd4 (patch) | |
| tree | cc01153f05e84ad6cd34556caecd3f4bc335d0bd /packages/meshbay-hub/src/meshbay_hub/login_throttle.py | |
| parent | d2495a2c4b89fbbfc18cefec83ae96cabdd745e2 (diff) | |
| download | meshbay-86188385cbdae1ee90c1dca7a7b9db2edef1ecd4.tar.gz | |
style: ruff's own fixes, mechanically applied
`ruff check .` had gone unrun long enough to report 568 errors, which is the
same as having no linter: the next real finding would have been invisible in the
noise. This is the 521 it fixes by itself, in 173 files, and nothing else — the
98 it cannot fix are the next commit.
What actually changed: import sorting (225), imports nobody used (87, none of
them a re-export — no `__init__.py` is touched, which was the one way this could
have broken an import elsewhere), `datetime.timezone.utc` to `datetime.UTC` (69)
and `asyncio.TimeoutError` to `TimeoutError` (18), both plain aliases on the 3.12
this project requires, `Optional[X]` to `X | None` (24), and f-strings with
nothing to interpolate (19).
Checked rather than assumed: every module in the three packages still imports,
and the suite is 2893 passed — the same count, test for test, as the merge
before it.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Diffstat (limited to 'packages/meshbay-hub/src/meshbay_hub/login_throttle.py')
| -rw-r--r-- | packages/meshbay-hub/src/meshbay_hub/login_throttle.py | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/packages/meshbay-hub/src/meshbay_hub/login_throttle.py b/packages/meshbay-hub/src/meshbay_hub/login_throttle.py index 3281088..bfd142e 100644 --- a/packages/meshbay-hub/src/meshbay_hub/login_throttle.py +++ b/packages/meshbay-hub/src/meshbay_hub/login_throttle.py @@ -24,7 +24,7 @@ locks somebody else's name from signing them out (§13.5b, AV26). """ import hashlib -from datetime import datetime, timedelta, timezone +from datetime import UTC, datetime, timedelta from sqlalchemy import case, delete, select, update from sqlalchemy.ext.asyncio import AsyncSession @@ -39,7 +39,7 @@ def _key(username: str) -> str: def _aware(dt: datetime) -> datetime: # SQLite hands back naive datetimes for a timezone-aware column. - return dt if dt.tzinfo is not None else dt.replace(tzinfo=timezone.utc) + return dt if dt.tzinfo is not None else dt.replace(tzinfo=UTC) def _insert_for(db: AsyncSession): @@ -64,7 +64,7 @@ async def reserve(db: AsyncSession, username: str) -> tuple[bool, int]: if max_failures == 0: return True, 0 - now = datetime.now(timezone.utc) + now = datetime.now(UTC) window = timedelta(minutes=limits["lockout_minutes"]) window_start = now - window key = _key(username) @@ -102,7 +102,7 @@ async def locked_for(db: AsyncSession, username: str) -> int: return 0 remaining = (_aware(row.last_failure_at) + timedelta(minutes=limits["lockout_minutes"]) - - datetime.now(timezone.utc)).total_seconds() + - datetime.now(UTC)).total_seconds() return max(0, int(remaining + 0.999)) @@ -136,7 +136,7 @@ async def clear(db: AsyncSession, username: str) -> None: async def purge_expired(db: AsyncSession) -> int: """Rows whose failures have aged out. Every unknown name typed creates one.""" limits = await hub_settings.login_limits(db) - cutoff = datetime.now(timezone.utc) - timedelta(minutes=limits["lockout_minutes"]) + cutoff = datetime.now(UTC) - timedelta(minutes=limits["lockout_minutes"]) result = await db.execute( delete(LoginThrottle).where(LoginThrottle.last_failure_at < cutoff)) await db.commit() |