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 Fri, 30 Dec 2016 09:32:49 GMT
Hello all,
for the record problem is solved. The loop above is properly passed. The
problem is that we pass an array of commands that get overwritten each time
through the loop. Also the install command we're using requires explicit
specification of the main directory where the software is installed. Last
one is caused by the differences between the shells on the Unix/Linux build
host job scheduler  - Bourne/Bash
Thanks for the great start and help!
Dimitar

2016-12-28 17:38 GMT+02:00 Dimitar Vassilev <dimitar.vassilev@gmail.com>:

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