🤝 Guia de Contribuição - Codis#
Obrigado por considerar contribuir com o Codis! Este guia explica tudo que você precisa saber para ter sua contribuição aceita.
Formas de Contribuir#
| Forma | Link |
|---|---|
| 🐛 Reportar bug | Issue (Bug) |
| 💡 Sugerir feature | Feature Request |
| 🖼️ Screenshots | Capturas do editor em diferentes SOs, temas e painéis para a wiki |
| 🌍 Traduções | Edite em src/locales/ ou via plugin |
| 🎨 Criar tema | Veja Criando um Tema |
| 🧩 Criar plugin | Veja wiki/plugins.md |
| 📝 Melhorar docs | Edite os arquivos em wiki/ |
| 🧪 Testes | Expanda tests/ para src/ui/ e integração |
| 💻 Código | Veja o Fluxo de Contribuição |
Fluxo de Contribuição#
1. Fork e Clone#
git clone https://github.com/SEU_USUARIO/Codis.git
cd Codis
git remote add upstream https://github.com/KillovSky/Codis.git
2. Crie uma Branch#
git checkout -b fix/sql-thread-lock # correções
git checkout -b feature/new-panel # features
git checkout -b docs/update-plugins-wiki # documentação
git checkout -b theme/nord-variant-light # temas
git checkout -b test/ui-editor-coverage # testes
git checkout -b i18n/update-fr-locale # traduções
3. Configure o Ambiente#
pip install -r requirements.txt
pip install pytest pytest-cov flake8 pylint
Linux - instale o Tkinter:
sudo apt install python3-tk # Ubuntu/Debian
sudo pacman -S tk # Arch
sudo dnf install python3-tkinter # Fedora
4. Faça as Mudanças#
- Siga as Convenções de Código
- Commits pequenos e descritivos
- Uma mudança por commit (não misture feature com bugfix)
5. Verifique Antes de Submeter#
# Sintaxe de todos os arquivos Python
find src/ -name "*.py" -print0 | xargs -0 python -m py_compile
# Testes headless (sem display gráfico)
pytest tests/ -v
# Com cobertura
pytest tests/ --cov=src --cov-report=term-missing
# Módulo específico
pytest tests/test_config.py -v
# Para no primeiro falho
pytest tests/ -x
# Estilo
flake8 src/ run.py --max-line-length=180
# Imports principais
python -c "from src.config import ConfigManager; print('OK')"
python -c "from src.app import CodisApp; print('OK')"
→ Documentação completa dos testes
6. Sincronize com o Upstream#
git fetch upstream
git rebase upstream/main
7. Submeta o Pull Request#
git push origin sua-branch
Abra o PR no GitHub preenchendo o template - especialmente a seção "Como Testar".
Convenções de Código#
Estilo Geral#
- Python 3.12+ - use f-strings,
match,dataclass, type hints - Type hints em todas as assinaturas públicas
- Docstrings em funções e classes públicas (Google Style em PT-BR)
Docstrings#
def minha_funcao(param1: str, param2: int = 0) -> bool:
"""Descrição concisa do que a função faz.
Args:
param1: Descrição do parâmetro.
param2: Descrição do parâmetro opcional.
Returns:
bool: O que o valor de retorno significa.
Raises:
ValueError: Quando acontece X.
"""
Thread Safety - CRÍTICO#
O Tkinter não é thread-safe total. Toda manipulação de widget deve ocorrer na main thread:
# ❌ ERRADO - pode crashar ou corromper o estado da UI
def minha_thread():
self._label.config(text="novo texto")
# ✅ CORRETO - agenda na main thread
def minha_thread():
self.after(0, lambda: self._label.config(text="novo texto"))
# ✅ CORRETO - com dados de retorno
def minha_thread():
result = calcular_algo()
self.after(0, lambda r=result: self._apply_result(r))
Internacionalização (i18n)#
Toda string visível ao usuário deve usar _t():
from src.i18n import _t
# ❌ ERRADO
tk.Label(self, text="Salvar arquivo")
# ✅ CORRETO
tk.Label(self, text=_t("ui.save_file", "Salvar arquivo"))
Fluxo para novas strings:
- Adicione a chave apenas em
src/locales/pt-BR.jsoncom o valor em português. - Execute
python sync_locales.py- propaga para todos os outros idiomas marcando com[TODO]para tradução futura. - Nunca edite os outros arquivos de locale manualmente para novas chaves - sempre via sync.
# Após adicionar chaves em pt-BR.json:
python sync_locales.py
# Automaticamente traduzir em todos os outros idiomas
# Apesar de permitido, evite quando puder; Sempre revise!
python translator.py
Criando um Tema#
Temas ficam em src/theme/base.py. Para criar um novo, adicione dentro de _define_themes():
_add(Theme(
name="meu_tema",
dark=True,
bg="#1a1a2e",
fg="#e0e0ff",
editor_bg="#12122a",
cursor="#6c63ff",
accent="#6c63ff",
# ... todos os campos obrigatórios
))
Adicione "meu_tema" na lista THEME_ORDER na posição desejada. Para temas distribuídos como plugins, veja wiki/plugins.md.
Criando uma Tradução#
Os arquivos de locale ficam em src/locales/<código>.json. O Codis usa 4.633 chaves de i18n (pt-BR e en são completos; sync_locales.py propaga as novas para os demais):
# Copiar o template do inglês para um novo idioma
cp src/locales/en.json src/locales/pl.json
# Abra o arquivo e traduza os valores - nunca as chaves!
Para adicionar um idioma via plugin (sem PR), veja wiki/plugins.md.
Adicionando um Novo Painel#
Os painéis do Codis seguem um padrão de integração definido:
- Crie o módulo em
src/ui/meu_painel.pycom uma classe que estendatk.Frame. - Implemente
apply_theme(tmgr)para recoloração dinâmica de tema. - Registre na Activity Bar em
src/_app_build.py(_actbar.add_plugin_item(...)). - Adicione ao
panel_mapemsrc/_app_editor.py(_on_activity). - Se for painel inferior: adicione a aba em
_build_bottom_panele aopanel_mapemsrc/_app_lsp.py(_show_panel). - Adicione ao bloco
apply_themeemsrc/app.py. - Adicione as chaves i18n em
pt-BR.jsone executesync_locales.py.
Modos Standalone - como testar#
Úteis para isolar bugs sem iniciar o editor completo. Há 29 modos disponíveis:
# Editor e visualizadores
python run.py scratch # Bloco de notas multi-aba
python run.py paint # Editor de imagens
python run.py diff A.py B.py # Diff Viewer
python run.py render doc.md # Preview HTML/Markdown/SVG
python run.py flowchart src/app.py # Fluxograma AST
# Banco de dados e dados
python run.py sql # SQL Studio
python run.py formatter # Formatador JSON/YAML/TOML/XML
# Ferramentas de dev
python run.py regex # Regex Playground
python run.py rest # REST Client
python run.py git . # Painel Git
python run.py terminal . # Terminal integrado
python run.py stats src/ # Estatísticas de código
# Sistema e ambiente
python run.py pip # Gerenciador de pacotes Pip
python run.py processes # Gerenciador de processos
python run.py env # Variáveis de ambiente
python run.py ssh # Conexão SSH
# Produtividade
python run.py player # Zen Media Player
python run.py pomodoro # Timer Pomodoro
python run.py todo # Lista de tarefas
python run.py tasks # Kanban de tarefas
python run.py calendar # Calendário
python run.py clock # Relógio / Alarmes
python run.py calculator # Calculadora científica
# Utilitários
python run.py snippets # Gerenciador de snippets
python run.py color-picker # Seletor de cores
python run.py archive arq.zip # Visualizador de arquivos compactados
python run.py output # Painel de output
python run.py accessibility # Painel de acessibilidade
python run.py plugins # Gerenciador de plugins
# Também via python -m src
python -m src paint
python -m src sql
Documentação#
Cada informação fica em um único lugar, para os textos não divergirem entre si.
| Onde | O que contém | Observação |
|---|---|---|
README.md |
Vitrine do projeto e início rápido | Só resumo; detalhes ficam na wiki |
wiki/*.md |
Guias de usuário e de desenvolvedor | Fonte dos guias. wiki/Home.md é o índice (grupos e ordem) e wiki/_Sidebar.md é o menu da GitHub Wiki |
CHANGELOG.md, ROADMAP.md, CONTRIBUTING.md, SECURITY.md, AUTHORS.md |
Documentos do projeto | Ficam na raiz (convenção do GitHub) |
docs/ |
Site (GitHub Pages) | index.html é escrito à mão; as demais páginas são geradas, não edite direto |
tools/docs_facts.py |
Extrai números do código e confere os docs | python tools/docs_facts.py --check |
tools/build_site.py |
Gera docs/*.html a partir dos .md |
make docs (precisa de pip install -r tools/requirements-docs.txt) |
Ao adicionar uma página na wiki: crie wiki/<nome-em-minusculas>.md, liste-a em wiki/Home.md e em wiki/_Sidebar.md, rode make docs e faça commit dos arquivos gerados. O job check do docs.yml falha no PR se docs/ estiver desatualizado ou se um número dos docs não bater com o código.
Áreas que Precisam de Contribuição#
| Área | O que precisamos |
|---|---|
| 🖼️ Screenshots | Capturas do editor em diferentes SOs e temas para a wiki |
| 🌍 Traduções | Todos os idiomas podem ter strings com [TODO] |
| 🎨 Temas | Gruvbox Hard, Tokyo Storm, Catppuccin Latte |
| 🧪 Testes | Expandir cobertura para src/ui/ e testes de integração |
| 📝 Docs | Exemplos práticos na wiki, especialmente para plugins e IA |
| 🐛 Bugs | Issues com label bug |
| ✨ Features | Issues com label help wanted |
Perguntas?#
- 💬 Discussões para dúvidas gerais
- Leia a Governança para entender o processo de decisão