module Tasking

Public Instance Methods

after( task_name, *after_task_names ) click to toggle source
# File lib/tasking.rb, line 60
def after( task_name, *after_task_names )
  @__late_evaluations ||= {}
  @__late_evaluations[:after] ||= []
  parent_namespace_name = @__parent_namespace.last&.name.to_s
  @__late_evaluations[:after] << [ task_name, parent_namespace_name, after_task_names.flatten ]
end
before( task_name, *before_task_names ) click to toggle source
# File lib/tasking.rb, line 53
def before( task_name, *before_task_names )
  @__late_evaluations ||= {}
  @__late_evaluations[:before] ||= []
  parent_namespace_name = @__parent_namespace.last&.name.to_s
  @__late_evaluations[:before] << [ task_name, parent_namespace_name, before_task_names.flatten ]
end
execute( name, options = {} ) click to toggle source
# File lib/tasking.rb, line 76
def execute( name, options = {} )
  if !@__subsequent_executions
    @__subsequent_executions = true
    late_evaluations
  end
  task = task_lookup( name )

  if !task
    msg = "Unknown task '#{name}'"
    msg << " or #{fully_qualified_name( name )}" if @__parent_namespace.size > 0
    abort( msg )
  end

  namespace_hierarchy_options = gather_options_for( name, task )
  namespace_hierarchy_options.merge!( options )
  @__parent_namespace.push( task.parent_namespace )
  task.execute( namespace_hierarchy_options )
  @__parent_namespace.pop
end
Also aliased as: invoke, run
invoke( name, options = {} )
Alias for: execute
late_after( task_name, parent_namespace_name, *after_task_names ) click to toggle source
# File lib/tasking.rb, line 45
def late_after( task_name, parent_namespace_name, *after_task_names )
  task = Tasking::Namespace.find_task_in_namespace( parent_namespace_name, task_name ) ||
         Tasking::Namespace.find_task( task_name ) 
  abort( "Unknown task '#{task_name}' in after filter" ) unless task

  task.add_after_filters( *after_task_names )
end
late_before( task_name, parent_namespace_name, *before_task_names ) click to toggle source
# File lib/tasking.rb, line 37
def late_before( task_name, parent_namespace_name, *before_task_names )
  task = Tasking::Namespace.find_task_in_namespace( parent_namespace_name, task_name ) ||
         Tasking::Namespace.find_task( task_name ) 
  abort( "Unknown task '#{task_name}' in before filter" ) unless task

  task.add_before_filters( *before_task_names )
end
late_evaluations() click to toggle source
# File lib/tasking.rb, line 67
def late_evaluations
  return unless @__late_evaluations
  @__late_evaluations.each_pair do |type, task_parameters|
    task_parameters.each do |( task_name, parent_namespace_name, args )|
      self.send( :"late_#{type}", task_name, parent_namespace_name, *args )
    end
  end
end
namespace( name, options = {}, &block ) click to toggle source
# File lib/tasking.rb, line 19
def namespace( name, options = {}, &block ) 
  abort( "Namespaces with empty names are not allowed" ) if name.to_s.empty?
  @__parent_namespace ||= []

  full_name = fully_qualified_name( name )
  parent_namespace_names, _ = split_task_from_namespace( full_name )
  build_namespace_hierarchy( parent_namespace_names )

  next_namespace = Tasking::Namespace.find_or_create( full_name, options )
  @__parent_namespace.push( next_namespace )
  next_namespace.execute( options, &block )
  @__parent_namespace.pop
end
options( options ) click to toggle source
# File lib/tasking.rb, line 33
def options( options ) 
  @__parent_namespace.last.merge_options( options )
end
run( name, options = {} )
Alias for: execute
task( name, options = {}, &block ) click to toggle source
# File lib/tasking.rb, line 4
def task( name, options = {}, &block )
  abort( "Tasks with empty names are not allowed" ) if name.to_s.empty?

  full_name = fully_qualified_name( name )
  namespace_name, task_name = split_task_from_namespace( full_name )

  abort( "Task '#{name}' is not in a namespace" ) if namespace_name.empty?

  build_namespace_hierarchy( namespace_name )

  parent_namespace = Tasking::Namespace.find_namespace( namespace_name )
  task = Tasking::Task.new( task_name, parent_namespace, options, &block )
  parent_namespace.register_task( task )
end

Private Instance Methods

build_namespace_hierarchy( full_name ) click to toggle source
# File lib/tasking.rb, line 149
def build_namespace_hierarchy( full_name ) 
  walk_namespace_tree_to( full_name ) do |ns_name|
    Tasking::Namespace.find_or_create( ns_name ) 
  end
end
fully_qualified_name( name ) click to toggle source
# File lib/tasking.rb, line 143
def fully_qualified_name( name )
  @__parent_namespace&.last ? 
    "#{@__parent_namespace.last.name}::#{name}" : 
    name
end
gather_options_for( full_task_name, task ) click to toggle source
# File lib/tasking.rb, line 132
def gather_options_for( full_task_name, task )
  final_options = Tasking::Options.new({})

  walk_namespace_tree_to( full_task_name, :task ) do |ns_name|
    namespace = Tasking::Namespace.find_namespace( ns_name )
    final_options.merge!( namespace.options )
  end

  final_options.merge!( task.options )
end
split_task_from_namespace( full_name ) click to toggle source
# File lib/tasking.rb, line 155
def split_task_from_namespace( full_name )
  namespace_name, _, task_name = full_name.rpartition( '::' )

  [ namespace_name, task_name ]
end
task_lookup( name ) click to toggle source
# File lib/tasking.rb, line 99
def task_lookup( name )
  @__parent_namespace ||= []
  task = nil

  if name.start_with?( '::' ) 
    name.slice!( 0, 2 )
    return Tasking::Namespace.find_task( name )
  end

  if @__parent_namespace.last 
    full_name = "#{@__parent_namespace.last.name}::#{name}"
    task = Tasking::Namespace.find_task( full_name )
  end

  task || Tasking::Namespace.find_task( name )
end
walk_namespace_tree_to( namespace_name, type = :namespace, &block ) click to toggle source
# File lib/tasking.rb, line 116
def walk_namespace_tree_to( namespace_name, type = :namespace, &block )
  ns_segments = namespace_name.split( '::' )
  ns_segments.pop if type != :namespace

  current_ns_hierarchy_level = nil
  ns_segments.each do |segment|
    if current_ns_hierarchy_level == nil
      current_ns_hierarchy_level = segment
    else
      current_ns_hierarchy_level += "::#{segment}"
    end 

    block.call( current_ns_hierarchy_level )
  end
end