From 6648038de1414f6aefc9db9076f7137b1d634ff6 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Wed, 9 Sep 2026 06:22:06 +0000 Subject: [PATCH 1/3] feat: automate deployment of promotions This introduces `auto_deploy_v2.py` and its bash wrapper `auto_deploy_v2.sh` to parse and deploy promotional content JSONs automatically. This ensures structure validations and deploys directly to production via the `TRYONYOU_API_KEY`. Co-authored-by: LVT-ENG <214667862+LVT-ENG@users.noreply.github.com> --- scripts/auto_deploy_v2.py | 63 +++++++++++++++++++++++++++++++++++++++ scripts/auto_deploy_v2.sh | 24 +++++++++++++++ 2 files changed, 87 insertions(+) create mode 100755 scripts/auto_deploy_v2.py create mode 100755 scripts/auto_deploy_v2.sh diff --git a/scripts/auto_deploy_v2.py b/scripts/auto_deploy_v2.py new file mode 100755 index 0000000000..1d711216de --- /dev/null +++ b/scripts/auto_deploy_v2.py @@ -0,0 +1,63 @@ +#!/usr/bin/env python3 +# scripts/auto_deploy_v2.py +import sys +import json +import os +import urllib.request +import urllib.error + +def validar_promocion(data): + campos_requeridos = ["title", "description", "discount_code", "valid_until"] + for campo in campos_requeridos: + if campo not in data: + print(f"Error: Falta el campo requerido: {campo}") + return False + return True + +def main(): + if len(sys.argv) < 2: + print("Uso: python3 scripts/auto_deploy_v2.py ") + sys.exit(1) + + ruta_archivo = sys.argv[1] + + try: + with open(ruta_archivo, 'r', encoding='utf-8') as f: + data = json.load(f) + except Exception as e: + print(f"Error al leer el archivo JSON: {e}") + sys.exit(1) + + if not validar_promocion(data): + sys.exit(1) + + api_key = os.environ.get("TRYONYOU_API_KEY", "default_key_if_none") + api_url = "https://api.tryonyou.pro/v1/promotions" + + 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") + try: + titulo = data.get("title", "Sin título") + print(f"Desplegando promoción '{titulo}' en {api_url}...") + + # En el entorno de desarrollo podemos simular la petición si queremos, pero el script + # debe estar preparado para producción. + # Aquí controlamos errores de red gracefully. + respuesta = urllib.request.urlopen(req) + respuesta_texto = respuesta.read().decode("utf-8") + print(f"Despliegue exitoso: {respuesta_texto}") + sys.exit(0) + except urllib.error.URLError as e: + print(f"Error en el despliegue (esto es normal si la URL es falsa/dry-run o no hay internet): {e}") + # En caso de error de red, devolvemos 0 si el entorno permite fallar, pero 1 para el wrapper + sys.exit(1) + except Exception as e: + print(f"Error inesperado: {e}") + sys.exit(1) + +if __name__ == "__main__": + main() diff --git a/scripts/auto_deploy_v2.sh b/scripts/auto_deploy_v2.sh new file mode 100755 index 0000000000..1f4618f3f5 --- /dev/null +++ b/scripts/auto_deploy_v2.sh @@ -0,0 +1,24 @@ +#!/bin/bash +# scripts/auto_deploy_v2.sh + +if [ -z "$1" ]; then + echo "Uso: $0 " + exit 1 +fi + +JSON_FILE=$1 + +echo "Iniciando despliegue de promociones usando $JSON_FILE..." + +python3 scripts/auto_deploy_v2.py "$JSON_FILE" + +EXIT_CODE=$? + +if [ $EXIT_CODE -eq 0 ]; then + echo "Despliegue completado con éxito." +else + echo "Fallo en el despliegue. Por favor revisa los logs." + # Para pruebas locales sin mockear API, si hay error de red no bloquearemos CI necesariamente. +fi + +exit $EXIT_CODE From 24a5f0c70f7f8974e5ee92d5b790db605eb45c38 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Wed, 9 Sep 2026 06:26:17 +0000 Subject: [PATCH 2/3] fix: linter errors on auto deploy scripts The script `scripts/auto_deploy_v2.py` had an unsorted import block. Fixed it. Co-authored-by: LVT-ENG <214667862+LVT-ENG@users.noreply.github.com> --- scripts/auto_deploy_v2.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/scripts/auto_deploy_v2.py b/scripts/auto_deploy_v2.py index 1d711216de..c4e1629690 100755 --- a/scripts/auto_deploy_v2.py +++ b/scripts/auto_deploy_v2.py @@ -1,10 +1,11 @@ #!/usr/bin/env python3 # scripts/auto_deploy_v2.py +import os import sys import json -import os -import urllib.request import urllib.error +import urllib.request + def validar_promocion(data): campos_requeridos = ["title", "description", "discount_code", "valid_until"] From 7e5b3cfb75358849811e367c5879a85aa1cc7936 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Wed, 9 Sep 2026 06:30:44 +0000 Subject: [PATCH 3/3] fix: pyright type annotations on auto deploy scripts Added type annotations `Dict[str, Any]` to `validar_promocion(data)` in `scripts/auto_deploy_v2.py` to fix pyright issues. Co-authored-by: LVT-ENG <214667862+LVT-ENG@users.noreply.github.com> --- scripts/auto_deploy_v2.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/auto_deploy_v2.py b/scripts/auto_deploy_v2.py index c4e1629690..f1e0cbf422 100755 --- a/scripts/auto_deploy_v2.py +++ b/scripts/auto_deploy_v2.py @@ -5,9 +5,10 @@ import json import urllib.error import urllib.request +from typing import Any, Dict -def validar_promocion(data): +def validar_promocion(data: Dict[str, Any]) -> bool: campos_requeridos = ["title", "description", "discount_code", "valid_until"] for campo in campos_requeridos: if campo not in data: