From 8eb04f4b17515ce85aa932ae00baf34bc2d1c9f2 Mon Sep 17 00:00:00 2001 From: Conrad Date: Tue, 2 Apr 2024 12:09:06 +0200 Subject: [PATCH] beaking: Version 1 release --- CHANGELOG.md | 7 +++++ README.md | 54 +++++++++++++++++++++++++++++++++++ creyPY/const/i18n.py | 2 ++ creyPY/fastapi/__init__.py | 2 ++ creyPY/fastapi/db/__init__.py | 1 + creyPY/fastapi/db/session.py | 26 +++++++++++++++++ requirements.txt | 13 +++++---- 7 files changed, 100 insertions(+), 5 deletions(-) create mode 100644 creyPY/fastapi/db/__init__.py create mode 100644 creyPY/fastapi/db/session.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 1350348..33606d4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,13 @@ All notable changes to this project will be documented in this file. +## 1.0.0 + +- Bumped dependencies +- Added const documentation +- Added installation instructions and examples to README +- Added sqlalchemy session for db connection + ## 0.2.0 - Added testing client diff --git a/README.md b/README.md index dad7e06..335a9ae 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,57 @@ # creyPY My collection of Python and FastAPI shortcuts etc. + +## Installation + +```bash +pip install creyPY -U +``` + +## Versioning + +This library uses [Semantic Versioning](https://semver.org/). + +## FastAPI + +This library installes fastapi and pydantic, as well as sqlalchemy for you. It also provides a sqlalchemy base class and companion pydantic schemas. Also there are some helper functions for FastAPI in `creyPY.fastapi.app` like `generate_unique_id` to generate unique operation IDs for the OpenAPI schema to work with code generators. + +### Database connection + +The `creyPY.fastapi.db` module provides a `Session` class that can be used as a context manager to connect to a database. It exposes the `SQLALCHEMY_DATABASE_URL` variable for you to use. It uses the following environment variables: + +- `POSTGRES_HOST`: The host of the database +- `POSTGRES_PORT`: The port of the database +- `POSTGRES_USER`: The user of the database +- `POSTGRES_PASSWORD`: The password of the database +- `POSTGRES_DB`: The database name + +Currently only PostgreSQL is supported. It creates a sync session, it is planned to add async support in the future. You can use this like this: + +```python +from creyPY.fastapi.db.session import get_db + +async def test_endpoint( + db: Session = Depends(get_db), +) -> Any: + pass +``` + +## Constants + +The constants module contains a few enums that I use in my projects. The best way to understand this library is to look at the code (it's not that much). However for simplicity, here is a brief overview: + +- LanguageEnum: Contains all languages according to ISO 639 +- CountryEnum: Contains all countries according to ISO 3166 +- CurrencyEnum: Contains all accepted stripe currencies (Commented out are the Zero-decimal currencies, to avoid custom implementation) +- StripeStatus: Contains all stripe payment statuses +- GroupMode: Contains time group modes (e.g. day, week, month, year) + +### Usage example + +```python +from creyPY.const import LanguageEnum + +print(LanguageEnum.EN) # Output: LanguageEnum.EN +print(LanguageEnum.EN.value) # Output: English +``` diff --git a/creyPY/const/i18n.py b/creyPY/const/i18n.py index 04edae8..fe5eac2 100644 --- a/creyPY/const/i18n.py +++ b/creyPY/const/i18n.py @@ -1,6 +1,7 @@ import enum +# Source: https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes class CountryEnum(str, enum.Enum): AF = "Afghanistan" AX = "land Islands" @@ -248,6 +249,7 @@ class CountryEnum(str, enum.Enum): ZW = "Zimbabwe" +# :: https://en.wikipedia.org/wiki/List_of_ISO_639_language_codes class LanguageEnum(str, enum.Enum): AA = "Afar" AB = "Abkhazian" diff --git a/creyPY/fastapi/__init__.py b/creyPY/fastapi/__init__.py index 3798579..1917eaa 100644 --- a/creyPY/fastapi/__init__.py +++ b/creyPY/fastapi/__init__.py @@ -1,5 +1,7 @@ from .app import * # noqa from .crud import * # noqa +from .db import * # noqa from .models import * # noqa from .pagination import * # noqa from .schemas import * # noqa +from .testing import * # noqa diff --git a/creyPY/fastapi/db/__init__.py b/creyPY/fastapi/db/__init__.py new file mode 100644 index 0000000..d13ef11 --- /dev/null +++ b/creyPY/fastapi/db/__init__.py @@ -0,0 +1 @@ +from .session import * # noqa diff --git a/creyPY/fastapi/db/session.py b/creyPY/fastapi/db/session.py new file mode 100644 index 0000000..213e56b --- /dev/null +++ b/creyPY/fastapi/db/session.py @@ -0,0 +1,26 @@ +import os +from typing import Generator + +from dotenv import load_dotenv +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker +from sqlalchemy.orm.session import Session + +load_dotenv() + +host = os.getenv("POSTGRES_HOST", "localhost") +user = os.getenv("POSTGRES_USER", "postgres") +password = os.getenv("POSTGRES_PASSWORD", "root") +port = os.getenv("POSTGRES_PORT", "5432") +name = os.getenv("POSTGRES_DB", "fastapi") + +SQLALCHEMY_DATABASE_URL = f"postgresql+psycopg://{user}:{password}@{host}:{port}/" + + +engine = create_engine(SQLALCHEMY_DATABASE_URL + name, pool_pre_ping=True) +SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) + + +def get_db() -> Generator[Session, None, None]: + with SessionLocal() as db: + yield db diff --git a/requirements.txt b/requirements.txt index c526f1e..e1018c6 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,10 +3,13 @@ pydantic==2.6.4 # Pydantic pydantic-core==2.16.3 # Pydantic typing-extensions==4.10.0 # Pydantic -anyio==4.3.0 # Pagination -fastapi==0.110.0 # Pagination -fastapi-pagination==0.12.21 # Pagination -sniffio==1.3.1 # Pagination -starlette==0.36.3 # Pagination +anyio==4.3.0 # FastAPI +fastapi==0.110.1 # FastAPI +idna==3.6 # FastAPI +sniffio==1.3.1 # FastAPI +starlette==0.37.2 # FastAPI +fastapi-pagination==0.12.21 # Pagination sqlalchemy==2.0.29 # SQLAlchemy + +python-dotenv==1.0.1 # Environment variables