transparencia-mg / dtamg-py

MIT License
0 stars 0 forks source link

Configurar dtamg-py para utilizar .env #1

Closed fjuniorr closed 2 years ago

fjuniorr commented 2 years ago

A variável de ambiente PYTHONIOENCODING=UTF-8 criada somente no .env gerou o erro

dtamg-py etl-make validate -r fl_convenio_entrada_aditivo >logs/validate/fl_convenio_entrada_aditivo.json
Traceback (most recent call last):
  File "C:\Users\m752587\projects\age7\venv\Scripts\dtamg-py-script.py", line 33, in <module>
    sys.exit(load_entry_point('dtamg-py', 'console_scripts', 'dtamg-py')())
  File "c:\users\m752587\projects\age7\venv\lib\site-packages\click\core.py", line 1128, in __call__
    return self.main(*args, **kwargs)
  File "c:\users\m752587\projects\age7\venv\lib\site-packages\click\core.py", line 1053, in main
    rv = self.invoke(ctx)
  File "c:\users\m752587\projects\age7\venv\lib\site-packages\click\core.py", line 1659, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "c:\users\m752587\projects\age7\venv\lib\site-packages\click\core.py", line 1659, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "c:\users\m752587\projects\age7\venv\lib\site-packages\click\core.py", line 1395, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "c:\users\m752587\projects\age7\venv\lib\site-packages\click\core.py", line 754, in invoke
    return __callback(*args, **kwargs)
  File "c:\users\m752587\projects\dtamg-py\dtamg_py\validate.py", line 12, in validate_cli
    validate(sys.argv[-1])
  File "c:\users\m752587\projects\dtamg-py\dtamg_py\utils.py", line 155, in validate
    json.dump(report, sys.stdout, indent=2, ensure_ascii=False)
  File "C:\Users\m752587\AppData\Local\Programs\Python\Python39\lib\json\__init__.py", line 180, in dump
    fp.write(chunk)
  File "C:\Users\m752587\AppData\Local\Programs\Python\Python39\lib\encodings\cp1252.py", line 19, in encode
    return codecs.charmap_encode(input,self.errors,encoding_table)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\x81' in position 163: character maps to <undefined>
make: *** [Makefile:56: logs/validate/fl_convenio_entrada_aditivo.json] Error 1

Em resumo, o json estava sendo criado com codificação windows-1252. Quando o log de validação teve acento, isso gerou o erro acima.

Depois que PYTHONIOENCODING foi criada diretamente como variável de ambiente no sistema o erro parou.

gabrielbdornas commented 2 years ago

@fjuniorr, acredito que você já havia resolvido esse isso e só esqueceu de fechar, pois

https://github.com/transparencia-mg/dtamg-py/blob/b1d31a24b2eafe175254d21d4aaa408010eb3097/setup.py#L9-L20

MINGW32 ~/projects/age7 (main)
$ make validate
During startup - Warning message:
Setting LC_CTYPE=C.UTF-8 failed
During startup - Warning message:
Setting LC_CTYPE=C.UTF-8 failed
During startup - Warning message:
Setting LC_CTYPE=C.UTF-8 failed
rsync --itemize-changes --checksum data/raw/* data/staging/ 2> logs/ingest.txt
>fcsT...... dm_acao.csv
>fcsT...... dm_alinea_rec.csv
>fcsT...... dm_cargo_scdp.csv

Sendo assim, vou fechar o issue.

fjuniorr commented 2 years ago

Repositório dtamg-py já possui pacote python-dotenv

O pacote de fato é usado no arquivo utils.py

https://github.com/transparencia-mg/dtamg-py/blob/64e3448feb9e40eb72b4d77cab7ab41e9fa3eb3c/dtamg_py/utils.py#L18

mas o erro ainda aconteceu. No dpckan essa mesma chamada é feita no __init__.py.

Vale confirmar a diferença de comportamento entre os dois arquivos.

gabrielbdornas commented 2 years ago

@fjuniorr, parei o código como sugerido e a variável de ambiente foi reconhecida:

ipdb> os.environ.get('PYTHONIOENCODING')                                                                                                      
'UTF-8' 

Pensei em mudarmos de estratégia para evitar essas confusões de conversões de encoding migrando a responsabilidade por gerar o arquivo do log/validate da própria função validate do dtamg-py e não mais do Makefile. Isso porque lá os problemas de encoding ficam mais fáceis de serem tratados.

https://github.com/transparencia-mg/dtamg-py/blob/6c4b51c224b98a5329be6f0c8839f589b6402133/dtamg_py/utils.py#L172-L178

Implementação neste PR #12 e neste PR do repositório age7.