Minio library functionalities#110
Conversation
…age multiple file operations
|
Incluir también las modificaciones en https://github.com/telefonicasc/etl-framework/blob/master/python-lib/tc_etl_lib/README.md En concreto:
|
| 'numpy==1.24.4' | ||
| 'numpy==1.24.4', | ||
| 'minio==7.2.7', | ||
| 'pytest-minio-mock==0.4.19' |
There was a problem hiding this comment.
Si no es una dependencia de producción (es decir, se puede construir el paquete de la libreria y funciona sin esta dependencia) entonces mejor no incluirlo aqúi.
Incluirlo en la GitAction, por aquí https://github.com/telefonicasc/etl-framework/blob/master/.github/workflows/unit-testing.yml#L32
| minio_client = minio_manager.initClient() | ||
|
|
||
| # Upload test-file.txt to python-test-bucket/output/example.txt | ||
| # Important: the bucket must already exist, so |
There was a problem hiding this comment.
"so" ...
¿quizás ha quedado incompleta la frase?
There was a problem hiding this comment.
Si, la frase comentaba que hay que tener el bucket creado antes de subir el fichero, pero escribir eso me hizo pensar que eso se debería gestionar en la librería, así que lo incluí en el método de subir fichero y aparentemente me dejé la frase. La elimino.
| processing_method=print) | ||
|
|
||
| # You can define your own custom processing method and use it in the processing_method argument of the getProcessedFile method | ||
| def customProcessingMethod(file_chunk): | ||
| # code to apply to the chunk of the file or to locally save the file | ||
|
|
There was a problem hiding this comment.
Creo que sería más ilustrativo usar un método propio directamente que haga una función sencilla (de hecho, puede ser el propio print). Algo de este estilo:
minio_manager.getProcessedFile(minio_client,
bucket_name='python-test-bucket',
destination_file='/output/example.txt',
chunk_size=3,
processing_method=process_chunk)
definiendo process_chunk() así:
def process_chunk(file_chunk):
print(file_chunk)
| - :param obligatorio `secret_key`: contraseña necesaria para hacer login en MinIO | ||
| - `initClient`: inicializa un cliente de MinIO | ||
| - :return: cliente autenticado de MinIO. | ||
| - `createBucket`: comprueba si existe el bucket y si no lo crea. |
There was a problem hiding this comment.
¿Y si ya existe no hace nada o da error?
| - `createBucket`: comprueba si existe el bucket y si no lo crea. | ||
| - :param obligatorio `client`: cliente de MinIO. | ||
| - :param obligatorio `bucket_name`: nombre del bucket a crear. | ||
| - `removeBucket`: comprueba si existe el bucket y si existe lo borra. |
There was a problem hiding this comment.
¿Y si no existe no hace nada o da error?
|
|
||
| ## Changelog | ||
|
|
||
| 0.17.0 (October 16th, 2025) |
There was a problem hiding this comment.
| 0.17.0 (October 16th, 2025) |
De momento no marques cierre de versión (aunque es muy probable que con esta feature cerremos versión, puede que entren más cosas antes).
| ## Changelog | ||
|
|
||
| 0.17.0 (October 16th, 2025) | ||
| - Add: new class `minioManager` to manage MinIO connection and file processing |
There was a problem hiding this comment.
Cuando existe issue asociado, incluimos su referencia. Ver como se está haciendo en algún otro caso en el Changelog existente.
| - `removeBucket`: comprueba si existe el bucket y si existe lo borra. | ||
| - :param obligatorio `client`: cliente de MinIO. | ||
| - :param obligatorio `bucket_name`: nombre del bucket a borrar. | ||
| - `uploadFile`: sube un fichero a MinIO. Si el bucket al que se sube no existe se crea previamente. |
There was a problem hiding this comment.
¿Si el fichero ya existe no hace nada o da error?
| - :param obligatorio `client`: cliente de MinIO. | ||
| - :param obligatorio `bucket_name`: nombre del bucket donde se va a buscar el fichero. | ||
| - :param obligatorio `destination_file`: nombre del fichero en MinIO (puede incluir el path SIN el nombre del bucket al inicio). | ||
| - :param obligatorio `chunk_size`: tamaño en bytes de cada fragmento del fichero a recuperar. |
There was a problem hiding this comment.
Igual debería ser opcional, con un chunk_size por defecto razonable.
There was a problem hiding this comment.
Imagino que lo más habitual será usar MinIO para ficheros grandes, pongo por defecto por ejemplo 500000 (500kB / 0,5mB)?
There was a problem hiding this comment.
No tengo especial criterio, pero 500KB suena bien.
@arcosa @AlvaroVega ¿cómo lo veis?
There was a problem hiding this comment.
500Kbs parece razonable para todo tipo de ficheros sin penar mucho el rendimiento.
| - `getProcessedFile`: procesa un fichero de MinIO por fragmentos y le aplica a cada fragmento la función provista. | ||
| - :param obligatorio `client`: cliente de MinIO. | ||
| - :param obligatorio `bucket_name`: nombre del bucket donde se va a buscar el fichero. | ||
| - :param obligatorio `destination_file`: nombre del fichero en MinIO (puede incluir el path SIN el nombre del bucket al inicio). |
There was a problem hiding this comment.
En realidad el fichero es más bien un origen de datos a procesar, no un destino.
Yo me dejaría de lios y lo llamaría simplemente "file".
| - :param obligatorio `destination_file`: nombre del fichero en MinIO (puede incluir el path SIN el nombre del bucket al inicio). | ||
| - :param obligatorio `chunk_size`: tamaño en bytes de cada fragmento del fichero a recuperar. | ||
| - :param obligatorio `processing_method`: método a aplicar a cada fragmento del fichero. | ||
|
|
There was a problem hiding this comment.
Estoy viendo que todos los métodos usan client como parámetro. ¿Es realmente necesario? Entiendo que ese cliente está asociado al propio minioManager en sí. En otros manager (cbManager, iotaManager) no se está usando un cliente como parámetro en las invocaciones.
Por otro lado, igual podemos simplificar la vida al usuario y que no tenga que hacer initClient. Que se haga en la propia construcción del manager o al invocar al primer método que lo requiera.
|
|
||
| # Custom method that writes the file chunks in a CSV (he receives and writes bytes) | ||
| def customCSVProcessingMethod(file_chunk): | ||
| fichero_procesado = open("salida.csv", "ab") |
There was a problem hiding this comment.
fichero_procesado
Mejor usar todos los nombres en inglés.
(No sé si habrá más casos como este, revisar)
| - :param obligatorio `bucket_name`: nombre del bucket donde se va a buscar el fichero. | ||
| - :param obligatorio `file`: nombre del fichero en MinIO (puede incluir el path SIN el nombre del bucket al inicio). | ||
| - :param obligatorio `processing_method`: método a aplicar a cada fragmento del fichero. | ||
| - :param optional `chunk_size`: tamaño en bytes de cada fragmento del fichero a recuperar. |
There was a problem hiding this comment.
Especificar el default (similar al comentario anterior).
Co-authored-by: Fermín Galán Márquez <fgalan@users.noreply.github.com>
Cambiado en el commit d985e5a |
| - :param obligatorio: `data`: Datos a enviar. Puede ser una lista de diccionarios o un DataFrame. | ||
| - :raises SendBatchError: Se levanta cuando se produce una excepción dentro de `send_http`. Atrapa la excepción original y se guarda y se imprime el índice donde se produjo el error. | ||
|
|
||
| - Clase `minioManager`: En esta clase están las funciones relacionadas con la solución de almacenamiento de objetos MinIO. |
There was a problem hiding this comment.
Un tema de style.
Mirando el style que estamos usando en esta librería, diría que los nombres de los manager van en camelCase (en ese sentido minioManage OK) pero los métodos van en snake_case.
En este caso ajustar
- create_bucket
- remove_bucket
- etc.
Tanto en docu, como en test, como en ejemplos, etc.
(Debería ser relativamente fácil con un "Replace All" en el IDE)
Co-authored-by: Fermín Galán Márquez <fgalan@users.noreply.github.com>


#109