API CRUD de usuarios criada com FastAPI, Python 3.14 e arquitetura Ports and Adapters.
O projeto foi pensado para estudo de deploy no Kubernetes, por isso inclui:
- persistencia apenas em memoria
- Swagger para exploracao da API
- testes unitarios e de endpoint
- endpoints de health check para liveness e readiness
- workflow de CI para execucao automatica dos testes
- Python 3.14
- FastAPI
- Uvicorn
- Pydantic
- Pytest
- Pytest Cov
- Black
- isort
- mypy
Entidade principal: Usuario
id: intnome: stringdtNascimento: datestatus: booltelefones: string[]
O projeto segue o modelo Ports and Adapters:
domain: regras e contratos do dominioapplication: casos de uso e servicosadapters/inbound: entrada HTTP da aplicacaoadapters/outbound: persistencia em memoria
Estrutura simplificada:
src
|-- adapters
| |-- inbound
| | `-- http
| | `-- routes
| `-- outbound
| `-- repositories
|-- application
| `-- services
|-- domain
| `-- ports
`-- main.py
- Windows com PowerShell
- Python 3.14 instalado
py -3.14disponivel no terminal
Para validar a instalacao do Python:
py -3.14 --versionNo PowerShell, dentro da pasta do projeto:
py -3.14 -m venv .venv.\.venv\Scripts\Activate.ps1Se o PowerShell bloquear a execucao de scripts, rode uma vez:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUserpython -m pip install --upgrade pip
pip install -e .[dev]Opcao 1, executando diretamente o arquivo principal:
py -3.14 .\src\main.pyOpcao 2, usando Uvicorn com recarga automatica:
uvicorn main:app --app-dir src --reloadCom a API em execucao, abra:
- API:
http://127.0.0.1:8000 - Swagger UI:
http://127.0.0.1:8000/docs - OpenAPI JSON:
http://127.0.0.1:8000/openapi.json
Com o ambiente virtual ativo:
pytest --cov=src --cov-report=term-missingResultado esperado no estado atual do projeto:
- testes unitarios do servico
- testes dos endpoints HTTP
- cobertura de 100%
O projeto tambem possui ferramentas de padronizacao e analise estatica configuradas em pyproject.toml.
Responsavel por formatar o codigo automaticamente, mantendo um padrao consistente no projeto.
Configuracao atual:
line-length = 88target-version = py314
Executar:
black src testsResponsavel por organizar os imports e manter o estilo compativel com o Black.
Configuracao atual:
- perfil
black line_length = 88
Executar:
isort src testsResponsavel por fazer checagem estatica de tipos para identificar inconsistencias antes da execucao.
Configuracao atual:
python_version = 3.14check_untyped_defs = truedisallow_incomplete_defs = trueno_implicit_optional = true
Executar:
mypy srcEsses pacotes fazem parte do grupo dev, junto com as dependencias de teste.
pip install -e .[dev]GET /health/liveGET /health/ready
Uso no Kubernetes:
live: verifica se a aplicacao esta vivaready: verifica se a aplicacao esta pronta para receber trafego
POST /usuariosGET /usuariosGET /usuarios/{usuario_id}PUT /usuarios/{usuario_id}DELETE /usuarios/{usuario_id}
Requisicao:
{
"id": 1,
"nome": "Carlos",
"dtNascimento": "1992-03-14",
"status": true,
"telefones": [
"11911112222",
"1122223333"
]
}{
"id": 1,
"nome": "Carlos",
"dtNascimento": "1992-03-14",
"status": true,
"telefones": [
"11911112222",
"1122223333"
]
}Criar usuario:
curl -X POST "http://127.0.0.1:8000/usuarios" \
-H "Content-Type: application/json" \
-d "{\"id\":1,\"nome\":\"Carlos\",\"dtNascimento\":\"1992-03-14\",\"status\":true,\"telefones\":[\"11911112222\",\"1122223333\"]}"Listar usuarios:
curl "http://127.0.0.1:8000/usuarios"Verificar readiness:
curl "http://127.0.0.1:8000/health/ready"Os dados sao armazenados somente em memoria.
Implicacoes:
- ao reiniciar a aplicacao, os dados sao perdidos
- nao existe dependencia de banco de dados
- o comportamento e ideal para estudo de API, testes e deploy em Kubernetes
O workflow de CI fica em .github/workflows/ci.yml e executa:
- instalacao das dependencias
- execucao dos testes
- geracao de relatorio JUnit para os testes
As versoes declaradas do projeto ficam em pyproject.toml.
Dependencias diretas atuais do projeto:
fastapi >= 0.135.1uvicorn >= 0.41.0httpx >= 0.28.1black >= 26.3.0isort >= 8.0.1mypy >= 1.19.1pytest >= 9.0.2pytest-cov >= 7.0.0
Observacao importante:
- dependencias transitivas, como
pydantic_core, normalmente nao devem ser atualizadas isoladamente - para dependencias diretas, o ideal e atualizar, rodar testes e revisar changelog antes de subir para producao
Formas praticas de acompanhar isso:
- rodar
pip list --outdatedno ambiente virtual - usar o CI para validar se a atualizacao nao quebrou nada
- acompanhar changelogs dos pacotes principais
- usar automacao para abrir PRs de atualizacao
Comando manual:
.\.venv\Scripts\python -m pip list --outdated --format=columnsAutomacao adicionada neste projeto:
- arquivo
.github/dependabot.yml - verificacao semanal de dependencias Python
- verificacao semanal de GitHub Actions
- abertura automatica de PRs para atualizacao
Recomendacao pratica:
- manter dependencias de runtime sempre dentro de faixas compativeis e testadas
- atualizar dependencias de teste com mais frequencia
- nao perseguir
latestcegamente; perseguirlatestvalidado pelos testes
Executar a API:
py -3.14 .\src\main.pyExecutar a API com reload:
uvicorn main:app --app-dir src --reloadExecutar testes:
pytest --cov=src --cov-report=term-missingFormatar codigo:
black src tests
isort src testsChecar tipos:
mypy srcInstalar dependencias novamente:
pip install -e .[dev]