commit 6ee4d38c06f8f5cb769c686e386b3cb47d746409 Author: Jimmy Date: Sun Sep 12 20:45:44 2021 +1200 Inital commit diff --git a/.env.sample b/.env.sample new file mode 100644 index 0000000..e69de29 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fbcfa91 --- /dev/null +++ b/.gitignore @@ -0,0 +1,64 @@ +.vscode/ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +pip-wheel-metadata/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..7c4604a --- /dev/null +++ b/Dockerfile @@ -0,0 +1,6 @@ +FROM tiangolo/uvicorn-gunicorn-fastapi:python3.8-slim +ENV DOCKER=1 + +COPY ./requirements.txt / +RUN pip install -r /requirements.txt && rm /requirements.txt +COPY ./app /app/app \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..d6a83d0 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 Pixel-Hideaway + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Pipfile b/Pipfile new file mode 100644 index 0000000..40af429 --- /dev/null +++ b/Pipfile @@ -0,0 +1,23 @@ +[[source]] +url = "https://pypi.org/simple" +verify_ssl = true +name = "pypi" + +[packages] +fastapi = "*" +fastapi-responses = "*" +uvicorn = {extras = ["standard"], version = "*"} + +[dev-packages] +# pytest = "*" +# requests = "*" +# pytest-asyncio = "*" +# black = "*" +# mypy = "*" + +[requires] +python_version = "3.8" + +[scripts] +test = "pytest app/test/test_main.py -s" +dev = "uvicorn app.main:app --reload" diff --git a/README.md b/README.md new file mode 100644 index 0000000..a01d74a --- /dev/null +++ b/README.md @@ -0,0 +1,18 @@ +# FastApi Template + +```pipenv sync``` + +```pipenv sync --dev``` + +## Run local dev server + +```pipenv run dev``` + +## Run Pytest +```pipenv run test``` + +## Run in Docker + +```pipenv lock -r requirements.txt``` + +```sudo docker-compose up --build``` \ No newline at end of file diff --git a/app/__init__.py b/app/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/main.py b/app/main.py new file mode 100755 index 0000000..4679aec --- /dev/null +++ b/app/main.py @@ -0,0 +1,8 @@ +from fastapi import FastAPI + +app = FastAPI() + + +@app.get("/") +async def read_main(): + return {"msg": "Hello World"} diff --git a/app/test/__init__.py b/app/test/__init__.py new file mode 100644 index 0000000..54fc925 --- /dev/null +++ b/app/test/__init__.py @@ -0,0 +1,4 @@ +import sys +import os + +sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))) diff --git a/app/test/test_main.py b/app/test/test_main.py new file mode 100644 index 0000000..394ffe6 --- /dev/null +++ b/app/test/test_main.py @@ -0,0 +1,10 @@ +from fastapi.testclient import TestClient +import app.main + +client = TestClient(app.main.app) + + +def test_read_main(): + response = client.get("/") + assert response.status_code == 200 + assert response.json() == {"msg": "Hello World"} diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..87d315d --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,13 @@ +version: '3.7' + +services: + app: + build: . + env_file: + - .env + ports: + - 8000:80 + tty: true + stdin_open: true + + diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..f109d54 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,16 @@ +-i https://pypi.org/simple +asgiref==3.4.1; python_version >= '3.6' +click==8.0.1; python_version >= '3.6' +fastapi-responses==0.2.1 +fastapi==0.68.1 +h11==0.12.0; python_version >= '3.6' +httptools==0.2.0 +pydantic==1.8.2; python_full_version >= '3.6.1' +python-dotenv==0.19.0 +pyyaml==5.4.1 +starlette==0.14.2; python_version >= '3.6' +typing-extensions==3.10.0.2 +uvicorn[standard]==0.15.0 +uvloop==0.16.0 +watchgod==0.7 +websockets==10.0