Criando uma biblioteca open source: do repositório à primeira contribuição externa
Criar uma biblioteca open source é uma jornada que combina habilidades técnicas, comunicação e gestão de comunidade. Este artigo percorre as etapas essenciais para transformar uma ideia em um projeto que atrai contribuidores externos, usando exemplos práticos de configuração e boas práticas.
1. Planejamento e definição do escopo da biblioteca
Antes de escrever uma linha de código, é crucial identificar um problema real que sua biblioteca resolverá. Evite reinventar a roda — pesquise soluções existentes e encontre um nicho onde sua biblioteca agregue valor.
Definindo o MVP (Minimum Viable Product):
Para uma biblioteca de validação de CPF em Python, por exemplo:
Funcionalidades mínimas:
- Validar formato do CPF (11 dígitos)
- Verificar dígitos verificadores
- Retornar booleano (True/False)
Público-alvo: Desenvolvedores Python que precisam validar CPFs em sistemas brasileiros
Escolha de licença: Licenças permissivas como MIT ou Apache 2.0 são recomendadas para maximizar adoção. O nome deve ser único e fácil de lembrar, como cpf-validator-py.
Estrutura inicial do repositório:
cpf-validator-py/
├── cpf_validator/
│ ├── __init__.py
│ └── validator.py
├── tests/
│ ├── __init__.py
│ └── test_validator.py
├── README.md
├── LICENSE
├── .gitignore
├── setup.py
└── requirements.txt
2. Configuração do repositório e boas práticas iniciais
README.md é a porta de entrada do seu projeto. Deve conter:
# cpf-validator-py
Biblioteca Python para validação de CPF.
## Instalação
```bash
pip install cpf-validator-py
Uso básico
from cpf_validator import validate_cpf
print(validate_cpf("529.982.247-25")) # True
print(validate_cpf("111.111.111-11")) # False
Documentação
[Link para documentação completa]
Contribuindo
Veja CONTRIBUTING.md para detalhes.
Licença
MIT
**Arquivos essenciais:**
- `LICENSE`: Texto da licença MIT
- `CONTRIBUTING.md`: Guia de como contribuir (padrão de commits, testes, etc.)
- `CODE_OF_CONDUCT.md`: Código de conduta (recomendado: Contributor Covenant)
- `.gitignore`: Para Python, incluir `__pycache__/`, `*.pyc`, `.env`, `venv/`
- `.editorconfig`: Padroniza indentação e encoding
**Versionamento semântico:** Use `MAJOR.MINOR.PATCH` (ex: 0.1.0 para primeira release). Crie tags no Git:
```text
git tag -a v0.1.0 -m "Primeira release funcional"
git push origin v0.1.0
3. Estrutura de código e documentação interna
Organização de pastas e módulos:
cpf-validator-py/
├── cpf_validator/
│ ├── __init__.py
│ ├── validator.py # Lógica principal
│ └── utils.py # Funções auxiliares
├── tests/
│ ├── __init__.py
│ ├── test_validator.py
│ └── test_utils.py
├── docs/
│ ├── index.md
│ └── api.md
└── examples/
└── basic_usage.py
Exemplo de código com docstrings (Sphinx-style):
# cpf_validator/validator.py
def validate_cpf(cpf: str) -> bool:
"""
Valida um CPF brasileiro.
Args:
cpf (str): CPF no formato "XXX.XXX.XXX-XX" ou "XXXXXXXXXXX"
Returns:
bool: True se o CPF for válido, False caso contrário
Examples:
>>> validate_cpf("529.982.247-25")
True
>>> validate_cpf("111.111.111-11")
False
"""
# Remove caracteres não numéricos
cpf = ''.join(filter(str.isdigit, cpf))
if len(cpf) != 11:
return False
# Verifica se todos os dígitos são iguais
if cpf == cpf[0] * 11:
return False
# Cálculo dos dígitos verificadores
for i in range(9, 11):
value = sum((int(cpf[num]) * ((i + 1) - num) for num in range(0, i)))
digit = (value * 10) % 11
if digit == 10:
digit = 0
if digit != int(cpf[i]):
return False
return True
Testes unitários (pytest):
# tests/test_validator.py
import pytest
from cpf_validator import validate_cpf
def test_cpf_valido():
assert validate_cpf("529.982.247-25") == True
def test_cpf_invalido():
assert validate_cpf("111.111.111-11") == False
def test_cpf_com_mascara():
assert validate_cpf("529.982.247-25") == True
def test_cpf_tamanho_incorreto():
assert validate_cpf("12345") == False
4. Automação e integração contínua (CI/CD)
GitHub Actions para testes automatizados:
# .github/workflows/tests.yml
name: Tests
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: [3.8, 3.9, 3.10]
steps:
- uses: actions/checkout@v3
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python-version }}
- name: Install dependencies
run: |
pip install pytest pytest-cov
pip install -r requirements.txt
- name: Run tests
run: |
pytest --cov=cpf_validator tests/
- name: Upload coverage
uses: codecov/codecov-action@v3
Publicação automática no PyPI:
# .github/workflows/publish.yml
name: Publish to PyPI
on:
release:
types: [published]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.10'
- name: Install dependencies
run: |
pip install setuptools wheel twine
- name: Build and publish
env:
TWINE_USERNAME: ${{ secrets.PYPI_USERNAME }}
TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }}
run: |
python setup.py sdist bdist_wheel
twine upload dist/*
5. Estratégias para atrair os primeiros contribuidores
Criando issues amigáveis para iniciantes:
# Issue: Adicionar validação de CPF com pontos e traços
# Labels: good first issue, enhancement
## Descrição
Atualmente, a função validate_cpf() aceita apenas números.
Precisamos que ela também aceite formatos como "529.982.247-25".
## Tarefas
- [ ] Modificar a função para remover caracteres não numéricos
- [ ] Adicionar testes para o novo formato
- [ ] Atualizar a documentação
## Como testar
python -m pytest tests/test_validator.py -v
Divulgação estratégica:
- Publique em comunidades como Python Brasil, Reddit (r/Python), Dev.to
- Envie para newsletters técnicas (Python Weekly, PyCoder's Weekly)
- Compartilhe em grupos de Telegram/Discord de Python
Oferecendo suporte rápido: Responda PRs em até 48 horas. Use templates de PR:
# .github/PULL_REQUEST_TEMPLATE.md
## Descrição
<!-- Descreva suas mudanças -->
## Tipo de mudança
- [ ] Correção de bug
- [ ] Nova funcionalidade
- [ ] Documentação
## Testes
- [ ] Testes unitários adicionados/atualizados
- [ ] Todos os testes passam
## Checklist
- [ ] Código segue o estilo do projeto
- [ ] Documentação atualizada
6. Gerenciamento da primeira contribuição externa
Processo de code review:
Checklist de revisão:
1. O código resolve o problema proposto?
2. Segue as convenções do projeto (PEP 8, nomes de variáveis)?
3. Testes cobrem os casos de borda?
4. Documentação foi atualizada?
5. Não introduz breaking changes?
Lidando com divergências: Seja educado e específico nos comentários. Exemplo de feedback construtivo:
"Obrigado pela contribuição! A lógica está correta, mas sugiro
extrair a validação de dígitos para uma função auxiliar para
melhorar a legibilidade. O que acha?"
Celebrando contribuições: Use all-contributors no README:
<!-- ALL-CONTRIBUTORS-BADGE:START -->
[](#contributors)
<!-- ALL-CONTRIBUTORS-BADGE:END -->
## Contribuidores ✨
<!-- ALL-CONTRIBUTORS-LIST:START -->
<table>
<tr>
<td align="center">
<a href="https://github.com/joao">
<img src="https://avatars.githubusercontent.com/joao" width="100px" alt="João"/>
<br /><sub><b>João Silva</b></sub>
</a>
</td>
</tr>
</table>
<!-- ALL-CONTRIBUTORS-LIST:END -->
7. Manutenção contínua e crescimento da comunidade
Roadmap público: Use GitHub Projects ou um arquivo ROADMAP.md:
# Roadmap
## Versão 0.2.0 (Próximo)
- [ ] Suporte a CPFs com máscara
- [ ] Função para gerar CPFs válidos
## Versão 0.3.0
- [ ] Interface de linha de comando (CLI)
- [ ] Validação em lote
## Versão 1.0.0
- [ ] Documentação completa com Sphinx
- [ ] 95% de cobertura de testes
- [ ] 5 contribuidores ativos
Delegando responsabilidades: Crie um arquivo MAINTAINERS.md e use labels como good first issue, help wanted, needs review.
Ambiente inclusivo: Responda perguntas em issues com paciência, evite jargões desnecessários e agradeça contribuições mesmo que pequenas.
Criar uma biblioteca open source é mais do que escrever código — é construir um ecossistema onde desenvolvedores se sintam bem-vindos para contribuir. Comece pequeno, mantenha a qualidade e celebre cada contribuição. Sua primeira contribuição externa será apenas o começo de uma jornada colaborativa.
Referências
- Guia oficial do GitHub para projetos open source — Recursos completos sobre como iniciar e gerenciar projetos open source, incluindo documentação, comunidades e boas práticas legais.
- Documentação do pytest — Framework de testes para Python, essencial para garantir qualidade em bibliotecas open source.
- GitHub Actions - Documentação oficial — Guia completo para configurar CI/CD automatizado, testes e publicação em projetos open source.
- Contributor Covenant - Código de Conduta — Modelo de código de conduta amplamente adotado para criar ambientes inclusivos em comunidades open source.
- All Contributors - Especificação — Ferramenta para reconhecer automaticamente todos os tipos de contribuições em projetos open source, não apenas código.
- Versionamento Semântico 2.0.0 — Especificação oficial de versionamento semântico, fundamental para gerenciar releases e compatibilidade em bibliotecas.
- Python Packaging User Guide — Guia oficial para empacotar e distribuir bibliotecas Python no PyPI, com exemplos de setup.py e configurações.
- Sphinx Documentation Generator — Ferramenta padrão para gerar documentação de projetos Python, com suporte a docstrings e autodoc.