wip
This commit is contained in:
parent
28eda9e899
commit
4ad297a291
6 changed files with 45 additions and 18 deletions
|
|
@ -1,13 +1,15 @@
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Annotated
|
from typing import Annotated
|
||||||
|
|
||||||
import alembic
|
|
||||||
from alembic.config import Config
|
|
||||||
import copier
|
import copier
|
||||||
import typer
|
import typer
|
||||||
|
|
||||||
from learn_sql_model.cli.common import verbose_callback
|
from learn_sql_model.cli.common import verbose_callback
|
||||||
from learn_sql_model.config import get_config
|
from learn_sql_model.config import get_config
|
||||||
|
from learn_sql_model.optional import _optional_import_
|
||||||
|
|
||||||
|
alembic = _optional_import_('alembic', group='manage')
|
||||||
|
Config = _optional_import_('alembic.config', 'Config', group='manage')
|
||||||
|
|
||||||
model_app = typer.Typer()
|
model_app = typer.Typer()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,6 @@ class HeroFactory(ModelFactory[Hero]):
|
||||||
__model__ = Hero
|
__model__ = Hero
|
||||||
__faker__ = Faker(locale="en_US")
|
__faker__ = Faker(locale="en_US")
|
||||||
__set_as_default_factory_for_type__ = True
|
__set_as_default_factory_for_type__ = True
|
||||||
id = None
|
|
||||||
pet_id = None
|
pet_id = None
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,9 @@ from sqlmodel import Field, SQLModel
|
||||||
|
|
||||||
from learn_sql_model.config import config
|
from learn_sql_model.config import config
|
||||||
|
|
||||||
|
from learn_sql_model.optional import optional
|
||||||
|
from learn_sql_model.models.pet import Pet
|
||||||
|
|
||||||
|
|
||||||
class HeroBase(SQLModel, table=False):
|
class HeroBase(SQLModel, table=False):
|
||||||
name: str
|
name: str
|
||||||
|
|
@ -21,7 +24,7 @@ class HeroBase(SQLModel, table=False):
|
||||||
|
|
||||||
|
|
||||||
class Hero(HeroBase, table=True):
|
class Hero(HeroBase, table=True):
|
||||||
id: Optional[int] = Field(default=None, primary_key=True)
|
id: int = Field(default=None, primary_key=True)
|
||||||
|
|
||||||
|
|
||||||
class HeroCreate(HeroBase):
|
class HeroCreate(HeroBase):
|
||||||
|
|
@ -65,21 +68,10 @@ class Heros(BaseModel):
|
||||||
return Heros.parse_obj({"__root__": r.json()})
|
return Heros.parse_obj({"__root__": r.json()})
|
||||||
|
|
||||||
|
|
||||||
class HeroUpdate(SQLModel):
|
@optional
|
||||||
# id is required to update the hero
|
class HeroUpdate(HeroBase):
|
||||||
id: int
|
id: int
|
||||||
|
|
||||||
# all other fields, must match the model, but with Optional default None
|
|
||||||
name: Optional[str] = None
|
|
||||||
secret_name: Optional[str] = None
|
|
||||||
# age: Optional[int] = None
|
|
||||||
# shoe_size: Optional[int] = None
|
|
||||||
# x: Optional[int]
|
|
||||||
# y: Optional[int]
|
|
||||||
|
|
||||||
# pet_id: Optional[int] = Field(default=None, foreign_key="pet.id")
|
|
||||||
# pet: Optional[Pet] = Relationship(back_populates="hero")
|
|
||||||
|
|
||||||
def update(self) -> Hero:
|
def update(self) -> Hero:
|
||||||
r = httpx.patch(
|
r = httpx.patch(
|
||||||
f"{config.api_client.url}/hero/",
|
f"{config.api_client.url}/hero/",
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,8 @@
|
||||||
|
from typing import List, Optional
|
||||||
import textwrap
|
import textwrap
|
||||||
|
import inspect
|
||||||
|
|
||||||
|
from pydantic import BaseModel
|
||||||
|
|
||||||
def _optional_import_(
|
def _optional_import_(
|
||||||
module: str,
|
module: str,
|
||||||
|
|
@ -61,3 +64,33 @@ def _optional_import_(
|
||||||
self._failed_import()
|
self._failed_import()
|
||||||
|
|
||||||
return _failed_import()
|
return _failed_import()
|
||||||
|
|
||||||
|
|
||||||
|
# def optional(fields: Optional[List[str]]=None, required: Optional[List[str]]=None):
|
||||||
|
# def decorator(cls):
|
||||||
|
# def wrapper(*args, **kwargs):
|
||||||
|
# if fields is None:
|
||||||
|
# fields = cls.__fields__
|
||||||
|
# if required is None:
|
||||||
|
# required = []
|
||||||
|
#
|
||||||
|
# for field in fields:
|
||||||
|
# if field not in required:
|
||||||
|
# cls.__fields__[field].required = False
|
||||||
|
# return _cls
|
||||||
|
# return wrapper
|
||||||
|
# return decorator
|
||||||
|
#
|
||||||
|
#
|
||||||
|
def optional(*fields):
|
||||||
|
def dec(_cls):
|
||||||
|
for field in fields:
|
||||||
|
_cls.__fields__[field].required = False
|
||||||
|
return _cls
|
||||||
|
|
||||||
|
if fields and inspect.isclass(fields[0]) and issubclass(fields[0], BaseModel):
|
||||||
|
cls = fields[0]
|
||||||
|
fields = cls.__fields__
|
||||||
|
return dec(cls)
|
||||||
|
return dec
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,7 @@ classifiers = [
|
||||||
"Programming Language :: Python :: Implementation :: PyPy",
|
"Programming Language :: Python :: Implementation :: PyPy",
|
||||||
]
|
]
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"black",
|
||||||
"python-socketio[client]",
|
"python-socketio[client]",
|
||||||
"anyconfig",
|
"anyconfig",
|
||||||
"copier",
|
"copier",
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@ class {{ modelname }}Base(SQLModel, table=False):
|
||||||
|
|
||||||
|
|
||||||
class {{ modelname }}({{ modelname }}Base, table=True):
|
class {{ modelname }}({{ modelname }}Base, table=True):
|
||||||
id: Optional[int] = Field(default=None, primary_key=True)
|
id: int = Field(default=None, primary_key=True)
|
||||||
|
|
||||||
|
|
||||||
class {{ modelname }}Create({{ modelname }}Base):
|
class {{ modelname }}Create({{ modelname }}Base):
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue