Skip to content

refactor(esaj): Template Method _run_search compartilhado por cjsg e cjpg#268

Open
bdcdo wants to merge 1 commit into
mainfrom
refactor/iss205-cjpg-template
Open

refactor(esaj): Template Method _run_search compartilhado por cjsg e cjpg#268
bdcdo wants to merge 1 commit into
mainfrom
refactor/iss205-cjpg-template

Conversation

@bdcdo
Copy link
Copy Markdown
Collaborator

@bdcdo bdcdo commented May 22, 2026

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: o cjpg deles é o próprio cjsg com um único parâmetro trocado, zero linha de código cjpg-específico. Só o TJSP tem cjpg independente — e mesmo nele a duplicação não está no download/parse (legitimamente TJSP-específicos), e sim na orquestração: TJSPScraper.cjpg era um clone linha-a-linha de EsajSearchScraper.cjsg.

Diante disso, o caminho (c) original da issue (orquestrador universal core/SearchScraperMixin para 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 fluxo probe count_only → auto-chunk → download → parse → cleanup, idêntico entre cjsg e cjpg. O que diverge entra por parâmetro (schema, chave de dedup, hook de pre_normalize) ou é resolvido por nome via getattr (<endpoint>_download/_parse/_<endpoint>_count_only) — o template fica agnóstico a HTTP e parsing.
  • EsajSearchScraper.cjsg e TJSPScraper.cjpg passam a ser especializações de uma única orquestração. _run_search tem 2 usuários concretos (cjsg em 6 tribunais + cjpg no TJSP), satisfazendo a Regra 1 do refactor: arquitetura modular inspirada no raspe — eliminar ~3000 linhas duplicadas #84.
  • TJSPScraper expõe INPUT_CJPG como atributo de classe, simétrico a INPUT_CJSG — torna cjpg "wired with class attr" e esvazia WIRED_WITHOUT_CLASS_ATTR no teste de paridade.

Desvio em relação ao plano aprovado

O plano previa mover tjsp/cjpg_download.py + cjpg_parse.py para _esaj/. Isso foi deliberadamente descopado: os métodos cjpg/cjpg_download/cjpg_parse precisam permanecer em TJSPScraper (a convenção de docstring do CLAUDE.md exige âncora de docstring por tribunal — o próprio TJSPScraper.cjsg existe só como override para isso; e os 5 eSAJ-puros não suportam cjpg). Com os métodos em tjsp/, 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 passed
  • pytest -k contract: 565 passed, zero-diff de schema
  • pre-commit (pylint, flake8, mypy, isort): verde

Closes #205
Refs #194

🤖 Generated with Claude Code

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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

refactor: cjpg via Template Method (caminho c) — TJSP + TJTO + TJES

1 participant