es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Actualización de Yaml usando Groovy

Tengo un archivo Yaml en el que estoy intentando hacer actualizaciones, dependiendo de si existe o no un valor para una clave específica.

Si el valor de productName es test y existe en el archivo Yaml, quiero actualizar su URL correspondiente, productUrl, con un nuevo valor.

Si tengo un nuevo productName llamado test que no existe en el archivo Yaml, quiero poder agregar una nueva entrada al archivo Yaml para este productName y su productUrl.

Aquí está lo que tengo hasta ahora, pero no estoy seguro si se puede reescribir de una manera más limpia o si hay un error en mi enfoque.

“`#!/usr/local/bin/groovy
@Grab('org.yaml:snakeyaml:1.17')
import org.yaml.snakeyaml.Yaml

Yaml parser = new Yaml()
def p = parser.load(("company.yml" as File).text)
Boolean isProductNew = true

p.company.products.each { i ->
if (i.productName == 'test') {
i.productUrl = 'https://company/product-new-test'
isProductNew = false
}
}

if (isProductNew) {
p.company.products << ["productName": "test", "productUrl": "https://company/product-test"]
}
println p
“`

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Actualización del archivo YAML basado en un valor clave específico en Groovy

    Problema

    Se te ha proporcionado un archivo YAML que contiene una lista de productos con sus respectivos nombres y URLs. Tu tarea es actualizar la URL de un producto existente o agregar una nueva entrada de producto si el producto aún no existe en el archivo. Específicamente, si el campo productName es igual a test, debes actualizar su campo productUrl con un nuevo valor; de lo contrario, debes agregar una nueva entrada para test con su campo productUrl.

    Solución

    Podemos resolver este problema utilizando la biblioteca de análisis YAML en Groovy, la cual nos permite cargar el archivo YAML en un objeto en memoria, actualizarlo según sea necesario y escribirlo de nuevo en el archivo. Así es como podemos hacerlo:

    #!/usr/bin/env groovy
    
    @Grab('org.yaml:snakeyaml:1.28')
    
    import org.yaml.snakeyaml.Yaml
    
    def fileName = "company.yml"
    def productName = "test"
    def productUrl = "https://company/product-test"
    
    // Cargamos el archivo YAML en un objeto
    def parser = new Yaml()
    def yamlObj = parser.load(new File(fileName).text)
    
    // Verificamos si el producto ya existe
    def isProductNew = true
    yamlObj.company.products.each { product ->
      if (product.productName == productName) {
        product.productUrl = productUrl
        isProductNew = false
      }
    }
    
    // Agregamos una nueva entrada si es necesario
    if (isProductNew) {
      yamlObj.company.products << [
        productName: productName,
        productUrl: productUrl
      ]
    }
    
    // Escribimos el YAML actualizado de nuevo en el archivo
    def newYaml = parser.dump(yamlObj)
    new File(fileName).text = newYaml
    

    En esta solución, primero cargamos el archivo YAML en el objeto yamlObj utilizando el método load() del analizador YAML. Luego, recorremos la lista de productos y verificamos si el campo productName coincide con el producto objetivo (en este caso, test). Si coincide, actualizamos el campo productUrl con el nuevo valor de URL. Si no coincide, establecemos isProductNew en true.

    Después del ciclo, verificamos si isProductNew sigue siendo true, lo que significa que el producto objetivo no existe en el archivo. En ese caso, agregamos una nueva entrada de producto a la lista con los valores de productName y productUrl dados.

    Finalmente, utilizamos el método dump() del analizador YAML para convertir yamlObj en una cadena YAML y lo escribimos de nuevo en el archivo utilizando la propiedad text del objeto File en Groovy.

    Conclusión

    En esta solución, hemos mostrado cómo actualizar un archivo YAML basado en un valor clave específico utilizando Groovy y la biblioteca SnakeYAML. Este enfoque se puede adaptar fácilmente para manejar otros tipos de archivos YAML y pares clave-valor.

Comments are closed.