Skip to main content

Cleandev Framework

Esta librería ofrece la posibilidad de transformar modelos en dto y dto en modelos de una forma fácil, esto lleva acoplado una reglas a la hora de nombrar las clases que representan los dto con respecto a los modelos de base de datos a cambio ofrece un código muchísimo más compacto y escalable

Diagrama

diagrama

Clases

Principalmente existen dos clases ModelAdapter y DataClassAdapter
DataClassAdapter se encarga de convertir modelos en clases de datos
ModelAdapter se encarga de convertir clases de datos en modelos

Para que la magia suceda debe existir una relacion de nombres entre los nombres de las clases que representan los modelos de base de datos y las clases que representan la clase de datos o "dataclass", por ejemplo:

Si tenemos un modelo de base de datos llamado User la clase de datos que representa ese modelo debera llamarse _UserDataClass de este modo la librera es capaz de transformar entre tipos de modelos y tipo de clase de datos.

Tiene una pinta similar a esta:

from typing import Optional
from dataclasses import field
from sqlalchemy import String
from sqlalchemy import Column
from postgresql_db import Base
from dataclasses import dataclass
from cleandev_validator import DataClass
from postgresql_db.inmutables import _Params
from cleandev_validator import _DataClassConstrains


class User(Base):
    __tablename__ = 'user'

    uuid = Column(String, primary_key=True)
    username = Column(String)
    email = Column(String)
    lastname = Column(String)

    def __init__(self, **kwargs):
        self.uuid = kwargs.get(_Params.UUID)
        self.username = kwargs.get(_Params.USERNAME)
        self.email = kwargs.get(_Params.EMAIL)
        self.lastname = kwargs.get(_Params.LASTNAME)


@dataclass()
class _UserDataClass(DataClass):
    uuid: str
    username: str
    email: str
    lastname: Optional[str] = field(default=None)

    def __post_init__(self):
        super(_UserDataClass, self)._validate(**self.__dict__)

    @property
    def __constrains__(self):
        return {
            'uuid': str(_DataClassConstrains.STR),
            'username': str(_DataClassConstrains.STR),
            'email': str(_DataClassConstrains.STR),
            'lastname': str(_DataClassConstrains.STR)
        }

DataClassAdapter

Posee dos metodos para el usuario final model_to_dataclass y list_models_to_list_dict model_to_dataclass Dado un modelo lo convierte a su correspondiente clase de datos
list_models_to_list_dict Dado una lista de modelos retorna una lista de variables tipo dict con los valores de las clases de datos, en el caso que desearas una instancia de la clase de datos bastaria con pasarle el diccionario en el constructor poniendo ** delante del diccionario

model_to_dataclass()

Dado un modelo lo convierte a su correspondiente clase de datos

from models import User
from models import _UserDataClass
from cleandev_framework import DataClassAdapter

if __name__ == '__main__':
    user: User = User(
        uuid='0548604f-4990-482b-977a-7c4164c816a9',
        username='Daniel',
        email='daniel@mail.com',
        lastname='Rodriguez'
    )

    user_data_class: _UserDataClass = DataClassAdapter.model_to_dataclass(user)
    user_data_class.__fields__  # ['uuid', 'username', 'email', 'lastname']
    user_data_class.__filter__(['username', 'email'])  # {'username': 'Daniel', 'email': 'daniel@mail.com'}
    user_data_class.__dict__
    # {'uuid': '0548604f-4990-482b-977a-7c4164c816a9', 'username': 'Daniel', 'email': 'daniel@mail.com', 'lastname': 'Rodriguez'}

list_models_to_list_dict()

Dado una lista de modelos retorna una lista de variables tipo dict con los valores de las clases de datos, en el caso que desearas una instancia de la clase de datos bastaria con pasarle el diccionario en el constructor poniendo ** delante del diccionario

import json

from cleandev_framework import DataClassAdapter
from models import User

if __name__ == '__main__':

    user: User = User(
        uuid='0548604f-4990-482b-977a-7c4164c816a9',
        username='Daniel',
        email='daniel@mail.com',
        lastname='Rodriguez'

    )

    # Supongamos que son usuario diferetes =)
    list_users: list = [user, user, user]
    list_dict: dict = DataClassAdapter.list_models_to_list_dict(list_users)

    print(json.dumps(list_dict, indent=4))

    [
        {
            "uuid": "0548604f-4990-482b-977a-7c4164c816a9",
            "username": "Daniel",
            "email": "daniel@mail.com",
            "lastname": "Rodriguez"
        },
        {
            "uuid": "0548604f-4990-482b-977a-7c4164c816a9",
            "username": "Daniel",
            "email": "daniel@mail.com",
            "lastname": "Rodriguez"
        },
        {
            "uuid": "0548604f-4990-482b-977a-7c4164c816a9",
            "username": "Daniel",
            "email": "daniel@mail.com",
            "lastname": "Rodriguez"
        }
    ]

ModelAdapter

Se encarga de convertir clases de datos en modelos

dataclass_to_model()

from models import User
from models import _UserDataClass
from cleandev_framework import DataClassAdapter

if __name__ == '__main__':
    user: User = User(
        uuid='0548604f-4990-482b-977a-7c4164c816a9',
        username='Daniel',
        email='daniel@mail.com',
        lastname='Rodriguez'
    )

    user_data_class: _UserDataClass = DataClassAdapter.model_to_dataclass(user)
    user_data_class.__fields__  # ['uuid', 'username', 'email', 'lastname']
    user_data_class.__filter__(['username', 'email'])  # {'username': 'Daniel', 'email': 'daniel@mail.com'}
    user_data_class.__dict__
    # {'uuid': '0548604f-4990-482b-977a-7c4164c816a9', 'username': 'Daniel', 'email': 'daniel@mail.com', 'lastname': 'Rodriguez'}

Metadata

Release files for cleandev-framework 0.1.7

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for cleandev-framework 0.1.7
File Size Uploaded
cleandev-framework-0.1.7.tar.gz 4.3 kB Details

Release files / cleandev-framework-0.1.7.tar.gz

Download URL cleandev-framework-0.1.7.tar.gz
Size 4.3 kB
Tags Source
SHA-256 checksum
How to use checksums
d601b1c27fd3ebb555670ea2e00907a54ff357e18e44657777c3f2dbd5113612
BLAKE2b-256 checksum
How to use checksums
3a5a1c471bfb95f5fd2527e58c5c8ab9c63e77539a8d0097bd36e86f0d6bdc7f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.0 CPython/3.9.10

Release history Release notifications | RSS feed

This release

0.1.7 This release

1 release file

0.1.6

1 release file

0.1.5

1 release file

0.1.4

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page