refactor(esaj): Template Method _run_search compartilhado por cjsg e cjpg#268
Open
bdcdo wants to merge 1 commit into
Open
refactor(esaj): Template Method _run_search compartilhado por cjsg e cjpg#268bdcdo wants to merge 1 commit into
bdcdo wants to merge 1 commit into
Conversation
Extrai o Template Method ``EsajSearchScraper._run_search`` em ``_esaj/base.py``, eliminando a duplicacao de orquestracao entre ``cjsg`` e ``cjpg``. O fluxo probe count_only -> auto-chunk -> download -> parse -> cleanup do diretorio temporario era um clone linha-a-linha entre ``EsajSearchScraper.cjsg`` e ``TJSPScraper.cjpg``. Agora ``cjsg`` (familia eSAJ) e ``cjpg`` (TJSP) sao especializacoes de uma unica orquestracao. O que diverge entra por parametro (schema, chave de dedup, hook de normalizacao previa) ou e resolvido por nome via ``getattr`` (metodos ``<endpoint>_download``/``_parse``/ ``_<endpoint>_count_only``), mantendo o template agnostico a HTTP e parsing. ``_run_search`` tem 2 usuarios concretos (cjsg em 6 tribunais + cjpg no TJSP), satisfazendo a Regra 1 do refactor #84. ``TJSPScraper`` passa a expor ``INPUT_CJPG`` como atributo de classe, simetrico a ``INPUT_CJSG`` — o que torna ``cjpg`` "wired with class attr" e esvazia ``WIRED_WITHOUT_CLASS_ATTR`` no teste de paridade. Refactor puramente interno: nenhuma mudanca de API publica nem de comportamento observavel (1621 testes offline + 565 contratos verdes, zero-diff de schema). Sem entrada no CHANGELOG. Refs #205, #194. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
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.
Contexto
Sub-issue #205 do guarda-chuva #194 — consolidar o endpoint
cjpg. A leitura das 3 implementações (TJSP, TJTO, TJES) durante o planejamento mostrou que TJTO e TJES já são DRY: ocjpgdeles é o própriocjsgcom um único parâmetro trocado, zero linha de códigocjpg-específico. Só o TJSP temcjpgindependente — e mesmo nele a duplicação não está no download/parse (legitimamente TJSP-específicos), e sim na orquestração:TJSPScraper.cjpgera um clone linha-a-linha deEsajSearchScraper.cjsg.Diante disso, o caminho (c) original da issue (orquestrador universal
core/SearchScraperMixinpara os 3 tribunais) foi descartado como overengineering — abstrairia 3 tipos de retorno incompatíveis para servir 2 tribunais que não precisam. Adotado o caminho (b): consolidação contida na família eSAJ.O que muda
EsajSearchScraper._run_search(_esaj/base.py) — novo Template Method que concentra o fluxoprobe count_only → auto-chunk → download → parse → cleanup, idêntico entrecjsgecjpg. O que diverge entra por parâmetro (schema, chave de dedup, hook depre_normalize) ou é resolvido por nome viagetattr(<endpoint>_download/_parse/_<endpoint>_count_only) — o template fica agnóstico a HTTP e parsing.EsajSearchScraper.cjsgeTJSPScraper.cjpgpassam a ser especializações de uma única orquestração._run_searchtem 2 usuários concretos (cjsgem 6 tribunais +cjpgno TJSP), satisfazendo a Regra 1 do refactor: arquitetura modular inspirada no raspe — eliminar ~3000 linhas duplicadas #84.TJSPScraperexpõeINPUT_CJPGcomo atributo de classe, simétrico aINPUT_CJSG— tornacjpg"wired with class attr" e esvaziaWIRED_WITHOUT_CLASS_ATTRno teste de paridade.Desvio em relação ao plano aprovado
O plano previa mover
tjsp/cjpg_download.py+cjpg_parse.pypara_esaj/. Isso foi deliberadamente descopado: os métodoscjpg/cjpg_download/cjpg_parseprecisam permanecer emTJSPScraper(a convenção de docstring doCLAUDE.mdexige âncora de docstring por tribunal — o próprioTJSPScraper.cjsgexiste só como override para isso; e os 5 eSAJ-puros não suportamcjpg). Com os métodos emtjsp/, mover só os helpers para_esaj/seria "promover para_esaj/com 1 ocorrência" — exatamente o que a Regra 1 proíbe — por ganho funcional nulo e churn em ~4 módulos de teste. A consolidação que a issue cita como justificativa real do caminho (b) ("ganho qualitativo — orquestrador único") é o_run_search, entregue aqui.Testes
Refactor puramente interno — nenhuma mudança de API pública nem de comportamento observável. Sem entrada no CHANGELOG (regra do projeto: refactor interno não entra).
pytest(suite offline completa): 1621 passedpytest -k contract: 565 passed, zero-diff de schemapre-commit(pylint, flake8, mypy, isort): verdeCloses #205
Refs #194
🤖 Generated with Claude Code