<< | Index | >>
Some object is returned as ODDA::Stub class directly.
Then this object dosen't have instance variables.
module OddbYaml ... def encode_with coder self::class::EXPORT_PROPERTIES.each do |a| p a value = self.instance_variable_get(a) p value if value.is_a? String if value.encoding.to_s.downcase != 'utf-8' value.force_encoding('utf-8') end end coder[a[1..-1]] = value end coder.tag = self.to_yaml_type end
... "@registrations" #<ODBA::Stub:53792880#29751 @odba_class= @odba_container=53794600#508> ...
ch.oddb> ODBA.cache.fetch(508).registrations -> [#<ODBA::Stub:68693340#24604 @odba_class=ODDB::Registration @odba_container=68749820#29751>] ch.oddb> ODBA.cache.fetch(508).instance_variable_get("@registrations") -> [#<ODBA::Stub:68693340#24604 @odba_class=ODDB::Registration @odba_container=68749820#29751>]
We have to handle Array that is owned directly by ODDB Object.
--- !oddb.org,2003/ODDB::Company oid: 123 ean13: '7601001307001' name: athenstaedt AG business_area: ba_pharma generic_type: registrations: array url: email: addresses: array contact: contact_email:
YAML dump fails sometimes at dump of following 2 object. (It seems that it is caused, if these object has umlaute characters.)
next, I tried to overwrite ODBA::Stub class.
module ODBA class Stub undef :to_yaml_properties undef :to_yaml_type undef :yaml_initialize def to_yaml(*args) odba_instance.to_yaml(*args) end def encode_with coder self::class::EXPORT_PROPERTIES.each do |a| value = self.odba_instance.instance_variable_get(a) if value.is_a? String if value.encoding.to_s.downcase != 'utf-8' value.force_encoding('utf-8') end end if value.class != Array and value.class != Hash coder[a[1..-1]] = value else p value.keys p value p value.class end end #coder.tag = self.to_yaml_type coder.tag = nil end end end
I could export some values of missing ODDB::Registration object into yaml.
But Array
and Hash
objects are not. these are used as ODBA_SELIALIZABLE.
$ grep -r ODBA_SERIALIZABLE src/model ... src/model/package.rb: ODBA_SERIALIZABLE = [ '@prices', '@ancestors', '@swissmedic_source' ] src/model/company.rb: ODBA_SERIALIZABLE = ['@addresses', '@invoice_dates', '@disabled_invoices', src/model/indication.rb: ODBA_SERIALIZABLE = [ '@descriptions', '@synonyms' ] src/model/galenicform.rb: ODBA_SERIALIZABLE = [ '@descriptions', '@synonyms' ] ...
Methods of Array and Hash are defined by ODBA.
It seems that this Yaml exporting fails by this re-definenig.
ODBA is created to suite syck engine (old YAML gem).
I try to use again syck engin. (back to syck engine)
I found deprecated unescape method.
def self.unescape( value ) warn "#{caller[0]}: YAML.unescape is deprecated" if $VERBOSE value.gsub( /\\(?:([nevfbart\\])|0?x([0-9a-fA-F]{2})|u([0-9a-fA-F]{4}))/ ) { if $3 ["#$3".hex ].pack('U*') elsif $2 [$2].pack( "H2" ) else UNESCAPES[$1] end } end
then, tried to unescape after dumped via syck
.
I could get correct "Umlaute" characters.
It works, expectedly !
require 'yaml' require 'syck' require 'syck/encoding' YAML::ENGINE.yamler = "syck" ... fh.puts Syck.unescape(YAML.dump(ODBA.cache.fetch(odba_id, nil))) # => registrations: - !oddb.org,2003/ODDB::Registration iksnr: "21109" registration_date: 1955-01-21 revision_date: expiration_date: 2015-01-06 inactive_date: sequences: "01": !oddb.org,2003/ODDB::Sequence seqnr: "01" name_base: Lecicarbon name_descr: "Suppositorien für Erwachsene" atc_class: &id003 !oddb.org,2003/ODDB::AtcClass code: A06AB descriptions: !oddb.org,2003/ODDB::SimpleLanguage::Descriptions {}