module Abid::RakeExtensions::Task
Public Instance Methods
async_execute(task_args)
click to toggle source
# File lib/abid/rake_extensions/task.rb, line 90 def async_execute(task_args) failed_task = prerequisite_tasks.find do |t| t.session.failed? || t.session.canceled? end if failed_task session.cancel(failed_task.session.error) return end async_post(worker) do if !needed? session.skip elsif session.lock call_hooks(:before_execute) execute(task_args) session.success else async_wait_external end end end
async_execute_after_prerequisites(task_args)
click to toggle source
# File lib/abid/rake_extensions/task.rb, line 77 def async_execute_after_prerequisites(task_args) if prerequisite_tasks.empty? async_execute(task_args) else counter = Concurrent::DependencyCounter.new(prerequisite_tasks.size) do session.capture_exception do async_execute(task_args) end end prerequisite_tasks.each { |t| t.session.add_observer counter } end end
async_invoke(*args)
click to toggle source
# File lib/abid/rake_extensions/task.rb, line 46 def async_invoke(*args) task_args = Rake::TaskArguments.new(arg_names, args) async_invoke_with_call_chain(task_args, Rake::InvocationChain::EMPTY) end
async_invoke_prerequisites(task_args, invocation_chain)
click to toggle source
# File lib/abid/rake_extensions/task.rb, line 70 def async_invoke_prerequisites(task_args, invocation_chain) prerequisite_tasks.each do |t| args = task_args.new_scope(t.arg_names) t.async_invoke_with_call_chain(args, invocation_chain) end end
async_invoke_with_call_chain(task_args, invocation_chain)
click to toggle source
# File lib/abid/rake_extensions/task.rb, line 51 def async_invoke_with_call_chain(task_args, invocation_chain) session.enter do session.capture_exception do new_chain = Rake::InvocationChain.append(self, invocation_chain) unless concerned? session.skip break end call_hooks(:before_invoke) async_invoke_prerequisites(task_args, new_chain) async_execute_after_prerequisites(task_args) end end end
async_post(worker_name, &block)
click to toggle source
# File lib/abid/rake_extensions/task.rb, line 140 def async_post(worker_name, &block) application.worker[worker_name].post do session.capture_exception do begin block.call finished = true ensure fail 'thread killed' if $ERROR_INFO.nil? && !finished end end end end
async_wait_external()
click to toggle source
# File lib/abid/rake_extensions/task.rb, line 114 def async_wait_external unless application.options.wait_external_task fail "task #{name_with_params} already running" end application.trace "** Wait #{name_with_params}" if application.options.trace async_post(:waiter) do interval = application.options.wait_external_task_interval || 10 timeout = application.options.wait_external_task_timeout || 3600 timeout_tm = Time.now.to_f + timeout loop do state.reload if !state.running? session.success break elsif Time.now.to_f >= timeout_tm fail "#{name} -- timeout exceeded" else sleep interval end end end end
call_hooks(tag, *args)
click to toggle source
# File lib/abid/rake_extensions/task.rb, line 42 def call_hooks(tag, *args) hooks[tag].each { |h| h.call(*args) } end
concerned?()
click to toggle source
# File lib/abid/rake_extensions/task.rb, line 30 def concerned? true end
hooks()
click to toggle source
# File lib/abid/rake_extensions/task.rb, line 38 def hooks @hooks ||= Hash.new { |h, k| h[k] = [] } end
name_with_params()
click to toggle source
# File lib/abid/rake_extensions/task.rb, line 26 def name_with_params name end
session()
click to toggle source
# File lib/abid/rake_extensions/task.rb, line 12 def session @session ||= Session.new(self).tap do |session| session.add_observer do |_, _, reason| if session.successed? || session.failed? call_hooks(:after_invoke, reason) end end end end
state()
click to toggle source
# File lib/abid/rake_extensions/task.rb, line 22 def state State.find(self) end
top_level?()
click to toggle source
# File lib/abid/rake_extensions/task.rb, line 34 def top_level? application.top_level_tasks.any? { |t| application[t] == self } end
volatile?()
click to toggle source
# File lib/abid/rake_extensions/task.rb, line 4 def volatile? true end
worker()
click to toggle source
# File lib/abid/rake_extensions/task.rb, line 8 def worker :default end