Apresentando o envoltório
Apresentando o envoltório. Novidade de Graham Dumpleton (famoso por wrapt, mod_wsgi e agente Python da New Relic), que descreve Wrapture como pegando as ideias de monkeypatching do wrapt e estendendo-as para serem aplicadas a testes e rastreamento ao mesmo tempo.
Wrapture (documentação completa aqui) facilita o encapsulamento de qualquer função ou método de forma que todo o acesso possa ser rastreado ou substituído para retornar um valor diferente.
Ele atua como uma alternativa para unittest.mock e uma maneira de implementar o rastreamento em um projeto existente:
Anexar observação a código que você não controla, registrar o que flui através dele e fazer isso sem perturbar o programa que está sendo assistido é um problema no qual nunca parei de pensar.
Wrapture inclui suporte OpenTelemetry e ainda possui um mecanismo totalmente baseado em configuração para adicionar rastreamento a um projeto Python existente, que se parece com isto:
capture = "summary"
((observe))
target = "domain:Calculator"
name = ("outer", "inner")
((sink))
type = "jsonlines"
path = "trace.jsonl"
Este ainda é um projeto muito jovem – com apenas algumas semanas – mas teve um início muito promissor.
Curiosamente, esta também é a primeira tentativa de Graham em um grande projeto inteiramente conduzido por agentes:
Cada linha de código e documentação foi escrita por um assistente de IA trabalhando sob minha direção. Quero ser franco sobre isso e igualmente franco sobre o que não foi. Isso não era vibração de codificação, onde um prompt único produz uma pilha de código gerado e a pessoa que dirige espera pelo melhor porque não tem o conhecimento para julgar o que retornou. A codificação Vibe ganhou má reputação. Projetei o envoltório cuidadosamente desde o início. Passei muito tempo neste canto específico do Python e sabia exatamente qual deveria ser o resultado, e a IA era o meio de produzi-lo, e não a fonte do design.
Em uma postagem de acompanhamento, Testes unitários com wrapture, Graham mostra os padrões de teste suportados pela nova biblioteca:
def test_stub_with_wrapture(): with wrapture.binding( Gateway, "charge" ).on_call.returns({ "id": "stub", "amount": 0} ): assert OrderService().place( 500 )("id") == "stub"
E este exemplo bacana de teste que chama e depois modifica o valor de retorno do método original:
def test_pinned_result_with_wrapture(): charge = wrapture.binding( Gateway, "charge" ) charge.on_call.transforms_result( lambda r: {**r, "id": "ch_TEST"} ) with charge: assert OrderService().place( 500 ) == { "id": "ch_TEST", "amount": 500 }
(Em ambos os exemplos o OrderService().place(...) chamadas de método Gateway().charge(...).)





