class Really::Script

Public Class Methods

new(path, options = {}) click to toggle source
# File lib/really/script.rb, line 9
def initialize(path, options = {})
  path = File.expand_path path
  raise "Script at '#{path}' is not readable. :( (Does it exist?)" unless File.readable?(path)

  @options = options
  @tasks = {}
  @roles = {}
  @drivers = []

  instance_eval File.read(path)
end

Public Instance Methods

configure(&block) click to toggle source
# File lib/really/script.rb, line 41
def configure(&block)
  instance_eval &block
end
execute(role_names = []) click to toggle source

Internal public API

# File lib/really/script.rb, line 57
def execute(role_names = [])
  @drivers.each do |driver|
    driver.open

    role_graph = DependencyGraph.new @roles

    # All drivers implicitly get the magic :default role.
    role_graph.add @roles[:default] if @roles.has_key?(:default)

    driver.role_names.each do |role_name|
      raise "Role '#{role_name}' does not exist." unless @roles.has_key?(role_name)
      role_graph.add @roles[role_name]
    end

    all_tasks = Hash[@tasks.collect { |key, value| [key, value.dup] }]
    task_graph = DependencyGraph.new all_tasks

    roles = role_graph.ordered_nodes

    roles.each do |role|
      role.task_descriptors.each do |descriptor|
        task_name = descriptor[:task_name]
        raise "Task '#{task_name}' does not exist." unless all_tasks.has_key?(task_name)

        task = all_tasks[task_name]
        task.options.merge! descriptor[:options]
        task_graph.add task
      end
    end

    logger.status "[#{roles.length > 1 ? 'roles' : 'role'}: #{roles.collect(&:name).join ', '}]"

    task_graph.ordered_nodes.each do |task|
      logger.status "task:#{task.name}", header: '***', header_color: :green
      driver.execute_task task, @options
    end

    driver.close
  end
end
role(name, options = {}, &block) click to toggle source
# File lib/really/script.rb, line 32
def role(name, options = {}, &block)
  name = name.to_sym
  raise "Duplicate definition of role name '#{name}'." if @roles.has_key?(name)

  role = Role.new(name, options, &block)
  @roles[name] = role
  role
end
task(name, options = {}, &block) click to toggle source

Public API for use in really.rb scripts

# File lib/really/script.rb, line 23
def task(name, options = {}, &block)
  name = name.to_sym
  raise "Duplicate definition of group name '#{name}'." if @tasks.has_key?(name)

  task = Task.new(name, options, &block)
  @tasks[name] = task
  task
end
via(name, &block) click to toggle source
# File lib/really/script.rb, line 45
def via(name, &block)
  name = name.to_s.capitalize
  name = "SSH" if name == "Ssh"
  klass = eval "Really::Drivers::#{name}"

  driver = klass.new &block
  @drivers << driver
  driver
end