Skip to content

Commit 3145317

Browse files
committed
Merge branch 'release/4.1.0'
2 parents 53ba96d + e9b86e6 commit 3145317

File tree

17 files changed

+158
-17
lines changed

17 files changed

+158
-17
lines changed

fastapi_template/cli.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -337,6 +337,21 @@ def checker(ctx: BuilderContext) -> bool:
337337
)
338338
),
339339
),
340+
MenuEntry(
341+
code="enable_taskiq",
342+
cli_name="taskiq",
343+
user_view="Add Taskiq support",
344+
description=(
345+
"{what} is an async task manager.\n"
346+
"You can think of taskiq as a {celery}, but async.".format(
347+
what=colored("Taskiq", color="green"),
348+
celery=colored(
349+
"celery",
350+
color="cyan",
351+
),
352+
)
353+
),
354+
),
340355
MenuEntry(
341356
code="enable_migrations",
342357
cli_name="migrations",

fastapi_template/template/cookiecutter.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@
2020
"enable_migrations": {
2121
"type": "bool"
2222
},
23+
"enable_taskiq": {
24+
"type": "bool"
25+
},
2326
"enable_kube": {
2427
"type": "bool"
2528
},

fastapi_template/template/{{cookiecutter.project_name}}/conditional_files.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,5 +209,11 @@
209209
"{{cookiecutter.project_name}}/db_tortoise/migrations/models/0_20210928165300_init_sqlite.sql",
210210
"{{cookiecutter.project_name}}/db_tortoise/migrations/models/1_20210928165300_init_dummy_sqlite.sql"
211211
]
212+
},
213+
"Taskiq support":{
214+
"enabled": "{{cookiecutter.enable_taskiq}}",
215+
"resources": [
216+
"{{cookiecutter.project_name}}/taskiq.py"
217+
]
212218
}
213219
}

fastapi_template/template/{{cookiecutter.project_name}}/deploy/docker-compose.dev.yml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,16 @@ services:
1111
environment:
1212
# Enables autoreload.
1313
{{cookiecutter.project_name | upper}}_RELOAD: "True"
14+
15+
{%- if cookiecutter.enable_taskiq == "True" %}
16+
17+
taskiq-worker:
18+
volumes:
19+
# Adds current directory as volume.
20+
- .:/app/src/
21+
command:
22+
- taskiq
23+
- worker
24+
- {{cookiecutter.project_name}}.taskiq:broker
25+
- --reload
26+
{%- endif %}

fastapi_template/template/{{cookiecutter.project_name}}/deploy/docker-compose.yml

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
version: '3.9'
22

33
services:
4-
api:
4+
api: &main_app
55
build:
66
context: .
77
dockerfile: ./deploy/Dockerfile
@@ -61,6 +61,9 @@ services:
6161
{%- if cookiecutter.enable_rmq == 'True' %}
6262
{{cookiecutter.project_name | upper }}_RABBIT_HOST: {{cookiecutter.project_name}}-rmq
6363
{%- endif %}
64+
{%- if cookiecutter.enable_redis == 'True' %}
65+
{{cookiecutter.project_name | upper }}_REDIS_HOST: {{cookiecutter.project_name}}-redis
66+
{%- endif %}
6467
{%- if cookiecutter.enable_kafka == "True" %}
6568
TESTKAFKA_KAFKA_BOOTSTRAP_SERVERS: '["{{cookiecutter.project_name}}-kafka:9092"]'
6669
{%- endif %}
@@ -69,6 +72,17 @@ services:
6972
- {{cookiecutter.project_name}}-db-data:/db_data/
7073
{%- endif %}
7174

75+
{%- if cookiecutter.enable_taskiq == "True" %}
76+
77+
taskiq-worker:
78+
<<: *main_app
79+
labels: []
80+
command:
81+
- taskiq
82+
- worker
83+
- {{cookiecutter.project_name}}.taskiq:broker
84+
{%- endif %}
85+
7286
{%- if cookiecutter.db_info.name == "postgresql" %}
7387

7488
db:

fastapi_template/template/{{cookiecutter.project_name}}/pyproject.toml

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,23 @@ asynctest = "^0.13.0"
140140
nest-asyncio = "^1.5.6"
141141
{%- endif %}
142142
httpx = "^0.23.3"
143+
{%- if cookiecutter.enable_taskiq == "True" %}
144+
taskiq = "^0"
145+
taskiq-fastapi = "^0"
146+
147+
{%- if cookiecutter.enable_redis == "True" %}
148+
taskiq-redis = "^0"
149+
{%- endif %}
150+
151+
{%- if cookiecutter.enable_rmq == "True" %}
152+
taskiq-aio-pika = "^0"
153+
{%- endif %}
154+
155+
{%- if (cookiecutter.enable_rmq or cookiecutter.enable_rmq) != "True" %}
156+
pyzmq = "^25.0.2"
157+
{%- endif %}
158+
159+
{%- endif %}
143160

144161
[tool.isort]
145162
profile = "black"
@@ -177,8 +194,8 @@ filterwarnings = [
177194
"ignore::DeprecationWarning",
178195
"ignore:.*unclosed.*:ResourceWarning",
179196
]
180-
{%- if cookiecutter.db_info.name != "none" %}
181197
env = [
198+
"{{cookiecutter.project_name | upper}}_ENVIRONMENT=pytest",
182199
{%- if cookiecutter.db_info.name == "sqlite" %}
183200
"{{cookiecutter.project_name | upper}}_DB_FILE=test_db.sqlite3",
184201
{%- else %}
@@ -191,7 +208,6 @@ env = [
191208
"{{cookiecutter.project_name | upper}}_SENTRY_DSN=",
192209
{%- endif %}
193210
]
194-
{%- endif %}
195211

196212
{%- if cookiecutter.orm == "tortoise" %}
197213
{%- if cookiecutter.enable_migrations == "True" %}

fastapi_template/template/{{cookiecutter.project_name}}/{{cookiecutter.project_name}}/db_psycopg/dependencies.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
from psycopg_pool import AsyncConnectionPool
22
from starlette.requests import Request
33

4+
{%- if cookiecutter.enable_taskiq == "True" %}
5+
from taskiq import TaskiqDepends
6+
{%- endif %}
47

5-
async def get_db_pool(request: Request) -> AsyncConnectionPool:
8+
async def get_db_pool(request: Request {%- if cookiecutter.enable_taskiq == "True" %} = TaskiqDepends(){%- endif %}) -> AsyncConnectionPool:
69
"""
710
Return database connections pool.
811

fastapi_template/template/{{cookiecutter.project_name}}/{{cookiecutter.project_name}}/db_sa/dependencies.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,12 @@
33
from sqlalchemy.ext.asyncio import AsyncSession
44
from starlette.requests import Request
55

6+
{%- if cookiecutter.enable_taskiq == "True" %}
7+
from taskiq import TaskiqDepends
8+
{%- endif %}
69

7-
async def get_db_session(request: Request) -> AsyncGenerator[AsyncSession, None]:
10+
11+
async def get_db_session(request: Request {%- if cookiecutter.enable_taskiq == "True" %} = TaskiqDepends(){%- endif %}) -> AsyncGenerator[AsyncSession, None]:
812
"""
913
Create and get database session.
1014

fastapi_template/template/{{cookiecutter.project_name}}/{{cookiecutter.project_name}}/logging.py

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -83,16 +83,19 @@ def record_formatter(record: dict[str, Any]) -> str: # pragma: no cover
8383

8484
def configure_logging() -> None: # pragma: no cover
8585
"""Configures logging."""
86-
loggers = (
87-
logging.getLogger(name)
88-
for name in logging.root.manager.loggerDict
89-
if name.startswith("uvicorn.")
90-
)
91-
for uvicorn_logger in loggers:
92-
uvicorn_logger.handlers = []
86+
intercept_handler = InterceptHandler()
87+
88+
logging.basicConfig(handlers=[intercept_handler], level=logging.NOTSET)
89+
90+
for logger_name in logging.root.manager.loggerDict:
91+
if logger_name.startswith("uvicorn."):
92+
logging.getLogger(logger_name).handlers = []
93+
{%- if cookiecutter.enable_taskiq == "True" %}
94+
if logger_name.startswith("taskiq."):
95+
logging.getLogger(logger_name).root.handlers = [intercept_handler]
96+
{%- endif %}
9397

9498
# change handler for default uvicorn logger
95-
intercept_handler = InterceptHandler()
9699
logging.getLogger("uvicorn").handlers = [intercept_handler]
97100
logging.getLogger("uvicorn.access").handlers = [intercept_handler]
98101

fastapi_template/template/{{cookiecutter.project_name}}/{{cookiecutter.project_name}}/services/kafka/dependencies.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
from aiokafka import AIOKafkaProducer
22
from fastapi import Request
33

4+
{%- if cookiecutter.enable_taskiq == "True" %}
5+
from taskiq import TaskiqDepends
6+
{%- endif %}
47

5-
def get_kafka_producer(request: Request) -> AIOKafkaProducer: # pragma: no cover
8+
9+
def get_kafka_producer(request: Request {%- if cookiecutter.enable_taskiq == "True" %} = TaskiqDepends(){%- endif %}) -> AIOKafkaProducer: # pragma: no cover
610
"""
711
Returns kafka producer.
812

0 commit comments

Comments
 (0)