Skip to content

Commit 8bf7cdc

Browse files
committed
Fixed format issues
1 parent 1acde6c commit 8bf7cdc

File tree

8 files changed

+42
-37
lines changed

8 files changed

+42
-37
lines changed

backend/app/api/routes/users.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,12 @@
3333

3434
@router.get(
3535
"/",
36-
dependencies=[Depends(RateLimiter(limit=10, window_seconds=60, key_policy=KeyStrategyName.IP)),
37-
Depends(get_current_active_superuser)],
36+
dependencies=[
37+
Depends(
38+
RateLimiter(limit=10, window_seconds=60, key_policy=KeyStrategyName.IP)
39+
),
40+
Depends(get_current_active_superuser),
41+
],
3842
response_model=UsersPublic,
3943
)
4044
def read_users(session: SessionDep, skip: int = 0, limit: int = 100) -> Any:

backend/app/core/config.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,7 @@ class Settings(BaseSettings):
4343

4444
# Correct Redis default inside Docker Compose
4545
REDIS_URL: str = ""
46-
RATE_LIMITER_STRATEGY: Literal[
47-
"none", "sliding_window"
48-
] = "none"
46+
RATE_LIMITER_STRATEGY: Literal["none", "sliding_window"] = "none"
4947
RATE_LIMIT_FAIL_OPEN: bool = True
5048

5149
@computed_field # type: ignore[prop-decorator]

backend/app/core/rate_limiter/key_strategy/key_strategy_registry.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44
from app.core.rate_limiter.key_strategy.key_strategy_enum import KeyStrategyName
55

66

7-
def get_key_strategy(name: KeyStrategyName, header_name: str | None = None) -> KeyStrategy:
7+
def get_key_strategy(
8+
name: KeyStrategyName, header_name: str | None = None
9+
) -> KeyStrategy:
810
if name == KeyStrategyName.IP:
911
return IPKeyStrategy()
1012

backend/app/core/rate_limiter/rate_limiter.py

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,14 @@
77

88
logger = logging.getLogger(__name__)
99

10+
1011
class RateLimiter:
11-
def __init__(self, limit: int, window_seconds: int, key_policy: KeyStrategyName = KeyStrategyName.IP):
12+
def __init__(
13+
self,
14+
limit: int,
15+
window_seconds: int,
16+
key_policy: KeyStrategyName = KeyStrategyName.IP,
17+
):
1218
self.limit = limit
1319
self.window_seconds = window_seconds
1420
self.key_policy = key_policy
@@ -28,19 +34,19 @@ async def __call__(self, request: Request) -> None:
2834
retry_after = None
2935
try:
3036
allowed, retry_after = await rate_limiter.allow_request(
31-
key, self.limit, self.window_seconds
32-
)
37+
key, self.limit, self.window_seconds
38+
)
3339
except Exception:
34-
logger.exception("Error invoking rate limiter")
35-
if rate_limiter.get_fail_open():
36-
raise HTTPException(
37-
status_code=503,
38-
detail={"detail": "Rate limiter unavailable"},
39-
)
40+
logger.exception("Error invoking rate limiter")
41+
if rate_limiter.get_fail_open():
42+
raise HTTPException(
43+
status_code=503,
44+
detail={"detail": "Rate limiter unavailable"},
45+
)
4046

4147
if not allowed:
4248
raise HTTPException(
4349
status_code=429,
4450
detail=f"Too Many Requests. Retry after {retry_after}s",
45-
headers={"Retry-After": str(retry_after)}
51+
headers={"Retry-After": str(retry_after)},
4652
)

backend/app/core/rate_limiter/rate_limiting_algorithm/base.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ class BaseRateLimiter(ABC):
77
"""Interface for pluggable rate limiter strategies."""
88

99
@abstractmethod
10-
async def allow_request(self, key: str, limit: int, window_seconds: int, member_id: str | None = None) -> tuple[bool, int | None]:
10+
async def allow_request(
11+
self, key: str, limit: int, window_seconds: int, member_id: str | None = None
12+
) -> tuple[bool, int | None]:
1113
"""
1214
Return (allowed: bool, retry_after_seconds: Optional[int]).
1315
If allowed True -> retry_after_seconds is None.

backend/app/core/rate_limiter/rate_limiting_algorithm/registry.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
import redis.asyncio as redis
32

43
from app.core.rate_limiter.rate_limiting_algorithm.base import BaseRateLimiter
@@ -7,7 +6,9 @@
76
)
87

98

10-
def get_rate_limiter(strategy: str | None, redis_url: str | None, fail_open: bool | None) -> BaseRateLimiter | None:
9+
def get_rate_limiter(
10+
strategy: str | None, redis_url: str | None, fail_open: bool | None
11+
) -> BaseRateLimiter | None:
1112
"""
1213
Factory: returns an instance of BaseRateLimiter or None (if disabled).
1314
"""
@@ -17,7 +18,7 @@ def get_rate_limiter(strategy: str | None, redis_url: str | None, fail_open: boo
1718
if not redis_url:
1819
return None
1920

20-
rc: redis.Redis = redis.from_url(redis_url, encoding="utf-8", decode_responses=True) # type: ignore[no-untyped-call]
21+
rc: redis.Redis = redis.from_url(redis_url, encoding="utf-8", decode_responses=True) # type: ignore[no-untyped-call]
2122
st = strategy.lower()
2223
if st == "sliding_window" or st == "sliding-window":
2324
return SlidingWindowRateLimiter(rc, fail_open or False)

backend/app/core/rate_limiter/rate_limiting_algorithm/sliding_window.py

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,7 @@
99
logger = logging.getLogger(__name__)
1010

1111
SCRIPT_PATH = (
12-
Path(__file__).resolve()
13-
.parents[3]
12+
Path(__file__).resolve().parents[3]
1413
/ "alembic"
1514
/ "rate_limiting_algorithms"
1615
/ "sliding_window.lua"
@@ -31,13 +30,8 @@ async def load_script(self) -> str | None:
3130
return self.lua_script
3231

3332
async def allow_request(
34-
self,
35-
key: str,
36-
limit: int,
37-
window_seconds: int,
38-
member_id: str | None = None
33+
self, key: str, limit: int, window_seconds: int, member_id: str | None = None
3934
) -> tuple[bool, int | None]:
40-
4135
now_ms = int(time.time() * 1000)
4236
window_ms = window_seconds * 1000
4337
member = member_id or f"{now_ms}"
@@ -46,14 +40,8 @@ async def allow_request(
4640
sha = await self.load_script()
4741
if sha is None:
4842
raise Exception
49-
res = await self.redis.evalsha(# type: ignore[misc]
50-
sha,
51-
1,
52-
key,
53-
now_ms,
54-
window_ms,
55-
limit,
56-
member
43+
res = await self.redis.evalsha( # type: ignore[misc]
44+
sha, 1, key, now_ms, window_ms, limit, member
5745
)
5846
except Exception:
5947
logger.exception("Redis error; failing open")

backend/app/main.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,11 @@ def custom_generate_unique_id(route: APIRoute) -> str:
3333

3434
# Set rate Limiting
3535
if settings.rate_limit_enabled:
36-
rate_limiter = get_rate_limiter(settings.RATE_LIMITER_STRATEGY, settings.REDIS_URL, settings.RATE_LIMIT_FAIL_OPEN)
36+
rate_limiter = get_rate_limiter(
37+
settings.RATE_LIMITER_STRATEGY,
38+
settings.REDIS_URL,
39+
settings.RATE_LIMIT_FAIL_OPEN,
40+
)
3741
app.state.rate_limiter = rate_limiter
3842

3943
app.include_router(api_router, prefix=settings.API_V1_STR)

0 commit comments

Comments
 (0)