class SousChef::Recipe

Attributes

node[RW]
shebang[RW]
shebang?[RW]
verbose[RW]
verbose?[RW]

Public Class Methods

load(file) click to toggle source
# File lib/sous_chef/recipe.rb, line 13
def self.load(file)
  new { instance_eval(File.read(file), file, 1) }
end
new(*flags, &block) click to toggle source
# File lib/sous_chef/recipe.rb, line 7
def initialize(*flags, &block)
  flags.each {|flag| __send__("#{flag}=", true)}
  @resources = []
  @block = block
end

Public Instance Methods

add_resource(resource) click to toggle source
# File lib/sous_chef/recipe.rb, line 78
def add_resource(resource)
  with_context(resource) do
    @resources << resource
    resource.setup
  end
  resource
end
command(cmd) click to toggle source
# File lib/sous_chef/recipe.rb, line 64
def command(cmd)
  if context
    context.command(cmd)
  else
    execute { command cmd }
  end
end
context() click to toggle source
# File lib/sous_chef/recipe.rb, line 86
def context
  @context
end
directory(*args, &block) click to toggle source
# File lib/sous_chef/recipe.rb, line 52
def directory(*args, &block)
  add_resource Resource::Directory.new(self, *args, &block)
end
echo(string) click to toggle source
# File lib/sous_chef/recipe.rb, line 40
def echo(string)
  command "echo '#{escape_string(string)}'"
end
escape_path(path) click to toggle source
# File lib/sous_chef/recipe.rb, line 96
def escape_path(path)
  path
end
escape_string(string) click to toggle source
# File lib/sous_chef/recipe.rb, line 100
def escape_string(string)
  # bash is completely insane
  # this stops the quote, immediately starts another one using
  # double quotes to insert the single quote, then resumes the
  # single quote again until the terminating single quote
  return if string.nil?
  string.gsub("'", %q{'"'"'})
end
execute(*args, &block) click to toggle source
# File lib/sous_chef/recipe.rb, line 44
def execute(*args, &block)
  add_resource Resource::Execute.new(self, *args, &block)
end
file(*args, &block) click to toggle source
# File lib/sous_chef/recipe.rb, line 48
def file(*args, &block)
  add_resource Resource::File.new(self, *args, &block)
end
gemfile(*args, &block) click to toggle source
# File lib/sous_chef/recipe.rb, line 60
def gemfile(*args, &block)
  add_resource Resource::Gemfile.new(self, *args, &block)
end
halt_on_failed_command() click to toggle source
# File lib/sous_chef/recipe.rb, line 72
def halt_on_failed_command
  execute "halt on failed command" do
    command "set -e"
  end
end
log(*args, &block) click to toggle source
# File lib/sous_chef/recipe.rb, line 56
def log(*args, &block)
  add_resource Resource::Log.new(self, *args, &block)
end
method_missing(meth, *args, &block) click to toggle source
Calls superclass method
# File lib/sous_chef/recipe.rb, line 109
def method_missing(meth, *args, &block)
  if context && context.resource_respond_to?(meth)
    context.__send__(meth, *args, &block)
  else
    super
  end
end
setup() click to toggle source
# File lib/sous_chef/recipe.rb, line 17
def setup
  if @block
    instance_eval &@block
    @block = nil
  end
end
to_script() click to toggle source
# File lib/sous_chef/recipe.rb, line 24
def to_script
  @script ||= begin
    setup
    lines = []
    lines << "#!/bin/bash" if shebang?
    lines += @resources.map do |resource|
      # @context = resource
      script = ""
      script << %{# #{resource.name}\n} if verbose? && resource.name
      script << resource.to_script
    end
    # add a trailing newline for consistency and vim-friendliness
    lines.join("\n\n") << "\n"
  end
end
with_context(resource) { || ... } click to toggle source
# File lib/sous_chef/recipe.rb, line 90
def with_context(resource)
  @context = resource
  yield
  @context = nil
end