🚀 Guia completo para desenvolvedores que querem contribuir ou fazer fork do projeto
- 🎯 Visão Geral
- 🏗️ Arquitetura
- ⚙️ Setup de Desenvolvimento
- 🧪 Testes
- 📝 Padrões de Código
- 🔧 Estrutura do Projeto
- 🔄 Fluxo de Desenvolvimento
- 📦 Contribuindo
- 🚀 Fazendo Fork
- 📚 Documentação
O Data-Runner é uma ferramenta de orquestração de pipelines de dados construída em Python que permite executar consultas SQL parametrizadas em múltiplas fontes de dados através de configurações JSON.
- Simplicidade: Configuração via JSON, não código
- Flexibilidade: Suporte a múltiplas fontes de dados
- Confiabilidade: Sistema de dependências e auditoria
- Performance: Execução paralela e otimizada
- Extensibilidade: Arquitetura modular e plugável
- Single Responsibility: Cada classe tem uma responsabilidade específica
- Dependency Injection: Dependências injetadas via construtor
- Factory Pattern: Criação de conexões via factory
- Strategy Pattern: Diferentes estratégias de processamento
- Observer Pattern: Sistema de auditoria e logging
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ CLI Layer │ │ Runner Layer │ │ Repository │
│ │ │ │ │ │
│ app/cli.py │───▶│ app/runner.py │───▶│ app/repository.py│
│ │ │ │ │ │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│ │ │
▼ ▼ ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ Connections │ │ Processors │ │ DuckDB │
│ │ │ │ │ │
│ app/connections │ │ app/*_processor │ │ data/*.duckdb │
│ │ │ │ │ │
└─────────────────┘ └─────────────────┘ └─────────────────┘
- Responsabilidade: Interface de linha de comando
- Tecnologia: Click framework
- Padrão: Command Pattern
- Responsabilidade: Orquestração e coordenação
- Funcionalidades:
- Carregamento de configurações
- Execução de jobs
- Gerenciamento de dependências
- Processamento de variáveis
- Responsabilidade: Persistência e auditoria
- Tecnologia: DuckDB + pandas
- Funcionalidades:
- Armazenamento de resultados
- Auditoria de execuções
- Inspeção de dados
- Responsabilidade: Gerenciamento de conexões
- Padrão: Factory Pattern
- Suporte: PostgreSQL, MySQL, SQL Server, Oracle, CSV, SQLite
- EnvironmentVariableProcessor: Processamento de variáveis de ambiente
- VariableProcessor: Processamento de variáveis configuráveis
- DependencyManager: Gerenciamento de dependências entre jobs
- Responsabilidade: Definição de contratos e tipos
- Tecnologia: Python dataclasses + enums
- Funcionalidades: Tipagem estática e validação
- Python: 3.11 ou superior
- Git: Para controle de versão
- Make: Para automação (opcional)
# Clone o repositório
git clone https://github.com/djonatas/data-runner.git
cd data-runner
# Crie ambiente virtual
python -m venv venv
source venv/bin/activate # Linux/macOS
# ou
venv\Scripts\activate # Windows
# Instale dependências de desenvolvimento
pip install -e ".[dev,all]"
# Configure arquivos de exemplo
cp config/connections.json.example config/connections.json
cp config/jobs.json.example config/jobs.jsonpip install -e .pip install -e ".[dev]"# Para MySQL
pip install -e ".[mysql]"
# Para SQL Server
pip install -e ".[mssql]"
# Para Oracle
pip install -e ".[oracle]"
# Todas as dependências
pip install -e ".[all]"# Teste básico
python -m app.cli --help
# Teste de importações
python -c "from app import runner, connections, repository"
# Executar testes
pytest tests/ -v# Todos os testes
pytest tests/ -v
# Testes específicos
pytest tests/test_runner_sqlite.py -v
# Com cobertura
pytest tests/ --cov=app --cov-report=html
# Testes de integração
pytest tests/ -m integration
# Testes rápidos (excluir slow)
pytest tests/ -m "not slow"tests/
├── __init__.py # Configuração de testes
├── test_config_parsing.py # Testes de parsing de configuração
└── test_runner_sqlite.py # Testes de integração com SQLite
- Testam componentes isolados
- Mock de dependências externas
- Rápidos e determinísticos
- Testam interação entre componentes
- Usam banco de dados real (SQLite)
- Marcados com
@pytest.mark.integration
- Testam performance e escalabilidade
- Marcados com
@pytest.mark.slow - Executados separadamente
import pytest
from app.runner import JobRunner
from app.types import Job, JobType
class TestJobRunner:
def test_run_job_success(self):
"""Testa execução bem-sucedida de job"""
runner = JobRunner()
# Setup do teste
# Execução
# Assertions
@pytest.mark.integration
def test_run_job_with_sqlite(self):
"""Testa integração com SQLite"""
# Teste de integração
@pytest.mark.slow
def test_performance_large_dataset(self):
"""Teste de performance com dataset grande"""
# Teste de performanceO projeto usa Black para formatação automática:
# Formatar código
black app/ tests/
# Verificar formatação
black --check app/ tests/O projeto usa isort para organização de importações:
# Organizar importações
isort app/ tests/
# Verificar organização
isort --check-only app/ tests/O projeto usa flake8 para verificação de código:
# Verificar código
flake8 app/ tests/
# Com configuração específica
flake8 app/ tests/ --max-line-length=88O projeto usa mypy para verificação de tipos:
# Verificar tipos
mypy app/
# Com configuração específica
mypy app/ --strictAs configurações estão no pyproject.toml:
[tool.black]
line-length = 88
target-version = ['py311']
[tool.isort]
profile = "black"
multi_line_output = 3
[tool.mypy]
python_version = "3.11"
disallow_untyped_defs = true
strict_equality = truedata-runner/
├── app/ # Código principal
│ ├── __init__.py # Inicialização do pacote
│ ├── cli.py # Interface CLI
│ ├── runner.py # Orquestrador principal
│ ├── connections.py # Gerenciamento de conexões
│ ├── repository.py # Persistência DuckDB
│ ├── types.py # Tipos e contratos
│ ├── env_processor.py # Processamento de env vars
│ ├── variable_processor.py # Processamento de variáveis
│ ├── dependency_manager.py # Gerenciamento de dependências
│ └── sql_utils.py # Utilitários SQL
├── config/ # Configurações
│ ├── connections.json.example # Exemplo de conexões
│ └── jobs.json.example # Exemplo de jobs
├── tests/ # Testes
│ ├── __init__.py
│ ├── test_config_parsing.py
│ └── test_runner_sqlite.py
├── data/ # Dados locais
│ └── warehouse.duckdb # Banco DuckDB
├── scripts/ # Scripts de automação
│ ├── install.sh
│ ├── setup.sh
│ ├── run.sh
│ └── test.sh
├── docs/ # Documentação
│ ├── README.md
│ ├── COMMANDS.md
│ ├── SCRIPTS.md
│ └── DEVELOPER.md
├── pyproject.toml # Configuração do projeto
├── requirements.txt # Dependências
└── .gitignore # Arquivos ignorados
- CLI: Apenas interface de usuário
- Runner: Apenas orquestração
- Repository: Apenas persistência
- Connections: Apenas conexões
class JobRunner:
def __init__(self, repository: Optional[DuckDBRepository] = None):
self.repository = repository or DuckDBRepository()class ConnectionFactory:
@classmethod
def create_connection(cls, connection: Connection) -> DatabaseConnection:
connection_class = cls._connection_classes[connection.type]
return connection_class(connection.params)class DatabaseConnection(ABC):
@abstractmethod
def execute_query(self, sql: str) -> pd.DataFrame:
passmaster: Branch principal, sempre estáveldevelop: Branch de desenvolvimentofeature/*: Branches para novas funcionalidadesbugfix/*: Branches para correçõeshotfix/*: Branches para correções urgentes
# Formato de commit
<type>: <descrição>
# Tipos aceitos
feat: nova funcionalidade
fix: correção de bug
docs: documentação
style: formatação
refactor: refatoração
test: testes
chore: manutenção
# Exemplos
feat: adiciona suporte a Oracle TNS Names
fix: corrige processamento de variáveis de ambiente
docs: atualiza README com novos comandos# Criar branch
git checkout -b feature/nova-funcionalidade
# Desenvolver
# ... código ...
# Testar
pytest tests/ -v
# Formatar
black app/ tests/
isort app/ tests/
# Commit
git add .
git commit -m "feat: adiciona nova funcionalidade"
# Push
git push origin feature/nova-funcionalidade- Criar PR para
develop - Incluir descrição detalhada
- Referenciar issues relacionadas
- Aguardar revisão e aprovação
- Merge para
develop - Testes de integração
- Merge para
master(releases)
# Atualizar versão no pyproject.toml
# Atualizar CHANGELOG.md
# Criar tag
git tag -a v1.1.0 -m "Release v1.1.0"# Build do pacote
python -m build
# Upload para PyPI (se aplicável)
python -m twine upload dist/*- Fork no GitHub
- Clone seu fork
- Configure remote upstream
git remote add upstream https://github.com/djonatas/data-runner.git- Siga os padrões de código
- Escreva testes para novas funcionalidades
- Mantenha cobertura de testes > 80%
- Documente mudanças importantes
- Descreva claramente as mudanças
- Inclua testes se aplicável
- Referencie issues relacionadas
- Aguarde revisão
- Segue padrões de formatação (Black)
- Importações organizadas (isort)
- Passa em linting (flake8)
- Passa em type checking (mypy)
- Testes unitários incluídos
- Testes de integração se aplicável
- README atualizado se necessário
- COMMANDS.md atualizado se novos comandos
- Docstrings em funções públicas
- Comentários em código complexo
- Novos testes para nova funcionalidade
- Testes existentes ainda passam
- Cobertura de testes mantida
- Testes de performance se aplicável
- Mantenha sincronizado com upstream
- Adicione funcionalidades específicas
- Considere contribuir de volta
- Mantenha compatibilidade com upstream
- Documente diferenças claramente
- Considere mudar nome do projeto
- Liberdade total para mudanças
- Não precisa manter compatibilidade
- Ideal para POCs e experimentos
# Buscar mudanças do upstream
git fetch upstream
# Merge das mudanças
git checkout master
git merge upstream/master
# Push para seu fork
git push origin master# app/connections.py
class MongoDBConnection(DatabaseConnection):
def execute_query(self, sql: str) -> pd.DataFrame:
# Implementação específica do MongoDB
pass
# Registrar no factory
ConnectionFactory._connection_classes[ConnectionType.MONGODB] = MongoDBConnection# app/types.py
class JobType(Enum):
CARGA = "carga"
BATIMENTO = "batimento"
EXPORT_CSV = "export-csv"
EXPORT_JSON = "export-json" # Novo tipo# app/custom_processor.py
class CustomProcessor:
def process(self, data: Dict[str, Any]) -> Dict[str, Any]:
# Lógica personalizada
pass- README.md: Guia principal para usuários
- COMMANDS.md: Documentação completa de comandos CLI
- SCRIPTS.md: Documentação dos scripts de automação
- DEVELOPER.md: Este guia para desenvolvedores
def execute_query(self, sql: str) -> pd.DataFrame:
"""
Executa uma consulta SQL no banco de dados.
Args:
sql: Consulta SQL a ser executada
Returns:
DataFrame com os resultados da consulta
Raises:
DatabaseError: Se a consulta falhar
ConnectionError: Se a conexão falhar
"""# Processar variáveis de ambiente antes de criar conexão
# Isso garante que ${env:VAR} seja resolvido corretamente
env_processor = EnvironmentVariableProcessor()
processed_params = env_processor.process_dict(params_dict)# Instalar sphinx (opcional)
pip install sphinx sphinx-rtd-theme
# Gerar documentação
sphinx-build -b html docs/ docs/_build/html# Instalar linkchecker
pip install linkchecker
# Verificar links na documentação
linkchecker docs/- Suporte a MongoDB
- Suporte a Redis
- Interface web básica
- Métricas e dashboards
- Suporte a streaming de dados
- Integração com Apache Airflow
- Suporte a Kubernetes
- API REST
- Interface gráfica
- Suporte a machine learning
- Integração com cloud providers
- Sistema de plugins
- Melhorar documentação
- Adicionar exemplos
- Corrigir typos
- Melhorar testes
- Adicionar novos tipos de conexão
- Implementar novos processadores
- Melhorar performance
- Adicionar métricas
- Refatorar arquitetura
- Implementar cache distribuído
- Adicionar suporte a streaming
- Criar interface web
- Issues: GitHub Issues
- Discussions: GitHub Discussions
- Documentação: Consulte os arquivos .md do projeto
- Seja respeitoso e construtivo
- Pesquise antes de perguntar
- Forneça contexto detalhado
- Ajude outros desenvolvedores
## Descrição
Descrição clara do problema ou funcionalidade.
## Ambiente
- OS: [ex: Linux, macOS, Windows]
- Python: [ex: 3.11.0]
- Data-Runner: [ex: 1.0.0]
## Passos para Reproduzir
1. ...
2. ...
3. ...
## Comportamento Esperado
O que deveria acontecer.
## Comportamento Atual
O que está acontecendo.
## Logs/ErrosTraceback (most recent call last): ...
## Contexto Adicional
Qualquer informação adicional relevante.
O Data-Runner é um projeto open-source que valoriza contribuições da comunidade. Seja para correções, melhorias ou novas funcionalidades, toda contribuição é bem-vinda!
- Fork o repositório
- Configure o ambiente de desenvolvimento
- Escolha uma issue ou crie uma nova funcionalidade
- Siga os padrões e guidelines
- Faça um pull request
- Participe da comunidade
Bem-vindo ao Data-Runner! 🎯🚀