From f86db25fcbbd20782bb77088a77e39e0bcd80043 Mon Sep 17 00:00:00 2001 From: Rossi-Luciano Date: Sun, 2 Aug 2026 13:22:12 -0300 Subject: [PATCH 1/4] chore(deps): atualiza packtools pra 4.16.9 e bump spsvalidator pra v0.3.0 - packtools @ git+.../packtools@4.16.7 -> @4.16.9. - version = "0.2.0" -> "0.3.0". Porque: 4.16.9 traz PR #1259 (correcao da baseline da suite de validacao SPS), PR #1261 (restaura a chave "text" em Abstract.data) e PR #1260 (internacionalizacao das mensagens de validacao, fecha packtools#1257). Bump de versao do spsvalidator pra acompanhar essa atualizacao antes da proxima release/geracao de executaveis (issue #33). Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_015N4tShpu6YUfgyPJR1PKnD --- spsvalidator/pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spsvalidator/pyproject.toml b/spsvalidator/pyproject.toml index f854db9..fd11e6a 100644 --- a/spsvalidator/pyproject.toml +++ b/spsvalidator/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "spsvalidator" -version = "0.2.0" +version = "0.3.0" description = "Standalone SPS package validator desktop webapp" readme = "README.md" requires-python = ">=3.11" @@ -12,7 +12,7 @@ dependencies = [ "Flask>=3.0.0", "Flask-Babel>=4.0.0", "lxml>=5.0.0", - "packtools @ git+https://git@github.com/scieloorg/packtools@4.16.7", + "packtools @ git+https://git@github.com/scieloorg/packtools@4.16.9", "pywebview>=5.1", "setuptools>=68,<82", "requests>=2.31.0", From d330975ed4c58114cbf522193a2960fc77d3549f Mon Sep 17 00:00:00 2001 From: Rossi-Luciano Date: Sun, 2 Aug 2026 13:22:19 -0300 Subject: [PATCH 2/4] test: atualiza test_packtools_version pra 4.16.9 - Ajusta a assertiva de versao instalada do packtools de 4.16.7 pra 4.16.9, acompanhando o bump de dependencia do commit anterior. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_015N4tShpu6YUfgyPJR1PKnD --- spsvalidator/tests/test_packtools_validations.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spsvalidator/tests/test_packtools_validations.py b/spsvalidator/tests/test_packtools_validations.py index 46e1102..c81edf2 100644 --- a/spsvalidator/tests/test_packtools_validations.py +++ b/spsvalidator/tests/test_packtools_validations.py @@ -331,10 +331,10 @@ def test_abstract_sem_lang_reporta_issue(tmp_path): def test_packtools_version(): - """packtools 4.16.7 deve estar instalada.""" + """packtools 4.16.9 deve estar instalada.""" import packtools - assert packtools.__version__ == "4.16.7" + assert packtools.__version__ == "4.16.9" # --------------------------------------------------------------------------- From 28afc753e810e6f25e8da47e6cb5d835febfed8d Mon Sep 17 00:00:00 2001 From: Rossi-Luciano Date: Sun, 2 Aug 2026 13:22:32 -0300 Subject: [PATCH 3/4] feat(i18n): sincroniza o locale do packtools com o do Flask-Babel - Novo hook `before_request` (`sync_packtools_locale`) que chama `packtools.sps.i18n.set_locale(...)` a cada requisicao, mapeando os codigos de idioma do spsvalidator (pt/en/es) pros nomes de diretorio de catalogo do packtools (pt_BR/en/es). Porque: o packtools 4.16.9 passou a suportar mensagens de validacao traduzidas via `packtools.sps.i18n.set_locale()` (packtools#1257), mas so tem efeito se alguem chamar essa funcao antes de rodar a validacao - sem isso, as mensagens continuariam em ingles mesmo com a i18n pronta no packtools. Por enquanto isso fica sem efeito pratico: a release 4.16.9 nao inclui os catalogos .mo compilados quando instalada via git (scieloorg/packtools#1267, aberta por pitangainnovare), entao `set_locale()` cai no fallback e as mensagens continuam em ingles. O wiring fica pronto pra funcionar assim que essa issue for corrigida no packtools, sem precisar de mudanca nenhuma aqui. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_015N4tShpu6YUfgyPJR1PKnD --- spsvalidator/src/spsvalidator/app.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/spsvalidator/src/spsvalidator/app.py b/spsvalidator/src/spsvalidator/app.py index 341acaa..b9a2903 100644 --- a/spsvalidator/src/spsvalidator/app.py +++ b/spsvalidator/src/spsvalidator/app.py @@ -4,6 +4,7 @@ from flask import Flask, current_app, request from flask_babel import Babel, get_locale +from packtools.sps import i18n as packtools_i18n from spsvalidator.build_metadata import get_footer_build_label from spsvalidator.db.repository import init_db @@ -11,6 +12,15 @@ from spsvalidator.web import i18n from spsvalidator.web.routes import web_blueprint +# Mapeia os codigos de idioma do spsvalidator (web/i18n.SUPPORTED_LANGUAGES) +# pros nomes de diretorio de catalogo do packtools (packtools/sps/locale/*). +# Nota: ate o packtools corrigir scieloorg/packtools#1267 (release nao inclui +# os .mo compilados quando instalado via git), set_locale() aqui fica sem +# efeito pratico - as mensagens de validacao continuam em ingles mesmo com o +# locale certo selecionado. O wiring fica pronto pra quando isso for corrigido +# no packtools. +_PACKTOOLS_LOCALE_MAP = {"pt": "pt_BR", "en": "en", "es": "es"} + def select_locale(): if current_app.config["EXECUTION_MODE"] == "desktop": @@ -39,6 +49,10 @@ def create_app( Babel(app, locale_selector=select_locale) + @app.before_request + def sync_packtools_locale(): + packtools_i18n.set_locale(_PACKTOOLS_LOCALE_MAP.get(str(get_locale()), "en")) + @app.context_processor def inject_app_info(): return { From c42c9fd0c6f09019947ed832ba0f6d580614168a Mon Sep 17 00:00:00 2001 From: Rossi-Luciano Date: Sun, 2 Aug 2026 13:23:59 -0300 Subject: [PATCH 4/4] test(i18n): cobre sync_packtools_locale com set_locale mockado - 5 testes confirmando que o hook before_request chama packtools.sps.i18n.set_locale() com o codigo certo (pt_BR/en/es) pra cada combinacao de modo de execucao (desktop/browser) e idioma (Accept-Language ou SYSTEM_LANGUAGE), inclusive o fallback pra portugues quando o idioma nao e suportado. Porque: set_locale() e mockado porque o packtools 4.16.9 ainda nao traduz de fato nada instalado via git (scieloorg/packtools#1267) - o teste verifica o wiring em si, nao o resultado da traducao, que so podera ser testado de ponta a ponta depois que essa issue for corrigida no packtools. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_015N4tShpu6YUfgyPJR1PKnD --- .../tests/test_packtools_locale_sync.py | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 spsvalidator/tests/test_packtools_locale_sync.py diff --git a/spsvalidator/tests/test_packtools_locale_sync.py b/spsvalidator/tests/test_packtools_locale_sync.py new file mode 100644 index 0000000..53e7176 --- /dev/null +++ b/spsvalidator/tests/test_packtools_locale_sync.py @@ -0,0 +1,44 @@ +import pytest + +from spsvalidator import app as app_module +from spsvalidator.app import create_app + + +@pytest.mark.parametrize( + ("accept_language", "expected_packtools_locale"), + [ + ("pt-BR,pt;q=0.9", "pt_BR"), + ("en-US,en;q=0.9", "en"), + ("es-AR,es;q=0.9", "es"), + ], +) +def test_before_request_sets_packtools_locale_from_accept_language( + tmp_path, monkeypatch, accept_language, expected_packtools_locale +): + calls = [] + monkeypatch.setattr(app_module.packtools_i18n, "set_locale", calls.append) + + app = create_app(str(tmp_path), execution_mode="browser") + app.test_client().get("/", headers={"Accept-Language": accept_language}) + + assert calls == [expected_packtools_locale] + + +def test_before_request_sets_packtools_locale_from_system_language(tmp_path, monkeypatch): + calls = [] + monkeypatch.setattr(app_module.packtools_i18n, "set_locale", calls.append) + + app = create_app(str(tmp_path), execution_mode="desktop", system_language="es_AR") + app.test_client().get("/", headers={"Accept-Language": "en-US"}) + + assert calls == ["es"] + + +def test_unsupported_locale_falls_back_to_packtools_portuguese(tmp_path, monkeypatch): + calls = [] + monkeypatch.setattr(app_module.packtools_i18n, "set_locale", calls.append) + + app = create_app(str(tmp_path), execution_mode="browser") + app.test_client().get("/", headers={"Accept-Language": "de-DE"}) + + assert calls == ["pt_BR"] \ No newline at end of file