# encoding: utf-8 module BeerDb class BeerReader include LogUtils::Logging ## make models available by default with namespace # e.g. lets you use Usage instead of Model::Usage include Models 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 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 def self.from_string( text, more_attribs={} ) BeerReader.new( text, more_attribs ) end def initialize( text, more_attribs={} ) ## todo/fix: how to add opts={} ??? @text = text @more_attribs = more_attribs end def read() reader = ValuesReader.from_string( @text, @more_attribs ) ### todo: cleanup - check if [] works for build_title... # better cleaner way ??? if @more_attribs[:region_id].present? known_breweries_source = Brewery.where( region_id: @more_attribs[:region_id] ) elsif @more_attribs[:country_id].present? known_breweries_source = Brewery.where( country_id: @more_attribs[:country_id] ) else logger.warn "no region or country specified; use empty brewery ary for header mapper" known_breweries_source = [] end known_breweries = TextUtils.build_title_table_for( known_breweries_source ) reader.each_line do |new_attributes, values| ## note: check for header attrib; if present remove ### todo: cleanup code later ## fix: add to new_attributes hash instead of values ary ## - fix: match_brewery() move region,city code out of values loop for reuse at the end if new_attributes[:header].present? brewery_line = new_attributes[:header].dup # note: make sure we make a copy; will use in-place string ops new_attributes.delete(:header) ## note: do NOT forget to remove from hash! logger.debug " trying to find brewery in line >#{brewery_line}<" ## todo: check what map_titles_for! returns (nothing ???) TextUtils.map_titles_for!( 'brewery', brewery_line, known_breweries ) brewery_key = TextUtils.find_key_for!( 'brewery', brewery_line ) logger.debug " brewery_key = >#{brewery_key}<" unless brewery_key.nil? ## bingo! add brewery_id upfront, that is, as first value in ary values = values.unshift "by:#{brewery_key}" end end Beer.create_or_update_from_attribs( new_attributes, values ) end # each_line end end # class BeerReader end # module BeerDb