fix(packaging): compila os catalogos i18n antes do build (closes #1267) - #1271
Open
Rossi-Luciano wants to merge 2 commits into
Open
fix(packaging): compila os catalogos i18n antes do build (closes #1267)#1271Rossi-Luciano wants to merge 2 commits into
Rossi-Luciano wants to merge 2 commits into
Conversation
…uild Propósito: Corrigir a issue scieloorg#1267 - a release 4.16.9 nao inclui os catalogos .mo compilados quando o packtools e instalado via pip a partir do git, fazendo packtools.sps.i18n.set_locale() cair silenciosamente no fallback (fallback=True) e manter todas as mensagens de validacao em ingles, mesmo com o locale certo selecionado. Solução técnica: - MANIFEST.in so incluia *.mo na distribuicao (nao os .po fonte), e nao havia nenhum passo de build que gerasse esses .mo a partir dos .po - sem workflow de CI/release, o unico jeito de obter os .mo era rodar manualmente `make compile_messages` antes de publicar, o que nunca foi feito pra 4.16.9. - Adicionado pyproject.toml com [build-system] declarando Babel como dependencia de build (o setup.py nao tinha esse arquivo, entao o pip buildava num ambiente isolado sem acesso a bibliotecas extras). - Novo comando build_py customizado em setup.py (compile_sps_i18n_catalogs) que compila packtools/sps/locale/*/LC_MESSAGES/*.po para .mo antes do build_py original rodar, garantindo que os .mo existam no disco antes da resolucao de package_data/manifest. - MANIFEST.in passa a incluir tambem *.po (fallback: catalogos fonte sempre disponiveis, mesmo se o passo de compilacao for pulado por algum motivo). Confirmado localmente: build do wheel (pip wheel . --no-deps) e instalacao em venv limpo, tanto do wheel quanto via `packtools @ git+file://...@<branch>`, reproduzindo os passos exatos da issue scieloorg#1267 - set_locale("pt_BR")/set_locale("es") agora traduzem de verdade ("Obtido {obtained}, esperado {expected}" / "Se obtuvo {obtained}, se esperaba {expected}"). Closes scieloorg#1267 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015N4tShpu6YUfgyPJR1PKnD
Propósito: Cobrir em teste automatizado a correcao da issue scieloorg#1267, seguindo exatamente a sugestao registrada la: builda o pacote, instala num ambiente limpo e confirma que packtools/sps/locale existe e que set_locale("pt_BR")/set_locale("es") traduzem de verdade, evitando que essa regressao de empacotamento volte a passar despercebida numa proxima release. Solução técnica: - BuildIncludesI18nCatalogsTest (tests/sps/test_i18n_packaging.py): builda o wheel via `pip wheel <repo> --no-deps` (evita depender de rede pra resolver as dependencias de runtime), cria um venv limpo com o modulo venv da stdlib e instala esse wheel nele. - 4 casos, cada um rodando codigo no interpretador do venv limpo via subprocess (nao no processo do pytest, que ja tem packtools importado/em outro estado): locale dir presente, set_locale("pt_BR") e set_locale("es") traduzem uma mensagem conhecida ("Got {obtained}, expected {expected}", igual ao exemplo usado na propria issue), e set_locale("en") mantem a mensagem original (sem catalogo en, cai no fallback por design). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015N4tShpu6YUfgyPJR1PKnD
16 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
O que esse PR faz?
Corrige a issue #1267: a release
4.16.9não inclui os catálogos.mocompilados quando o packtools é instalado viapip install packtools @ git+https://...— a forma como aplicações consumidoras (ex.: SPS Validator) consomem essa dependência hoje. Isso fazpacktools.sps.i18n.set_locale()cair silenciosamente no fallback (fallback=True) e manter todas as mensagens de validação em inglês, mesmo com o locale certo selecionado.Causa raiz:
MANIFEST.insó incluía*.mona distribuição (não os.pofonte), e não havia nenhuma etapa de build que gerasse esses.moa partir dos.po— sem workflow de CI/release configurado, o único jeito de obter os.moseria rodar manualmentemake compile_messagesantes de publicar, o que nunca foi feito para a4.16.9.Correção:
pyproject.tomlcom[build-system]declarandoBabel>=2.12como dependência de build (osetup.pynão tinha esse arquivo, então opipbuildava num ambiente isolado sem acesso a bibliotecas extras).build_pycustomizado emsetup.py(compile_sps_i18n_catalogs) que compilapacktools/sps/locale/*/LC_MESSAGES/*.popara.moantes dobuild_pyoriginal rodar, garantindo que os.moexistam no disco antes da resolução depackage_data/manifest.MANIFEST.inpassa a incluir também*.po(fallback: catálogos fonte sempre disponíveis, mesmo se o passo de compilação for pulado por algum motivo).tests/sps/test_i18n_packaging.py) que builda o wheel e instala num venv limpo, exatamente como a issue sugeriu.Onde a revisão poderia começar?
setup.py—compile_sps_i18n_catalogs()e ocmdclass={"build_py": build_py}.pyproject.toml— novo, declara Babel como dependência de build.MANIFEST.in— inclusão de*.poalém de*.mo.tests/sps/test_i18n_packaging.py— teste de build+instalação em venv limpo.Como este poderia ser testado manualmente?
Reproduzindo os mesmos passos da issue #1267, mas após esta correção:
Também dá pra rodar o teste automatizado novo isoladamente:
pytest tests/sps/test_i18n_packaging.py -v(builda o wheel e instala num venv limpo próprio, ~20s).Testei localmente das duas formas (wheel builda via
pip wheel . --no-depse instalação viagit+file://...) e confirmei que o resultado bate exatamente com o "Comportamento esperado" descrito na issue.Algum cenário de contexto que queira dar?
Essa issue foi aberta pelo próprio pitangainnovare durante a revisão de um PR no SPS Validator (scieloorg/spsvalidator#38), que estava atualizando o pin do packtools para
4.16.9e tentando conectarset_locale()ao locale do Flask-Babel — o wiring do lado do spsvalidator já está pronto e só vai ter efeito prático depois que esta correção for mesclada e uma nova tag/release for cortada.Quais são os tickets relevantes?
Closes #1267. Relacionado a #1257 (i18n das mensagens de validação, que introduziu
set_locale()) e a scieloorg/spsvalidator#38.Referências
.mo, fazendoset_locale()manter mensagens em inglês #1267Segurança da informação (NSI.04)
Este PR manipula dados sensíveis ou pessoais (LGPD)?
Este PR altera autenticação, autorização, controle de acesso ou gerenciamento de sessão?
Este PR introduz, atualiza ou remove dependências de terceiros?
Babel>=2.12como dependência de build (viapyproject.toml,[build-system] requires), não como dependência de runtime instalada junto com o pacote. Já era usada como dependência opcional do extrawebapp(optional-requirements.txt), agora também declarada formalmente para a etapa de build.Este PR foi validado pelo pipeline de segurança (SonarQube / Trivy)?
tests/sps/test_i18n.py,tests/sps/test_i18n_packaging.py) e build/instalação manual em venv limpo.Este PR concatena, monta ou executa comandos SQL, HTML ou JavaScript a partir de entrada externa?
setup.py,pyproject.toml,MANIFEST.in) e um teste; nenhuma mudança em código de validação/runtime.Este PR expõe novos endpoints, telas ou serviços?
Algum segredo, senha, chave ou token está sendo adicionado ao código-fonte?