class Drugbank::Import

Public Class Methods

new(url, batch_size = 500) click to toggle source
# File lib/drugbank/import.rb, line 16
def initialize(url, batch_size = 500)
  @batch_size = batch_size
  @url = url
end

Public Instance Methods

collector() click to toggle source
# File lib/drugbank/import.rb, line 25
def collector
  @collector ||= Drugbank::Collector.new(@batch_size)
end
import(&block) click to toggle source
# File lib/drugbank/import.rb, line 29
def import(&block)
  set_collector_block(block)
  parser.parse_stream(fetch_url(@url))
  collector.collect_batch
end
parser() click to toggle source
# File lib/drugbank/import.rb, line 21
def parser
  @parser ||= SaxStream::Parser.new(collector, [Drugbank::Drugs])
end

Private Instance Methods

add_file_for_cleanup(file) click to toggle source
# File lib/drugbank/import.rb, line 40
def add_file_for_cleanup(file)
  define_finalizer(self, lambda{|id| file.respond_to?(:unlink) ? file.unlink : File.unlink(file) })
end
fetch_url(url) click to toggle source
# File lib/drugbank/import.rb, line 48
  def fetch_url(url)
    case url.split(/\./).last
    when 'zip'
      zip_file = open(file_name, 'wb')
      add_file_for_cleanup(file_name)
      begin
        uri = URI.parse(url)
        Net::HTTP.start(uri.host, uri.port) do |http|
          http.request_get(uri.request_uri) do |resp|
              resp.read_body do |segment|
                  zip_file.write(segment)
              end
          end
        end
      ensure
        zip_file.close()
      end
      #unzip the file first
      Zip::ZipInputStream::open(file_name) do |io|
        while (entry = io.get_next_entry)
          if entry.name.split(/\./).last == 'xml'
            unziped_file = Tempfile.new(Digest::MD5.hexdigest(entry.name))
            add_file_for_cleanup(unziped_file)
            unziped_file.binmode
            unziped_file.write(io.read)
            unziped_file.close()
            return open(unziped_file.path)
          end
        end
      end
    else
      return open(url)
    end
end
file_name() click to toggle source
# File lib/drugbank/import.rb, line 44
def file_name
  "drugbank_import-#{Digest::MD5.hexdigest(@url)}.zip"
end
set_collector_block(block) click to toggle source
# File lib/drugbank/import.rb, line 36
def set_collector_block(block)
  collector.block = block
end