class Spud::TaskRunners::SpudTaskRunner::Task

Attributes

dependencies[R]
filename[R]
name[R]
source[R]
watches[R]

Public Class Methods

new(driver:, name:, filename:, dependencies:, watches:, file_dsl:, &block) click to toggle source
# File lib/spud/task_runners/spud_task_runner/task.rb, line 61
def initialize(driver:, name:, filename:, dependencies:, watches:, file_dsl:, &block)
  @driver = driver
  @name = name
  @filename = filename
  @watches = watches
  @dependencies = dependencies.map { |to, from| Dependency.new(to, from) }
  @file_dsl = file_dsl
  @block = block
end
qualified_name(filename, name) click to toggle source
# File lib/spud/task_runners/spud_task_runner/task.rb, line 38
def self.qualified_name(filename, name)
  segments = File.dirname(filename)
    .split('/')
    .reject { |segment| segment == '.' }

  basename = File.basename(filename, '.spud')
  segments << basename unless basename == 'Spudfile'

  segments << name
  segments.join('.')
end
tasks(driver) click to toggle source
# File lib/spud/task_runners/spud_task_runner/task.rb, line 33
def self.tasks(driver)
  Dir['Spudfile', '*.spud'].flat_map { |filename| FileDSL.run(driver, filename) }
end

Public Instance Methods

args() click to toggle source
# File lib/spud/task_runners/spud_task_runner/task.rb, line 91
def args
  @args ||= TaskArgs.from_block(filename, &@block)
end
details() click to toggle source
# File lib/spud/task_runners/spud_task_runner/task.rb, line 96
def details
  filename, line_cursor = @block.source_location
  line_cursor -= 1

  lines = File.read(filename).split("\n")
  builder = StringIO.new

  # Move up for comments
  while lines[line_cursor - 1]&.start_with?('#')
    line_cursor -= 1
  end

  # Capture comments
  while lines[line_cursor]&.start_with?('#')
    builder.puts lines[line_cursor]
    line_cursor += 1
  end

  # Capture block
  until lines[line_cursor - 1]&.start_with?('end')
    builder.puts lines[line_cursor]
    line_cursor += 1
  end

  builder.string
end
invoke(ordered, named) click to toggle source
# File lib/spud/task_runners/spud_task_runner/task.rb, line 72
def invoke(ordered, named)
  if up_to_date?
    raise Error, "'#{name}' up to date"
  end

  check_required_args!(ordered)

  catch :halt do
    if args.any_named?
      T.unsafe(task_dsl).instance_exec(*ordered, **symbolize_keys(named), &@block)
    else
      T.unsafe(task_dsl).instance_exec(*ordered, &@block)
    end
  end
rescue ArgumentError => error
  raise Error, "invocation of '#{name}' with #{error.message}"
end

Private Instance Methods

check_required_args!(ordered) click to toggle source
# File lib/spud/task_runners/spud_task_runner/task.rb, line 126
def check_required_args!(ordered)
  required_ordered = args.required_ordered
  missing_ordered = required_ordered.length - ordered.length
  if missing_ordered > 0
    arguments = required_ordered.length - missing_ordered > 1 ? 'arguments' : 'argument'
    raise Error, "invocation of '#{name}' missing required #{arguments} #{required_ordered.join(', ')}"
  end
end
symbolize_keys(hash) click to toggle source
# File lib/spud/task_runners/spud_task_runner/task.rb, line 148
def symbolize_keys(hash)
  hash.each_with_object({}) { |(key, value), new_hash| new_hash[key.to_sym] = value }
end
task_dsl() click to toggle source
# File lib/spud/task_runners/spud_task_runner/task.rb, line 143
def task_dsl
  @task_dsl ||= TaskDSL.new(@driver, @filename, @file_dsl)
end
up_to_date?() click to toggle source
# File lib/spud/task_runners/spud_task_runner/task.rb, line 136
def up_to_date?
  return false if @dependencies.empty?

  @dependencies.all?(&:up_to_date?)
end