Skip to content

Commit c39b81e

Browse files
authored
Release version 0.1.3 📣
Release version 0.1.3
2 parents 4695df5 + 063de67 commit c39b81e

File tree

8 files changed

+359
-90
lines changed

8 files changed

+359
-90
lines changed

README.md

+5
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,11 @@ newproject/
7474

7575
### Latest Changes
7676

77+
### 0.1.3
78+
79+
* Make database optional
80+
* Now Manage FastAPI has support for MongoDB, PostgreSQL, SQLite, MySQL, Tortoise ORM
81+
7782
### 0.1.2
7883

7984
* Add tests

docs/managing_projects/startproject.md

+13-13
Original file line numberDiff line numberDiff line change
@@ -85,20 +85,20 @@ class Settings(BaseSettings):
8585
raise ValueError(v)
8686

8787
# Database Settings
88-
DATABASE_SERVER: Optional[str] = ""
89-
DATABASE_USER: Optional[str] = ""
90-
DATABASE_PASSWORD: Optional[str] = ""
91-
DATABASE_PORT: Optional[str] = ""
92-
DATABASE_NAME: Optional[str] = ""
93-
DATABASE_HOST: Optional[str] = ""
94-
95-
# SQLALCHEMY_DATABASE_URL: Optional[
88+
DB_SERVER: Optional[str] = ""
89+
DB_USER: Optional[str] = ""
90+
DB_PASSWORD: Optional[str] = ""
91+
DB_PORT: Optional[str] = ""
92+
DB_NAME: Optional[str] = ""
93+
DB_PORT: Optional[str] = ""
94+
95+
# DATABASE_URL: Optional[
9696
# str
97-
# ] = f"{DATABASE_SERVER}://{DATABASE_USER}:{DATABASE_PASSWORD}@{DATABASE_HOST}:{DATABASE_PORT}/{DATABASE_NAME}"
97+
# ] = f"{DB_SERVER}://{DB_USER}:{DB_PASSWORD}@{DB_PORT}:{DB_PORT}/{DB_NAME}"
9898

9999

100-
# SQLALCHEMY_DATABASE_URL = "postgresql://user:passowrd@localhost:5432/database_name"
101-
SQLALCHEMY_DATABASE_URL = "sqlite:///./test.db"
100+
# DATABASE_URL = "postgresql://user:passowrd@localhost:5432/DB_NAME"
101+
DATABASE_URL = "sqlite:///./test.db"
102102

103103

104104

@@ -116,7 +116,7 @@ import sqlalchemy
116116
from newproject.settings import settings
117117
import databases
118118

119-
database = databases.Database(settings.SQLALCHEMY_DATABASE_URL)
119+
database = databases.Database(settings.DATABASE_URL)
120120
metadata = sqlalchemy.MetaData()
121121

122122
# Put your database models here | Below
@@ -126,7 +126,7 @@ metadata = sqlalchemy.MetaData()
126126
# Put your database models here | Above
127127

128128

129-
engine = sqlalchemy.create_engine(settings.SQLALCHEMY_DATABASE_URL)
129+
engine = sqlalchemy.create_engine(settings.DATABASE_URL)
130130
metadata.create_all(engine)
131131
```
132132

docs/release-notes.md

+6
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,12 @@
22

33
### Latest Changes
44

5+
### 0.1.3
6+
7+
* Make database optional
8+
* Now Manage FastAPI has support for MongoDB, PostgreSQL, SQLite, MySQL, Tortoise ORM
9+
10+
511
### 0.1.2
612

713
* Add tests

manage_fastapi/main.py

+16-3
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,27 @@
11
import typer
2-
from .utils import start_app, start_project
2+
from .utils import start_app, start_project, select_database
33

4-
app = typer.Typer(add_completion=False, help="Managing FastAPI projects made easy!")
4+
5+
app = typer.Typer(
6+
add_completion=False,
7+
help="Managing FastAPI projects made easy!",
8+
name="Manage FastAPI",
9+
)
510

611

712
@app.command(help="Creates a project with the given name.")
813
def startproject(projectname: str = typer.Argument(...)):
9-
start_project(projectname)
14+
database_option = select_database()
15+
start_project(projectname, database_option=database_option)
1016

1117

1218
@app.command(help="Creates a app with the given name.")
1319
def startapp(appname: str = typer.Argument(...)):
1420
start_app(appname)
21+
22+
23+
# TODO
24+
# @app.command(help="Runs server")
25+
# def runserver(server: str = typer.Argument("uvicorn")):
26+
# run_server()
27+

manage_fastapi/templates.py

+193-54
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,8 @@
1-
main_template = """from fastapi import FastAPI
2-
from fastapi.middleware.cors import CORSMiddleware
3-
4-
from {project_name}.settings import settings
5-
from {project_name}.models.database import database
6-
7-
app = FastAPI(title=settings.PROJECT_NAME)
8-
9-
if settings.BACKEND_CORS_ORIGINS:
10-
app.add_middleware(
11-
CORSMiddleware,
12-
allow_origins=[str(origin) for origin in settings.BACKEND_CORS_ORIGINS],
13-
allow_methods=["*"],
14-
allow_headers=["*"],
15-
)
16-
17-
18-
@app.on_event("startup")
19-
async def connect_database():
20-
await database.connect()
21-
1+
database_options_template = """PostgreSQL - SQLite - MySQL [0]
2+
Tortoise [1]
3+
MongoDB [2]
4+
Create without Database [9]
225
23-
@app.on_event("shutdown")
24-
async def disconnect_database():
25-
await database.disconnect()
266
"""
277

288
schema_template = """# For more information check Pydantic documentation = https://pydantic-docs.helpmanual.io/usage/models/
@@ -41,23 +21,6 @@ class Model(BaseModel):
4121
pass
4222
"""
4323

44-
database_template = """import sqlalchemy
45-
from {project_name}.settings import settings
46-
import databases
47-
48-
database = databases.Database(settings.SQLALCHEMY_DATABASE_URL)
49-
metadata = sqlalchemy.MetaData()
50-
51-
# Put your database models here | Below
52-
53-
# FastAPI documentation for databases: https://fastapi.tiangolo.com/advanced/async-sql-databases/
54-
55-
# Put your database models here | Above
56-
57-
58-
engine = sqlalchemy.create_engine(settings.SQLALCHEMY_DATABASE_URL)
59-
metadata.create_all(engine)
60-
"""
6124

6225
settings_template = """from typing import Any, Dict, List, Optional, Union
6326
@@ -82,20 +45,16 @@ def assemble_cors_origins(cls, v: Union[str, List[str]]) -> Union[List[str], str
8245
raise ValueError(v)
8346
8447
# Database Settings
85-
DATABASE_SERVER: Optional[str] = ""
86-
DATABASE_USER: Optional[str] = ""
87-
DATABASE_PASSWORD: Optional[str] = ""
88-
DATABASE_PORT: Optional[str] = ""
89-
DATABASE_NAME: Optional[str] = ""
90-
DATABASE_HOST: Optional[str] = ""
91-
92-
# SQLALCHEMY_DATABASE_URL: Optional[
93-
# str
94-
# ] = f"{DATABASE_SERVER}://{DATABASE_USER}:{DATABASE_PASSWORD}@{DATABASE_HOST}:{DATABASE_PORT}/{DATABASE_NAME}"
95-
48+
DB_SERVER: Optional[str] = ""
49+
DB_USER: Optional[str] = ""
50+
DB_PASSWORD: Optional[str] = ""
51+
DB_PORT: Optional[str] = ""
52+
DB_NAME: Optional[str] = ""
53+
DB_PORT: Optional[str] = ""
54+
55+
# DATABASE_URL: str = f"{DB_SERVER}://{DB_USER}:{DB_PASSWORD}@{DB_PORT}:{DB_PORT}/{DB_NAME}"
9656
97-
# SQLALCHEMY_DATABASE_URL = "postgresql://user:passowrd@localhost:5432/database_name"
98-
SQLALCHEMY_DATABASE_URL = "sqlite:///./test.db"
57+
DATABASE_URL = "sqlite:///./test.db"
9958
10059
10160
@@ -161,3 +120,183 @@ def test_read_items():
161120
assert response.status_code == 200
162121
assert response.json() == {"name": "Fighters"}
163122
"""
123+
124+
requirements_template = """fastapi==0.61.0
125+
uvicorn==0.11.8
126+
"""
127+
128+
129+
# TORTOISE Main | Database template
130+
131+
tortoise_main_template = """from fastapi import FastAPI
132+
from fastapi.middleware.cors import CORSMiddleware
133+
134+
from {project_name}.{project_name}.models.database import Example
135+
from tortoise.contrib.fastapi import HTTPNotFoundError, register_tortoise
136+
137+
138+
from {project_name}.{project_name}.settings import settings
139+
140+
app = FastAPI(title=settings.PROJECT_NAME)
141+
142+
143+
if settings.BACKEND_CORS_ORIGINS:
144+
app.add_middleware(
145+
CORSMiddleware,
146+
allow_origins=[str(origin) for origin in settings.BACKEND_CORS_ORIGINS],
147+
allow_methods=["*"],
148+
allow_headers=["*"],
149+
)
150+
151+
152+
153+
register_tortoise(
154+
app,
155+
db_url=settings.DATABASE_URL,
156+
modules={"models": ["{project_name}.{project_name}.models"]},
157+
generate_schemas=True,
158+
add_exception_handlers=True,
159+
)
160+
"""
161+
162+
tortoise_database_template = """from tortoise import fields, models
163+
from tortoise.contrib.pydantic import pydantic_model_creator
164+
165+
166+
class Example(models.Model):
167+
168+
id = fields.IntField(pk=True)
169+
created_at = fields.DatetimeField(auto_now_add=True)
170+
modified_at = fields.DatetimeField(auto_now=True)
171+
172+
class PydanticMeta:
173+
pass
174+
175+
176+
Example = pydantic_model_creator(Example, name="Example")
177+
"""
178+
179+
180+
# Postgresql, SQLite, MySQL Main | Database
181+
182+
empty_main_template = """from fastapi import FastAPI
183+
from fastapi.middleware.cors import CORSMiddleware
184+
185+
from {project_name}.settings import settings
186+
187+
if settings.BACKEND_CORS_ORIGINS:
188+
app.add_middleware(
189+
CORSMiddleware,
190+
allow_origins=[str(origin) for origin in settings.BACKEND_CORS_ORIGINS],
191+
allow_methods=["*"],
192+
allow_headers=["*"],
193+
)
194+
195+
196+
"""
197+
198+
199+
async_sql_main_template = """from fastapi import FastAPI
200+
from fastapi.middleware.cors import CORSMiddleware
201+
202+
from {project_name}.{project_name}.settings import settings
203+
from {project_name}.{project_name}.models.database import database
204+
205+
app = FastAPI(title=settings.PROJECT_NAME)
206+
207+
if settings.BACKEND_CORS_ORIGINS:
208+
app.add_middleware(
209+
CORSMiddleware,
210+
allow_origins=[str(origin) for origin in settings.BACKEND_CORS_ORIGINS],
211+
allow_methods=["*"],
212+
allow_headers=["*"],
213+
)
214+
215+
216+
@app.on_event("startup")
217+
async def connect_database():
218+
await database.connect()
219+
220+
221+
@app.on_event("shutdown")
222+
async def disconnect_database():
223+
await database.disconnect()
224+
"""
225+
226+
async_sql_database_template = """import sqlalchemy
227+
from {project_name}.{project_name}.settings import settings
228+
import databases
229+
230+
database = databases.Database(settings.DATABASE_URL)
231+
metadata = sqlalchemy.MetaData()
232+
233+
# Put your database models here | Below
234+
235+
# FastAPI documentation for databases: https://fastapi.tiangolo.com/advanced/async-sql-databases/
236+
237+
# Put your database models here | Above
238+
239+
240+
engine = sqlalchemy.create_engine(settings.DATABASE_URL)
241+
metadata.create_all(engine)
242+
"""
243+
244+
245+
### MONGODB
246+
mongo_main_template = """from fastapi import FastAPI
247+
from fastapi.middleware.cors import CORSMiddleware
248+
249+
from {project_name}.{project_name}.settings import settings
250+
from {project_name}.{project_name}.models.utils import connect_to_mongo, close_mongo_connection
251+
252+
app = FastAPI()
253+
254+
if settings.BACKEND_CORS_ORIGINS:
255+
app.add_middleware(
256+
CORSMiddleware,
257+
allow_origins=[str(origin) for origin in settings.BACKEND_CORS_ORIGINS],
258+
allow_methods=["*"],
259+
allow_headers=["*"],
260+
)
261+
262+
app.add_event_handler("startup", connect_to_mongo)
263+
app.add_event_handler("shutdown", close_mongo_connection)
264+
265+
266+
"""
267+
268+
269+
mongo_database_template = """from motor.motor_asyncio import AsyncIOMotorClient
270+
271+
272+
class DataBase:
273+
client: AsyncIOMotorClient = None
274+
275+
276+
db = DataBase()
277+
278+
279+
async def get_database() -> AsyncIOMotorClient:
280+
return db.client
281+
"""
282+
283+
mongo_utils_template = """import logging
284+
285+
from motor.motor_asyncio import AsyncIOMotorClient
286+
from {project_name}.{project_name}.models.database import db
287+
288+
logger = logging.getLogger(__name__)
289+
290+
291+
async def connect_to_mongo():
292+
db.client = AsyncIOMotorClient(str("localhost:27017"),
293+
maxPoolSize=10,
294+
minPoolSize=10)
295+
296+
logger.info(f"Connecting to mongoDB")
297+
298+
299+
async def close_mongo_connection():
300+
db.client.close()
301+
logger.info(f"Closing to mongoDB")
302+
"""

manage_fastapi/tests/test_version.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@
22

33

44
def test_version():
5-
assert __version__ == "0.1.2"
5+
assert __version__ == "0.1.3"

0 commit comments

Comments
 (0)