splor-mg / dpm

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

`resource.path` não está sendo retornado corretamente quando `field_rename_to_target` e `table_write_normalized` são aplicados na mesma pipeline #20

Closed fjuniorr closed 1 year ago

fjuniorr commented 1 year ago

Percebi essa regressão entre as versões 0.0.0.9004 e 0.0.0.9005 introduzida no commit https://github.com/splor-mg/dpm/pull/17/commits/116c4c2999b7f2513f01ed87666046456c38f9b6 ao estruturar o projeto https://github.com/splor-mg/cookiecutter-datapackage

make transform
python main.py transform fact --target-descriptor logs/transform/fact.json
2023-07-21T10:00:39-0300 INFO  [scripts.transform] Transforming resource fact
2023-07-21T10:00:39-0300 INFO  [dpm.steps] resource.path='data/fact.csv' # dentro da transformação path está correto
2023-07-21T10:00:39-0300 INFO  [dpm.steps] resource.data=None
2023-07-21T10:00:39-0300 INFO  [scripts.transform] resource.path=None # o valor retornado já está incorreto
2023-07-21T10:00:39-0300 INFO  [scripts.transform] resource.data=<transformed-data>
labanca commented 1 year ago

Ia sugerir atualizar o path dentro do dpm.steps, mas la já está correto. Será que atribuir o valor de data apaga outras propriedades? (Sei que pode ser somente um bug do frictionless mesmo)

fjuniorr commented 1 year ago

Será que atribuir o valor de data apaga outras propriedades?

Atribuir algum valor a resource.data está modificando sim as propriedades do recurso retornado pela pipeline, mas não entendi o que está acontecendo.

Criei um issue https://github.com/frictionlessdata/frictionless-py/issues/1572 relatando um problema similar mas usando somente as funções próprias do frictionless pra ver se dá uma luz pra gente.

fjuniorr commented 1 year ago

Pelo menos parte do problema é que ao final da execução do step field_rename_to_target a propriedade resource.path já não está mais definida por que transformer.py é chamado. A parte relevante é:

for step in pipeline.steps:
    data = resource.data
    step.transform_resource(resource)    
    # Postprocess
    if resource.data is not data:
        resource.path = None

Isso significa que pra fazer o reprex de 9c03f1c244238483411b1f0434581c17bdfe08e3 passar basta adicionar um

transform(resource, steps=[
        steps.resource_update(name='temporal-dim', 
                              descriptor={'path': 'data-raw/temporal-dim.txt'})
    ])

antes de assert resource.path == 'data-raw/temporal-dim.txt'