Basically the latest Perl and Python YAML modules I could find won’t
quote some of the words that Ruby’s YAML would. (Things like on, off,
yes, no, +) Perhaps they conform to a different version of the YAML
spec. I find the incompatibility a bit frustrating. I can and have
easily hacked the other modules to do the compatible thing but there
are political admin maintenance issues surrounding my patching all the
company computers with this.
I’ll not comment right now on whether I think it was a good idea to
flag these items as special to begin with. I’d just like to know if
there’s a simple module over-ride hack or module parameter setting that
I can set or clip into my scripts to deal with this problem.
Problem: Ruby wants to auto-interpret boolean flagged words, […]
Hi Mikshir,
Hadn’t heard about those :-? Interesting.
I’ll not comment right now on whether I think it was a good idea to
flag these items as special to begin with. I’d just like to know if
there’s a simple module over-ride hack or module parameter setting that
I can set or clip into my scripts to deal with this problem.
Thanks.
This isn’t anything official, so caution is recommended.
Successive changes to YAML.rb mean that I’ve had to stitch
two fixes. The relevant one should auto-select and it
seems to work for the following Rubys:
#----------------------------------------------------------------------
module YAML::Syck
BOOL_RE = /bool#\w+\z/
if defined?(Loader)
class Loader
alias_method :o_transfer, :transfer
def transfer(type_id, val)
(String === type_id) and type_id.gsub!(BOOL_RE, ‘str’)
o_transfer(type_id, val)
end
end
else
class Node
alias_method :o_transform, :transform
def transform
kind == :scalar and self.type_id = type_id.gsub(BOOL_RE, ‘str’)
o_transform
end
end
end
end #----------------------------------------------------------------------
hobj = YAML.parse(<<EoS).transform
words:
yes
put
it
on
the
off
setting
EoS
if hobj[‘words’] == %w{ yes put it on the off setting }
puts ’ —> S U C C E S S <—’
else
p hobj
end
on
yes, no, +) Perhaps they conform to a different version of the YAML
Thanks.
Well, I was looking at the YAML site, and apparently yes/no on/off
are part of a draft specification, it looks like ruby is just ahead
of the curve, so to speak.
The only solution I could come up with, in a word, sucks.
require ‘yaml’
test = YAML.parse(FIle.read(“test.yml”)) # where test.yml contains
that —\n words: -yes -no etc.
test.children[0].value.each do |x|
if x.type_id =~ /bool#(?:yes|no)\z/
x.type_id = “tag:yaml.org,2002:str”
end
end
Of course this iteration will only work for that file, since I made
some massive assumptions about the structure. Your other option is to
do a search and replace on the yess, ons,offs, etc and quote them
before parsing.
as you can see these words need to be quoted to be handled correctly -
basically the error is both in the person(s) writing the docs and in the
other
decoders. i’ll bet a quoted “yes” or “no” works in perl and python
decoders
too though.
Yes, I have my own modified version of PyYaml to make it conform to the
latest Ruby implemention. (I haven’t done this for the Perl YAML
module yet.) The immediate issue is that for certain reasons I can’t
update the modules system-wide and so I was looking for a quick and
easy user-script solution; like throwing in some re-definitions,
overrides, or extensions to force in some backwards compatability and
something I can throw in a library or with a switch.
Quoting the flagged words does the right thing (forces them to be
strings) and pre/post processing all Python and Perl generated Yaml
docs has been a stop-gap measure but is clumsy or not convenient.
Anyhow, thanks very much Daz. I will test out your method. /salute
This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.