lib/rbbt/tsv/accessor.rb in rbbt-util-4.0.2 vs lib/rbbt/tsv/accessor.rb in rbbt-util-4.1.0

- old
+ new

@@ -2,11 +2,11 @@ module TSV extend ChainMethods self.chain_prefix = :tsv - attr_accessor :unnamed + attr_accessor :unnamed, :serializer_module def with_unnamed saved_unnamed = @unnamed @unnamed = true res = yield @@ -45,78 +45,129 @@ def write? @writable end end end + + if not data.respond_to? :serialized_get + class << data + alias serialized_get tsv_clean_get_brackets + alias serialized_set tsv_clean_set_brackets + end + end end KEY_PREFIX = "__tsv_hash_" ENTRIES = [] ENTRY_KEYS = [] - def serialized_get(key) - raise "Uninitialized serializer" if serializer == :type - serialized_value = tsv_clean_get_brackets(key) - SERIALIZER_ALIAS[serializer.to_sym].load(serialized_value) unless serialized_value.nil? + #{{{ Chained Methods + def tsv_empty? + length == 0 end - def serialized_set(key, value) - raise "Uninitialized serializer" if serializer == :type - if value.nil? - tsv_clean_set_brackets(key, nil) - else - tsv_clean_set_brackets(key, SERIALIZER_ALIAS[serializer.to_sym].dump(value)) - end - end - - #{{{ Chained Methods def tsv_get_brackets(key) - value = if serializer.nil? - tsv_clean_get_brackets(key) - else - serialized_get(key) - end + value = serialized_get(key) + return value if @unnamed or fields.nil? - NamedArray.setup value, fields if Array === value and not @unnamed + case type + when :double, :list + NamedArray.setup value, fields, key + when :flat, :single + Entity.formats[fields.first].setup(value, :format => fields.first) if defined?(Entity) and Entity.respond_to?(:formats) and Entity.formats.include? fields.first + end value end def tsv_set_brackets(key,value) - if serializer.nil? - tsv_clean_set_brackets(key, value) - else - serialized_set(key, value) - end + serialized_set(key, value) end def tsv_keys - tsv_clean_keys - ENTRY_KEYS + keys = tsv_clean_keys - ENTRY_KEYS + return keys if @unnamed or key_field.nil? + + if defined?(Entity) and Entity.respond_to?(:formats) and Entity.formats.include? key_field + Entity.formats[key_field].setup(keys.collect{|k| k.dup}, :format => key_field) + else + keys + end end def tsv_values values = values_at(*keys) - values.each{|value| NamedArray.setup value, fields} if Array === values.first and not @unnamed + return values if @unnamed or fields.nil? + + case type + when :double, :list + values.each{|value| NamedArray.setup value, fields } + when :flat, :single + values.each{|value| + Entity.formats[fields.first].setup(value, :format => fields.first) + } if defined?(Entity) and Entity.respond_to?(:formats) and Entity.formats.include? fields.first + end + values end def tsv_each + fields = self.fields + + serializer = self.serializer + serializer_module = SERIALIZER_ALIAS[serializer] unless serializer.nil? tsv_clean_each do |key, value| next if ENTRY_KEYS.include? key - value = SERIALIZER_ALIAS[serializer].load(value) unless serializer.nil? - NamedArray.setup value, fields if Array === value and not @unnamed + # TODO Update this to be more efficient + value = serializer_module.load(value) unless serializer.nil? + + # Annotated with Entity and NamedArray + if not @unnamed + if not fields.nil? + case type + when :double, :list + NamedArray.setup value, fields, key if Array === value + when :flat, :single + Entity.formats[fields.first].setup(value, :format => fields.first) if defined?(Entity) and Entity.respond_to?(:formats) and Entity.formats.include? fields.first + end + end + if defined?(Entity) and not key_field.nil? and Entity.respond_to?(:formats) and Entity.formats.include? key_field + key = Entity.formats[key_field].setup(key.dup, :format => key_field) + end + end + yield key, value if block_given? [key, value] end end def tsv_collect + serializer = self.serializer + serializer_module = SERIALIZER_ALIAS[serializer] unless serializer.nil? tsv_clean_collect do |key, value| next if ENTRY_KEYS.include? key - value = SERIALIZER_ALIAS[serializer].load(value) unless serializer.nil? or not String === value - NamedArray.setup value, fields if Array === value and not @unnamed + + # TODO Update this to be more efficient + value = serializer_module.load(value) unless serializer.nil? + + # Annotated with Entity and NamedArray + if not @unnamed + if not fields.nil? + case type + when :double, :list + NamedArray.setup value, fields, key if Array === value + when :flat, :single + Entity.formats[fields.first].setup(value, :format => fields.first) if defined?(Entity) and Entity.respond_to?(:formats) and Entity.formats.include? fields.first + end + end + if defined?(Entity) and not key_field.nil? and Entity.respond_to?(:formats) and Entity.formats.include? key_field + key = Entity.formats[key_field].setup(key.dup, :format => key_field) + end + end + + if block_given? yield key, value else [key, value] end @@ -227,13 +278,46 @@ @#{entry} = YAML.load(self.tsv_clean_get_brackets('#{key}') || nil.to_yaml) end @#{entry} end -def #{ entry }=(value) - @#{entry} = value - self.tsv_clean_set_brackets '#{key}', value.to_yaml + +if '#{entry}' == 'serializer' + + def #{ entry }=(value) + @#{entry} = value + self.tsv_clean_set_brackets '#{key}', value.to_yaml + + return if value.nil? + + self.serializer_module = SERIALIZER_ALIAS[value.to_sym] + + if serializer_module.nil? + class << self + alias serialized_get tsv_clean_get_brackets + alias serialized_set tsv_clean_set_brackets + end + + else + class << self + + define_method :serialized_get do |key| + self.serializer_module.load(tsv_clean_get_brackets(key)) + end + + define_method :serialized_set do |key, value| + tsv_clean_set_brackets key, self.serializer_module.dump(value) + end + end + end + + end +else + def #{ entry }=(value) + @#{entry} = value + self.tsv_clean_set_brackets '#{key}', value.to_yaml + end end " end end @@ -321,36 +405,41 @@ keys = self.keys.sort end str = "" - str << "#: " << Misc.hash2string(ENTRIES.collect{|key| [key.to_sym, self.send(key)]}) << "\n" unless no_options + str << "#: " << Misc.hash2string((ENTRIES - ["key_field", "fields"]).collect{|key| [key.to_sym, self.send(key)]}) << "\n" unless no_options if fields str << "#" << key_field << "\t" << fields * "\t" << "\n" end - saved_unnamed = @unnamed - @unnamed = false - if keys.nil? - each do |key, values| - key = key.to_s if Symbol === key - str << key.dup - str << values_to_s(values) + with_unnamed do + if keys.nil? + each do |key, values| + key = key.to_s if Symbol === key + str << key.to_s + str << values_to_s(values) + end + else + keys.zip(values_at(*keys)).each do |key, values| + key = key.to_s if Symbol === key + str << key.to_s << values_to_s(values) + end end - else - keys.zip(values_at(*keys)).each do |key, values| - key = key.to_s if Symbol === key - str << key.dup << values_to_s(values) - end - end - @unnamed = saved_unnamed + end str end def value_peek peek = {} keys[0..10].zip(values[0..10]).each do |k,v| peek[k] = v end peek + end + + def to_hash + new = self.dup + ENTRY_KEYS.each{|entry| new.delete entry} + new end end