# Put your code that runs your task inside the do_work method # it will be run automatically in a thread. You have access to # all of your rails models if you set load_rails to true in the # config file. You also get @logger inside of this class by default. class RepositoryScanWorker < BackgrounDRb::Rails def do_work(args) @logger.info ":: Scanning #{args[:url]}" @scanner = AdvancedPluginRepositoryScanner.new(args[:url], @logger) @scanner.run @logger.info ":: Scan complete." end def plugins_added @scanner.plugins_added end def progress @scanner.progress end end class AdvancedPluginRepositoryScanner attr_reader :plugins_added def initialize(url, logger = nil) @url = url @logger = logger @plugins_added = [] @started = false end def run @plugins_found = RemoteResources.repository_list(@url) @started = true @plugins_found.each do |plugin| plugin_root = StringUtilities.normalise_url(@url) + plugin Plugin.create(:name => plugin, :root => plugin_root, :auto_updatable => true) log "Found plugin #{plugin}" @plugins_added << plugin end end def progress raise "Scanner has not started" unless @started progress = (@plugins_added.size.to_f / @plugins_found.size.to_f) * 100 progress.to_i end protected def log(output) return if @logger.nil? @logger.info output end end