feat: add active field to agency YAML configuration#4
Conversation
This commit migrates changes from PR #70 in data-platform repository to resolve Issue #64: the inability to programmatically disable agencies. ## Problem Previously, disabling agencies with problematic URLs (502, 404) required commenting lines in YAML with `#`, causing loss of information about when/why they were disabled and making programmatic management difficult. ## Solution Convert YAML format from simple strings to dictionaries with fields: - `url`: Agency news page URL (required) - `active`: Boolean flag to enable/disable (optional, default: true) - `disabled_reason`: Why the agency was disabled (optional) - `disabled_date`: When it was disabled (optional) ## Changes ### Gov.br Scraper - `site_urls.yaml`: Converted to dictionary format with ~158 agencies - `scrape_manager.py`: Added `_extract_url()`, `_is_agency_inactive()`, and updated `_load_urls_from_yaml()` to filter inactive agencies ### EBC Scraper - Created `ebc_urls.yaml` with 3 sources (memoria-ebc inactive, agencia-brasil and tvbrasil active) - `ebc_webscraper.py`: Parameterized `base_url`, added `_get_base_domain()`, implemented 3 scraping strategies for different EBC sites - `ebc_scrape_manager.py`: Added YAML loading, inactive filtering, and `agencies` parameter to `run_scraper()` ### API - `api.py`: Added `agencies` parameter to `/scrape/ebc` endpoint ### Storage - `postgres_manager.py`: Added intra-batch deduplication by `unique_id` to handle race conditions during pagination ### DAGs - `dags/config/site_urls.yaml`: Synced with src/ version - `dags/scrape_agencies.py`: Updated to filter inactive agencies ### Tests - Added 35 unit tests for new functionality - All tests passing Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
nitaibezerra
left a comment
There was a problem hiding this comment.
Code Review
PR bem estruturado, descrição excelente. Algumas observações:
1. Duplicação entre ScrapeManager e EBCScrapeManager
_extract_url(), _is_agency_inactive() e _load_urls_from_yaml() são idênticos nos dois managers. Qualquer fix futuro precisa ser feito em dois lugares. Sugestão: extrair para classe base ou módulo utilitário (pode ser follow-up).
2. agencia_brasil → agencia-brasil é breaking change silenciosa
ebc_webscraper.py:418 muda o agency key de agencia_brasil para agencia-brasil. Registros novos no PostgreSQL vão ter o nome novo, antigos têm o antigo. Queries que filtram por agency (portal, analytics) vão ter inconsistência.
Opções:
- Manter
agencia_brasil(underscore) para consistência com dados existentes - Ou fazer um UPDATE nos registros antigos + documentar a mudança
3. agencies_processed retorna URLs em vez de nomes
Em ebc_scrape_manager.py, agencies_processed recebe scraper.base_url (ex: "https://agenciabrasil.ebc.com.br/ultimas"), mas o endpoint /scrape/agencies retorna nomes como ["mec", "mds"]. O response da API fica inconsistente entre os dois endpoints.
4. DAG tem fallback para formato legado, mas ScrapeManager não
scrape_agencies.py trata ambos os formatos (dict e string):
if isinstance(data, dict):
active_agencies[key] = data.get("url")
else:
active_agencies[key] = data # formato string legadoMas ScrapeManager._extract_url() assume sempre dict e faz agency_data["url"] direto. Se for consistente (ambos suportam ou nenhum suporta), fica mais seguro.
5. Dedup no postgres_manager — boa adição 👍
Resumo
Pontos 2 e 3 merecem atenção antes do merge. Os demais podem ser follow-up.
- Fix agencies_processed returning URLs instead of names in EBC manager - Revert agency name from 'agencia-brasil' to 'agencia_brasil' for DB consistency - Remove legacy string format support from DAG (only dict format now) - Extract duplicated YAML config code to shared yaml_config.py module - Update tests to reflect new module structure Addresses review comments from @nitaibezerra on PR #4
|
@nitaibezerra segue a implementação das correções conforme os pontos levantados. Resumo das AlteraçõesPonto 2: Breaking change
|
| Arquivo | Mudança |
|---|---|
src/govbr_scraper/scrapers/yaml_config.py |
NOVO - Módulo compartilhado |
src/govbr_scraper/scrapers/ebc_scrape_manager.py |
Usa yaml_config, corrige agencies_processed |
src/govbr_scraper/scrapers/scrape_manager.py |
Usa yaml_config |
src/govbr_scraper/scrapers/ebc_webscraper.py |
agencia_brasil (underscore) |
src/govbr_scraper/scrapers/config/ebc_urls.yaml |
agencia_brasil (underscore) |
dags/scrape_agencies.py |
Remove suporte formato legado |
tests/unit/test_yaml_config.py |
NOVO - Testes do módulo compartilhado |
tests/unit/test_ebc_scrape_manager.py |
Testes movidos para test_yaml_config.py |
tests/unit/test_scrape_manager.py |
Testes movidos para test_yaml_config.py |
Verificação
poetry run pytest tests/unit/ -v
# 29 passedContexto para Revisão com Claude
Para revisar este PR usando Claude Code, execute:
# Clonar e navegar para o branch
git fetch origin feat/active-field-agencies
git checkout feat/active-field-agencies
# Ver o diff completo desde a main
git diff main...HEAD
# Principais arquivos para revisar:
# 1. Novo módulo compartilhado
cat src/govbr_scraper/scrapers/yaml_config.py
# 2. Como os managers usam o novo módulo
git diff main...HEAD -- src/govbr_scraper/scrapers/ebc_scrape_manager.py
git diff main...HEAD -- src/govbr_scraper/scrapers/scrape_manager.py
# 3. Mudança no nome da agency
git diff main...HEAD -- src/govbr_scraper/scrapers/ebc_webscraper.py
git diff main...HEAD -- src/govbr_scraper/scrapers/config/ebc_urls.yaml
# 4. Remoção do suporte legado na DAG
git diff main...HEAD -- dags/scrape_agencies.pyPontos de Atenção para Revisão
- Consistência de API: Verificar se
agencies_processedagora retorna o mesmo formato em ambos endpoints - Módulo compartilhado: Verificar se a extração do código duplicado foi feita corretamente
- Testes: Verificar se todos os casos de teste foram cobertos em
test_yaml_config.py - Breaking change evitada: Confirmar que
agencia_brasil(underscore) está sendo usado consistentemente
- ScrapeManager now uses (agency_name, scraper) tuples like EBCScrapeManager, ensuring agencies_processed returns YAML keys consistently across both endpoints - Extract get_config_dir() to yaml_config.py, removing duplication from both managers - Delete empty test_scrape_manager.py (tests were moved to test_yaml_config.py) - Add tests for get_config_dir() Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
nitaibezerra
left a comment
There was a problem hiding this comment.
Boa, Miguel! As correções ficaram corretas — todos os 4 pontos da revisão foram endereçados adequadamente. O módulo yaml_config.py compartilhado ficou limpo, a reversão do agencia_brasil para underscore evita a breaking change, e o agencies_processed agora retorna nomes consistentemente no EBC.
Fiz algumas mudanças cosméticas no PR #5 (baseado na sua branch):
- Unifiquei o
ScrapeManagerpara usar o mesmo padrão de tuplas(agency_name, scraper)doEBCScrapeManager - Extraí o
_get_config_dir()duplicado para oyaml_config.py - Removi o
test_scrape_manager.pyque ficou vazio
Pode revisar o PR #5 e, se concordar, aprovar e fazer merge dele na sua branch. Depois pode fazer merge da sua branch na main — já está aprovada por mim.
refactor: unify manager patterns and remove duplicated code
Contexto
Este PR migra as mudanças do PR #70 do repositório
data-platformpara resolver a Issue #64: a impossibilidade de desabilitar agências de forma programática.Problema Original
#Solução Implementada
Converter formato YAML de string simples para dicionário com campos:
url: URL da página de notícias (obrigatório)active: Flag booleano para ativar/desativar (opcional, default: true)disabled_reason: Motivo da desativação (opcional)disabled_date: Data da desativação (opcional)Mudanças
1. Sistema
activepara gov.brsrc/govbr_scraper/scrapers/config/site_urls.yamlsrc/govbr_scraper/scrapers/scrape_manager.py_extract_url(),_is_agency_inactive()e filtro em_load_urls_from_yaml()2. Sistema
activepara EBCsrc/govbr_scraper/scrapers/config/ebc_urls.yamlsrc/govbr_scraper/scrapers/ebc_webscraper.pybase_url, adicionado_get_base_domain(), 3 estratégias de scrapingsrc/govbr_scraper/scrapers/ebc_scrape_manager.pyagencies3. API
src/govbr_scraper/api.pyagenciesno endpoint/scrape/ebc4. Storage
src/govbr_scraper/storage/postgres_manager.pyunique_id5. DAGs
dags/config/site_urls.yamldags/scrape_agencies.py_load_agencies_config()filtra agências inativas6. Testes
tests/unit/test_scrape_manager.pytests/unit/test_ebc_scrape_manager.pytests/unit/test_ebc_scraper.pybase_urlFormato do novo YAML
site_urls.yaml (gov.br)
ebc_urls.yaml
Test Plan
poetry run pytest tests/unit/ -v- 35 testes passando/scrape/agenciescom agência ativa/scrape/agenciescom agência inativa (deve falhar)/scrape/ebccomagencies: ["agencia-brasil"]/scrape/ebccomagencies: ["memoria-ebc"](deve falhar - inativa)Arquivos para Revisar (prioridade)
src/govbr_scraper/scrapers/scrape_manager.py- Lógica de filtro de agênciassrc/govbr_scraper/scrapers/ebc_scrape_manager.py- Novo sistema de carregamento YAML e múltiplas fontessrc/govbr_scraper/scrapers/ebc_webscraper.py- Múltiplas estratégias de scraping (linhas 239-318)dags/scrape_agencies.py- Filtro de agências inativas nas DAGsRiscos e Mitigações
agencia_brasil→agencia-brasil)🤖 Generated with Claude Code