[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Probs with accessing variables in yaml file

Rebhan, Gilbert

5/14/2007 6:54:00 AM


Hi,

i have a script that is configured via yaml file :

---script-----------

require 'yaml'
require 'highline/import'
require 'win32/registry'

config=YAML.load_file("cvs_login.yaml")

[ ... ]

def filesed!(pattern, replaceString, filename)
regexPattern = Regexp.compile(pattern)
tmpFilename = "#{filename}.#{Time.now.usec}"
tmpFile = File.new(tmpFilename, "w")
srcFile = File.open(filename)
srcFile.each_line do |line|
tmpFile.print line.gsub(regexPattern) {|match|
replaceString
}
end
tmpFile.close
srcFile .close
File.rename(tmpFilename, filename)
end

if config['targetdirs']

Win32::Registry::HKEY_CURRENT_USER.open('Software\Cvsnt\cvspass') do
|reg|
@cvsreg =
reg[":pserver:#{ENV["USERNAME"]}@cvsprod:d:/cvsrepos/test"]
end

config['targetdirs'].each do |dir|
Dir.chdir(dir)
puts "\n\n"
Dir.glob(config['targetfilepattern']).each do |file|
puts "... processing "<<File.expand_path("#{file}")
puts 'bla'<<@cvsreg
puts 'replaceto == '<<config['replaceto']

#filesed!("<Passwort>.*<\/Passwort>","<Passwort><![CDATA[@cvsreg]]><\/Pa
sswort>","#{file}")
filesed!(config['replacefrom'],config['replaceto'],"#{file}")
end
end
puts "\n\nDone !!"
sleep 1
else
puts "\n\nDone !!"
sleep 1
end

---script-----------

--yaml-------------

cvs_login.yaml looks like =

targetdirs:
- Y:/tempwork

targetfilepattern: "Scm*.xml"

replacefrom: "<Passwort>.*<\/Passwort>"
replaceto: "<Passwort><![CDATA[#{@cvsreg}]><\/Passwort>"

--yaml--------------

Question =

If i write :
puts 'replaceto == '<<"<Passwort><![CDATA[#{@cvsreg}]]><\/Passwort>"
direct into the script it's echoed correct, but it doesn't work via yaml
file;
when running via yaml the line in my xml file get's replaced to =

<Passwort><![CDATA[#{@cvsreg}]><\/Passwort>


Where's the failure ??


Regards, Gilbert

2 Answers

Rebhan, Gilbert

5/14/2007 9:30:00 AM

0



Hi,

don't know if there's another | better way, but
i solved it like that =

yaml has now =

replaceto1: "<Passwort><![CDATA["
replaceto2: "]></Passwort>"


and my script has =

s=config['replaceto1']<<"#{@cvsreg}"<<config['replaceto2']
[...]
filesed!(config['replacefrom'],s,"#{file}")



Gilbert

Jano Svitok

5/14/2007 9:57:00 AM

0

On 5/14/07, Rebhan, Gilbert <Gilbert.Rebhan@huk-coburg.de> wrote:
>
>
> Hi,
>
> don't know if there's another | better way, but
> i solved it like that =
>
> yaml has now =
>
> replaceto1: "<Passwort><![CDATA["
> replaceto2: "]></Passwort>"
>
>
> and my script has =
>
> s=config['replaceto1']<<"#{@cvsreg}"<<config['replaceto2']
> [...]
> filesed!(config['replacefrom'],s,"#{file}")

Hi,

the #{} are evaluated when the string is instantiated, i.e. in normal
case when the line containing the literal (note: the LITERAL) is
evaluated. When you load the string from yaml, these #{} are not
evaluated at all.

What you might want to do is to add quotes around and call eval --
e.g. config['replaceto'] = eval("\"#{config['replaceto']}\""), with
all the dangerous implications of eval. (Note the double use of #{}...
once it is evaluated as the line is parsed to create another literal
that is then passed to eval to expand again. I could have avoided the
outer expansion by using "\"" + config[...] + "\"", but I guess this
one's faster), and it's shorter in any case.)