Package: cleandev-framework
Cleandev FrameworkEsta 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 escalableDiagramaClasesPrincipalmente existen dos clasesModelAdapteryDataClassAdapterDataClassAdapterse encarga de convertir modelos en clases de datosModelAdapterse encarga de convertir clases de datos en modelosPara 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 llamadoUserla clase de datos que representa ese modelo debera llamarse_UserDataClassde este modo la librera es capaz de transformar entre tipos de modelos y tipo de clase de datos.Tiene una pinta similar a esta:fromtypingimportOptionalfromdataclassesimportfieldfromsqlalchemyimportStringfromsqlalchemyimportColumnfrompostgresql_dbimportBasefromdataclassesimportdataclassfromcleandev_validatorimportDataClassfrompostgresql_db.inmutablesimport_Paramsfromcleandev_validatorimport_DataClassConstrainsclassUser(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:strusername:stremail:strlastname:Optional[str]=field(default=None)def__post_init__(self):super(_UserDataClass,self)._validate(**self.__dict__)@propertydef__constrains__(self):return{'uuid':str(_DataClassConstrains.STR),'username':str(_DataClassConstrains.STR),'email':str(_DataClassConstrains.STR),'lastname':str(_DataClassConstrains.STR)}DataClassAdapterPosee dos metodos para el usuario finalmodel_to_dataclassylist_models_to_list_dictmodel_to_dataclassDado un modelo lo convierte a su correspondiente clase de datoslist_models_to_list_dictDado una lista de modelos retorna una lista de variables tipodictcon 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 diccionariomodel_to_dataclass()Dado un modelo lo convierte a su correspondiente clase de datosfrommodelsimportUserfrommodelsimport_UserDataClassfromcleandev_frameworkimportDataClassAdapterif__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 tipodictcon 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 diccionarioimportjsonfromcleandev_frameworkimportDataClassAdapterfrommodelsimportUserif__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"}]ModelAdapterSe encarga de convertir clases de datos en modelosdataclass_to_model()frommodelsimportUserfrommodelsimport_UserDataClassfromcleandev_frameworkimportDataClassAdapterif__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'}