Scratch the part about the side effect... i forgot to remove that line after adding the exception handling.
Gerald R. Wiltse [email protected] On Wed, Apr 20, 2016 at 2:31 AM, Gerald Wiltse <[email protected]> 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 > [email protected] > > > On Wed, Apr 20, 2016 at 1:57 AM, Gerald Wiltse <[email protected]> > wrote: > >> Also, thank you so very much for the response! >> >> Gerald R. Wiltse >> [email protected] >> >> >> On Wed, Apr 20, 2016 at 1:57 AM, Gerald Wiltse <[email protected]> >> 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 >>> [email protected] >>> >>> >>> On Wed, Apr 20, 2016 at 1:48 AM, Guillaume Laforge <[email protected]> >>> 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 <[email protected]> >>>> 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 >>>>> [email protected] >>>>> >>>>> >>>>> On Wed, Apr 20, 2016 at 1:15 AM, Guillaume Laforge <[email protected] >>>>> > 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 <[email protected]> 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 >>>>>>> [email protected] >>>>>>> >>>>>>> >>>>>> >>>>>> -- >>>>>> 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> >>>> >>> >>> >> >
