I understand regular expressions. been doing them a long time in
various languages. But, how are the fields determined from this regex?

David

On Tue, Aug 23, 2011 at 4:19 PM, David Kavanagh <dkavan...@gmail.com> wrote:
> for reference, here's how the regex matches the trailing comment;
> http://rubular.com/r/vJUtBWpB6J
>
>
> On Tue, Aug 23, 2011 at 4:17 PM, David Kavanagh <dkavan...@gmail.com> wrote:
>> Hi Stefan,
>> I have it working using your suggestions (I took out my hacks). I
>> adjusted the match regex to match the quotes in the value portion.
>> Otherwise, I kept getting more quotes added in each time the file was
>> processed.
>> The only glitch now is that it always thinks there's a comment, so
>> even if there isn't a comment after the value, it adds a "#" at the
>> end of line.
>>
>> David
>>
>> On Tue, Aug 23, 2011 at 11:45 AM, Stefan Schulte
>> <stefan.schu...@taunusstein.net> wrote:
>>> On Tue, Aug 23, 2011 at 10:32:54AM -0400, David Kavanagh wrote:
>>>> I did get this working. In a nutshell, I modified to_line like this;
>>>>   def self.to_line(hash)
>>>>     return super unless hash[:record_type] == :parsed
>>>>     "#{hash[:name]}=#{hash[:value]}"
>>>>   end
>>>
>>> As I said, I wouldn't to that. Just pass a :to_line => proc {...} to your
>>> record_line call because you will then just overwrite the to_line method
>>> of that particular record_type.
>>>
>>>>
>>>> which handles the other line types. To handle wrapping values in
>>>> quotes, I changed the type like this;
>>>>   newproperty(:value) do
>>>>     munge do |value|
>>>>       '"'+value.to_s+'"'
>>>>     end
>>>>     newvalues(/^\S+$/)
>>>>   end
>>>>
>>>> so, that line where value.to_s is wrapped with quotes seems to work nicely.
>>>
>>> Hm, in my opinion using a regex that gets the value as an unqoted string
>>> and put the quotes back to the string in the to_line method looks saner
>>> than munging the value.
>>>
>>>>
>>>> My other problem now is that aside from handling these variations
>>>>
>>>> # comment lines
>>>> key="value"
>>>>
>>>> I also need to handle this;
>>>>
>>>> key="value" #optional comment
>>>>
>>>> I could add to the regex for the line matching (in record_line
>>>> :parsed). Then, I'm not sure how to get that into to_line for output.
>>>
>>> You have to store the inlinecomment in the record hash and then put it
>>> back in the to_line hook. So this should work
>>> (to test the regex I recommend rubular.com)
>>>
>>> record_line :parsed,
>>>  :fields   => %w{name value comment},
>>>  :optional => %w{value comment},
>>>  :regex    => /^\s*(.*?)(?:\s*=\s*(.*?))?(?:\s*#\s*(.*))?\s*$/,
>>>  :to_line  => proc { |hash|
>>>    str = hash[:name]
>>>    str += "=\"#{hash[:value]}\"" if hash[:value] != :absent
>>>    str += " # #{hash[:comment]}" if hash[:comment] != :absent
>>>    str
>>>  }
>>>
>>>
>>>>
>>>> David
>>>>
>>>> On Mon, Aug 22, 2011 at 8:48 PM, David Kavanagh <dkavan...@gmail.com> 
>>>> wrote:
>>>> > Thanks, I'll try to work through your suggestions. I took this from
>>>> > the nova_config stuff on github, so that was my example.
>>>> >
>>>> > David
>>>> >
>>>> > On Mon, Aug 22, 2011 at 7:36 PM, Stefan Schulte
>>>> > <stefan.schu...@taunusstein.net> wrote:
>>>> >> On Mon, Aug 22, 2011 at 06:33:27PM -0400, David Kavanagh wrote:
>>>> >>> I'm working on a type/provider for the eucalyptus.conf file. What I
>>>> >>> have generally works for modifying properties. I have a couple of
>>>> >>> issues and not being very experienced with Ruby and custom providers,
>>>> >>> I wonder if anyone can help?
>>>> >>> The code is included below. The key/value constructs in the file look 
>>>> >>> like:
>>>> >>>
>>>> >>> key="value"
>>>> >>>
>>>> >>> 1. I'm not getting the quotes surrounding the value, which I think I
>>>> >>> can figure out myself.
>>>> >>> 2. I get all blanks and comments replaced by "=", which is more of a 
>>>> >>> problem.
>>>> >>>
>>>> >>> David
>>>> >>>
>>>> >>>
>>>> >>> require 'puppet/provider/parsedfile'
>>>> >>>
>>>> >>> eucaconf = "/etc/eucalyptus/eucalyptus.conf"
>>>> >>>
>>>> >>> Puppet::Type.type(:eucalyptus_config).provide(
>>>> >>>   :parsed,
>>>> >>>   :parent => Puppet::Provider::ParsedFile,
>>>> >>>   :default_target => eucaconf,
>>>> >>>   :filetype => :flat
>>>> >>> ) do
>>>> >>>
>>>> >>>   confine :exists => eucaconf
>>>> >>>   text_line :comment, :match => /^#/;
>>>> >>>   text_line :blank, :match => /^\s*$/;
>>>> >>>
>>>> >>>   record_line :parsed,
>>>> >>>     :fields => %w{line},
>>>> >>>     :match => /(.*)/ ,
>>>> >>>     :post_parse => proc { |hash|
>>>> >>>       Puppet.debug("eucalyptus config line:#{hash[:line]} has been 
>>>> >>> parsed")
>>>> >>>       if hash[:line] =~ /^\s*(\S+)\s*=\s*(\S+)\s*$/
>>>> >>>         hash[:name]=$1
>>>> >>>         hash[:value]=$2
>>>> >>>       elsif hash[:line] =~ /^\s*(\S+)\s*$/
>>>> >>>         hash[:name]=$1
>>>> >>>         hash[:value]=false
>>>> >>>       else
>>>> >>>         raise Puppet::Error, "Invalid line: #{hash[:line]}"
>>>> >>>       end
>>>> >>>     }
>>>> >>
>>>> >> instead of the post_parse hook you can probably just change your regex
>>>> >>  :fields   => %w{name value},
>>>> >>  :optional => %w{value},
>>>> >>  :match    => /^\s*(.*?)(?:\s*=\s*"(\S+)")?\s*$/
>>>> >>
>>>> >> This matches line like
>>>> >>
>>>> >>  foo
>>>> >>
>>>> >> and
>>>> >>
>>>> >>  foo = "bar"
>>>> >>
>>>> >>>
>>>> >>>   def self.to_line(hash)
>>>> >>>     "#{hash[:name]}=#{hash[:value]}"
>>>> >>>   end
>>>> >>
>>>> >> If you just overwrite the to_line method you have to take care of the
>>>> >> different record_types (you defined :comment, :text and :parsed).
>>>> >> So you have to do
>>>> >>
>>>> >>    def self.to_line(hash)
>>>> >>      return super unless hash[:record_type] == :parsed
>>>> >>      if hash[:value] == :absent
>>>> >>        hash[:name]
>>>> >>      else
>>>> >>        "#{hash[:name]}=\"#{hash[:value]}\""
>>>> >>      end
>>>> >>    end
>>>> >>
>>>> >> Nevertheless the "right" thing to do is to pass a block to the
>>>> >> record_line method:
>>>> >>
>>>> >>  record_line :parsed,
>>>> >>    :fields  => ...,
>>>> >>    :match   => ...,
>>>> >>    :to_line => proc { |hash|
>>>> >>      if hash[:value] == :absent
>>>> >>        hash[:name]
>>>> >>      else
>>>> >>        "#{hash[:name]}=\"#{hash[:value]}\""
>>>> >>      end
>>>> >>    }
>>>> >>
>>>> >> Hope that helps.
>>>> >>
>>>> >> -Stefan
>>>> >>
>>>> >
>>>>
>>>> --
>>>> You received this message because you are subscribed to the Google Groups 
>>>> "Puppet Users" group.
>>>> To post to this group, send email to puppet-users@googlegroups.com.
>>>> To unsubscribe from this group, send email to 
>>>> puppet-users+unsubscr...@googlegroups.com.
>>>> For more options, visit this group at 
>>>> http://groups.google.com/group/puppet-users?hl=en.
>>>>
>>>
>>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Puppet Users" group.
To post to this group, send email to puppet-users@googlegroups.com.
To unsubscribe from this group, send email to 
puppet-users+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/puppet-users?hl=en.

Reply via email to