groovy-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Dimitar Vassilev <dimitar.vassi...@gmail.com>
Subject Re: parsing YAML with snakeyaml
Date Wed, 28 Dec 2016 15:38:31 GMT
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:
>>
>> pkgcolls:
>>   pkgcol1:
>>      software:Foo
>>          version:baz
>>   pkgcol2:
>>      software:baz
>>          version:Foo
>>
>> 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.
>> Thanks
>>
>
>
> 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 = '''
> pkgcolls:
>   pkgcol1:
>     software:Foo
>       version:baz
>   pkgcol2:
>     software:baz
>       version:Foo
> '''
>
> 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
toolgroups:
  toolgroup1:
     tools:
        software:
           version
  toolgroup2:
     tools:
        software:
           version

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)
````````
----------------------

Mime
View raw message