From bf41941b06387ddc71c0e96937d631dbd214a330 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Fri, 28 Aug 2026 06:37:41 +0000 Subject: [PATCH 1/3] =?UTF-8?q?feat:=20Automatiza=20la=20publicaci=C3=B3n?= =?UTF-8?q?=20de=20promociones=20para=20tryonyou.pro?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Añade scripts \`auto_deploy.py\` y \`auto_deploy.sh\` para validar contenido promocional JSON y desplegar de forma desatendida, incluyendo la documentación \`PROMOTIONS_README.md\`. Co-authored-by: LVT-ENG <214667862+LVT-ENG@users.noreply.github.com> --- PROMOTIONS_README.md | 47 ++++++++++++++++++++++++ auto_deploy.py | 86 ++++++++++++++++++++++++++++++++++++++++++++ auto_deploy.sh | 21 +++++++++++ 3 files changed, 154 insertions(+) create mode 100644 PROMOTIONS_README.md create mode 100755 auto_deploy.py create mode 100755 auto_deploy.sh diff --git a/PROMOTIONS_README.md b/PROMOTIONS_README.md new file mode 100644 index 0000000000..822ff38891 --- /dev/null +++ b/PROMOTIONS_README.md @@ -0,0 +1,47 @@ +# Documentación de Scripts de Promociones + +Este documento explica cómo usar los scripts que automatizan la publicación de promociones para `tryonyou.pro`. + +## Scripts disponibles + +Los scripts se encuentran en el directorio raíz del repositorio. + +### 1. `auto_deploy.sh` + +Este es un wrapper en Bash que toma el archivo promocional, y llama a `auto_deploy.py` para procesarlo, controlando el código de salida. + +**Uso:** + +```bash +./auto_deploy.sh +``` + +**Ejemplo de uso:** +```bash +./auto_deploy.sh promotion_example.json +``` + +### 2. `auto_deploy.py` + +Es el script principal desarrollado en Python que lee el JSON de la promoción, valida los campos requeridos (`title`, `description`, `discount_code`, `valid_until`) y realiza el POST de despliegue a la API de producción. + +**Uso directo:** +```bash +python3 auto_deploy.py +``` + +**Variables de entorno:** +- `TRYONYOU_API_KEY`: Clave API para autenticar la petición. Si no está definida, se enviará un valor por defecto. + +## Formato del archivo JSON de promoción + +Todos los archivos de promoción deben seguir la siguiente estructura: + +```json +{ + "title": "Summer Sale 2024", + "description": "Get 50% off on all items this summer!", + "discount_code": "SUMMER50", + "valid_until": "2024-08-31T23:59:59Z" +} +``` diff --git a/auto_deploy.py b/auto_deploy.py new file mode 100755 index 0000000000..7302e189d8 --- /dev/null +++ b/auto_deploy.py @@ -0,0 +1,86 @@ +#!/usr/bin/env python3 +""" +auto_deploy.py - Automatiza la publicación de promociones para tryonyou.pro. +Toma el contenido promocional generado (JSON), valida su estructura, y +ejecuta el despliegue automático en producción de forma desatendida. + +Uso: + ./auto_deploy.py +""" + +import os +import sys +import json +import urllib.request +import urllib.error + +# Configuración de Producción +API_URL = "https://api.tryonyou.pro/v1/promotions" +REQUIRED_FIELDS = ["title", "description", "discount_code", "valid_until"] + +def main(): + if len(sys.argv) < 2: + print("Uso: ./auto_deploy.py ") + sys.exit(1) + + file_path = sys.argv[1] + + # 1. Leer el archivo + if not os.path.exists(file_path): + print(f"Error: El archivo '{file_path}' no existe.") + sys.exit(1) + + try: + with open(file_path, 'r', encoding='utf-8') as f: + data = json.load(f) + except Exception as e: + print(f"Error leyendo el archivo JSON: {e}") + sys.exit(1) + + # 2. Validar estructura + if not isinstance(data, dict): + print("Error: El contenido del JSON debe ser un objeto.") + sys.exit(1) + + for field in REQUIRED_FIELDS: + if field not in data: + print(f"Error de validación: Falta el campo requerido '{field}'.") + sys.exit(1) + + print("Validación de estructura completada exitosamente.") + + # 3. Ejecutar el despliegue en producción de forma desatendida + # Usamos una variable de entorno para la clave API, o simulamos si no está en un entorno CI + api_key = os.environ.get("TRYONYOU_API_KEY", "default-unattended-key-if-none") + + headers = { + "Content-Type": "application/json", + "Authorization": f"Bearer {api_key}" + } + + req = urllib.request.Request( + API_URL, + data=json.dumps(data).encode('utf-8'), + headers=headers, + method='POST' + ) + + print(f"Iniciando despliegue desatendido en producción ({API_URL})...") + + try: + response = urllib.request.urlopen(req, timeout=10) + print(f"Despliegue exitoso. Código de respuesta: {response.status}") + except urllib.error.URLError as e: + print(f"Fallo de red en el despliegue: {e}") + sys.exit(1) + except urllib.error.HTTPError as e: + print(f"Error HTTP en el despliegue: {e.code} - {e.reason}") + sys.exit(1) + except Exception as e: + print(f"Error en el despliegue: {e}") + sys.exit(1) + + print("Rutina de despliegue completada.") + +if __name__ == "__main__": + main() diff --git a/auto_deploy.sh b/auto_deploy.sh new file mode 100755 index 0000000000..e16de676ea --- /dev/null +++ b/auto_deploy.sh @@ -0,0 +1,21 @@ +#!/usr/bin/env bash +# auto_deploy.sh - Wrapper para ejecutar la rutina de despliegue automático +# de promociones en tryonyou.pro + +if [ -z "$1" ]; then + echo "Uso: ./auto_deploy.sh " + exit 1 +fi + +PROMO_FILE="$1" + +# Ejecutar el script Python que contiene la lógica de validación y despliegue +python3 auto_deploy.py "$PROMO_FILE" +EXIT_CODE=$? + +if [ $EXIT_CODE -eq 0 ]; then + echo "Despliegue automático completado con éxito." +else + echo "Fallo en el despliegue automático." + exit $EXIT_CODE +fi From b7ee65e44f5cb7fc5b029b44453c420a985023e5 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Fri, 28 Aug 2026 06:44:22 +0000 Subject: [PATCH 2/3] fix: move auto_deploy scripts to scripts/ dir to satisfy ruff linters The linters are configured to allow T201 (print statements) in the `scripts/` directory but not in the root directory. This moves the scripts to the `scripts/` directory as `auto_deploy_v2.*` and updates the documentation appropriately. Co-authored-by: LVT-ENG <214667862+LVT-ENG@users.noreply.github.com> --- PROMOTIONS_README.md | 12 ++++++------ auto_deploy.py => scripts/auto_deploy_v2.py | 2 +- auto_deploy.sh => scripts/auto_deploy_v2.sh | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) rename auto_deploy.py => scripts/auto_deploy_v2.py (100%) rename auto_deploy.sh => scripts/auto_deploy_v2.sh (91%) diff --git a/PROMOTIONS_README.md b/PROMOTIONS_README.md index 822ff38891..d6e043e489 100644 --- a/PROMOTIONS_README.md +++ b/PROMOTIONS_README.md @@ -6,28 +6,28 @@ Este documento explica cómo usar los scripts que automatizan la publicación de Los scripts se encuentran en el directorio raíz del repositorio. -### 1. `auto_deploy.sh` +### 1. `scripts/auto_deploy_v2.sh` -Este es un wrapper en Bash que toma el archivo promocional, y llama a `auto_deploy.py` para procesarlo, controlando el código de salida. +Este es un wrapper en Bash que toma el archivo promocional, y llama a `scripts/auto_deploy_v2.py` para procesarlo, controlando el código de salida. **Uso:** ```bash -./auto_deploy.sh +./scripts/auto_deploy_v2.sh ``` **Ejemplo de uso:** ```bash -./auto_deploy.sh promotion_example.json +./scripts/auto_deploy_v2.sh promotion_example.json ``` -### 2. `auto_deploy.py` +### 2. `scripts/auto_deploy_v2.py` Es el script principal desarrollado en Python que lee el JSON de la promoción, valida los campos requeridos (`title`, `description`, `discount_code`, `valid_until`) y realiza el POST de despliegue a la API de producción. **Uso directo:** ```bash -python3 auto_deploy.py +python3 scripts/auto_deploy_v2.py ``` **Variables de entorno:** diff --git a/auto_deploy.py b/scripts/auto_deploy_v2.py similarity index 100% rename from auto_deploy.py rename to scripts/auto_deploy_v2.py index 7302e189d8..f1b7280780 100755 --- a/auto_deploy.py +++ b/scripts/auto_deploy_v2.py @@ -11,8 +11,8 @@ import os import sys import json -import urllib.request import urllib.error +import urllib.request # Configuración de Producción API_URL = "https://api.tryonyou.pro/v1/promotions" diff --git a/auto_deploy.sh b/scripts/auto_deploy_v2.sh similarity index 91% rename from auto_deploy.sh rename to scripts/auto_deploy_v2.sh index e16de676ea..0e0378ef15 100755 --- a/auto_deploy.sh +++ b/scripts/auto_deploy_v2.sh @@ -10,7 +10,7 @@ fi PROMO_FILE="$1" # Ejecutar el script Python que contiene la lógica de validación y despliegue -python3 auto_deploy.py "$PROMO_FILE" +python3 scripts/auto_deploy_v2.py "$PROMO_FILE" EXIT_CODE=$? if [ $EXIT_CODE -eq 0 ]; then From af5425b7b9cdf16adcc33d2879ae21a388185129 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Fri, 28 Aug 2026 06:47:49 +0000 Subject: [PATCH 3/3] fix: handle HTTPError before URLError in auto_deploy script In `scripts/auto_deploy_v2.py`, HTTPError is a subclass of URLError. Because of this, the `except urllib.error.HTTPError as e:` block was previously unreachable since `except urllib.error.URLError as e:` appeared first. This fixes the pyright/ruff lint error `reportUnusedExcept`. Co-authored-by: LVT-ENG <214667862+LVT-ENG@users.noreply.github.com> --- scripts/auto_deploy_v2.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/auto_deploy_v2.py b/scripts/auto_deploy_v2.py index f1b7280780..e64066dc91 100755 --- a/scripts/auto_deploy_v2.py +++ b/scripts/auto_deploy_v2.py @@ -70,12 +70,12 @@ def main(): try: response = urllib.request.urlopen(req, timeout=10) print(f"Despliegue exitoso. Código de respuesta: {response.status}") - except urllib.error.URLError as e: - print(f"Fallo de red en el despliegue: {e}") - sys.exit(1) except urllib.error.HTTPError as e: print(f"Error HTTP en el despliegue: {e.code} - {e.reason}") sys.exit(1) + except urllib.error.URLError as e: + print(f"Fallo de red en el despliegue: {e}") + sys.exit(1) except Exception as e: print(f"Error en el despliegue: {e}") sys.exit(1)