@@ -18,99 +18,101 @@ jobs:
1818 - name : Instalar dependências
1919 run : pip install requests
2020
21+ # MODIFICAÇÃO ABAIXO: A forma de executar o script foi alterada para ser mais robusta.
2122 - name : Executar Script Python para Baixar e Processar
2223 run : |
23- python -c """
24- import requests
25- import json
26- import os
27-
28- # Etapa 1: Baixar os dados
29- print('Baixando o arquivo JSON...')
30- url = 'https://estruturaorganizacional.dados.gov.br/doc/estrutura-organizacional/completa.json?codigoPoder=1&codigoEsfera=1&codigoUnidade=86144&retornarOrgaoEntidadeVinculados=SIM'
31- response = requests.get(url)
32- response.raise_for_status()
33- source_data = response.json()
34-
35- # Etapa 2: Pré-processar os dados em uma lista de dicionários mais simples
36- print('Pré-processando JSON...')
37- unidades = source_data.get('unidades', [])
38- dados = [
39- {
40- 'sigla' : u.get('sigla', ''),
41- 'nome' : u.get('nome', ''),
42- 'competencia' : u.get('competencia', ''),
43- 'municipio' : u.get('endereco', {}).get('municipio', ''),
44- 'uf' : u.get('endereco', {}).get('uf', ''),
45- 'cep' : u.get('endereco', {}).get('cep', ''),
46- 'codigoUnidade' : u.get('codigoUnidade', '').split('/')[-1],
47- 'codigoUnidadePai' : u.get('codigoUnidadePai', '').split('/')[-1] if u.get('codigoUnidadePai') else None
48- }
49- for u in unidades
50- ]
51-
52- # Função auxiliar para encontrar o caminho completo
53- def caminho_completo(unidade, lista_completa):
54- caminho = []
55- atual = unidade
56- while atual:
57- caminho.insert(0, atual.get('sigla') or atual.get('nome'))
58- codigo_pai = atual.get('codigoUnidadePai')
59- if not codigo_pai:
60- break
61- # Encontra o próximo pai na lista
62- atual = next((x for x in lista_completa if x.get('codigoUnidade') == codigo_pai), None)
63- return '/'.join(caminho)
64-
65- # Etapa 3: Processar cada unidade para adicionar os campos finais
66- print('Processando cada unidade...')
67- dados_completos = []
68- for u in dados:
69- sigla_completa = caminho_completo(u, dados)
70-
71- # Lógica especial para NURACs
72- if u['sigla'].startswith('NURAC'):
73- partes_nome = u['nome'].split(' ')
74- cidade = partes_nome[6] if len(partes_nome) > 6 else ''
75- estado = partes_nome[7].replace('(', '').replace(')', '') if len(partes_nome) > 7 else ''
76- sigla_corrigida = f'NURAC {cidade} {estado}'
77-
78- partes_caminho = sigla_completa.split('/')
79- if len(partes_caminho) >= 3:
80- sigla_completa_corrigida = f'{partes_caminho[0]}/{partes_caminho[1]}/{partes_caminho[2]}/{sigla_corrigida}'
81- else :
82- sigla_completa_corrigida = sigla_completa # Fallback
83- else :
84- sigla_corrigida = u['sigla']
85- sigla_completa_corrigida = sigla_completa
86-
87- # Adiciona os novos campos
88- u['siglaCorrigida'] = sigla_corrigida
89- u['siglaCompletaCorrigida'] = sigla_completa_corrigida
90- dados_completos.append(u)
91-
92- # Etapa 4: Salvar o JSON processado
93- with open('estrutura-py.json', 'w', encoding='utf-8') as f:
94- json.dump(dados_completos, f, ensure_ascii=False, indent=2)
95- print('Arquivo estrutura-py.json gerado.')
96-
97- # Etapa 5: Gerar o arquivo HTML
98- print('Gerando arquivo HTML...')
99- html_content = '''
100- <!DOCTYPE html><html lang="pt-BR"><head><meta charset="UTF-8"><title>Estrutura ANAC (Python)</title></head><body>
101- <h1>Estrutura Organizacional ANAC (Gerado com Python)</h1>
102- <table border="1"><thead><tr><th>Sigla</th><th>Sigla Completa</th><th>Nome</th><th>UF</th></tr></thead><tbody>
103- '''
104- for item in dados_completos:
105- html_content += f"<tr><td>{item.get('siglaCorrigida', '')}</td><td>{item.get('siglaCompletaCorrigida', '')}</td><td>{item.get('nome', '')}</td><td>{item.get('uf', '')}</td></tr>\\n"
106-
107- html_content += '</tbody></table></body></html>'
108-
109- with open('estrutura-py.html', 'w', encoding='utf-8') as f:
110- f.write(html_content)
111- print('Arquivo estrutura-py.html gerado.')
112- """
113-
24+ python - <<EOF
25+ import requests
26+ import json
27+ import os
28+
29+ # Etapa 1: Baixar os dados
30+ print('Baixando o arquivo JSON...')
31+ url = 'https://estruturaorganizacional.dados.gov.br/doc/estrutura-organizacional/completa.json?codigoPoder=1&codigoEsfera=1&codigoUnidade=86144&retornarOrgaoEntidadeVinculados=SIM'
32+ response = requests.get(url)
33+ response.raise_for_status()
34+ source_data = response.json()
35+
36+ # Etapa 2: Pré-processar os dados em uma lista de dicionários mais simples
37+ print('Pré-processando JSON...')
38+ unidades = source_data.get('unidades', [])
39+ dados = [
40+ {
41+ 'sigla': u.get('sigla', ''),
42+ 'nome': u.get('nome', ''),
43+ 'competencia': u.get('competencia', ''),
44+ 'municipio': u.get('endereco', {}).get('municipio', ''),
45+ 'uf': u.get('endereco', {}).get('uf', ''),
46+ 'cep': u.get('endereco', {}).get('cep', ''),
47+ 'codigoUnidade': u.get('codigoUnidade', '').split('/')[-1],
48+ 'codigoUnidadePai': u.get('codigoUnidadePai', '').split('/')[-1] if u.get('codigoUnidadePai') else None
49+ }
50+ for u in unidades
51+ ]
52+
53+ # Função auxiliar para encontrar o caminho completo
54+ def caminho_completo(unidade, lista_completa):
55+ caminho = []
56+ atual = unidade
57+ while atual:
58+ caminho.insert(0, atual.get('sigla') or atual.get('nome'))
59+ codigo_pai = atual.get('codigoUnidadePai')
60+ if not codigo_pai:
61+ break
62+ # Encontra o próximo pai na lista
63+ atual = next((x for x in lista_completa if x.get('codigoUnidade') == codigo_pai), None)
64+ return '/'.join(caminho)
65+
66+ # Etapa 3: Processar cada unidade para adicionar os campos finais
67+ print('Processando cada unidade...')
68+ dados_completos = []
69+ for u in dados:
70+ sigla_completa = caminho_completo(u, dados)
71+
72+ # Lógica especial para NURACs
73+ if u['sigla'].startswith('NURAC'):
74+ partes_nome = u['nome'].split(' ')
75+ cidade = partes_nome[6] if len(partes_nome) > 6 else ''
76+ estado = partes_nome[7].replace('(', '').replace(')', '') if len(partes_nome) > 7 else ''
77+ sigla_corrigida = f'NURAC {cidade} {estado}'
78+
79+ partes_caminho = sigla_completa.split('/')
80+ if len(partes_caminho) >= 3:
81+ sigla_completa_corrigida = f'{partes_caminho[0]}/{partes_caminho[1]}/{partes_caminho[2]}/{sigla_corrigida}'
82+ else:
83+ sigla_completa_corrigida = sigla_completa # Fallback
84+ else:
85+ sigla_corrigida = u['sigla']
86+ sigla_completa_corrigida = sigla_completa
87+
88+ # Adiciona os novos campos
89+ u['siglaCorrigida'] = sigla_corrigida
90+ u['siglaCompletaCorrigida'] = sigla_completa_corrigida
91+ dados_completos.append(u)
92+
93+ # Etapa 4: Salvar o JSON processado
94+ with open('estrutura-py.json', 'w', encoding='utf-8') as f:
95+ json.dump(dados_completos, f, ensure_ascii=False, indent=2)
96+ print('Arquivo estrutura-py.json gerado.')
97+
98+ # Etapa 5: Gerar o arquivo HTML
99+ print('Gerando arquivo HTML...')
100+ html_content = '''
101+ <!DOCTYPE html><html lang="pt-BR"><head><meta charset="UTF-8"><title>Estrutura ANAC (Python)</title></head><body>
102+ <h1>Estrutura Organizacional ANAC (Gerado com Python)</h1>
103+ <table border="1"><thead><tr><th>Sigla</th><th>Sigla Completa</th><th>Nome</th><th>UF</th></tr></thead><tbody>
104+ '''
105+ for item in dados_completos:
106+ html_content += f"<tr><td>{item.get('siglaCorrigida', '')}</td><td>{item.get('siglaCompletaCorrigida', '')}</td><td>{item.get('nome', '')}</td><td>{item.get('uf', '')}</td></tr>\\n"
107+
108+ html_content += '</tbody></table></body></html>'
109+
110+ with open('estrutura-py.html', 'w', encoding='utf-8') as f:
111+ f.write(html_content)
112+ print('Arquivo estrutura-py.html gerado.')
113+ EOF
114+ # FIM DA MODIFICAÇÃO
115+
114116 - name : Salvar Artefatos (Python)
115117 uses : actions/upload-artifact@v4
116118 with :
0 commit comments