From fbe720b29b0b7375b83579cf0a5b12416377f665 Mon Sep 17 00:00:00 2001 From: Andrew Myers Date: Thu, 23 Mar 2023 11:36:12 -0400 Subject: [PATCH 1/7] Adds factories for test data Uses pydantic-factories package to add factories for generating test data for Chowda models. Also: * Adds *.sqlite to gitignore. --- .gitignore | 2 +- chowda/factories.py | 50 +++++++++++++++++++++++++++++++++++++++++++++ pyproject.toml | 1 + requirements.txt | 1 + 4 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 chowda/factories.py diff --git a/.gitignore b/.gitignore index 895a19b2..2d79bd53 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ __pycache__ # Development sqlite db -chowda.sqlite +*.sqlite diff --git a/chowda/factories.py b/chowda/factories.py new file mode 100644 index 00000000..c085fa42 --- /dev/null +++ b/chowda/factories.py @@ -0,0 +1,50 @@ +from .models import ( + MediaFile, + Collection, + ClamsApp +) +from pydantic_factories import ( + ModelFactory, + SyncPersistenceProtocol, + AsyncPersistenceProtocol +) +from typing import TypeVar, List +from pydantic import BaseModel +from sqlmodel import Session +from .app import engine + +T = TypeVar("T", bound=BaseModel) + +class SyncPersistenceHandler(SyncPersistenceProtocol[T]): + def save(self, data: T) -> T: + with Session(engine) as session: + session.add(d) + session.commit() + + def save_many(self, data: List[T]) -> List[T]: + with Session(engine) as session: + for d in data: + session.add(d) + session.commit() + +class AsyncPersistenceHandler(AsyncPersistenceProtocol[T]): + async def save(self, data: T) -> T: + # TODO: impelement + pass + + async def save_many(self, data: List[T]) -> List[T]: + # TODO: impelement + pass + +class ChowdaFactory(ModelFactory): + __sync_persistence__ = SyncPersistenceHandler + __async_persistence__ = AsyncPersistenceHandler + +class MediaFileFactory(ChowdaFactory): + __model__ = MediaFile + +class CollectionFactory(ChowdaFactory): + __model__ = Collection + +class ClamsAppFactory(ChowdaFactory): + __model__ = ClamsApp diff --git a/pyproject.toml b/pyproject.toml index 3abc64b4..bb9c8460 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,6 +12,7 @@ fastapi = "^0.92.0" starlette-admin = "^0.5.2" sqlmodel = "^0.0.8" pydantic = {extras = ["email"], version = "^1.10.5"} +pydantic-factories = "^1.17.2" [tool.poetry.group.dev.dependencies] uvicorn = "^0.20.0" diff --git a/requirements.txt b/requirements.txt index db379ff9..3a656f6f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,3 +2,4 @@ starlette-admin uvicorn sqlmodel pydantic[email] +pydantic-factories From 3a89e2b25d4cd110513458fd45414c0512b24336 Mon Sep 17 00:00:00 2001 From: Harpo Harbert Date: Thu, 23 Mar 2023 14:47:39 -0700 Subject: [PATCH 2/7] Adds async persistence implementation --- chowda/app.py | 5 +---- chowda/db.py | 12 ++++++++++++ chowda/factories.py | 31 +++++++++++++++++++------------ 3 files changed, 32 insertions(+), 16 deletions(-) create mode 100644 chowda/db.py diff --git a/chowda/app.py b/chowda/app.py index c7f37edd..3769e838 100644 --- a/chowda/app.py +++ b/chowda/app.py @@ -1,16 +1,13 @@ from fastapi import FastAPI -from sqlalchemy import create_engine from starlette.responses import HTMLResponse from starlette.routing import Route from starlette_admin.contrib.sqlmodel import Admin, ModelView from sqlmodel import SQLModel -from .config import ENGINE_URI from .models import User, MediaFile, Collection, ClamsApp, Pipeline, Batch, ClamsEvent from ._version import __version__ - -engine = create_engine(ENGINE_URI, connect_args={'check_same_thread': False}, echo=True) +from .db import engine def init_database() -> None: diff --git a/chowda/db.py b/chowda/db.py new file mode 100644 index 00000000..0c9b66b5 --- /dev/null +++ b/chowda/db.py @@ -0,0 +1,12 @@ +from sqlalchemy import create_engine +from .config import ENGINE_URI + +engine = create_engine(ENGINE_URI, connect_args={'check_same_thread': False}, echo=True) + + +def create_async_engine(): + from sqlmodel.ext.asyncio.session import AsyncEngine + + return AsyncEngine( + create_engine(ENGINE_URI, connect_args={'check_same_thread': False}, echo=True) + ) diff --git a/chowda/factories.py b/chowda/factories.py index c085fa42..289ef5c9 100644 --- a/chowda/factories.py +++ b/chowda/factories.py @@ -1,24 +1,23 @@ -from .models import ( - MediaFile, - Collection, - ClamsApp -) +from chowda.app import engine +from chowda.config import ENGINE_URI +from chowda.models import MediaFile, Collection, ClamsApp from pydantic_factories import ( ModelFactory, SyncPersistenceProtocol, - AsyncPersistenceProtocol + AsyncPersistenceProtocol, ) from typing import TypeVar, List from pydantic import BaseModel from sqlmodel import Session -from .app import engine +from sqlmodel.ext.asyncio.session import AsyncSession, AsyncEngine T = TypeVar("T", bound=BaseModel) + class SyncPersistenceHandler(SyncPersistenceProtocol[T]): def save(self, data: T) -> T: with Session(engine) as session: - session.add(d) + session.add(data) session.commit() def save_many(self, data: List[T]) -> List[T]: @@ -27,24 +26,32 @@ def save_many(self, data: List[T]) -> List[T]: session.add(d) session.commit() + class AsyncPersistenceHandler(AsyncPersistenceProtocol[T]): async def save(self, data: T) -> T: - # TODO: impelement - pass + async with AsyncSession(engine) as session: + session.add(data) + await session.commit() async def save_many(self, data: List[T]) -> List[T]: - # TODO: impelement - pass + async with AsyncSession(engine) as session: + for d in data: + session.add(d) + await session.commit() + class ChowdaFactory(ModelFactory): __sync_persistence__ = SyncPersistenceHandler __async_persistence__ = AsyncPersistenceHandler + class MediaFileFactory(ChowdaFactory): __model__ = MediaFile + class CollectionFactory(ChowdaFactory): __model__ = Collection + class ClamsAppFactory(ChowdaFactory): __model__ = ClamsApp From ce26c820627f13189eff091dfd89d712506a0c29 Mon Sep 17 00:00:00 2001 From: Harpo Harbert Date: Thu, 23 Mar 2023 14:57:10 -0700 Subject: [PATCH 3/7] Moves pydantic-factories to dev dependencies --- poetry.lock | 137 +++++++++++++++++++++++++++++++++++-------------- pyproject.toml | 2 +- 2 files changed, 99 insertions(+), 40 deletions(-) diff --git a/poetry.lock b/poetry.lock index 1975fd81..c3829e7d 100644 --- a/poetry.lock +++ b/poetry.lock @@ -236,6 +236,21 @@ files = [ [package.extras] test = ["pytest (>=6)"] +[[package]] +name = "faker" +version = "18.3.1" +description = "Faker is a Python package that generates fake data for you." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "Faker-18.3.1-py3-none-any.whl", hash = "sha256:4c98c42984db54be2246d40e6407cd983db7b1511a70eaff64c3f383a51bace6"}, + {file = "Faker-18.3.1.tar.gz", hash = "sha256:9bd71833146b844d848791b79720c7806108130c9603c7074123b3f77b4e97a1"}, +] + +[package.dependencies] +python-dateutil = ">=2.4" + [[package]] name = "fastapi" version = "0.92.0" @@ -557,48 +572,48 @@ files = [ [[package]] name = "pydantic" -version = "1.10.6" +version = "1.10.7" description = "Data validation and settings management using python type hints" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "pydantic-1.10.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f9289065611c48147c1dd1fd344e9d57ab45f1d99b0fb26c51f1cf72cd9bcd31"}, - {file = "pydantic-1.10.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8c32b6bba301490d9bb2bf5f631907803135e8085b6aa3e5fe5a770d46dd0160"}, - {file = "pydantic-1.10.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd9b9e98068fa1068edfc9eabde70a7132017bdd4f362f8b4fd0abed79c33083"}, - {file = "pydantic-1.10.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c84583b9df62522829cbc46e2b22e0ec11445625b5acd70c5681ce09c9b11c4"}, - {file = "pydantic-1.10.6-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:b41822064585fea56d0116aa431fbd5137ce69dfe837b599e310034171996084"}, - {file = "pydantic-1.10.6-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:61f1f08adfaa9cc02e0cbc94f478140385cbd52d5b3c5a657c2fceb15de8d1fb"}, - {file = "pydantic-1.10.6-cp310-cp310-win_amd64.whl", hash = "sha256:32937835e525d92c98a1512218db4eed9ddc8f4ee2a78382d77f54341972c0e7"}, - {file = "pydantic-1.10.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bbd5c531b22928e63d0cb1868dee76123456e1de2f1cb45879e9e7a3f3f1779b"}, - {file = "pydantic-1.10.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e277bd18339177daa62a294256869bbe84df1fb592be2716ec62627bb8d7c81d"}, - {file = "pydantic-1.10.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89f15277d720aa57e173954d237628a8d304896364b9de745dcb722f584812c7"}, - {file = "pydantic-1.10.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b243b564cea2576725e77aeeda54e3e0229a168bc587d536cd69941e6797543d"}, - {file = "pydantic-1.10.6-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3ce13a558b484c9ae48a6a7c184b1ba0e5588c5525482681db418268e5f86186"}, - {file = "pydantic-1.10.6-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3ac1cd4deed871dfe0c5f63721e29debf03e2deefa41b3ed5eb5f5df287c7b70"}, - {file = "pydantic-1.10.6-cp311-cp311-win_amd64.whl", hash = "sha256:b1eb6610330a1dfba9ce142ada792f26bbef1255b75f538196a39e9e90388bf4"}, - {file = "pydantic-1.10.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4ca83739c1263a044ec8b79df4eefc34bbac87191f0a513d00dd47d46e307a65"}, - {file = "pydantic-1.10.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea4e2a7cb409951988e79a469f609bba998a576e6d7b9791ae5d1e0619e1c0f2"}, - {file = "pydantic-1.10.6-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:53de12b4608290992a943801d7756f18a37b7aee284b9ffa794ee8ea8153f8e2"}, - {file = "pydantic-1.10.6-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:60184e80aac3b56933c71c48d6181e630b0fbc61ae455a63322a66a23c14731a"}, - {file = "pydantic-1.10.6-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:415a3f719ce518e95a92effc7ee30118a25c3d032455d13e121e3840985f2efd"}, - {file = "pydantic-1.10.6-cp37-cp37m-win_amd64.whl", hash = "sha256:72cb30894a34d3a7ab6d959b45a70abac8a2a93b6480fc5a7bfbd9c935bdc4fb"}, - {file = "pydantic-1.10.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3091d2eaeda25391405e36c2fc2ed102b48bac4b384d42b2267310abae350ca6"}, - {file = "pydantic-1.10.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:751f008cd2afe812a781fd6aa2fb66c620ca2e1a13b6a2152b1ad51553cb4b77"}, - {file = "pydantic-1.10.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:12e837fd320dd30bd625be1b101e3b62edc096a49835392dcf418f1a5ac2b832"}, - {file = "pydantic-1.10.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:587d92831d0115874d766b1f5fddcdde0c5b6c60f8c6111a394078ec227fca6d"}, - {file = "pydantic-1.10.6-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:476f6674303ae7965730a382a8e8d7fae18b8004b7b69a56c3d8fa93968aa21c"}, - {file = "pydantic-1.10.6-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3a2be0a0f32c83265fd71a45027201e1278beaa82ea88ea5b345eea6afa9ac7f"}, - {file = "pydantic-1.10.6-cp38-cp38-win_amd64.whl", hash = "sha256:0abd9c60eee6201b853b6c4be104edfba4f8f6c5f3623f8e1dba90634d63eb35"}, - {file = "pydantic-1.10.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6195ca908045054dd2d57eb9c39a5fe86409968b8040de8c2240186da0769da7"}, - {file = "pydantic-1.10.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:43cdeca8d30de9a897440e3fb8866f827c4c31f6c73838e3a01a14b03b067b1d"}, - {file = "pydantic-1.10.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c19eb5163167489cb1e0161ae9220dadd4fc609a42649e7e84a8fa8fff7a80f"}, - {file = "pydantic-1.10.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:012c99a9c0d18cfde7469aa1ebff922e24b0c706d03ead96940f5465f2c9cf62"}, - {file = "pydantic-1.10.6-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:528dcf7ec49fb5a84bf6fe346c1cc3c55b0e7603c2123881996ca3ad79db5bfc"}, - {file = "pydantic-1.10.6-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:163e79386c3547c49366e959d01e37fc30252285a70619ffc1b10ede4758250a"}, - {file = "pydantic-1.10.6-cp39-cp39-win_amd64.whl", hash = "sha256:189318051c3d57821f7233ecc94708767dd67687a614a4e8f92b4a020d4ffd06"}, - {file = "pydantic-1.10.6-py3-none-any.whl", hash = "sha256:acc6783751ac9c9bc4680379edd6d286468a1dc8d7d9906cd6f1186ed682b2b0"}, - {file = "pydantic-1.10.6.tar.gz", hash = "sha256:cf95adb0d1671fc38d8c43dd921ad5814a735e7d9b4d9e437c088002863854fd"}, + {file = "pydantic-1.10.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e79e999e539872e903767c417c897e729e015872040e56b96e67968c3b918b2d"}, + {file = "pydantic-1.10.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:01aea3a42c13f2602b7ecbbea484a98169fb568ebd9e247593ea05f01b884b2e"}, + {file = "pydantic-1.10.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:516f1ed9bc2406a0467dd777afc636c7091d71f214d5e413d64fef45174cfc7a"}, + {file = "pydantic-1.10.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae150a63564929c675d7f2303008d88426a0add46efd76c3fc797cd71cb1b46f"}, + {file = "pydantic-1.10.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ecbbc51391248116c0a055899e6c3e7ffbb11fb5e2a4cd6f2d0b93272118a209"}, + {file = "pydantic-1.10.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f4a2b50e2b03d5776e7f21af73e2070e1b5c0d0df255a827e7c632962f8315af"}, + {file = "pydantic-1.10.7-cp310-cp310-win_amd64.whl", hash = "sha256:a7cd2251439988b413cb0a985c4ed82b6c6aac382dbaff53ae03c4b23a70e80a"}, + {file = "pydantic-1.10.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:68792151e174a4aa9e9fc1b4e653e65a354a2fa0fed169f7b3d09902ad2cb6f1"}, + {file = "pydantic-1.10.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe2507b8ef209da71b6fb5f4e597b50c5a34b78d7e857c4f8f3115effaef5fe"}, + {file = "pydantic-1.10.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10a86d8c8db68086f1e30a530f7d5f83eb0685e632e411dbbcf2d5c0150e8dcd"}, + {file = "pydantic-1.10.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d75ae19d2a3dbb146b6f324031c24f8a3f52ff5d6a9f22f0683694b3afcb16fb"}, + {file = "pydantic-1.10.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:464855a7ff7f2cc2cf537ecc421291b9132aa9c79aef44e917ad711b4a93163b"}, + {file = "pydantic-1.10.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:193924c563fae6ddcb71d3f06fa153866423ac1b793a47936656e806b64e24ca"}, + {file = "pydantic-1.10.7-cp311-cp311-win_amd64.whl", hash = "sha256:b4a849d10f211389502059c33332e91327bc154acc1845f375a99eca3afa802d"}, + {file = "pydantic-1.10.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cc1dde4e50a5fc1336ee0581c1612215bc64ed6d28d2c7c6f25d2fe3e7c3e918"}, + {file = "pydantic-1.10.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0cfe895a504c060e5d36b287ee696e2fdad02d89e0d895f83037245218a87fe"}, + {file = "pydantic-1.10.7-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:670bb4683ad1e48b0ecb06f0cfe2178dcf74ff27921cdf1606e527d2617a81ee"}, + {file = "pydantic-1.10.7-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:950ce33857841f9a337ce07ddf46bc84e1c4946d2a3bba18f8280297157a3fd1"}, + {file = "pydantic-1.10.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c15582f9055fbc1bfe50266a19771bbbef33dd28c45e78afbe1996fd70966c2a"}, + {file = "pydantic-1.10.7-cp37-cp37m-win_amd64.whl", hash = "sha256:82dffb306dd20bd5268fd6379bc4bfe75242a9c2b79fec58e1041fbbdb1f7914"}, + {file = "pydantic-1.10.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8c7f51861d73e8b9ddcb9916ae7ac39fb52761d9ea0df41128e81e2ba42886cd"}, + {file = "pydantic-1.10.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6434b49c0b03a51021ade5c4daa7d70c98f7a79e95b551201fff682fc1661245"}, + {file = "pydantic-1.10.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64d34ab766fa056df49013bb6e79921a0265204c071984e75a09cbceacbbdd5d"}, + {file = "pydantic-1.10.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:701daea9ffe9d26f97b52f1d157e0d4121644f0fcf80b443248434958fd03dc3"}, + {file = "pydantic-1.10.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:cf135c46099ff3f919d2150a948ce94b9ce545598ef2c6c7bf55dca98a304b52"}, + {file = "pydantic-1.10.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b0f85904f73161817b80781cc150f8b906d521fa11e3cdabae19a581c3606209"}, + {file = "pydantic-1.10.7-cp38-cp38-win_amd64.whl", hash = "sha256:9f6f0fd68d73257ad6685419478c5aece46432f4bdd8d32c7345f1986496171e"}, + {file = "pydantic-1.10.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c230c0d8a322276d6e7b88c3f7ce885f9ed16e0910354510e0bae84d54991143"}, + {file = "pydantic-1.10.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:976cae77ba6a49d80f461fd8bba183ff7ba79f44aa5cfa82f1346b5626542f8e"}, + {file = "pydantic-1.10.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d45fc99d64af9aaf7e308054a0067fdcd87ffe974f2442312372dfa66e1001d"}, + {file = "pydantic-1.10.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d2a5ebb48958754d386195fe9e9c5106f11275867051bf017a8059410e9abf1f"}, + {file = "pydantic-1.10.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:abfb7d4a7cd5cc4e1d1887c43503a7c5dd608eadf8bc615413fc498d3e4645cd"}, + {file = "pydantic-1.10.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:80b1fab4deb08a8292d15e43a6edccdffa5377a36a4597bb545b93e79c5ff0a5"}, + {file = "pydantic-1.10.7-cp39-cp39-win_amd64.whl", hash = "sha256:d71e69699498b020ea198468e2480a2f1e7433e32a3a99760058c6520e2bea7e"}, + {file = "pydantic-1.10.7-py3-none-any.whl", hash = "sha256:0cd181f1d0b1d00e2b705f1bf1ac7799a2d938cce3376b8007df62b29be3c2c6"}, + {file = "pydantic-1.10.7.tar.gz", hash = "sha256:cfc83c0678b6ba51b0532bea66860617c4cd4251ecf76e9846fa5a9f3454e97e"}, ] [package.dependencies] @@ -609,6 +624,23 @@ typing-extensions = ">=4.2.0" dotenv = ["python-dotenv (>=0.10.4)"] email = ["email-validator (>=1.0.3)"] +[[package]] +name = "pydantic-factories" +version = "1.17.2" +description = "Mock data generation for pydantic based models and python dataclasses" +category = "dev" +optional = false +python-versions = ">=3.8,<4.0" +files = [ + {file = "pydantic_factories-1.17.2-py3-none-any.whl", hash = "sha256:e1378700a9e963b368b602e46e8ccc3331027f10233e617eb47b3a3dd052ee25"}, + {file = "pydantic_factories-1.17.2.tar.gz", hash = "sha256:a1ea1d3a595235a65f954d6e182ec4bfe94645f2c4d986fd43ae19a62ffb90b0"}, +] + +[package.dependencies] +faker = "*" +pydantic = ">=1.10.0" +typing-extensions = "*" + [[package]] name = "pyflakes" version = "3.0.1" @@ -664,6 +696,21 @@ pytest = ">=4.6" [package.extras] testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"] +[[package]] +name = "python-dateutil" +version = "2.8.2" +description = "Extensions to the standard Python datetime module" +category = "dev" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] + +[package.dependencies] +six = ">=1.5" + [[package]] name = "python-multipart" version = "0.0.6" @@ -679,6 +726,18 @@ files = [ [package.extras] dev = ["atomicwrites (==1.2.1)", "attrs (==19.2.0)", "coverage (==6.5.0)", "hatch", "invoke (==1.7.3)", "more-itertools (==4.3.0)", "pbr (==4.3.0)", "pluggy (==1.0.0)", "py (==1.11.0)", "pytest (==7.2.0)", "pytest-cov (==4.0.0)", "pytest-timeout (==2.1.0)", "pyyaml (==5.1)"] +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + [[package]] name = "sniffio" version = "1.3.0" @@ -743,7 +802,7 @@ files = [ ] [package.dependencies] -greenlet = {version = "!=0.4.17", markers = "python_version >= \"3\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"} +greenlet = {version = "!=0.4.17", markers = "python_version >= \"3\" and platform_machine == \"aarch64\" or python_version >= \"3\" and platform_machine == \"ppc64le\" or python_version >= \"3\" and platform_machine == \"x86_64\" or python_version >= \"3\" and platform_machine == \"amd64\" or python_version >= \"3\" and platform_machine == \"AMD64\" or python_version >= \"3\" and platform_machine == \"win32\" or python_version >= \"3\" and platform_machine == \"WIN32\""} [package.extras] aiomysql = ["aiomysql", "greenlet (!=0.4.17)"] @@ -880,4 +939,4 @@ standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", [metadata] lock-version = "2.0" python-versions = "^3.8.1" -content-hash = "476f83ea47c53ed9dd34bdcdca15cbd4698069a330365c11367c15161607c274" +content-hash = "5e3af9fb1b5a6a2b820fa5f0a94f00aa93bc5ebb3f817788404636f11fc4f0a3" diff --git a/pyproject.toml b/pyproject.toml index bb9c8460..6afad36e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,12 +12,12 @@ fastapi = "^0.92.0" starlette-admin = "^0.5.2" sqlmodel = "^0.0.8" pydantic = {extras = ["email"], version = "^1.10.5"} -pydantic-factories = "^1.17.2" [tool.poetry.group.dev.dependencies] uvicorn = "^0.20.0" black = "^23.1.0" flake8 = "^6.0.0" +pydantic-factories = "^1.17.2" [tool.poetry.group.test] optional = true From 9652e059c8d965aca9c87f2be5b0ae407c40b9b0 Mon Sep 17 00:00:00 2001 From: Harpo Harbert Date: Fri, 24 Mar 2023 09:44:31 -0700 Subject: [PATCH 4/7] Adds rest of factories --- chowda/factories.py | 37 +++++++++++++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/chowda/factories.py b/chowda/factories.py index 289ef5c9..57b8ab1c 100644 --- a/chowda/factories.py +++ b/chowda/factories.py @@ -1,6 +1,14 @@ -from chowda.app import engine -from chowda.config import ENGINE_URI -from chowda.models import MediaFile, Collection, ClamsApp +from chowda.db import engine +from chowda.models import ( + MediaFile, + Collection, + ClamsApp, + User, + MediaFileCollectionLink, + MediaFileBatchLink, + Pipeline, + ClamsEvent, +) from pydantic_factories import ( ModelFactory, SyncPersistenceProtocol, @@ -9,7 +17,7 @@ from typing import TypeVar, List from pydantic import BaseModel from sqlmodel import Session -from sqlmodel.ext.asyncio.session import AsyncSession, AsyncEngine +from sqlmodel.ext.asyncio.session import AsyncSession T = TypeVar("T", bound=BaseModel) @@ -41,6 +49,7 @@ async def save_many(self, data: List[T]) -> List[T]: class ChowdaFactory(ModelFactory): + __allow_none_optionals__ = False __sync_persistence__ = SyncPersistenceHandler __async_persistence__ = AsyncPersistenceHandler @@ -55,3 +64,23 @@ class CollectionFactory(ChowdaFactory): class ClamsAppFactory(ChowdaFactory): __model__ = ClamsApp + + +class UserFactory(ChowdaFactory): + __model__ = User + + +class MediaFileCollectionLinkFactory(ChowdaFactory): + __model__ = MediaFileCollectionLink + + +class MediaFileBatchLinkFactory(ChowdaFactory): + __model__ = MediaFileBatchLink + + +class PipelineFactory(ChowdaFactory): + __model__ = Pipeline + + +class ClamsEventFactory(ChowdaFactory): + __model__ = ClamsEvent From f06e871ddc589044ebd574557a74e3e17a40ea47 Mon Sep 17 00:00:00 2001 From: Andrew Myers Date: Fri, 24 Mar 2023 13:28:51 -0400 Subject: [PATCH 5/7] Removes factories for link tables; Adds factory for Batches --- Dockerfile | 2 +- chowda/factories.py | 15 +++++---------- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/Dockerfile b/Dockerfile index 754f906f..82066712 100644 --- a/Dockerfile +++ b/Dockerfile @@ -18,4 +18,4 @@ COPY chowda chowda RUN pip install . -CMD uvicorn chowda:app --host 0.0.0.0 +CMD uvicorn chowda:app --host 0.0.0.0 --reload diff --git a/chowda/factories.py b/chowda/factories.py index 57b8ab1c..c93c68b7 100644 --- a/chowda/factories.py +++ b/chowda/factories.py @@ -4,10 +4,9 @@ Collection, ClamsApp, User, - MediaFileCollectionLink, - MediaFileBatchLink, Pipeline, ClamsEvent, + Batch ) from pydantic_factories import ( ModelFactory, @@ -70,17 +69,13 @@ class UserFactory(ChowdaFactory): __model__ = User -class MediaFileCollectionLinkFactory(ChowdaFactory): - __model__ = MediaFileCollectionLink - - -class MediaFileBatchLinkFactory(ChowdaFactory): - __model__ = MediaFileBatchLink - - class PipelineFactory(ChowdaFactory): __model__ = Pipeline class ClamsEventFactory(ChowdaFactory): __model__ = ClamsEvent + + +class BatchFactory(ChowdaFactory): + __model__ = Batch From 4fd34b98fafb21f1917648f4ebe44c14d97e79e1 Mon Sep 17 00:00:00 2001 From: Harpo Harbert Date: Fri, 24 Mar 2023 10:46:41 -0700 Subject: [PATCH 6/7] Add trailing comma for black --- chowda/factories.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chowda/factories.py b/chowda/factories.py index c93c68b7..337ab8fa 100644 --- a/chowda/factories.py +++ b/chowda/factories.py @@ -6,7 +6,7 @@ User, Pipeline, ClamsEvent, - Batch + Batch, ) from pydantic_factories import ( ModelFactory, From 0534031f2f3ec70e2873eef8610025b5595e97b6 Mon Sep 17 00:00:00 2001 From: Harpo Harbert Date: Fri, 24 Mar 2023 10:50:25 -0700 Subject: [PATCH 7/7] Moves factories to tests --- {chowda => tests}/factories.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {chowda => tests}/factories.py (100%) diff --git a/chowda/factories.py b/tests/factories.py similarity index 100% rename from chowda/factories.py rename to tests/factories.py