You could go

rule(:ctime) {(space >> str("ctime = ") >> value.as(:time) >>
newline).as(:ctime)}

I think that would produce what you need.


---
"Man, I'm going to have so many chickens when this lot hatch!"


On Mon, Sep 2, 2013 at 5:58 PM, Ra <[email protected]> wrote:

> Hi Nigel,
> I got the point but how can I create that tree structure if the parser
> give me back :
>  {:job_id=>"2763.spark.space.ad"@8,
>  :job_name=>"STDIN"@42,
>  :job_owner=>"[email protected]"@64,
>  :resources_used_cput=>"00:00:00"@116,
>  :resources_used_mem=>"3152kb"@150,
>  :resources_used_vmem=>"32528kb"@183,
>  :resources_used_walltime=>"00:07:40"@221,
>  :job_state=>"R"@246,
>  :queue=>"bio"@260,
>  :server=>"spark.ingm.ad"@277,
>  :checkpoint=>"u"@308,
>  :ctime=>"Thu Aug 29 18:09:26 2013"@322}
>
> Or better, how do I need to write the parser ?
> You can have a look
> https://github.com/helios/torque_rm/blob/master/lib/torque_rm/qstat.rb#L46-L112
>
> On Sat, Aug 31, 2013 at 3:32 PM, Nigel Thorne <[email protected]>wrote:
>
>> From http://kschiess.github.io/parslet/transform.html
>>
>> class MyTransform < Parslet::Transform
>>
>>     rule('a') { 'b' }
>>
>>   end
>>   MyTransform.new.apply('a') # => "b"
>>
>> A Transform class, when applied, looks through it's known rules, and applies 
>> any that match. Applying a rule replaces the matched object with the result 
>> of the associated block. It has to match a whole object, so you can't match 
>> a single key from a hash. You have to match the whole hash. One way around 
>> this is to make your parser generate a tree that is a little less flat. So.. 
>> if instead your output was
>>
>> {..., :ctime => {time: "Thu Aug 29 18:09:26 2013"} }
>>
>> You could then do something like this
>>
>> class MyTransform < Parslet::Transform
>>
>>     rule(:time => simple(:time)) { DateTime.parse(time) }
>>
>> end
>> MyTransform.new.apply(your_tree)
>>
>> This would result in a tree with the whole {time => ...} hash replaced the a 
>> DateTime value. In this case:
>>
>>
>>
>> {..., :ctime => #<DateTime: 2013-08-29T18:09:26+00:00 ...> }
>>
>> I hope this helps.
>>
>>
>> ---
>> "No man is an island... except Philip"
>>
>>
>> On Sat, Aug 31, 2013 at 9:30 PM, Ra <[email protected]> wrote:
>>
>>> Dear Kaspar,
>>> your parselet is wonderful and I'm using it as part of a library for
>>> managing TORQUE/PBS, parselet is use mostly for extracting info form qstat.
>>> This is just an example of the object returned from my parser:
>>>
>>>  {:job_id=>"2763.spark.space.ad"@8,
>>>  :job_name=>"STDIN"@42,
>>>  :job_owner=>"[email protected]"@64,
>>>  :resources_used_cput=>"00:00:00"@116,
>>>  :resources_used_mem=>"3152kb"@150,
>>>  :resources_used_vmem=>"32528kb"@183,
>>>  :resources_used_walltime=>"00:07:40"@221,
>>>  :job_state=>"R"@246,
>>>  :queue=>"bio"@260,
>>>  :server=>"spark.ingm.ad"@277,
>>>  :checkpoint=>"u"@308,
>>>  :ctime=>"Thu Aug 29 18:09:26 2013"@322}
>>>
>>>
>>> some keys are "maybe" so I do not have the guarantees that all of them
>>> will be available to all the objects, btw that is fine because qstat not
>>> always report everything.
>>> I read the documentation many times but I did understand how to convert
>>> the parser's result:
>>>
>>> for instance, I'd like to have ctime as a DateTime object and
>>> resources_used_mem
>>> as a numeric ...
>>>
>>>
>>> could you give me some advice on how to correctely transform my output ?
>>>
>>> Cheers.
>>>
>>> --
>>> Raoul
>>>
>>
>>
>
>
> --
> Ra
>

Reply via email to