splor-mg / dpm

https://splor-mg.github.io/dpm/
0 stars 0 forks source link

Permitir filtro em `data.yaml` para permitir download de um subconjunto dos recursos #36

Closed fjuniorr closed 1 year ago

fjuniorr commented 1 year ago

Essa funcionalidade veio ao observar que o painel-admin-obz precisa apenas do recurso sisor-dados-2024/data/base_orcam_despesa_item_fiscal.csv para implementar splor-mg/painel-admin-obz#6 mas teve que baixar todos os recursos do sisor-dados-2024

fjuniorr commented 1 year ago

Não conheço nenhuma propriedade que possa ser usado pra isso, então minha sugestão apesar de possibilidade de confusão é usar novamente resources. Dessa forma para o data.yaml

name: spreadmart
resources: 
  - name: reprex-excel
    path: https://raw.githubusercontent.com/splor-mg/reprex/main/reprex/20230512T084359/datapackage.json
    resources: ['plaintext', 'B'] # https://dev.to/this-is-learning/yaml-collections-sequences-and-mappings-4meb

A gente pode fazer

from frictionless import Package

dp = Package('data.yaml')

source = Package(dp.get_resource('reprex-excel').path)

for resource_name in source.resource_names:
    resource_name in dp.get_resource('reprex-excel').custom['resources']

É importante que uma mensagem de warning seja mostrada se algum recurso especificado como filtro no data.yaml não existir na fonte de dados, como por exemplo B.

labanca commented 1 year ago

@fjuniorr a keyword ´resources´ foi usada novamente para manter alguma funcionalidade do frictionless?

fjuniorr commented 1 year ago

Foi não. Pensei nela porque a gente está filtrando recursos, mas podemos usar outra coisa. Algumas outras que tinha pensado:

labanca commented 1 year ago

No caso usar filesno nome da propriedade seria ruim? Por exemplo install_files.

No caso, as resources de nível 1 (reprex-excel do exemplo) conteriam sempre arquivos? Ou poderiam ser datapackages ou outras coisas que não casaria com chamar a propriedade nova de `install_files?

Acho que selected_resources seria bom, mas fica confuso se está selecionando das resources de nível 1 ou das que estão aninhadas dentro dessas.

update: Não haverá argumento novo na linha de comando (DPM install "data.yaml" install_resources reprex_excel [plain_text, B]). Somente é necessário colocar os recursos que serão instalados dentro do data.yaml e o DPM tratar isso.

labanca commented 1 year ago

É importante que uma mensagem de warning seja mostrada se algum recurso especificado como filtro no data.yaml não existir na fonte de dados, como por exemplo B.

Caso o pacote não seja encontrado, não é para interromper com erro, mas instalar os recursos presentes e avisar com warning os que não foram instalados/encontrados.

labanca commented 1 year ago

Primeiro commit do filtro em data.toml: 4805e0f060b551b24afb9dcaa03a65636512cd74

Problemas que serão tratados em commits futuros:

Para uma fonte de dados, caso a propriedade resources do data.toml não exista ou seja uma lista vazia, o dpm procede como antes e baixa todos os arquivos.

Foi não. Pensei nela porque a gente está filtrando recursos, mas podemos usar outra coisa. Algumas outras que tinha pensado:

install_resources keep_resources download_resources fetch_resources

Sugiro, caso seja possível, que a propriedade do data.toml tenha outro nome que não resources. Das opções dadas fetch_resources parece intuitiva. Para escrever este texto tive dificuldade de explicar quando me referia às resources do frictionless ou às lista de resources do data.toml.

labanca commented 1 year ago
  • [x] O teste test_fetch_resources.py não funciona ainda, pois não gera nenhum arquivo para ser comparado a lista esperada de arquivos. A pasta temporária de teste fica vazia após a execução. O teste não está encontrando o arquivo tests/data/fetch-resources.toml, apesar de tudo indicar que ele esta na pasta correta.

Era somente um problema de configuração da IDE Pycharm. Colocar o Working Directory na raiz do dpm resolveu o problema.

  • [x] O teste test_fetch_resources.py referencia datapackages que não são puramente reprex, o que imagino que será visto como um problema.

implementado em 9f1f719526c4a14593735ef74bdb5206c5b41bfd

  • [x] Atualmente o código considera que o nome das fontes de dados no data.toml, por exemplo [datapackage.obz-dados] devem ser iguais das resources após o pacote ser instanciado no Frictionless. Imagino que existam contornos possíveis usando o ferramental frictionless que eu não soube utilizar.

O install funciona independentemente do nome dado ao package no data.toml.

  • [x] As mensagens de log ainda não foram adaptadas

Implementado em: https://github.com/splor-mg/dpm/commit/b4ade85fd841f1801228f6f27653e3d45380db01

  • [x] adaptar o datapackage instalado (Criado depois do dpm install ) tem de dropar (retirar do datapackage.json) as linhas que referenciam as resources que não foram baixadas devido ao fetch resources.

Implementado em: https://github.com/splor-mg/dpm/commit/41dc345d6d0ff80471f3efb9b4607843eb5ddf05

labanca commented 1 year ago

@fjuniorr o comportamento quando a lista resourcesno data.toml está vazia:

[packages.empty-fetch-list]
path =  "https://raw.githubusercontent.com/transparencia-mg/datapackage-reprex/foreign-key-constraint/datapackage.json"
resources = []

Agora é o de informar ao usuário que "nenhuma das resources listadas foram encontradas no data source."? image