Este projeto é uma aplicação de automação robótica de processos (RPA) que extrai dados meteorológicos em tempo real de uma API externa, transforma-os conforme necessário, armazena em um banco de dados SQLite e apresenta os resultados de forma estruturada.
O projeto segue a arquitetura ETL (Extração, Transformação, Carga) com módulos bem separados e cobertura de testes unitários e de integração.
API_Clima/
├── main.py # Ponto de entrada da aplicação
├── requirements.txt # Dependências do projeto
├── pytest.ini # Configuração do pytest
│
├── config/ # Módulo de configuração
│ └── __init__.py
│
├── model/ # Módulo de modelo de dados
│ ├── __init__.py
│ ├── database.py # Configuração da conexão com banco
│ └── table_clima.py # Definição da tabela de clima
│
├── src/ # Módulo principal da aplicação
│ ├── __init__.py
│ ├── extract.py # Extração de dados da API
│ ├── transform.py # Transformação e tratamento de dados
│ ├── load.py # Carga de dados no banco
│ └── output.py # Exibição de dados
│
├── tests/ # Testes da aplicação
│ ├── __init__.py
│ ├── unit_tests.py # Testes unitários
│ └── integration_tests.py # Testes de integração
- Python 3.7 ou superior
- pip (gerenciador de pacotes Python)
cd API_Climapip install -r requirements.txtCrie um arquivo .env na raiz do projeto com as seguintes variáveis:
API_KEY=sua_chave_api_aquipython main.pyA aplicação irá:
- Solicitar a cidade
- Extrair dados de clima da API
- Transformar os dados obtidos
- Exibir os dados na tela
- Armazenar os dados no banco de dados SQLite
pytestpytest tests/unit_tests.pypytest tests/integration_tests.pypytest -vpytest --cov=src --cov=model --cov-report=htmlResponsável pela extração de dados:
obter_cidade()- Obtém a cidade do usuárioobter_api_key()- Obtém a chave da APIobter_dados_clima()- Realiza a chamada à API de clima
Responsável pela transformação de dados:
filtrar_dados()- Filtra e processa os dados brutos da APIcalcular_horario_local()- Calcula o horário local baseado na timezone
Responsável pelo carregamento de dados:
inserir_dados_clima()- Insere dados transformados no banco de dados
Responsável pela saída de dados:
exibir_dados_clima()- Exibe os dados de forma formatada
Gerencia a conexão com o banco de dados SQLite:
configurar_banco_dados()- Estabelece conexão e cria cursor
Define a estrutura da tabela:
criar_tabela_clima()- Cria a tabela de dados meteorológicos no banco
| Pacote | Versão | Propósito |
|---|---|---|
| requests | - | Requisições HTTP para a API |
| python-dotenv | - | Carregamento de variáveis de ambiente |
| pandas | - | Manipulação e análise de dados |
| pytest | - | Framework de testes |
| pytest-mock | - | Plugin para mocking em testes |
O projeto segue a arquitetura ETL (Extract, Transform, Load):
┌─────────────────────────────────────────────────────────────┐
│ APLICAÇÃO API CLIMA │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌────────────┐ ┌────────────┐ ┌────────────┐ │
│ │ EXTRACT │ │ TRANSFORM │ │ LOAD │ │
│ │ │───▶│ │───▶│ │ │
│ │ API Clima │ │ Filtragem │ │ SQLite DB │ │
│ └────────────┘ └────────────┘ └────────────┘ │
│ │ │
│ ▼ │
│ ┌────────────┐ │
│ │ OUTPUT │ │
│ │ │ │
│ │ Exibição │ │
│ └────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
A aplicação possui testes cobrindo:
- Extração de dados da API
- Transformação e tratamento de dados
- Exibição de dados
- Configuração do banco de dados
- Criação de tabelas
- Inserção de dados
- Fluxo completo de extração-transformação-carga
- Múltiplas cidades
- Criação e inserção de dados
- Tratamento de erros e exceções
- Estrutura base implementada
- Testes unitários e de integração
- Módulos separados (Extract, Transform, Load, Output)
- Configuração e Segurança: Centralização de settings, validação de API key
- Robustez da API: Timeout explícito, retry com backoff exponencial
- Qualidade de Código: Lint, formatação, análise de tipos, CI/CD
- Banco de Dados: Constraints, índices, prevenção de duplicidade
- Observabilidade: Logging estruturado, CLI melhorada, exportação de dados
Este projeto é de código aberto e disponível sob a licença MIT.
Felipe Viana
Última atualização: Maio de 2026