groovy-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Gerald Wiltse <jerrywil...@gmail.com>
Subject Re: Methods for Creating Ranges
Date Wed, 20 Apr 2016 06:32:32 GMT
Scratch the part about the side effect... i forgot to remove that line
after adding the exception handling.

Gerald R. Wiltse
jerrywiltse@gmail.com


On Wed, Apr 20, 2016 at 2:31 AM, Gerald Wiltse <jerrywiltse@gmail.com>
wrote:

> For posterity, here's the working form of very short loop for accepting a
> bunch of values in a map which are all in string form.  The goal is to try
> to parsing them to their groovy types, and then assign them to the
> variables on the current object if those variables exist.  This loop will
> be in the constructor for various objects that get "instantiated" from this
> source application.  The exception is needed for plain old string values.
>
> taskProps.each {String k,String v ->
>     if (this.hasProperty(tmpKey)) {
>         try{
>             this[tmpKey] =  new GroovyShell().parse(v).run()
>         }catch(MissingPropertyException e){
>             this[tmpKey] = v
>         }
>     }
> }
>
> Groovy really is amazing.
>
>
> It seems the one side-effect is that all string properties will now have
> to be enclosed in quotes, whereas before they did not.
>
> Here are the proofs... Maybe mrhaki can post these examples on his blog.
>
> def r = "1..5"
> assert new GroovyShell().parse("return $r").run() == [1, 2, 3, 4, 5]
>
> def b = "true"
> assert new GroovyShell().parse("return $b").run() == true
>
> def l = "['str1','str2']"
> assert new GroovyShell().parse("return $l").run() == ['str1', 'str2']
>
> def s = "'mystring'"
> assert new GroovyShell().parse("return $s").run() == "mystring"
>
> ​def m = "['key1':'value1','key2':'value2']"
> assert new GroovyShell().parse("return $m").run()​ ==
> ['key1':'value1','key2':'value2']​
>
> Gerald R. Wiltse
> jerrywiltse@gmail.com
>
>
> On Wed, Apr 20, 2016 at 1:57 AM, Gerald Wiltse <jerrywiltse@gmail.com>
> wrote:
>
>> Also, thank you so very much for the response!
>>
>> Gerald R. Wiltse
>> jerrywiltse@gmail.com
>>
>>
>> On Wed, Apr 20, 2016 at 1:57 AM, Gerald Wiltse <jerrywiltse@gmail.com>
>> wrote:
>>
>>> Wow, i just wrote that exact code basically... and started responding to
>>> your email, but there were various drawbacks to this approach as I don't
>>> want to have to define handling of every property by name...  Then... it
>>> hit me...
>>>
>>> def v = '1..10'
>>> assert new GroovyShell().parse(v).run() == [1,2,3,4,5]
>>>
>>> It works!!!
>>>
>>> Something about the Eval works just a little bit differently than
>>> GroovyShell i guess.  Perhaps Dierk  can explain.
>>>
>>> Last question, how expensive is this invocation of groovyshell and parse
>>> and all that (resources wise)?  So-so?
>>>
>>>
>>> Gerald R. Wiltse
>>> jerrywiltse@gmail.com
>>>
>>>
>>> On Wed, Apr 20, 2016 at 1:48 AM, Guillaume Laforge <glaforge@gmail.com>
>>> wrote:
>>>
>>>> If you know it's a range when parsing that string, you can do this,
>>>> with the toInteger() method:
>>>>
>>>>    def rangeString = "123..455"
>>>>    def (String min, String max) = rangeString.tokenize("..")
>>>>    def range = min.toInteger()..max.toInteger()
>>>>
>>>> On Wed, Apr 20, 2016 at 7:26 AM, Gerald Wiltse <jerrywiltse@gmail.com>
>>>> wrote:
>>>>
>>>>> I don't see how that works in my case, maybe i'm missing something.
>>>>>
>>>>> I will clarify:
>>>>>
>>>>> I define a variable in web to represent the range:   14502..14520
>>>>>
>>>>> The web converts this to a string, and passes it into my code.
>>>>>
>>>>> My code then has to receive this string, and then construct a list
>>>>> from it.
>>>>>
>>>>> I could do:
>>>>>
>>>>> String rangeString = passedInVar
>>>>> (String min, String max) = rangeString.tokenize("..")
>>>>> Range range = min..max
>>>>>
>>>>> But i was hoping for a universal "caster" loop which can detect and
>>>>> cast the common types from strings:
>>>>> Integers, lists, ranges, maps, booleans..
>>>>>
>>>>> 12345
>>>>> ["this", "is", "Sample", "List"]
>>>>> 14502..14520
>>>>> ["key":"value","for":"maps"]
>>>>> true
>>>>>
>>>>> I think eval works for all but ranges.
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> Gerald R. Wiltse
>>>>> jerrywiltse@gmail.com
>>>>>
>>>>>
>>>>> On Wed, Apr 20, 2016 at 1:15 AM, Guillaume Laforge <glaforge@gmail.com
>>>>> > wrote:
>>>>>
>>>>>> Hi,
>>>>>>
>>>>>> You can just replace the bounds with variables.
>>>>>>
>>>>>> def a = 1
>>>>>> def b = 10
>>>>>> def r = a..b
>>>>>>
>>>>>> Isn't that what you're looking for?
>>>>>>
>>>>>> Guillaume
>>>>>>
>>>>>>
>>>>>> Le mercredi 20 avril 2016, Gerald Wiltse <jerrywiltse@gmail.com>
a
>>>>>> écrit :
>>>>>>
>>>>>>> I can find no examples of different ways to create a range. 
There's
>>>>>>> a plethora of examples on what you can do when you start by creating
a
>>>>>>> range like so:  "1..10"
>>>>>>>
>>>>>>> But, how does one create a range when the min and max values
are
>>>>>>> stored in variables?  There's no range constructor.  I see that
it's a form
>>>>>>> of a list, but I see no helper methods for dynamically creating
ranges
>>>>>>> given a min and max value.
>>>>>>>
>>>>>>> I even tried to get really fancy, but this evaluates to a string.
>>>>>>>
>>>>>>> def v = "10..15"
>>>>>>> assert Eval.x(v, "return x")​.getClass()​.name ==
>>>>>>> "​​​​​​​​​​​java.lang.String"​
>>>>>>>
>>>>>>> My use case is this.  I populate a bunch of form fields with
>>>>>>> variable definitions... but they all get passed to my code as
strings. But
>>>>>>> I want to pass port ranges and lists and maps. So, the Eval()
method is
>>>>>>> exactly what I needed.. it just isn't working for ranges.
>>>>>>>
>>>>>>> Regards,
>>>>>>> Jerry
>>>>>>>
>>>>>>>
>>>>>>> Gerald R. Wiltse
>>>>>>> jerrywiltse@gmail.com
>>>>>>>
>>>>>>>
>>>>>>
>>>>>> --
>>>>>> Guillaume Laforge
>>>>>> Apache Groovy committer & PMC Vice-President
>>>>>> Product Ninja & Advocate at Restlet <http://restlet.com>
>>>>>>
>>>>>> Blog: http://glaforge.appspot.com/
>>>>>> Social: @glaforge <http://twitter.com/glaforge> / Google+
>>>>>> <https://plus.google.com/u/0/114130972232398734985/posts>
>>>>>>
>>>>>>
>>>>>
>>>>
>>>>
>>>> --
>>>> Guillaume Laforge
>>>> Apache Groovy committer & PMC Vice-President
>>>> Product Ninja & Advocate at Restlet <http://restlet.com>
>>>>
>>>> Blog: http://glaforge.appspot.com/
>>>> Social: @glaforge <http://twitter.com/glaforge> / Google+
>>>> <https://plus.google.com/u/0/114130972232398734985/posts>
>>>>
>>>
>>>
>>
>

Mime
View raw message