2016-12-22 0:42 GMT+02:00 John Wagenleitner <john.wagenleitner@gmail.com>:
On Wed, Dec 21, 2016 at 11:58 AM, Dimitar Vassilev <dimitar.vassilev@gmail.com> wrote:
Good evening/morning/day,
Quick one how can I parse a YAML file with groovy and snakeyaml

I have a nested hash YAML like:


In Ruby I can do something like in the irb/file
require 'yaml'
thing = YAML.load_file('some.yml')
puts thing.inspect

How can I do similar thing in groovy using

import org.yaml.snakeyaml.DumperOptions
import org.yaml.snakeyaml.Yaml

and the yaml.load(object) function?
I would like to loop through the YAML structure and figure out which kind of loop to use.
I'm interested in dealing directly with the pkgcol(1-N) attributes directly if possible.

Something like the following could be run in the GroovyConsole

@Grab(group='org.yaml', module='snakeyaml', version='1.17') 
import org.yaml.snakeyaml.*

String yamlText = '''

Yaml yaml = new Yaml()
def result = yaml.load(yamlText)
// or from a file
// new File('/tmp/test.yml').withReader('UTF-8') { reader ->
//    def result = yaml.load(reader)
//    ....
// }

result.pkgcolls.each {
    assert it.key == 'pkgcol1' || it.key == 'pkgcol2'

println result.inspect()
Thanks John,
I got a hang of it. My next question is how one can expand a statically defined directory variable with values from the loop so that subdirs are created? I need to install my software in certain locations.  The main directory is called pkgHome. I would like to have a separate subdirectory for each software collection. In the current state only the first statement is caught and only 1 directory is created. If you or anyone else can give a hand on this one, will be appreciated. I can donate the amount of 2-3 beers via Paypal or to a software project of your choice.

The real structure I have is

My sample code is below

/definitions of the placeholders

toolsYmlFile = project.file(".pkg/tools_${os.name}.yml")
pkgHome = project.file(".pkgdir/${os.name}")
pkgdataFile = project.file("${pkgHome}/.pkgdata")
def commandList = []

* yaml parsing
yaml.load(toolsFile).toolgroups.each() {
          toolGroup ->
            def groupName = toolGroup.key
            def  pkgGroupHome = pkgHome.toString() + "/" + groupName
            File pkgHome = new File (pkgHome.toString(), groupName.toString())
            File pkgdataFile = new File ("${pkgHome}/.pkgdata")

              println "toolGroup: "+groupName
              println groupName
            if ( toolGroup.value.tools == null) throw new Exception("YAML toolgroups are missing!")
            toolGroup.value.tools.each() {
              tool ->
                 println "\ttool:"+tool.key
                 def toolName = tool.key
                 def toolVersion = tool.value.version
                 println "\ttoolName:"+toolName + "\ttoolVersion:"+toolVersion

                 if ( toolVersion == null) throw new Exception("Software cannot be installed due to missing version.")
                  if(pkgdataFile.exists()) {
                       commandList << "rm -f $(pkgdataFile)"
                       } else {
                           commandList << "mkdir -p ${pkgdataFile}"
                       commandList << ("install " + toolVersion.toString() + " " + toolName.toString())
                       println commandList
                  this.command = new pkgToolsCommand(commandList, pkgHome, project.projectDir)