Skip to content

[Silver Pipeline] - Parte 001 - Cria extratores e normalizadores de dados#649

Merged
pitangainnovare merged 9 commits into
scieloorg:mainfrom
pitangainnovare:scms-oca-etl-helpers
May 13, 2026
Merged

[Silver Pipeline] - Parte 001 - Cria extratores e normalizadores de dados#649
pitangainnovare merged 9 commits into
scieloorg:mainfrom
pitangainnovare:scms-oca-etl-helpers

Conversation

@pitangainnovare
Copy link
Copy Markdown
Contributor

O que esse PR faz?

Adiciona a base técnica de helpers puros para o ETL: normalização de DOI, ISBN, ISSN, idioma, país, texto, listas e extração de identificadores/metadados comuns de payloads SciELO/OpenAlex.

Onde a revisão poderia começar?

etl/normalizers.py e depois etl/extractors.py.

Como este poderia ser testado manualmente?

Rodar:

docker compose -f local.yml run --rm django pytest etl/tests/test_normalizers.py etl/tests/test_extractors.py --create-db

Algum cenário de contexto que queira dar?

Este PR prepara a base para a geração do índice Silver, separando helpers puros antes da introdução de models, pipeline, OpenSearch, tasks e admin.

Screenshots

N/A.

Quais são tickets relevantes?

Relacionado a #645.

Referências

@pitangainnovare pitangainnovare self-assigned this May 7, 2026
@pitangainnovare pitangainnovare added the enhancement New feature or request label May 7, 2026
Comment thread etl/normalizers.py
return None


def normalize_text(text: str | None) -> str | None:
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Em search_gateway.option_normalization e harvest.language_normalizer tem funções que cumprem o mesmo proposito dessas, é interessante colocar todas essas funções em um diretório unico para evitar duplicação de código.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ótimo. Proponho mover todas as funções de normalização para o core (Algo como core/normalization.py). Há outras em indicator que posso mover pra lá tbm, em algum momento.

Ou vc entende que devemos ter outra ideia?

self.assertEqual(scalar_or_list(["a", "b"]), ["a", "b"])


class LanguageNormalizerTests(SimpleTestCase):
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Há casos em que o valor do idioma vem em outros idiomas, por ex: Português. É o caso de adicionar uma tradução no valor do idioma para sempre inglês depois da normalização do valor. Outros exemplos de valores: "spanish sign language", "spanish castilian", "en us"

Comment thread etl/extractors.py
ids = doc.get("ids") if isinstance(doc.get("ids"), dict) else {}
biblio = doc.get("biblio") if isinstance(doc.get("biblio"), dict) else {}

for key in ("isbn", "eisbn", "isbns", "eisbns"):
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Dois for que interam sobre a mesma tupla. Realizar tudo no mesmo for

Comment thread etl/extractors.py
values.append(raw_value)

for location_key in ("primary_location", "best_oa_location"):
location = doc.get(location_key) if isinstance(doc.get(location_key), dict) else {}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Na extração de isbns e issns há o acesso de algumas chaves em comum, não é o caso de criar uma função que extrai os mesmo valores para os dois casos ou são acessos diferentes? Talvez modularizar essas funções

Comment thread etl/extractors.py

return titles


Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Não é um extrator.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Esta função extrai o campo title. Mas achei outros casos que não são extratores, de fato. Vou fazer uns ajustes.

Obrigado.

Comment thread etl/extractors.py
return value[0] if value else None
return value


Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

não é extrator

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Este não é de fato. Irá para um utilitário (além de outros).

@pitangainnovare pitangainnovare merged commit 9f11b0f into scieloorg:main May 13, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Criar app/estrutura base para geração de índice Silver (docs mesclados)

2 participants