Skip to content

Commit 9e80746

Browse files
chore(deps): bump dev/runtime deps and refresh lockfile
Update test container images and bump requests/fastapi/grpc/etc; tighten typing in Keycloak userinfo caching and sqlalchemy_atomic overloads.
1 parent 86fe0ac commit 9e80746

5 files changed

Lines changed: 251 additions & 245 deletions

File tree

.env.test

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,21 +32,21 @@ PROMETHEUS__IS_ENABLED=true
3232
PROMETHEUS__SERVER_PORT=8200
3333

3434
# Redis Configuration
35-
REDIS__IMAGE=redis:8.6.1-alpine
35+
REDIS__IMAGE=redis:8.6.2-alpine
3636
REDIS__MASTER_HOST=localhost:6379
3737
REDIS__DATABASE=0
3838
REDIS__PASSWORD=test_password
3939

4040
# PostgreSQL Configuration
41-
POSTGRES__IMAGE=postgres:18.2-alpine
41+
POSTGRES__IMAGE=postgres:18.3-alpine
4242
POSTGRES_SQLALCHEMY__HOST=localhost
4343
POSTGRES_SQLALCHEMY__PORT=5432
4444
POSTGRES_SQLALCHEMY__DATABASE=test_db
4545
POSTGRES_SQLALCHEMY__USERNAME=test_user
4646
POSTGRES_SQLALCHEMY__PASSWORD=test_password
4747

4848
# StarRocks Configuration
49-
STARROCKS__IMAGE=starrocks/allin1-ubuntu:4.0.6
49+
STARROCKS__IMAGE=starrocks/allin1-ubuntu:4.0.8
5050
STARROCKS_SQLALCHEMY__DRIVER_NAME=starrocks
5151
STARROCKS_SQLALCHEMY__HOST=localhost
5252
STARROCKS_SQLALCHEMY__PORT=9030
@@ -55,7 +55,7 @@ STARROCKS_SQLALCHEMY__USERNAME=root
5555
STARROCKS_SQLALCHEMY__PASSWORD=
5656

5757
# Keycloak Configuration
58-
KEYCLOAK__IMAGE=quay.io/keycloak/keycloak:26.5.4
58+
KEYCLOAK__IMAGE=keycloak/keycloak:26.5.7
5959
KEYCLOAK__SERVER_URL=http://localhost:8080
6060
KEYCLOAK__ADMIN_USERNAME=admin
6161
KEYCLOAK__ADMIN_PASSWORD=admin
@@ -67,13 +67,13 @@ KEYCLOAK__VERIFY_SSL=false
6767
KEYCLOAK__TIMEOUT=30
6868

6969
# Elasticsearch Configuration
70-
ELASTIC__IMAGE=elastic/elasticsearch:9.3.0
70+
ELASTIC__IMAGE=elastic/elasticsearch:9.3.3
7171
ELASTIC__HOSTS=["http://localhost:9200"]
7272
ELASTIC__HTTP_USER_NAME=elastic
7373
ELASTIC__HTTP_PASSWORD=test_password
7474

7575
# Kafka Configuration
76-
KAFKA__IMAGE=confluentinc/cp-kafka:8.0.3
76+
KAFKA__IMAGE=confluentinc/cp-kafka:8.2.0
7777
KAFKA__BROKERS_LIST=["localhost:9092"]
7878

7979
# MinIO Configuration
@@ -83,7 +83,7 @@ MINIO__ACCESS_KEY=test_access_key
8383
MINIO__SECRET_KEY=test_secret_key
8484

8585
# ScyllaDB Configuration
86-
SCYLLADB__IMAGE=scylladb/scylla:2025.4
86+
SCYLLADB__IMAGE=scylladb/scylla:2025.4.3
8787
SCYLLADB__CONTACT_POINTS=["localhost"]
8888
SCYLLADB__PORT=9042
8989
SCYLLADB__PROTOCOL_VERSION=4

archipy/adapters/keycloak/adapters.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import json
22
import logging
33
import time
4-
from typing import Any, NoReturn, override
4+
from typing import Any, NoReturn, cast, override
55

66
from async_lru import alru_cache
77
from keycloak import KeycloakAdmin, KeycloakOpenID
@@ -550,7 +550,7 @@ def get_userinfo(self, token: str) -> KeycloakUserType | None:
550550

551551
@ttl_cache_decorator(ttl_seconds=30, maxsize=100) # Cache for 30 seconds
552552
def _get_userinfo_cached(self, token: str) -> KeycloakUserType:
553-
return self._openid_adapter.userinfo(token) # type: ignore[return-value]
553+
return cast("KeycloakUserType", self._openid_adapter.userinfo(token))
554554

555555
@override
556556
@ttl_cache_decorator(ttl_seconds=300, maxsize=100) # Cache for 5 minutes
@@ -1961,7 +1961,7 @@ async def get_userinfo(self, token: str) -> KeycloakUserType | None:
19611961

19621962
@alru_cache(ttl=30, maxsize=100) # Cache for 30 seconds
19631963
async def _get_userinfo_cached(self, token: str) -> KeycloakUserType:
1964-
return await self.openid_adapter.a_userinfo(token) # type: ignore[return-value]
1964+
return cast("KeycloakUserType", await self.openid_adapter.a_userinfo(token))
19651965

19661966
@override
19671967
@alru_cache(ttl=300, maxsize=100) # Cache for 5 minutes

archipy/helpers/decorators/sqlalchemy_atomic.py

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import logging
88
from collections.abc import Awaitable, Callable
99
from functools import partial, wraps
10-
from typing import Any, NoReturn, TypeVar, overload
10+
from typing import Any, Literal, NoReturn, TypeVar, cast, overload
1111

1212
from sqlalchemy.exc import (
1313
IntegrityError,
@@ -120,11 +120,19 @@ def _handle_db_exception(exception: BaseException, db_type: str, func_name: str)
120120
@overload
121121
def sqlalchemy_atomic_decorator[R](
122122
db_type: str,
123-
is_async: bool = False,
123+
is_async: Literal[False] = False,
124124
function: Callable[..., R] = ...,
125125
) -> Callable[..., R]: ...
126126

127127

128+
@overload
129+
def sqlalchemy_atomic_decorator[R](
130+
db_type: str,
131+
is_async: Literal[True],
132+
function: Callable[..., Awaitable[R]] = ...,
133+
) -> Callable[..., Awaitable[R]]: ...
134+
135+
128136
@overload
129137
def sqlalchemy_atomic_decorator(
130138
db_type: str,
@@ -136,8 +144,8 @@ def sqlalchemy_atomic_decorator(
136144
def sqlalchemy_atomic_decorator[R](
137145
db_type: str,
138146
is_async: bool = False,
139-
function: Callable[..., R] | None = None,
140-
) -> Callable[..., R] | partial[Callable[..., Any]]:
147+
function: Callable[..., R] | Callable[..., Awaitable[R]] | None = None,
148+
) -> Callable[..., R] | Callable[..., Awaitable[R]] | partial[Callable[..., Any]]:
141149
"""Factory for creating SQLAlchemy atomic transaction decorators.
142150
143151
This decorator ensures that a function runs within a database transaction for the specified
@@ -257,7 +265,7 @@ async def async_wrapper(*args: Any, **kwargs: Any) -> R:
257265
return async_wrapper
258266

259267
if function is not None:
260-
return async_decorator(function) # type: ignore[arg-type, return-value]
268+
return async_decorator(cast("Callable[..., Awaitable[R]]", function))
261269
return partial(sqlalchemy_atomic_decorator, db_type=db_type, is_async=is_async)
262270

263271
else:
@@ -305,7 +313,7 @@ def sync_wrapper(*args: Any, **kwargs: Any) -> R:
305313
return sync_wrapper
306314

307315
if function is not None:
308-
return sync_decorator(function)
316+
return sync_decorator(cast("Callable[..., R]", function))
309317
return partial(sqlalchemy_atomic_decorator, db_type=db_type, is_async=is_async)
310318

311319

pyproject.toml

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ requires-python = ">=3.14,<4"
1111
dependencies = [
1212
"pydantic>=2.12.5",
1313
"pydantic-settings>=2.13.1",
14-
"requests>=2.33.0",
14+
"requests>=2.33.1",
1515
"jdatetime>=5.2.0",
1616
]
1717
license = { file = "LICENSE" }
@@ -26,21 +26,21 @@ elastic-apm = ["elastic-apm>=6.25.0"]
2626
elasticsearch = ["elasticsearch>=9.3.0"]
2727
elasticsearch-async = ["elasticsearch[async]>=9.3.0"]
2828
fakeredis = ["fakeredis>=2.34.1"]
29-
fastapi = ["fastapi[all]>=0.135.2"]
30-
grpc = ["grpcio>=1.78.0", "grpcio-health-checking>=1.78.0", "protobuf>=6.33.6"]
29+
fastapi = ["fastapi[all]>=0.135.3"]
30+
grpc = ["grpcio>=1.80.0", "grpcio-health-checking>=1.80.0", "protobuf>=6.33.6"]
3131
jwt = ["pyjwt>=2.12.1"]
32-
kafka = ["confluent-kafka>=2.13.2"]
32+
kafka = ["confluent-kafka>=2.14.0"]
3333
keycloak = ["python-keycloak>=7.1.1", "cachetools>=7.0.5", "async-lru>=2.3.0"]
34-
minio = ["boto3>=1.42.78", "cachetools>=7.0.5", "async-lru>=2.3.0"]
35-
parsian-ipg = ["zeep>=4.3.2", "requests[socks]>=2.33.0"]
34+
minio = ["boto3>=1.42.83", "cachetools>=7.0.5", "async-lru>=2.3.0"]
35+
parsian-ipg = ["zeep>=4.3.2", "requests[socks]>=2.33.1"]
3636
postgres = ["psycopg[binary,pool]>=3.3.3"]
3737
prometheus = ["prometheus-client>=0.24.1"]
3838
redis = ["redis[hiredis]>=7.4.0"]
3939
scheduler = ["apscheduler>=3.11.2"]
4040
scylladb = ["scylla-driver>=3.29.9", "lz4>=4.4.5", "cachetools>=7.0.5", "async-lru>=2.3.0"]
41-
sentry = ["sentry-sdk>=2.56.0"]
42-
sqlalchemy = ["sqlalchemy>=2.0.48"]
43-
sqlalchemy-async = ["sqlalchemy[asyncio]>=2.0.48"]
41+
sentry = ["sentry-sdk>=2.57.0"]
42+
sqlalchemy = ["sqlalchemy>=2.0.49"]
43+
sqlalchemy-async = ["sqlalchemy[asyncio]>=2.0.49"]
4444
starrocks = ["starrocks>=1.3.3", "pymysql>=1.1.2"]
4545
starrocks-async = ["starrocks>=1.3.3", "aiomysql>=0.3.2", "asyncmy>=0.2.11"]
4646
temporalio = ["temporalio>=1.24.0"]
@@ -67,16 +67,16 @@ dev = [
6767
"add-trailing-comma>=4.0.0",
6868
"bandit>=1.9.4",
6969
"codespell>=2.4.2",
70-
"ty>=0.0.26",
70+
"ty>=0.0.29",
7171
"pre-commit-hooks>=6.0.0",
7272
"pre-commit>=4.5.1",
73-
"ruff>=0.15.8",
73+
"ruff>=0.15.9",
7474
"types-cachetools>=6.2.0.20260317",
7575
"types-grpcio>=1.0.0.20251009",
76-
"types-protobuf>=6.32.1.20260221",
76+
"types-protobuf>=7.34.1.20260403",
7777
"types-pymysql>=1.1.0.20251220",
78-
"types-regex>=2026.2.28.20260301",
79-
"types-requests>=2.33.0.20260327",
78+
"types-regex>=2026.4.4.20260405",
79+
"types-requests>=2.33.0.20260402",
8080
"validate-pyproject>=0.25",
8181
]
8282

@@ -86,7 +86,7 @@ docs = [
8686
"mkdocs>=1.6.1",
8787
"mkdocstrings-python>=2.0.3",
8888
"mkdocstrings>=1.0.3",
89-
"pymdown-extensions>=10.21",
89+
"pymdown-extensions>=10.21.2",
9090
]
9191

9292

@@ -313,7 +313,6 @@ exclude = ["features", "scripts"]
313313
[tool.ty.rules]
314314
# Enable strict type checking rules (similar to mypy strict mode)
315315
# Error-level rules (default)
316-
byte-string-type-annotation = "error"
317316
call-non-callable = "error"
318317
conflicting-argument-forms = "error"
319318
conflicting-declarations = "error"
@@ -323,7 +322,6 @@ cyclic-type-alias-definition = "error"
323322
duplicate-base = "error"
324323
duplicate-kw-only = "error"
325324
escape-character-in-forward-annotation = "error"
326-
fstring-type-annotation = "error"
327325
implicit-concatenated-string-type-annotation = "error"
328326
inconsistent-mro = "error"
329327
index-out-of-bounds = "error"

0 commit comments

Comments
 (0)