class GtfsEngine::Sources
Public Class Methods
new(config)
click to toggle source
# File lib/gtfs_engine/sources.rb, line 20 def initialize(config) @config = config @source_ids = ::Set.new end
Public Instance Methods
method_missing(name, &block)
click to toggle source
# File lib/gtfs_engine/sources.rb, line 25 def method_missing(name, &block) source = @config.sources.__send__ name add_default_importers source source.instance_exec source, &block if ::Kernel.block_given? source end
Private Instance Methods
add_default_importers(source)
click to toggle source
# File lib/gtfs_engine/sources.rb, line 34 def add_default_importers(source) id = source.__id__ return if @source_ids.include? id @source_ids.add id get_method = ::Kernel.instance_method(:method).bind self bulk_importer = get_method.call :bulk_importer set_id = ::OpenStruct.new id: -1 source.before do |etag| if DataSet.where(name: source.name, etag: etag).empty? set = DataSet.create name: source.name, title: source.title, etag: etag, url: source.url set.reload set_id.id = set.id else ::Kernel.raise ::GtfsReader::SkipSourceError, "Data Pull already exists for #{etag}" end end source.handlers bulk_importer, set_id, bulk: 1024 do |importer, set_id| agency &importer.call( Agency, set_id ) calendar &importer.call( Calendar, set_id ) calendar_dates &importer.call( CalendarDate, set_id ) fare_attributes &importer.call( FareAttribute, set_id ) fare_rules &importer.call( FareRule, set_id ) feed_info &importer.call( FeedInfo, set_id ) frequencies &importer.call( Frequency, set_id ) stop_times &importer.call( StopTime, set_id ) routes &importer.call( Route, set_id ) shapes &importer.call( Shape, set_id ) stops &importer.call( Stop, set_id ) stop_times &importer.call( StopTime, set_id ) transfers &importer.call( Transfer, set_id ) trips &importer.call( Trip, set_id ) end end
bulk_importer(model_class, data_set_id_holder)
click to toggle source
# File lib/gtfs_engine/sources.rb, line 75 def bulk_importer(model_class, data_set_id_holder) ::Proc.new do bulk do |values, count, total, columns| id = data_set_id_holder.id values.each {|v| v << id } model_class.import (columns + [:data_set_id]), values ::Rails.logger.info "Inserted #{count} #{model_class} records (total: #{total})" end end end