From 76d9a5996aaefa612fe647d197f19b3a91d4e6db Mon Sep 17 00:00:00 2001 From: Luis Gutierrez Lopez Date: Fri, 29 Aug 2025 09:55:57 +0200 Subject: [PATCH] Paquete Debian --- pip_busqueda_deb/DEBIAN/control | 11 +++ pip_busqueda_deb/usr/local/bin/pip_busca | 49 ++++++++++++ pip_busqueda_deb/usr/local/bin/pip_info | 90 +++++++++++++++++++++++ pipbusqueda.deb | Bin 0 -> 2536 bytes 4 files changed, 150 insertions(+) create mode 100644 pip_busqueda_deb/DEBIAN/control create mode 100644 pip_busqueda_deb/usr/local/bin/pip_busca create mode 100644 pip_busqueda_deb/usr/local/bin/pip_info create mode 100644 pipbusqueda.deb diff --git a/pip_busqueda_deb/DEBIAN/control b/pip_busqueda_deb/DEBIAN/control new file mode 100644 index 0000000..e57070a --- /dev/null +++ b/pip_busqueda_deb/DEBIAN/control @@ -0,0 +1,11 @@ +Package: pipbusqueda +Version: 1.6 +Architecture: all +Maintainer: luisgulo +Depends: python3 +Section: devel +Priority: optional +Homepage: https://soloconlinux.org.es +Description: Conjunto de scripts que permiten buscar modulos python e información sobre ellos. + Contiene los programas pip_busca y pip_info, escritos en python y bash respectivamente. + diff --git a/pip_busqueda_deb/usr/local/bin/pip_busca b/pip_busqueda_deb/usr/local/bin/pip_busca new file mode 100644 index 0000000..458a462 --- /dev/null +++ b/pip_busqueda_deb/usr/local/bin/pip_busca @@ -0,0 +1,49 @@ +#!/usr/bin/env python3 +''' +Author: LuisGuLo +Release: v1.6 +ChangeLog: + v1.6: Peticion simple y extraccion + v1.5: browsers de consola y dumps + v1.4: Uso de requests-html + v1.3: Modulos y venv + v1.2: Peticion con user-agent + v1.1: Peticion web mediante query + v1.0: PoC inicial bash. Cambio a python. +''' +import sys +import requests +from bs4 import BeautifulSoup + +def mostrar_ayuda(): + print("══════════════════════════════════════════════════════════════") + print("Uso: ./pip_busca ") + print("\nBusca paquetes en PyPI cuyo nombre contenga la cadena indicada") + print("Ejemplo: ./pip_busca ansi") + print("══════════════════════════════════════════════════════════════") + +if len(sys.argv) < 2 or sys.argv[1] in ["--help", "-h"]: + mostrar_ayuda() + sys.exit(0) + +busqueda = sys.argv[1].lower() +url = "https://pypi.org/simple/" + +try: + response = requests.get(url) + response.raise_for_status() +except requests.RequestException as e: + print(f"❌ Error al conectar con PyPI: {e}") + sys.exit(1) + +soup = BeautifulSoup(response.text, "html.parser") +paquetes = [a.text for a in soup.find_all("a")] +coincidentes = [p for p in paquetes if busqueda in p.lower()] + +print(f"\n🔍 Paquetes que contienen '{busqueda}':\n") +if not coincidentes: + print("❌ No se encontraron coincidencias.") +else: + for nombre in coincidentes: + print(f"📦 {nombre}") + diff --git a/pip_busqueda_deb/usr/local/bin/pip_info b/pip_busqueda_deb/usr/local/bin/pip_info new file mode 100644 index 0000000..813a98d --- /dev/null +++ b/pip_busqueda_deb/usr/local/bin/pip_info @@ -0,0 +1,90 @@ +#!/bin/bash +: ' --- + Author: Luis GuLo + Release: 1.3 + Changelog: + 1.3: Mostrar version Python requerida + 1.2: Ayuda + Mostrar por defecto 10 ultimas versiones disponibles, con opcion a todas + 1.1: Compactar salida de todas las versiones disponibles + 1.0: Localizar paquete y mostrar ultima version + disponibles +---' + +mostrar_ayuda() { + echo "════════════════════════════════════════════════════════════════════════════════" + echo "Uso: $0 [--all]" + echo "" + echo "Opciones:" + echo " --all Muestra todas las versiones disponibles (incluye alphas, betas, etc.)" + echo "" + echo "Por defecto, se muestran las últimas 10 versiones estables." + echo "Nota: Se indica entre paréntesis la version de Python requerida" + echo "════════════════════════════════════════════════════════════════════════════════" +} + +# Verifica si se pidió ayuda +if [[ "$1" == "--help" || "$1" == "-h" ]]; then + mostrar_ayuda + exit 0 +fi + +# Verifica que se haya pasado un nombre de paquete +if [ -z "$1" ]; then + echo "❌ Error: Debe indicar el nombre del paquete." + mostrar_ayuda + exit 1 +fi + +PAQUETE="$1" +# Verificar orden: paquete + opcion +if [ "$PAQUETE" == "--all" ] ; then + echo "❌ Error: Orden en sintaxis obligatoria." + mostrar_ayuda + exit 0 +fi + +URL="https://pypi.org/pypi/$PAQUETE/json" +RESPUESTA=$(curl -s "$URL") + +# Verifica si la respuesta contiene información válida +if echo "$RESPUESTA" | grep -q '"info"'; then + NOMBRE=$(echo "$RESPUESTA" | jq -r '.info.name') + VERSION=$(echo "$RESPUESTA" | jq -r '.info.version') + DESCRIPCION=$(echo "$RESPUESTA" | jq -r '.info.summary') + echo "📦 Paquete: $NOMBRE" + echo "🔢 Última versión: $VERSION" + echo "📝 Descripción: $DESCRIPCION" + +# echo -e "\n📚 Versiones disponibles:" + +mostrar_versiones() { + echo "$RESPUESTA" | jq -r '.releases | to_entries[] | "\(.key) \(.value[0].requires_python // "N/A")"' \ + | grep -E '^[0-9]+\.[0-9]+\.[0-9]+ ' \ + | sort -k1 -V -r \ + | head -n 10 \ + | awk '{printf "%s (%s) ", $1, $2}' + echo +} + +mostrar_todas_versiones() { + echo "$RESPUESTA" | jq -r '.releases | to_entries[] | "\(.key) \(.value[0].requires_python // "N/A")"' \ + | sort -k1 -V -r \ + | awk '{printf "%s (%s) ", $1, $2}' + echo +} + + if [[ "$2" == "--all" ]]; then + echo -e "\n📚 Versiones disponibles:" + #echo "$RESPUESTA" | jq -r '.releases | keys[]' | sort -V -r | xargs + mostrar_todas_versiones + else + echo -e "\n📚 Ultimas 10 Versiones estables disponibles:" + #echo "$RESPUESTA" | jq -r '.releases | keys[]' \ + # | grep -E '^[0-9]+\.[0-9]+\.[0-9]+$' \ + # | sort -V -r \ + # | head -n 10 \ + # | xargs + mostrar_versiones + fi +else + echo "❌ No se encontró información para el paquete '$PAQUETE'" +fi diff --git a/pipbusqueda.deb b/pipbusqueda.deb new file mode 100644 index 0000000000000000000000000000000000000000..69d439a1af61f223ac2ac9286b5c924a44a87c0f GIT binary patch literal 2536 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