fast-clean 1.4.0__py3-none-any.whl → 1.4.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- fast_clean/depends.py +12 -14
- fast_clean/repositories/cache/__init__.py +10 -4
- fast_clean/repositories/cache/redis.py +0 -1
- fast_clean/services/lock.py +2 -1
- fast_clean/settings.py +6 -1
- {fast_clean-1.4.0.dist-info → fast_clean-1.4.2.dist-info}/METADATA +1 -1
- {fast_clean-1.4.0.dist-info → fast_clean-1.4.2.dist-info}/RECORD +9 -10
- fast_clean/redis.py +0 -23
- {fast_clean-1.4.0.dist-info → fast_clean-1.4.2.dist-info}/WHEEL +0 -0
- {fast_clean-1.4.0.dist-info → fast_clean-1.4.2.dist-info}/top_level.txt +0 -0
fast_clean/depends.py
CHANGED
@@ -16,7 +16,6 @@ from stringcase import snakecase
|
|
16
16
|
|
17
17
|
from .broker import BrokerFactory
|
18
18
|
from .db import SessionFactory, SessionManagerImpl, SessionManagerProtocol
|
19
|
-
from .redis import RedisManager
|
20
19
|
from .repositories import (
|
21
20
|
CacheManager,
|
22
21
|
CacheRepositoryProtocol,
|
@@ -107,6 +106,14 @@ class CoreProvider(Provider):
|
|
107
106
|
"""
|
108
107
|
return await settings_repository.get(CoreSettingsSchema)
|
109
108
|
|
109
|
+
@provide
|
110
|
+
@staticmethod
|
111
|
+
async def get_cache_settings(settings_repository: SettingsRepositoryProtocol) -> CoreCacheSettingsSchema:
|
112
|
+
"""
|
113
|
+
Получаем настройки кеша.
|
114
|
+
"""
|
115
|
+
return await settings_repository.get(CoreCacheSettingsSchema)
|
116
|
+
|
110
117
|
@staticmethod
|
111
118
|
async def get_broker_repository(settings_repository: SettingsRepositoryProtocol) -> AsyncIterator[KafkaBroker]:
|
112
119
|
"""
|
@@ -121,15 +128,8 @@ class CoreProvider(Provider):
|
|
121
128
|
"""
|
122
129
|
Получаем репозиторий кеша.
|
123
130
|
"""
|
124
|
-
settings = await settings_repository.get(CoreSettingsSchema)
|
125
|
-
if settings.redis_dsn is not None:
|
126
|
-
RedisManager.init(settings.redis_dsn)
|
127
131
|
cache_settings = await settings_repository.get(CoreCacheSettingsSchema)
|
128
|
-
|
129
|
-
CacheManager.init(cache_settings, RedisManager.redis)
|
130
|
-
if CacheManager.cache_repository is not None:
|
131
|
-
return CacheManager.cache_repository
|
132
|
-
raise ValueError('Cache is not initialized')
|
132
|
+
return CacheManager.init(cache_settings)
|
133
133
|
|
134
134
|
@provide(scope=Scope.REQUEST)
|
135
135
|
@staticmethod
|
@@ -201,14 +201,12 @@ class CoreProvider(Provider):
|
|
201
201
|
|
202
202
|
@provide
|
203
203
|
@staticmethod
|
204
|
-
def get_lock_service(
|
204
|
+
def get_lock_service(cache_settings: CoreCacheSettingsSchema) -> LockServiceProtocol:
|
205
205
|
"""
|
206
206
|
Получаем сервис распределенной блокировки.
|
207
207
|
"""
|
208
|
-
|
209
|
-
|
210
|
-
assert RedisManager.redis is not None
|
211
|
-
return RedisLockService(RedisManager.redis)
|
208
|
+
redis_client = CacheManager.init(cache_settings)
|
209
|
+
return RedisLockService(redis_client) # type: ignore
|
212
210
|
|
213
211
|
|
214
212
|
provider = CoreProvider()
|
@@ -9,9 +9,9 @@
|
|
9
9
|
from typing import ClassVar, Protocol, Self, cast
|
10
10
|
|
11
11
|
from fastapi_cache import FastAPICache
|
12
|
+
from redis import asyncio as aioredis
|
12
13
|
|
13
14
|
from fast_clean.settings import CoreCacheSettingsSchema
|
14
|
-
from redis import asyncio as aioredis
|
15
15
|
|
16
16
|
from .in_memory import InMemoryCacheRepository as InMemoryCacheRepository
|
17
17
|
from .redis import RedisCacheRepository as RedisCacheRepository
|
@@ -67,7 +67,7 @@ class CacheManager:
|
|
67
67
|
cache_repository: ClassVar[CacheRepositoryProtocol | None] = None
|
68
68
|
|
69
69
|
@classmethod
|
70
|
-
def init(cls, cache_settings: CoreCacheSettingsSchema
|
70
|
+
def init(cls, cache_settings: CoreCacheSettingsSchema):
|
71
71
|
"""
|
72
72
|
Инициализируем кеш.
|
73
73
|
"""
|
@@ -77,7 +77,13 @@ class CacheManager:
|
|
77
77
|
case 'in_memory':
|
78
78
|
cache_backend = InMemoryCacheRepository()
|
79
79
|
case 'redis':
|
80
|
-
|
81
|
-
|
80
|
+
if not cache_settings.redis:
|
81
|
+
raise ValueError('Redis not configured in settings')
|
82
|
+
cache_backend = RedisCacheRepository(
|
83
|
+
aioredis.from_url(url=str(cache_settings.redis.dsn), decode_responses=True) # type: ignore
|
84
|
+
)
|
85
|
+
case _:
|
86
|
+
raise ValueError('Cache is not initialized')
|
82
87
|
FastAPICache.init(cache_backend, prefix=cache_settings.prefix)
|
83
88
|
cls.cache_repository = cast(CacheRepositoryProtocol, cache_backend)
|
89
|
+
return cls.cache_repository
|
fast_clean/services/lock.py
CHANGED
@@ -6,10 +6,11 @@ from collections.abc import AsyncIterator
|
|
6
6
|
from contextlib import asynccontextmanager
|
7
7
|
from typing import AsyncContextManager, Protocol
|
8
8
|
|
9
|
-
from fast_clean.exceptions import LockError
|
10
9
|
from redis import asyncio as aioredis
|
11
10
|
from redis.exceptions import LockError as AIORedisLockError
|
12
11
|
|
12
|
+
from fast_clean.exceptions import LockError
|
13
|
+
|
13
14
|
|
14
15
|
class LockServiceProtocol(Protocol):
|
15
16
|
"""
|
fast_clean/settings.py
CHANGED
@@ -39,6 +39,10 @@ class CoreDbSettingsSchema(BaseModel):
|
|
39
39
|
return f'{self.provider}://{self.user}:{self.password}@{self.host}:{self.port}/{self.name}'
|
40
40
|
|
41
41
|
|
42
|
+
class CoreRedisSettingsSchema(BaseModel):
|
43
|
+
dsn: RedisDsn
|
44
|
+
|
45
|
+
|
42
46
|
class CoreCacheSettingsSchema(BaseModel):
|
43
47
|
"""
|
44
48
|
Схема настроек кеша.
|
@@ -48,6 +52,8 @@ class CoreCacheSettingsSchema(BaseModel):
|
|
48
52
|
|
49
53
|
prefix: str
|
50
54
|
|
55
|
+
redis: CoreRedisSettingsSchema | None = None
|
56
|
+
|
51
57
|
|
52
58
|
class CoreS3SettingsSchema(BaseModel):
|
53
59
|
"""
|
@@ -178,7 +184,6 @@ class CoreSettingsSchema(BaseSettingsSchema):
|
|
178
184
|
base_dir: Path = Path(os.getcwd())
|
179
185
|
secret_key: str
|
180
186
|
cors_origins: Annotated[list[str], Field(default_factory=list)]
|
181
|
-
redis_dsn: RedisDsn | None = None
|
182
187
|
sentry_dsn: str | None = None
|
183
188
|
|
184
189
|
model_config = SettingsConfigDict(
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: fast-clean
|
3
|
-
Version: 1.4.
|
3
|
+
Version: 1.4.2
|
4
4
|
Summary: FastAPI Clean Architecture implementation
|
5
5
|
Author-email: Luferov Victor <luferovvs@yandex.ru>, Orlov Artem <squakrazv@yandex.ru>, Kashapov Rustam <hardtechnik91@gmail.com>
|
6
6
|
Requires-Python: >=3.13
|
@@ -2,15 +2,14 @@ fast_clean/__init__.py,sha256=sT4tb75t5PXws8W_7wpA0jNtNxkWPFLAMrPlDGS7RHw,51
|
|
2
2
|
fast_clean/broker.py,sha256=CHnL4Jd6jF5gKgtUXi33j9QFG2EUM4uqhVqdLuxIrZs,4474
|
3
3
|
fast_clean/container.py,sha256=E1e0H1JqGOacH4uBNwkjTDXYhzN56yZi0AmWXQ3DkEQ,3535
|
4
4
|
fast_clean/db.py,sha256=uZHXXHdLstqhyzGtBL5Z7VvXwIe6mxuPOUheJEzSMyM,5776
|
5
|
-
fast_clean/depends.py,sha256=
|
5
|
+
fast_clean/depends.py,sha256=d6KbRPZsF_eh3Ed4Z9TYaDHZoWl6CSlHjc1y0OpiApg,7620
|
6
6
|
fast_clean/enums.py,sha256=lPhC_2_r6YFby7Mq-9u_JSiuyZ0e57F2VxBfUwnBZ18,826
|
7
7
|
fast_clean/exceptions.py,sha256=Sp-k-a5z1Gedu0slzj1-rORnr4GP1FXDHKCKRaJq-7o,9485
|
8
8
|
fast_clean/loggers.py,sha256=hVvZSDMMxYnK-p_yyjd4R7SyHpmxQF3eKQEeMu9Q-jo,705
|
9
9
|
fast_clean/middleware.py,sha256=p0Tv_qu89ZQtzKZ10tNepArJyHlFX2II9UmivGWnycw,1037
|
10
10
|
fast_clean/models.py,sha256=H7-Hk3gZP9i2TiJHu0u2Nex76c8ZbDhMR4lF41_PMyI,1057
|
11
11
|
fast_clean/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
12
|
-
fast_clean/
|
13
|
-
fast_clean/settings.py,sha256=YgmdhW38quBHQty254Pv-vFZ5eGbl__VQ1lIgoVg8kI,4864
|
12
|
+
fast_clean/settings.py,sha256=Ox2aDEOxw4LgrszCNpUMNlxCqozc6kcv7406786ADAw,4938
|
14
13
|
fast_clean/cli/__init__.py,sha256=m8n09uN47JGtAfgWVbXCJOxpzlrUazogqtLo6xPWe3s,181
|
15
14
|
fast_clean/cli/cryptography.py,sha256=ACaYAOn4KEKIdsTuCYkX1m6g2YpMczNCjJcVfLE2Rzo,1936
|
16
15
|
fast_clean/cli/load_seed.py,sha256=Tm5_r_myrC5dl_WyC6Bx2WKFAkfLf-Pch4ZK6zWN2Qg,867
|
@@ -27,9 +26,9 @@ fast_clean/contrib/monitoring/router.py,sha256=94gffX34VE_Yb6TLaQOP4YyXDQsClzOn4
|
|
27
26
|
fast_clean/contrib/sqlalchemy_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
28
27
|
fast_clean/contrib/sqlalchemy_utils/utils.py,sha256=5xktmJlQifGpIXMruhe7qofEEu_ExncBTUmlrtFK1YQ,1061
|
29
28
|
fast_clean/repositories/__init__.py,sha256=mHJ6CW1fYkkiSnnYiO3GRAa5YVCPN1otOOKkjbutuhs,1753
|
30
|
-
fast_clean/repositories/cache/__init__.py,sha256=
|
29
|
+
fast_clean/repositories/cache/__init__.py,sha256=aVl1ReoU0doH1i78-Ef8rS-LaVQacF0SS9xLFWzmcgQ,2811
|
31
30
|
fast_clean/repositories/cache/in_memory.py,sha256=Hb68UrTmQozALcyLrmYPBIfJfi67NvsCTDe1RfqwBHQ,2259
|
32
|
-
fast_clean/repositories/cache/redis.py,sha256
|
31
|
+
fast_clean/repositories/cache/redis.py,sha256=-iX6x-sfXj-pDYfcRIyKjq9nCjnlRQKeJtfeMmDpT-4,1907
|
33
32
|
fast_clean/repositories/crud/__init__.py,sha256=z_-zY3esEbUEHSGb9WInU-vvRuTpTu4M-Qe5UhCN0Pc,4359
|
34
33
|
fast_clean/repositories/crud/db.py,sha256=wyvDvEjvncfSVHlaguhrgCP7wIsiKRoGZEesxHzDVHI,23212
|
35
34
|
fast_clean/repositories/crud/in_memory.py,sha256=37VBQJTIV4z1_Om9DhYqpa1t98hGGhY8gumoyV-fhDg,13172
|
@@ -51,7 +50,7 @@ fast_clean/schemas/pagination.py,sha256=GEQ-Tbhx6xkMMXhDNWrTEhPv8IdnAOJxH2P1tscm
|
|
51
50
|
fast_clean/schemas/repository.py,sha256=ASxMJb23H3zwavr7P0_ZpCWZX7FjqAuC75qAIYqejvQ,889
|
52
51
|
fast_clean/schemas/request_response.py,sha256=i4HTpjelWl4DxJ1sQaeanTWB_PThlhVJRhtMMGqRAiQ,693
|
53
52
|
fast_clean/services/__init__.py,sha256=Lvdb5ZibRGwoMn_WENrk9wERUViTsPrU8E_71XtPFJc,617
|
54
|
-
fast_clean/services/lock.py,sha256=
|
53
|
+
fast_clean/services/lock.py,sha256=SlO-wkULBtm9X7jvtUTiEpmDWuiNTscMD-73PPlmI0o,1654
|
55
54
|
fast_clean/services/seed.py,sha256=M0yA2I5z-jLM2UcW_x7287mwIFW5Vt0fPFaplakGFc0,2836
|
56
55
|
fast_clean/services/transaction.py,sha256=djXR6e6ukgpBXDbVmU095MvRJAIqdOPMgAcege52Qxg,762
|
57
56
|
fast_clean/services/cryptography/__init__.py,sha256=XK9-z6HT1Jgfc4-IpNY6fZihjW2dqeO83cz5ZvjJIbo,1559
|
@@ -67,7 +66,7 @@ fast_clean/utils/time.py,sha256=nvavbtG4zR_gkrGSbsqKAsBdePxO3LuTeoISbFZIgn0,307
|
|
67
66
|
fast_clean/utils/toml.py,sha256=NbP7EfgKNYQ18LH8Hc-DmY1gks92bUSBW3D3-tMrY4E,737
|
68
67
|
fast_clean/utils/type_converters.py,sha256=bMEJeoQB9Q6Qok1-ppn4Ii8ZpIkZwJbD2IzCydSStHw,523
|
69
68
|
fast_clean/utils/typer.py,sha256=1O7BsNGn68bBzNbj0-Ycfhv35WpLzwvYTKn510YNXQQ,663
|
70
|
-
fast_clean-1.4.
|
71
|
-
fast_clean-1.4.
|
72
|
-
fast_clean-1.4.
|
73
|
-
fast_clean-1.4.
|
69
|
+
fast_clean-1.4.2.dist-info/METADATA,sha256=C2BSQ7zHJPDpyiwr8GBzf_1IrnEetSu7YFxXO1YOmJQ,1200
|
70
|
+
fast_clean-1.4.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
71
|
+
fast_clean-1.4.2.dist-info/top_level.txt,sha256=QfsGs-QLmPCZWWPFOukD0zhMnokH68FoO2KeObl6ZIA,11
|
72
|
+
fast_clean-1.4.2.dist-info/RECORD,,
|
fast_clean/redis.py
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
"""
|
2
|
-
Модуль, содержащий функционал, связанный с Redis.
|
3
|
-
"""
|
4
|
-
|
5
|
-
from pydantic import RedisDsn
|
6
|
-
|
7
|
-
from redis import asyncio as aioredis
|
8
|
-
|
9
|
-
|
10
|
-
class RedisManager:
|
11
|
-
"""
|
12
|
-
Менеджер для управления клиентом Redis.
|
13
|
-
"""
|
14
|
-
|
15
|
-
redis: aioredis.Redis | None = None
|
16
|
-
|
17
|
-
@classmethod
|
18
|
-
def init(cls, redis_dsn: RedisDsn) -> None:
|
19
|
-
"""
|
20
|
-
Инициализируем клиент Redis.
|
21
|
-
"""
|
22
|
-
if cls.redis is None:
|
23
|
-
cls.redis = aioredis.from_url(url=str(redis_dsn), decode_responses=True)
|
File without changes
|
File without changes
|