Package: libgal
LibGalLibrería para agilizar el desarrollo en Python.Explorar el proyecto»Reportar errorTabla de ContenidosDescripción GeneralInstalaciónFuncionalidadesVariables de EntornoRegistro de LogsSelenium Web Browser FirefoxTeradataFastload y cargas incrementalesTeradataErrorSQLAlchemySelectInsertQuerySQLAlchemyErrorUtilidades del filesystemContactoDescripción GeneralEsta librería python fue desarrollada con la finalidad de agilizar el desarrollo de aplicaciones con funciones configurables minimizando de esta forma nuestro código python, evitando a su vez la replicación de  código en distintos proyectos, permitiendonos centrar en la funcionalidad principal de la aplicación a desarrollar.(Ir arriba)InstalaciónLa instación de esta librería se hace mediante siguiente sentencia:pipinstalllibgalPara mas información sobre la instalación de la librería, por favor consulte ladocumentación de instalación.(Ir arriba)FuncionalidadesPara hacer uso de las diferentes funcionalidades de esta librería basta con importar la misma en nuestro código con la siguiente sentencia:importlibgalUna vez importada la librería solo nos queda instanciar en una variable la función que necesitemos tal como se muestra a continuación.browser=libgal.variables_entorno()Variables de EntornoPara poder usar las variables de entorno de forma local con esta librería será necesario crear un archivo de texto cuyo nombre y extensión será “.env”. Dentro de este mismo archivo “.env” podemos especificar todas las variables secrets y configmap que utilizará nuestra aplicación, tal como se muestra en el siguiente ejemplo:#SECRETSUSERNAME=usuario@correo.comPASSWORD=contraseña#CONFIGMAPAPI_PREDICT=https://url.com/predictAPI_AUDIENCIAS=https://url.com/audienciasCANT_POST=10#Cantidad de últimos posts a descargarEs importante mencionar que al momento de desplegar nuestra aplicación no se debe subir este archivo “.env” ya que solo es para ejecuciones y pruebas en modo local simulando estar en el entorno productivo donde se debe manejar un sistema de secrets.Ahora bien, para poder usar estas variables dentro de nuestro código solo será necesario importar la librería LIBGAL e instanciar en una variable la función VARIABLES_ENTORNO, indicando como parametro la ruta y nombre del archivo .env y así poder acceder a las variables de entorno indicado en el mismo, tal cómo se muestra en el siguiente ejemplo:importlibgalve=libgal.variables_entorno('.env')api_predict=ve['API_PREDICT']api_audiencias=ve['API_AUDIENCIAS']Nótese que para invocar los nombres de las variables es necesario escribirlas en mayúscula.(Ir arriba)Registro de LogsHaciendo uso de esta librería no nos tenemos que preocupar por la configuración de nuestros registros logs, ya que la misma se encarga de ello mediante unos pocos pasos. Para hacer esto, solo debemos llamar la función LOGGER de la librería y asignarla a una variable para poder usar en el resto de nuestro código.La función LOGGER consta de dos parámetros de configuración de tipo string:format_output:(Requerido, Tipo String)Indica el tipo de formato para el registro log de nuestra aplicación. Por los momentos consta de dos tipos: “JSON” usado para los logs dentro del entorno Openshift y “CSV” para generar el log en una sola línea separados por coma (,).app_name:(Requerido, Tipo String)En este parámetro especificaremos el nombre de nuestra aplicación. Recordemos que nuestro archivo Python principal deberá llamar APP.PY.Para crear un registro log mediante esta función en nuestra aplicación solo debemos hacer uso de nuestra variable tipo LOGGER de forma muy similar al “print” de Python pero con un agregado adicional y es que podemos definir el nivel de Log para cada registro, tal como lo veremos en el siguiente código de ejemplo:Importlibgallog=libgal.logger(format_output="JSON",app_name="Instagram")log.info("Esto es un registro informativo")log.error("Esto es un registro de error")log.warning("Esto es un registro de advertencia")log.critical("Esto es un registro de error crítico")log.exception("Esto es un registro de excepción")log.log("Esto es un registro de log")Ver tests enFileLoggerTestspara mas info sobre logger con salida en archivo.(ir arriba)Selenium Web Browser FirefoxMediante la librería podemos hacer la invocación de un Web Browser de Selenium para nuestras automatizaciones, test y/o extracciones de datos de cualquier página web. Esto se logra invocando la función Firefox de la librería e instanciándola a una variable.La función consta de 4 parámetros de configuración:webdriver_path:(Requerido, Tipo String)Ruta del driver geckodriver utilizado para levantar e invocar el Web Browser de Firefox.browser_path:(Requerido, Tipo String)Ruta del ejecutable Firefox.exe del servidor o equipo local necesario para levantar el Web Browser.url:(Requerido, Tipo String)Dirección Web con la que vamos a mediante el Web Browser.Hidden: (Opcional, Tipo Booleano) Indica si el Web Browser se oculta durante su ejecución. False predeterminado.Ejemplo:importlibgalbrowser=libgal.firefox(webdriver_path=r"C:\webdrivers\geckodriver.exe",browser_path=r"C:\Program Files\Mozilla Firefox\firefox.exe",url="https://bolsar.info/Cauciones.php")(ir arriba)TeradataPara simplificar un poco las conexiones a Teradata Database se agregó esta nueva funcionalidad.La misma consta de solo 3 parámetros:Host:(Requerido, Tipo String)Indica el servidor de base de datos al cual nos deseamos conectar.User:(Requerido, Tipo String)Usuario necesario para la conexión al servidor de base de datos.Password:(Requerido, Tipo String)Contraseña con la que se autentica el usuario para poderse conectar a la base de datos.Logmech:(Opcional, Tipo String)Indica el mecanismo de autenticación del usuario. Esta función utiliza LDAP por defecto.Un ejemplo de su uso puede ser el siguiente:importlibgalcon=libgal.teradata(host='servidor',user='tu_user',password='tu_password',logmech='TD2')TeradataErrorMediante esta función podemos acceder a las diferentes excepciones de error de TeradataSQL, tal como se muestra en el siguiente ejemplo:importlibgalconexion=libgal.teradata(host='host',user='user',password='password',logmech='TD2')try:data=('1','Descripción 1')query="INSERT INTO esquema.tabla(codigo, descripcion) VALUES (?,?)"withconexion.cursor()ascursor:cursor.execute(query,data)conexion.commit()print("Los datos fueron almacenados correctmente.")exceptlibgal.TeradataErrorase:print(e)Ver tests enTeradata_Basic_Testspara mas info.(Ir arriba)HTML_ParserEstá función sirve para hacer búsquedas rápidas de etiquetas y textos dentro de un código HTML mediante funciones nativas de Beautiful Soup. Para esto solo será necesario instanciar la función en una variable pasándole por parámetro un string o variable de tipo string contentiva del código HTML a trabajar, tal cómo se muestra a continuación:importlibgalhtml='<html><head></head><body>Sacré bleu!</body></html>'soup=libgal.html_parser(html)(Ir arriba)SQLAlchemyEsta función encapsula algunas de las funcionalidades de SQLAlchemy. La funcionalidad principal de su uso consiste en la adopción de la progamación de acceso a datos mediante ORMs lo que nos permite cambiar de base de datos sin necesidad de cambiar las instrucciones CRUD dentro de nuestro código.Para la instanciación de la misma es necesario definir los siguientes parámetros:Host:(Requerido, Tipo String)Indica el servidor de base de datos al cual nos deseamos conectar.User:(Requerido, Tipo String)Usuario necesario para la conexión al servidor de base de datos.Password:(Requerido, Tipo String)Contraseña con la que se autentica el usuario para poderse conectar a la base de datos.Driver:(Requerido, Tipo String)Indica el tipo de base de datos al que nos estamos conectando. Por los momentos solo podemos definir los siguientes valores: Teradata y/o MySQL.Logmech:(Opcional, Tipo String)Indica el mecanismo de autenticación del usuario. Es función utiliza LDAP por defecto.Para comenzar a interactuar con esta función podemos seguir el siguiente ejemplo:importlibgalcon=libgal.sqlalchemy(host='host',user='usuario',password='password',driver='teradata',logmech='TD2')Para poder intectuar con las tablas de la base es necesario crear objetos que harán referencia a las mismas tal como se muestra en el siguiente ejemplo:#Creación de modelos de TablasBase=con.Base()# Defino clase de la tablaclassclase_tabla(Base):__tablename__='nombre_tabla'__table_args__={'schema':'nombre_esquema'}campo_clave=libgal.Column(libgal.Integer,primary_key=True)descripcion=libgal.Column(libgal.String)def__repr__(self):returnf"<dato(campo_clave='{self.campo_clave}', descripcion={self.descripcion})>"Notese que se creó una clase con los mismos atributos definidos para la creación de la tabla en el motor de la base de datos. A partir de aquí podemos crear objetos con los que podemos interactuar y que impactarán en la tabla de la base.Se recomienda usar sesiones para interactuar con las tablas. Estas son definidas de la siguiente forma:session=con.Session()SelectPara listar todos los registros y campos de una tabla con SQLAlchemy solo debemos crear un objeto de la siguiente forma:query_tabla=session.query(clase_tabla)datos=query_tabla.all()En caso de que se quiera hacer un select con campos específicos y que además se quiera filtrar los registros con algunos valores de uno o más campos, lo podemos hacer de la siguiente manera:query_tabla=session.query(clase_tabla.campo_clave,clase_tabla.descripcion).filter(clase_tabla.campo_clave==1)datos=query_tabla.all()InsertPara agregar un registro en la tabla solo creamos un objeto mediante la clase de la tabla que vamos a trabajar, tal como se muestra en el siguiente ejemplo:nuevo_dato=clase_tabla(campo_clave=1,descripcion='Descripción del registro')session=bd.Session()session.add(nuevo_dato)session.commit()session.close()QueryEn caso de que se requiera hacer una query especializada, con campos calculados o que implique dos o más tablas, mediante la conexión que creamos para interactuar con la base de datos, disponibilizamos un método llamado QUERY, el cual puede ser invocado como se muestra a continuación:importlibgalcon=libgal.sqlalchemy(host='host',user='usuario',password='password',driver='teradata')otra_query=con.query("select * from tabla where campo='valor'")InsertDataframeEsta función permite insertar los datos de un Dataframe de Pandas en una tabla siempre y cuando tenga los mismos nombres de campo que el Dataframe.importlibgalimportpandasd={'col1':[1,2],'col2':[3,4]}dataframe=pandas.DataFrame(data=d)con=libgal.sqlalchemy(host='host',user='usuario',password='password',driver='teradata')conn.InsertDataframe(pandas_dataframe=dataframe,database='esquema',table='tabla')Ver tests enSQLAlchemyTestspara mas info.Si el dataframe tiene más de 10000 filas es recomendable utilizarFastloadpara la carga de datos.Para mas detalles ver:TeradataSQLAlchemyErrorMediante esta función podemos acceder a las diferentes excepciones de error de SQLAlchemy, tal como se muestra en el siguiente ejemplo:importlibgalcon=libgal.sqlalchemy(host='host',user='user',password='password',driver='teradata',logmech='TD2')withcon.Session()assession:try:session.add(nuevo_dato)session.commit()print("Datos almacenadas correctamente")exceptlibgal.SQLAlchemyErrorase:session.rollback()print(e)Ver tests enSQLAlchemyTestspara mas info.(Ir arriba)ContactoJean González -@jeanmgonzalezJulian Girandez -@julgiraldezSebastian Wilwerth -@swilwerthLink del proyecto:https://github.com/jeanmgonzalez/libgal(ir arriba)