class BeerDb::QuickReader

Public Class Methods

from_file( path, more_attribs={} ) click to toggle source
# File lib/beerdb/readers/quick.rb, line 29
def self.from_file( path, more_attribs={} )
  ## note: assume/enfore utf-8 encoding (with or without BOM - byte order mark)
  ## - see textutils/utils.rb
  text = File.read_utf8( path )
  self.from_string( text, more_attribs )
end
from_string( text, more_attribs={} ) click to toggle source
# File lib/beerdb/readers/quick.rb, line 36
def self.from_string( text, more_attribs={} )
  QuickReader.new( text, more_attribs )
end
from_zip( zip_file, entry_path, more_attribs={} ) click to toggle source
# File lib/beerdb/readers/quick.rb, line 19
def self.from_zip( zip_file, entry_path, more_attribs={} )
  ## get text content from zip
  entry = zip_file.find_entry( entry_path )

  text = entry.get_input_stream().read()
  text = text.force_encoding( Encoding::UTF_8 )

  self.from_string( text, more_attribs )
end
new( text, more_attribs={} ) click to toggle source
# File lib/beerdb/readers/quick.rb, line 40
def initialize( text, more_attribs={} )
  ## todo/fix: how to add opts={} ???
  @text = text
  @more_attribs = more_attribs
end

Public Instance Methods

read() click to toggle source
# File lib/beerdb/readers/quick.rb, line 47
def read()

  ########
  # note:
  #   assume meta.format == multiline  => brewery
  #                      == line       => beer

  last_brewery = nil

  reader = ValuesReader.from_string( @text, @more_attribs )

  reader.each_line_with_meta do |attributes|

    ## note: group header not used for now; do NOT forget to remove from hash!
    if attributes[:header].present?
      logger.warn "removing unused group header #{attributes[:header]}"
      attributes.delete(:header)   ## note: do NOT forget to remove from hash!
    end

    if attributes[:meta][:format] == :multiline
      ### assume new brewery
      puts
      puts "new brewery w/ attributes: #{attributes.inspect}"
    else
      ### assume new beer
      puts
      puts "new beer w/ attributes: #{attributes.inspect}"
    end

    meta   = attributes[:meta]
    values = attributes[:values]

    attributes.delete(:meta)
    attributes.delete(:values)

    if meta[:format] == :multiline
      ## assume new brewery
      ### check values for worldtree entry w/ › e.g. Hainaut › Belgium

      worldtree = values.find {|val| val.index('›') }
      if worldtree
        puts "  worldtree: #{worldtree}"
        worldtree_ary = worldtree.split( /\s*›\s*/ )   ## note: remove leading n trailing spaces
        pp worldtree_ary
        ## assume last entry is country
        country_name = worldtree_ary[-1]
        puts "     country: #{country_name}"

        country = Country.find_by_name( country_name )
        if country.nil?
          puts "  auto-add country #{country_name}"
          ## hack: fix use worldlite to get proper key,code,area,pop etc.
          country = Country.create!( key:  country_name[0..2].downcase,
                                     name: country_name,
                                     code: country_name[0..2].upcase,
                                     area: 0,
                                     pop:  0 )
        end

        attributes[:country_id] = country.id

        last_brewery = Brewery.create_or_update_from_attribs( attributes, values )
      else
        puts "  worldtree missing (no country etc.) !!!!!"
        exit
      end
    else
      ## assume new beer
      attributes[:brewery_id] = last_brewery.id
      attributes[:country_id] = last_brewery.country_id

      Beer.create_or_update_from_attribs( attributes, values )
    end

  end # each_line
end