martes, 18 de junio de 2024

Python (IV). Crear librerías. Ejecutar las pruebas. Guardarlas en pypi

Ver también CodeCamp pero con cuidado pues no hace falta meter los ficheros __init__.py en cada carpeta!!! O ver tambien Medium 

Para crear una librería hay que realizar los siguientes pasos básicos:

1. Crear la carpeta padre del proyecto y crear un entorno virtual en ella

Creamos por ejemplo la carpeta mymodule, y dentro de ella creamos el entorno virtual virtualenv

#Creamos la carpeta padre y nos situamo dentro de ella
mkdir mymodule
cd mymodule

#Si no tenemos instalado para crear el entorno virtual lo instalamos
pip install virtualenv 

# Creamos el entormo virtual y lo activamos
python -m venv myenv
myenv\Scripts\activate.bat

2. Instal·lar en dicho entorno virtual las librerias wheel, setuptools y twine


#Nos situamos dentro de la carpeta padre e instalamos
pip install setuptools wheel twine


3. Creamos la estructura del proyecto: las subcarpetas ximo01, ximo02 y test

#Creamos las subcarpetas ximo01, ximo02 y test 
mkdir ximo01
mkdir ximo02
mkdir test
cd mymodule

#Si no tenemos instalado para crear el entorno virtual lo instalamos
mymodule/
│
├── mi_paquete/
│   ├── __init__.py
│   ├── subcarpeta1/
│   │   ├── __init__.py
│   │   ├── modulo1.py
│   │   └── modulo2.py
│   ├── subcarpeta2/
│   │   ├── __init__.py
│   │   ├── modulo3.py
│   │   └── modulo4.py
│   └── subcarpeta3/
│       ├── __init__.py
│       ├── modulo5.py
│       └── modulo6.py

4. Crear entorno virtual y activarlo


#Si no tenemos instalado para crear el entorno virtual lo instalamos
pip install virtualenv 

# Creamos el entormo virtual y lo activamos
python -m venv myenv
# lo activamos (windows)
myenv\Scripts\activate.bat
# lo activamos (linux)
source myvenv/bin/activate


3. Crear una carpeta dentro de ximolib01parent con el nombre que queramos que tenga la librería por jemplo ximollib01 

4. Entrar en la carpeta ximolib01parent y crear un entorno virtual de python y activarlo

python3 -m venv myvenv

source myvenv/bin/activate


Ojo: para que el entorno virtual se guarde en a configuración de vscode ver el siguiente post


5. Instalar en dicho entorno las librerías: wheel, setuptools y twine

pip install wheel setuptools twine

6. En la carpeta padre ximolib01parent crear estos ficheros

- setup.py (vacío)

- README.md (inicilamentre vacío, pero se puede dar información de la librería)

7. Situarse en ximolib01 (ximolib01parent/ximolib01) y crear estos ficheros:

 - _init__.py (inicilamente vacío)

- Uno o varios ficheros python (.py) de las funcionalidades a crear

 8. Situarse en ximolib01parent/tests y crear estos ficheros:

 - _init__.py (inicilamente vacío)

- Uno o varios ficheros python (.py) que comiencen con test_ de las funcionalidades a testear

 Veamos la estructura del proyecto

ximolib01parent
   └>setup.py
   └>README.md
   └>myvenv
   │   └>bin
   └>ximolib01
   │   └>__init_.py
   │   └>myfunctions01.py
   │   └>myfunctions02.py
   │   └>myfunctionsNN.py
   └>tests
         └>__init_.py
         └>test_myfun01.py    
         └>test_myfun02.py    

9. Ejemplo

Supongamos que solmente tenemos esta estructura simple de proyecto

ximolib01parent
   └>setup.py
   └>myvenv
   │   └>bin
   └>ximolib01
   │   └>__init_.py
    |    └>ximolib0101
   │    |    └>__init_.py
   │    |    └>formulas.py
    |    └>tests
    |           └>__init_.py
    |           └>test_formulas.py    

Veamos el fichero formulas.py

import math

def area_circle(radius):
    return math.pi * radius ** 2

def area_square(side):
    return side ** 2

def area_rectangle(length, width):
    return length * width

Veamos el contenido del fichero test_formulas.py. Para ello debemos observar que para pasar de la carpeta tests a la carpetaximolib01parent  debemos hacer 2 salto2, por tanto en el pathlib incluimos 2 saltos

import unittest
from pathlib import Path

# ------Imprescindible para poder importar de otras carpetas (de basicutils)
import sys
saltos=2  # Solo hay un salto de la carpeta tests a la carpeta ximolib01parent
from pathlib import Path
for i in range(saltos):sys.path.append(str(Path(__file__).parents[i]))
from ximolib01 import formulas
# ------Fin imprescindible


class TestFigures(unittest.TestCase):
    
    def test_circle_area(self):
        self.assertEqual(circle.circle_area(1), 3.1415926,'wrong circle area') 

    def test_rectangle_area(self):
        self.assert rectangle.rectangle_area(1, 2) == 2

#Execute test
if __name__ == '__main__':
	unittest.main()

Observar en el test que importamos así 

import sys
saltos=2  # Solo hay un salto de la carpeta tests a la carpeta ximolib01parent
from pathlib import Path
for i in range(saltos):sys.path.append(str(Path(__file__).parents[i]))
from ximolib01 import formulas


EJECUCIÓN DE LOS TESTS

Podemos ejecutarlos de 3 maneras:

  1. Mediante el triángulo de vs code
  2. En el terminal de vscode( y comprobando que estamos en el entorno virtual) nos situamos dentro de la carpeta ximolib01 (que es el padre inminente de la carpeta tests) y ejecutamos: 
     python -m unittest tests/test_formula.py
    

  3. En el terminal de vscode( y comprobando que estamos en el entorno virtual) nos situamos dentro de la carpeta ximolib01 (que es el padre inminente de la carpeta tests) y ejecutamos:
     python -m unittest discover -s tests
    

En la tercera opción le pedimos al sistema que busquer TODOS los tests y los ejecute

10. Fichero ximolib01parent/setup.py


from setuptools import setup, find_packages

VERSION = '0.0.1'
DESCRIPTION = 'My first python library'
LONG_DESCRIPTION = 'This is my first library and I am very proud of it'

# Setting up
setup(
# the name must match the folder name 'ximolib01'
name="ximolib01",
version=VERSION,
author="Ximo Dante",
author_email="<ximodane@gmail.com>",
description=DESCRIPTION,
long_description=LONG_DESCRIPTION,
packages=find_packages(),
install_requires=['xmltodict'], # add any additional packages that
# needs to be installed along with your package. Eg: 'caer'
test_requires=[],
keywords=['python', 'wsdl'],
classifiers= [
"Development Status :: 3 - Alpha",
"Intended Audience :: Education",
"Programming Language :: Python :: 3",
"Operating System :: MacOS :: MacOS X",
"Operating System :: Microsoft :: Windows",
"Operating System :: Linux :: Ubuntu",
]
)


Los parámetros son:

install_requires indica la lista de librerías que se requieren previamente 

test_requires indica la lista de librerías que se requieren previamente solo para realizar los tests


11.Construir (build) la librería

Situarse en ximo01libparent y ejecutar en un shell


python setup.py bdist_wheel

y el fichero con extensión .whl (de wheel) se creará en la carpeta dist

12. Instalar la librería localmente


pip install /path/to/wheelfile.whl

13. Instalarla en https://pypi.org

13.1 Obtener una clave API de https://pypi.org/

Todo parece sencillo hasta que aparece un código QR que hay que leer con el authentictor de google del móvil y ya da un token enorme que hay que guardar

12. Ejecutar el builfd y la instalación

Ojo: utilizar setup está deprecado!!!!

python setup.py sdist bdist_wheel  # Ya hecho antes

twine upload dist/*

Y nos pide el token anterior


Y además nos da una url donde ver la librería

https://pypi.org/project/ximolib01/0.0.1/

13. Instalar la librería

Ya la tenemos disponible en el repositorio pypi para instalar

 pip install ximolib01





No hay comentarios :

Publicar un comentario