Para encontrar o menor caminho/custo entre dois pontos foi utilizado Dijkstra.
- FastAPI - REST API Framework (Tem suporte para GraphQL)
- SQLAlchemy - Abstração para fazer queries SQL
- Pytest - biblioteca para implementar testes unitários
- Docker
- PostgreSQL
- Clone do repositório
- Instalar docker e docker-compose
- Rodar
docker-compose up -d db
para iniciar o PostgreSQL - Rocker
docker-compose up dev
para iniciar o projecto em modo de desenvolvimento - Para acessar a documentação da API, basta usar o seguinte link:
http://localhost:8000/docs
POST /api/v1/route
- Exemplo de paylod
{
"map": "string",
"origin": "string",
"destination": "string",
"distance": 0
}
curl -X POST "http://localhost:8000/api/v1/route" -H "accept: application/json" -H "Content-Type: application/json" -d "{\"map\":\"SP\",\"origin\":\"A\",\"destination\":\"B\",\"distance\":10}"
curl -X POST "http://localhost:8000/api/v1/route" -H "accept: application/json" -H "Content-Type: application/json" -d "{\"map\":\"SP\",\"origin\":\"B\",\"destination\":\"D\",\"distance\":15}"
curl -X POST "http://localhost:8000/api/v1/route" -H "accept: application/json" -H "Content-Type: application/json" -d "{\"map\":\"SP\",\"origin\":\"A\",\"destination\":\"C\",\"distance\":20}"
curl -X POST "http://localhost:8000/api/v1/route" -H "accept: application/json" -H "Content-Type: application/json" -d "{\"map\":\"SP\",\"origin\":\"C\",\"destination\":\"D\",\"distance\":30}"
curl -X POST "http://localhost:8000/api/v1/route" -H "accept: application/json" -H "Content-Type: application/json" -d "{\"map\":\"SP\",\"origin\":\"B\",\"destination\":\"E\",\"distance\":50}"
curl -X POST "http://localhost:8000/api/v1/route" -H "accept: application/json" -H "Content-Type: application/json" -d "{\"map\":\"SP\",\"origin\":\"D\",\"destination\":\"E\",\"distance\":30}"
GET /api/v1/route/cheapest/map/{map}/origin/{origin}/destination/{destination}/truck_autonomy/{truck_autonomy}/gas_price/{gas_price}
map: string
origin: string
destination: string
truck_autonomy: float
gas_price: float
Exemplo - GET /api/v1/route/cheapest/map/SP/origin/A/destination/B/truck_autonomy/10.1/gas_price/2.50
{
"route": [
"A",
"B",
"D"
],
"cost": 6.25
}
- Rodar
docker-compose up tests
- Rodar
docker-compose up flake8
- Irá mostrar algo caso tiver algo a ser corrigido - Rodar
docker-compose up coverage
- Irá gerar um relatório da cobertura de teste. Após isso é só abrir no navegador o arquivohtmlcov/index.html
.
- Implementação simples, funcional e flexivél para extensão
- Utilizado uma biblioteca pronta para calcular o menor caminho/custo
- Garantir 100% de cobertura de teste.
- Melhorar os testes para usar fixture do pytest.
- Organizar as mensagens de errors para padronizar as mesmas.
- Criar um Dockerfile que não instale as dependencias de desenvolvimento.
- Implementar migrations usando sqlalchemy-migrate
- Adicionar mais logs em parte importantes do sistema. Essa lib parece interesante (https://github.com/Delgan/loguru)