Contrato de modernização do registro de pedidos
Interface existente
service.py --source <csv> [--customer <id>] emite exatamente um objeto JSON em stdout.
Os registros são ordenados por id; os totais são centavos inteiros; um cliente desconhecido retorna
uma lista vazia e total zero. Entrada inválida retorna código diferente de zero e um erro em stderr.
Alteração solicitada
Adicione a opção explícita --backend sqlite --source <database> com o mesmo contrato observável
de consulta. Mantenha CSV como padrão durante o exercício. Implemente migrate.py
separadamente das consultas.
Pontos de controle
- MOD-1: a caracterização congelada do CSV continua passando.
- MOD-2: contagem migrada, total inteiro, ordenação e versão do esquema correspondem.
- MOD-3: entrada malformada/duplicada falha sem um destino parcial apresentado como bem-sucedido.
- MOD-4: um destino existente nunca é sobrescrito, inclusive em uma reexecução.
- MOD-5: ler um banco SQLite ausente não cria um.
- MOD-6: a reversão para CSV funciona e o hash da fonte permanece inalterado.
O intervalo de inteiros aceito pelo Python não deve ser silenciosamente restringido ao intervalo
de 64 bits com sinal de INTEGER/SUM do SQLite. Armazene texto decimal validado se necessário, converta-o em
inteiros Python na leitura e reconcilie com aritmética inteira exata. Nunca troque
para somas em ponto flutuante. O contrato JSON continua expondo centavos inteiros.
Contas, pagamentos, APIs HTTP, registros de produção, bancos de dados externos ou implantação na nuvem não fazem parte desta modernização.