Skip to content

Commit c4d6276

Browse files
committed
add docstrings
1 parent 4591977 commit c4d6276

6 files changed

Lines changed: 208 additions & 2 deletions

File tree

api_v1/routers.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,33 @@
77
def register_routers(app: FastAPI) -> None:
88
"""
99
Функция по регистрации роутеров
10+
11+
## Args:
12+
app (FastAPI): ASGI приложение.
13+
14+
## Returns:
15+
None
16+
17+
## Example
18+
```python
19+
from fastapi import FastAPI
20+
21+
from config import settings
22+
from api_v1.api_xml.views import router as xml
23+
from api_v1.users.views import router as users
24+
25+
26+
def register_routers(app: FastAPI) -> None:
27+
app.include_router(
28+
router=xml,
29+
prefix=settings.API_PREFIX,
30+
)
31+
# Новый роутер
32+
app.include_router(
33+
router=users,
34+
prefix=settings.API_PREFIX,
35+
)
36+
```
1037
"""
1138
app.include_router(
1239
router=users,

app_includes/logs_errors.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,54 @@
1212
def register_errors(app: FastAPI) -> None:
1313
"""
1414
Крючек для логирования различных исключений
15+
16+
## Args:
17+
app (FastAPI): ASGI приложение.
18+
19+
## Returns:
20+
None
21+
22+
## Example
23+
```python
24+
from fastapi import FastAPI, Request
25+
from fastapi.responses import JSONResponse
26+
from fastapi.exceptions import HTTPException
27+
from http import HTTPStatus
28+
29+
from config.setup_logs.logging import logger
30+
from api_v1.api_xml.exeptions import APIFileNotFoundError
31+
32+
33+
def register_errors(app: FastAPI) -> None:
34+
@app.exception_handler(HTTPException)
35+
async def http_error_handler(
36+
request: Request,
37+
exc: HTTPException,
38+
):
39+
logger.opt(exception=True).warning(exc)
40+
response = dict(
41+
status=False,
42+
error_code=exc.status_code,
43+
message=exc.detail,
44+
)
45+
return JSONResponse(response)
46+
47+
# Добавление нового крюка
48+
@app.exception_handler(APIFileNotFoundError)
49+
async def file_not_found_error_handler(
50+
request: Request,
51+
exc: APIFileNotFoundError,
52+
):
53+
logger.opt(exception=True).warning(exc)
54+
response = dict(
55+
status=False,
56+
error_code=exc.status_code,
57+
message=exc.detail,
58+
)
59+
return JSONResponse(response)
60+
```
1561
"""
62+
1663
@app.exception_handler(ValidationError)
1764
async def validation_error_handler(
1865
request: Request,

app_includes/middlewares.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,39 @@
77
def register_middlewares(app: FastAPI) -> None:
88
"""
99
Регистрация middleware
10+
11+
## Args:
12+
app (FastAPI): ASGI приложение.
13+
14+
## Returns:
15+
None
16+
17+
## Example
18+
```python
19+
from fastapi.middleware.cors import CORSMiddleware
20+
from fastapi import FastAPI
21+
22+
from config import settings
23+
from middlewares import SomeMiddleware
24+
25+
26+
def register_middlewares(app: FastAPI) -> None:
27+
app.add_middleware(
28+
CORSMiddleware,
29+
allow_origins=[y
30+
settings.CURRENT_ORIGIN,
31+
],
32+
allow_credentials=True,
33+
allow_methods=['*'],
34+
allow_headers=['*'],
35+
)
36+
37+
# Новая регистрация
38+
app.add_middleware(
39+
SomeMiddleware,
40+
*args,
41+
)
42+
```
1043
"""
1144
app.add_middleware(
1245
CORSMiddleware,

config/database/db_helper.py

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,49 @@
1616

1717
class DataBaseHelper:
1818
"""
19-
Вспомогательный класс для работы с Базой Данных
19+
Вспомогательный класс для работы с Базой Данных.
20+
21+
Помогает инициализировать соединение с Базой Данных, а так же
22+
работу с сессиями.
23+
24+
## Инициализация:
25+
:string:`db_url` - Адресс базы данных.
26+
:string:`poolclass` - Пул типа :class:`sqlalchemy.pool.Pool`
27+
28+
## Методы:
29+
:function:`DataBaseHelper.session_geter` - Получение генератора текущей сессии.
30+
:function:`DataBaseHelper.get_scoped_session` - Получение текущей сессии.
31+
:function:`DataBaseHelper.dispose` - Закрытые соединения.
32+
33+
## Примеры:
34+
```python
35+
from fastapi import FastAPI
36+
from contextlib import asynccontextmanager
37+
from config import db_connection, BaseModel
38+
39+
40+
@asynccontextmanager
41+
async def lifespan(app: FastAPI):
42+
# Инициализация соединения для создания таблиц.
43+
async with db_connection.engine.begin() as conn:
44+
await conn.run_sync(BaseModel.metadata.create_all)
45+
yield
46+
await db_connection.dispose()
47+
48+
app = FastApi(lifespan=lifespan)
49+
```
2050
"""
2151
def __init__(self,
2252
db_url: str = DATA_BASE_URL,
2353
poolclass: Pool | None = None,
2454
) -> None:
55+
"""
56+
Args:
57+
db_url (str, optional): Адресс Базы Данных. Defaults to DATA_BASE_URL.
58+
59+
poolclass (Pool | None, optional): Пул типа :class:`sqlalchemy.pool.Pool`.
60+
Defaults to None.
61+
"""
2562
self._db_url = db_url
2663
setup = dict(
2764
url=self._db_url,
@@ -42,16 +79,33 @@ def __init__(self,
4279
)
4380

4481
async def dispose(self) -> None:
82+
"""
83+
Закрытие соединения
84+
"""
4585
await self.engine.dispose()
4686

4787
def get_scoped_session(self) -> AsyncSession:
88+
"""
89+
Получение сессии
90+
"""
4891
session = async_scoped_session(
4992
session_factory=self.session,
5093
scopefunc=current_task,
5194
)
5295
return session
5396

5497
async def session_geter(self) -> AsyncGenerator[AsyncSession, Any]:
98+
"""
99+
Получение генератора сессии
100+
101+
Returns:
102+
AsyncGenerator[AsyncSession, Any]: Возвращает
103+
генератор с сессиями
104+
105+
Yields:
106+
Iterator[AsyncGenerator[AsyncSession, Any]]: Генератор подает
107+
сессии
108+
"""
55109
session = self.get_scoped_session()
56110
yield session
57111
await session.remove()

config/models/base.py

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,48 @@
66

77

88
class Base(DeclarativeBase):
9-
"""Базовая модель
9+
"""
10+
Базовая модель для инициализации других моделей.
11+
12+
Данная базовая модель является абстактной, и определяет
13+
базовое поведение других таблиц.
14+
15+
## Определение поведения таблиц:
16+
17+
- Имя любой таблицы приводится к :method:`lower()` и
18+
добаляется `s` к окончанию.
19+
20+
- Для каждой таблицы создается автогенерируемое поле `id` или `uid`,
21+
которое автоинкремирует счетчик интидификатора сущностей.
22+
23+
## Примеры:
24+
```python
25+
from sqlalchemy.orm import Mapped, mapped_column
26+
from sqlalchemy import String
27+
from sqlalchemy.types import LargeBinary
28+
from datetime import date
29+
30+
from config.models import Base
31+
32+
33+
class User(Base):
34+
name: Mapped[str] = mapped_column(String(length=100))
35+
surname: Mapped[str] = mapped_column(String(length=200))
36+
password: Mapped[str] = mapped_column(LargeBinary)
37+
active: Mapped[bool] = mapped_column(default=True)
38+
is_admin: Mapped[bool] = mapped_column(default=False)
39+
create_date: Mapped[datetime] = mapped_column(
40+
insert_default=func.now(),
41+
server_default=func.now(),
42+
)
43+
login_date: Mapped[datetime | None] = mapped_column(
44+
default=None,
45+
server_default=None,
46+
nullable=True,
47+
)
48+
```
49+
По итогу к классу :class:`User` будет добавленно поле `id` или `uid`,
50+
а так же в Базу данных таблица будет с названием `users`.
1051
"""
1152
__abstract__ = True
1253

config/setup_logs/logging.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
r"""
2+
Основной файл настройки логирования проектов
3+
"""
4+
15
import sys
26
from loguru import logger
37

0 commit comments

Comments
 (0)