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(...).)



Source link

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *

Botão Voltar ao Topo