[ad_1]
Esse novo operador foi considerado a melhor coisa que já aconteceu ao DataWeave desde o pão fatiado. É o resultado de um extenso trabalho com nossos usuários em suas necessidades do dia a dia. Nesta postagem do blog, você verá em primeira mão como os scripts do DataWeave podem ser simplificados no 4.3.0 aproveitando o recurso mais recente para alterar os valores dos campos.
Enquanto trabalhava em um projeto de integração do Jenkins com o Slack, nosso objetivo era obter uma lista de testes com falha de builds do Jenkins e mostrá-los no Slack, permitindo que os usuários os designassem para revisão para si próprios ou para outros.
A API Jenkins requer XML, enquanto a API Slack, por outro lado, usa JSON extensivamente, mas também algumas informações codificadas de URL. Internamente, decidi armazenar as informações mínimas necessárias para os testes de falha atuais em JSON. Como resultado, o DataWeave assumiu o centro do projeto – não apenas tive que mapear entre esses dois mundos, mas também lidar com vários formatos.
{“package”: “org.acme.runtime”, “class”: “SomeTestCase”, “name”: “validateStatus”, “age”: 5, “assignee”: “lisbeth.salander”}
{ “pacote”: “org.acme.runtime”, “classe”: “SomeTestCase”, “nome”: “validateStatus”, “era”: 5, “cessionário”: “lisbeth.salander” } |
Estrutura interna que representa um teste com falha.
Esta foi a primeira vez que usei o DataWeave tão extensivamente e fiquei impressionado com seu poder e simplicidade. Manipular os vários formatos foi fácil, na verdade, não precisei me preocupar com eles além de definir qual deles eu queria, e pude criar rapidamente as mensagens do Slack para apresentar anexos e botões. No entanto, uma coisa me pareceu estranha sobre como manter minha estrutura interna por meio das interações do usuário.
Alterar os valores de um campo
Como eu queria que os usuários do Slack atribuíssem revisores de teste, tive que manter um status de atribuição: se não houvesse um responsável, eu forneceria opções para selecionar um. Do contrário, mostraria quem era o cessionário. Portanto, quando um usuário selecionou um responsável para um teste, tive que atualizar o status do responsável. Esta foi minha abordagem inicial:
% dw 2.0 output application / json — {“package”: payload.package, “class”: payload.class, “name”: payload.name, “age”: payload.age, “assignee”: vars.assignee }
%dw 2.0 resultado inscrição/json –– { “pacote”: carga útil.pacote, “classe”: carga útil.classe, “nome”: carga útil.nome, “era”: carga útil.era, “cessionário”: de quem.cessionário } |
Copiar cada campo parecia estranho, então eu procurei alternativas e pousei na função “mapObject”, para passar por cada par de valores-chave, deixando todos iguais, exceto aquele que eu queria mudar.
% dw 2.0 output application / json — payload mapObject ((value, key, index) -> {(if (key ~ = “assignee”) (key): vars.assignee else (key): value)})
%dw 2.0 resultado inscrição/json –– carga útil mapObject ((valor, chave, índice) -> { (E se (chave ~= “cessionário”) (chave): de quem.cessionário outro (chave): valor) } ) |
Certamente era melhor, mas ainda era um pouco complicado e não era algo que eu pudesse inventar sozinho. É por isso que fiquei animado com a introdução de uma maneira clara e simples de atualizar campos em 4.3.0.
o atualizar operador
Este novo operador permite que você atualize campos específicos de uma estrutura de dados com novos valores. Sob o capô, DataWeave cria uma estrutura totalmente nova, mantendo os campos inalterados e atualizando os que você selecionou. Veja como meu script de atribuição foi simplificado no 4.3.0:
% dw 2.0 output application / json — atualização de carga útil {case .assignee -> vars.assignee}
%dw 2.0 resultado inscrição/json –– carga útil atualizar { caso .cessionário -> de quem.cessionário } |
o atualizar operador também pode lidar com o upsert do par de valores-chave. Nos exemplos, o campo “cessionário” foi mantido com um nulo valor para sinalizar que não havia nenhum, mas se, em vez disso, eu sinalizasse que, por não ter a chave, meu script de atribuição poderia usar a funcionalidade upsert (!):
% dw 2.0 output application / json — atualização de carga útil {case .assignee! -> vars.assignee}
%dw 2.0 resultado inscrição/json –– carga útil atualizar { caso .cessionário! -> de quem.cessionário } |
A grande vantagem desse operador é que ele torna mais fácil atualizar vários campos, mesmo fazendo isso condicionalmente:
% dw 2.0 output application / json — atualização de carga útil {case .assignee -> vars.assignee case age at .age if (age <10) -> age + 1}
%dw 2.0 resultado inscrição/json –– carga útil atualizar { caso .cessionário -> de quem.cessionário caso era em .era E se (era < 10) -> era + 1 } |
No exemplo acima, usamos uma variável “idade” para capturar o valor do campo. Isso permite referenciá-lo em condicionais e a nova definição de valor.
% dw 2.0 output application / json — payload mapObject ((value, key, index) -> {(if (key ~ = “assignee”) (key): vars.assignee else (key): value)})
%dw 2.0 resultado inscrição/json –– carga útil mapObject ((valor, chave, índice) -> { (E se (chave ~= “cessionário”) (chave): de quem.cessionário outro (chave): valor) } ) |
% dw 2.0 output application / json — atualização de carga útil {case .assignee -> vars.assignee}
%dw 2.0 resultado inscrição/json –– carga útil atualizar { caso .cessionário -> de quem.cessionário } |
Comparação de atualizações de campo DataWeave em 4.2 e 4.3
Resumo
o atualizar O operador introduzido em 4.3.0 é uma verdadeira virada de jogo, permitindo ações simples, mas poderosas, para modificar vários campos em uma carga útil.
Você pode ler todos os detalhes sobre o atualizar operador aqui. Realmente esperamos que você possa aproveitar este novo recurso e começar a simplificar seus scripts. Experimente hoje, inscrevendo-se para uma avaliação gratuita da Plataforma Anypoint.
[ad_2]