Skip to content

Commit 739a07d

Browse files
committed
Merge branch 'release/3.3.3'
2 parents 465bbf3 + d64a19e commit 739a07d

File tree

32 files changed

+624
-47
lines changed

32 files changed

+624
-47
lines changed

README.md

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ Generator features:
5454
- Different ORMs support;
5555
- Optional migrations for each ORM except raw drivers;
5656
- redis support;
57+
- rabbitmq support;
5758
- different CI\CD;
5859
- Kubernetes config generation;
5960
- Demo routers and models;
@@ -71,7 +72,7 @@ usage: FastAPI template [-h] [--version] [--name PROJECT_NAME]
7172
[--api-type {rest,graphql}]
7273
[--db {none,sqlite,mysql,postgresql}]
7374
[--orm {ormar,sqlalchemy,tortoise,psycopg,piccolo}]
74-
[--ci {none,gitlab_ci,github}] [--redis]
75+
[--ci {none,gitlab_ci,github}] [--redis] [--rabbit]
7576
[--migrations] [--kube] [--dummy] [--routers]
7677
[--swagger] [--force] [--quite]
7778

@@ -89,13 +90,14 @@ optional arguments:
8990
ORM
9091
--ci {none,gitlab_ci,github}
9192
Choose CI support
92-
--redis Add redis support
93+
--redis Add Redis support
94+
--rabbit Add RabbitMQ support
9395
--migrations Add migrations support
94-
--kube Add kubernetes configs
96+
--kube Add Kubernetes configs
9597
--dummy, --dummy-model
9698
Add dummy model
9799
--routers Add example routers
98-
--swagger Enable self-hosted swagger
100+
--swagger Enable self-hosted Swagger
99101
--force Owerrite directory if it exists
100-
--quite Do not ask for feature during generation
102+
--quite Do not ask for features during generation
101103
```

fastapi_template/cli.py

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -82,11 +82,18 @@ def parse_args():
8282
)
8383
parser.add_argument(
8484
"--redis",
85-
help="Add redis support",
85+
help="Add Redis support",
8686
action="store_true",
8787
default=None,
8888
dest="enable_redis",
8989
)
90+
parser.add_argument(
91+
"--rabbit",
92+
help="Add RabbitMQ support",
93+
action="store_true",
94+
default=None,
95+
dest="enable_rmq",
96+
)
9097
parser.add_argument(
9198
"--migrations",
9299
help="Add migrations support",
@@ -96,7 +103,7 @@ def parse_args():
96103
)
97104
parser.add_argument(
98105
"--kube",
99-
help="Add kubernetes configs",
106+
help="Add Kubernetes configs",
100107
action="store_true",
101108
default=None,
102109
dest="enable_kube",
@@ -118,7 +125,7 @@ def parse_args():
118125
)
119126
parser.add_argument(
120127
"--swagger",
121-
help="Enable self-hosted swagger",
128+
help="Enable self-hosted Swagger",
122129
action="store_true",
123130
default=None,
124131
dest="self_hosted_swagger",
@@ -132,7 +139,7 @@ def parse_args():
132139
)
133140
parser.add_argument(
134141
"--quite",
135-
help="Do not ask for feature during generation",
142+
help="Do not ask for features during generation",
136143
action="store_true",
137144
default=False,
138145
dest="quite",
@@ -159,6 +166,10 @@ def ask_features(current_context: BuilderContext) -> BuilderContext:
159166
"name": "self_hosted_swagger",
160167
"value": current_context.self_hosted_swagger,
161168
},
169+
"RabbitMQ integration": {
170+
"name": "enable_rmq",
171+
"value": current_context.enable_rmq,
172+
},
162173
}
163174
if current_context.db != DatabaseType.none:
164175
features["Migrations support"] = {

fastapi_template/input_model.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ class BuilderContext(BaseModel):
117117
enable_routers: Optional[bool]
118118
add_dummy: Optional[bool] = False
119119
self_hosted_swagger: Optional[bool]
120+
enable_rmq: Optional[bool]
120121
force: bool = False
121122
quite: bool = False
122123

fastapi_template/template/cookiecutter.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@
1414
"enable_redis": {
1515
"type": "bool"
1616
},
17+
"enable_rmq": {
18+
"type": "bool"
19+
},
1720
"ci_type": {
1821
"type": "string"
1922
},

fastapi_template/template/{{cookiecutter.project_name}}/.flake8

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@ per-file-ignores =
8282
WPS432,
8383
; Missing parameter(s) in Docstring
8484
DAR101,
85+
; Found too many arguments
86+
WPS211,
8587

8688
; all init files
8789
__init__.py:

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

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
"REST API": {
99
"enabled": "{{cookiecutter.api_type == 'rest'}}",
1010
"resources": [
11+
"{{cookiecutter.project_name}}/web/api/rabbit",
1112
"{{cookiecutter.project_name}}/web/api/dummy",
1213
"{{cookiecutter.project_name}}/web/api/echo",
1314
"{{cookiecutter.project_name}}/web/api/redis"
@@ -23,6 +24,16 @@
2324
"deploy/kube/redis.yml"
2425
]
2526
},
27+
"RabbitMQ support": {
28+
"enabled": "{{cookiecutter.enable_rmq}}",
29+
"resources": [
30+
"{{cookiecutter.project_name}}/web/api/rabbit",
31+
"{{cookiecutter.project_name}}/web/gql/rabbit",
32+
"{{cookiecutter.project_name}}/services/rabbit",
33+
"{{cookiecutter.project_name}}/tests/test_rabbit.py",
34+
"deploy/kube/redis.yml"
35+
]
36+
},
2637
"Kubernetes": {
2738
"enabled": "{{cookiecutter.enable_kube}}",
2839
"resources": [
@@ -80,8 +91,11 @@
8091
"enabled": "{{cookiecutter.enable_routers}}",
8192
"resources": [
8293
"{{cookiecutter.project_name}}/web/api/echo",
94+
"{{cookiecutter.project_name}}/web/gql/echo",
8395
"{{cookiecutter.project_name}}/web/api/dummy",
96+
"{{cookiecutter.project_name}}/web/gql/dummy",
8497
"{{cookiecutter.project_name}}/web/api/redis",
98+
"{{cookiecutter.project_name}}/web/gql/redis",
8599
"{{cookiecutter.project_name}}/tests/test_echo.py",
86100
"{{cookiecutter.project_name}}/tests/test_dummy.py",
87101
"{{cookiecutter.project_name}}/tests/test_redis.py"
@@ -91,6 +105,7 @@
91105
"enabled": "{{cookiecutter.add_dummy}}",
92106
"resources": [
93107
"{{cookiecutter.project_name}}/web/api/dummy",
108+
"{{cookiecutter.project_name}}/web/gql/dummy",
94109
"{{cookiecutter.project_name}}/db_sa/dao",
95110
"{{cookiecutter.project_name}}/db_sa/models/dummy_model.py",
96111
"{{cookiecutter.project_name}}/db_ormar/dao",
@@ -170,4 +185,4 @@
170185
"{{cookiecutter.project_name}}/db_tortoise/migrations/models/1_20210928165300_init_dummy_sqlite.sql"
171186
]
172187
}
173-
}
188+
}

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

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ services:
1010
env_file:
1111
- .env
1212
{%- if ((cookiecutter.db_info.name != "none" and cookiecutter.db_info.name != "sqlite") or
13-
(cookiecutter.enable_redis == "True")) %}
13+
(cookiecutter.enable_redis == "True") or
14+
(cookiecutter.enable_rmq == "True")) %}
1415
depends_on:
1516
{%- if cookiecutter.db_info.name != "none" %}
1617
{%- if cookiecutter.db_info.name != "sqlite" %}
@@ -22,6 +23,10 @@ services:
2223
redis:
2324
condition: service_healthy
2425
{%- endif %}
26+
{%- if cookiecutter.enable_rmq == "True" %}
27+
rmq:
28+
condition: service_healthy
29+
{%- endif %}
2530
{%- endif %}
2631
environment:
2732
{{cookiecutter.project_name | upper }}_HOST: 0.0.0.0
@@ -36,6 +41,9 @@ services:
3641
{{cookiecutter.project_name | upper}}_DB_BASE: {{cookiecutter.project_name}}
3742
{%- endif %}
3843
{%- endif %}
44+
{%- if cookiecutter.enable_rmq == 'True' %}
45+
{{cookiecutter.project_name | upper }}_RABBIT_HOST: {{cookiecutter.project_name}}-rmq
46+
{%- endif %}
3947
{%- if cookiecutter.db_info.name == "sqlite" %}
4048
volumes:
4149
- {{cookiecutter.project_name}}-db-data:/db_data/
@@ -59,7 +67,7 @@ services:
5967
retries: 40
6068
{%- endif %}
6169

62-
{% if cookiecutter.db_info.name == "mysql" -%}
70+
{%- if cookiecutter.db_info.name == "mysql" %}
6371
db:
6472
image: {{cookiecutter.db_info.image}}
6573
hostname: {{cookiecutter.project_name}}-db
@@ -78,7 +86,7 @@ services:
7886
- {{cookiecutter.project_name}}-db-data:/bitnami/mysql/data
7987
{%- endif %}
8088

81-
{% if cookiecutter.enable_migrations == 'True' -%}
89+
{%- if cookiecutter.enable_migrations == 'True' %}
8290
migrator:
8391
image: {{cookiecutter.project_name}}:{{"${" }}{{cookiecutter.project_name | upper }}_VERSION:-latest{{"}"}}
8492
restart: "no"
@@ -115,7 +123,7 @@ services:
115123
{%- endif %}
116124
{%- endif %}
117125

118-
{% if cookiecutter.enable_redis == "True" -%}
126+
{%- if cookiecutter.enable_redis == "True" %}
119127
redis:
120128
image: bitnami/redis:6.2.5
121129
hostname: {{cookiecutter.project_name}}-redis
@@ -129,6 +137,23 @@ services:
129137
retries: 30
130138
{%- endif %}
131139

140+
{%- if cookiecutter.enable_rmq == "True" %}
141+
rmq:
142+
image: rabbitmq:3.9.16-alpine
143+
hostname: {{cookiecutter.project_name}}-rmq
144+
restart: always
145+
environment:
146+
RABBITMQ_DEFAULT_USER: "guest"
147+
RABBITMQ_DEFAULT_PASS: "guest"
148+
RABBITMQ_DEFAULT_VHOST: "/"
149+
healthcheck:
150+
test: rabbitmq-diagnostics check_running -q
151+
interval: 1s
152+
timeout: 3s
153+
retries: 30
154+
{%- endif %}
155+
156+
132157
{% if cookiecutter.db_info.name != 'none' %}
133158
volumes:
134159
{{cookiecutter.project_name}}-db-data:

fastapi_template/template/{{cookiecutter.project_name}}/deploy/kube/app.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,8 @@ spec:
5252
{%- endif %}
5353
resources:
5454
limits:
55-
memory: "300Mi"
56-
cpu: "200m"
55+
memory: "200Mi"
56+
cpu: "100m"
5757
ports:
5858
- containerPort: 8000
5959
name: api-port
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
---
2+
apiVersion: apps/v1
3+
kind: Deployment
4+
metadata:
5+
namespace: "{{cookiecutter.kube_name}}"
6+
name: "{{cookiecutter.kube_name}}-rmq"
7+
spec:
8+
selector:
9+
matchLabels:
10+
app: "{{cookiecutter.kube_name}}-rmq"
11+
template:
12+
metadata:
13+
labels:
14+
app: "{{cookiecutter.kube_name}}-rmq"
15+
spec:
16+
containers:
17+
- name: rabbit
18+
image: rabbitmq:3.9.16-alpine
19+
startupProbe:
20+
exec:
21+
command: ["rabbitmq-diagnostics", "check_running", "-q"]
22+
failureThreshold: 30
23+
periodSeconds: 5
24+
timeoutSeconds: 10
25+
env:
26+
- name: RABBITMQ_DEFAULT_USER
27+
value: "guest"
28+
- name: RABBITMQ_DEFAULT_PASS
29+
value: "guest"
30+
- name: RABBITMQ_DEFAULT_VHOST
31+
value: "/"
32+
resources:
33+
limits:
34+
memory: "200Mi"
35+
cpu: "250m"
36+
ports:
37+
- containerPort: 5672
38+
name: amqp
39+
---
40+
apiVersion: v1
41+
kind: Service
42+
metadata:
43+
namespace: "{{cookiecutter.kube_name}}"
44+
name: "{{cookiecutter.kube_name}}-rmq-service"
45+
spec:
46+
selector:
47+
app: "{{cookiecutter.kube_name}}-rmq"
48+
ports:
49+
- port: 5672
50+
targetPort: amqp
51+
52+
---

fastapi_template/template/{{cookiecutter.project_name}}/deploy/kube/redis.yml

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,16 @@
22
apiVersion: apps/v1
33
kind: Deployment
44
metadata:
5-
namespace: {{cookiecutter.kube_name}}
6-
name: {{cookiecutter.kube_name}}-redis
5+
namespace: "{{cookiecutter.kube_name}}"
6+
name: "{{cookiecutter.kube_name}}-redis"
77
spec:
88
selector:
99
matchLabels:
10-
app: {{cookiecutter.kube_name}}-redis
10+
app: "{{cookiecutter.kube_name}}-redis"
1111
template:
1212
metadata:
1313
labels:
14-
app: {{cookiecutter.kube_name}}-redis
14+
app: "{{cookiecutter.kube_name}}-redis"
1515
spec:
1616
containers:
1717
- name: redis
@@ -26,19 +26,19 @@ spec:
2626
value: "yes"
2727
resources:
2828
limits:
29-
memory: "300Mi"
30-
cpu: "200m"
29+
memory: "50Mi"
30+
cpu: "50m"
3131
ports:
3232
- containerPort: 6379
3333
---
3434
apiVersion: v1
3535
kind: Service
3636
metadata:
37-
namespace: {{cookiecutter.kube_name}}
37+
namespace: "{{cookiecutter.kube_name}}"
3838
name: "{{cookiecutter.kube_name}}-redis-service"
3939
spec:
4040
selector:
41-
app: {{cookiecutter.kube_name}}-redis
41+
app: "{{cookiecutter.kube_name}}-redis"
4242
ports:
4343
- port: 6379
4444
targetPort: 6379

0 commit comments

Comments
 (0)