From 4fb18f671fe1befbe7c73c3b2de7ffaf9949b7df Mon Sep 17 00:00:00 2001 From: Obijuan Date: Sun, 16 Jun 2024 21:35:05 +0200 Subject: [PATCH] Example: Instllation of the iceK-0.1.4 collection --- Makefile | 2 +- icm/commands/cmd_info.py | 100 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 100 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 2cf2fc4..89d73d4 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ deps: ## Install dependencies python -m pip install --upgrade pip - python -m pip install black flake8 flit pylint pytest tox tox-gh-actions semantic_version polib + python -m pip install black flake8 flit pylint pytest tox tox-gh-actions semantic_version polib tqdm cenv: ## Create the virtual-environment python3 -m venv env diff --git a/icm/commands/cmd_info.py b/icm/commands/cmd_info.py index 6f59481..df41e56 100644 --- a/icm/commands/cmd_info.py +++ b/icm/commands/cmd_info.py @@ -8,9 +8,13 @@ # -- Author Juan Gonzalez (Obijuan) # -- Licence GPLv2 +from pathlib import Path +from tqdm import tqdm import platform import shutil -from pathlib import Path +import requests +import zipfile +import os import click @@ -30,6 +34,28 @@ # -- Icestudio root for collections COLLECTIONS = ICESTUDIO_HOME / "collections" +# -- Information about collections +icek = { + "name": "iceK", + "version": "0.1.4" +} + +# -- Collection file +COLLECTION_FILE = "v" + +# -- Template URL +# -- Full collection download url: PREFIX + NAME + SUFFIX + FILE +TEMPLATE_URL_PREFIX = "https://github.com/FPGAwars/" +TEMPLATE_URL_SUFFIX = "/archive/refs/tags/" + + +# Función para dibujar la barra de progreso +def print_progress_bar(iteration, total, length=50): + percent = f"{100 * (iteration / float(total)):.1f}" + filled_length = int(length * iteration // total) + bar = '#' * filled_length + '-' * (length - filled_length) + print(f"\r|{bar}| {percent}%", end='') + def main(): """ENTRY POINT: Show system information""" @@ -85,3 +111,75 @@ def main(): ) print() + + # --- Scafold for the installation of collections + # -- Download url: https://github.com/FPGAwars/iceK/archive/refs/tags/v0.1.4.zip + # -- Build the collection filename + filename = f"v{icek['version']}.zip" + print(f"Colection file: {filename}") + + absolut_filename = f"{COLLECTIONS}/{filename}" + print(f"Absolut filename: {absolut_filename}") + + url = f"{TEMPLATE_URL_PREFIX}{icek['name']}{TEMPLATE_URL_SUFFIX}{filename}" + print(f"Url: {url}") + + # -- Download the collection + # Realizar la solicitud HTTP para obtener el contenido del archivo + response = requests.get(url, stream=True) + + # Verificar que la solicitud se completó correctamente + if response.status_code == 200: + + # Obtener el tamaño total del archivo desde los headers + total_size = int(response.headers.get('content-length', 0)) + + # Abrir un archivo local con el nombre especificado en modo escritura binaria + with open(absolut_filename, 'wb') as file: + + # Crear una barra de progreso con tqdm + with tqdm(total=total_size, unit='B', unit_scale=True, desc=filename) as pbar: + # Iterar sobre el contenido en bloques + for chunk in response.iter_content(chunk_size=1024): + # Filtrar bloques vacíos + if chunk: + # Escribir el contenido del bloque en el archivo local + file.write(chunk) + # Actualizar la barra de progreso + pbar.update(len(chunk)) + + # Utilizar shutil.copyfileobj para copiar el contenido del archivo descargado al archivo local + #shutil.copyfileobj(response.raw, file) + print(f"Archivo descargado y guardado como {filename}") + else: + print(f"Error al descargar el archivo. Código de estado: {response.status_code}") + + # -- Uncompress the collection + + # Nombre del archivo ZIP + zip_filename = absolut_filename + + # Directorio de destino para descomprimir los archivos + extract_to = COLLECTIONS + + # Abrir el archivo ZIP y extraer su contenido con barra de progreso + with zipfile.ZipFile(zip_filename, 'r') as zip_ref: + # Obtener la lista de archivos en el archivo ZIP + file_list = zip_ref.namelist() + + # Crear una barra de progreso + with tqdm(total=len(file_list), desc='Descomprimiendo', unit='file') as pbar: + # Iterar sobre cada archivo en el archivo ZIP + for file in file_list: + # Extraer cada archivo + zip_ref.extract(file, extract_to) + # Actualizar la barra de progreso + pbar.update(1) + + # -- Borrar el archivo zip + os.remove(zip_filename) + + + + +