class Wunderbar::JsonBuilder

Public Class Methods

new(scope) click to toggle source
# File lib/wunderbar/builder.rb, line 483
def initialize(scope)
  @_scope = scope
  @_target = {}
end

Public Instance Methods

_!(object) click to toggle source
# File lib/wunderbar/builder.rb, line 563
def _!(object)
  @_target = object
end
_exception(*args) click to toggle source
Calls superclass method
# File lib/wunderbar/builder.rb, line 567
def _exception(*args)
  exception = args.first
  if exception.respond_to? :backtrace
    Wunderbar.error exception.inspect
    super(exception.inspect)
    @_target['backtrace'] = []
    exception.backtrace.each do |frame| 
      next if CALLERS_TO_IGNORE.any? {|re| frame =~ re}
      Wunderbar.warn "  #{frame}"
      @_target['backtrace'] << frame 
    end
  else
    super
  end
end
encode(&block) click to toggle source
# File lib/wunderbar/builder.rb, line 488
def encode(&block)
  set_variables_from_params
  before = @_target.dup
  result = self.instance_eval(&block)
  _! result if before.empty? and result and @_target == before
  @_target
end
method_missing(method, *args, &block) click to toggle source

forward to Wunderbar, @_target, or @_scope

Calls superclass method
# File lib/wunderbar/builder.rb, line 497
def method_missing(method, *args, &block)

  if method.to_s =~ /^_(\w*)$/
    name = $1
  elsif Wunderbar.respond_to? method
    return Wunderbar.send method, *args, &block
  elsif @_target.respond_to? method
    return @_target.send method, *args, &block
  elsif @_scope and @_scope.respond_to? method
    return @_scope.send method, *args, &block
  else
    super
  end

  if args.length == 0
    return self unless block
    result = JsonBuilder.new(@_scope).encode(&block)
  elsif args.length == 1
    result = args.first

    if block
      if Symbol === result or String === result
        result = {result.to_s => JsonBuilder.new(@_scope).encode(&block)}
      else
        result = result.map {|n| @_target = {}; block.call(n); @_target} 
      end
    end
  elsif block
    ::Kernel::raise ::ArgumentError, 
      "can't mix multiple arguments with a block"
  else
    object = args.shift

    if not Enumerable === object or String === object or Struct === object
      result = {}
      args.each {|arg| result[arg.to_s] = object.send arg}
    else
      result = []
      result = @_target if name.empty? and @_target.respond_to? :<<
      object.each do |item|
        result << Hash[args.map {|arg| [arg.to_s, item.send(arg)]}]
      end
    end
  end

  if name != ''
    unless Hash === @_target or @_target.empty?
      ::Kernel::raise ::ArgumentError, "mixed array and hash calls"
    end

    @_target[name.to_s] = result
  elsif args.length == 0 or (args.length == 1 and not block)
    @_target = [] if @_target == {}

    if Hash === @_target 
      ::Kernel::raise ::ArgumentError, "mixed hash and array calls"
    end

    @_target << result
  else
    @_target = result
  end

  self
end
system(*args) click to toggle source

execute a system command, echoing stdin, stdout, and stderr

Calls superclass method Wunderbar::BuilderClass#system
# File lib/wunderbar/builder.rb, line 584
def system(*args)
  opts = {}
  opts = args.pop if Hash === args.last

  transcript = opts[:transcript]  || 'transcript'
  output_prefix = opts[:prefix] || {}
  output_prefix[:stdin]  ||= '$ '

  if @_target[transcript]
    @_target[transcript] << ''
  else
    @_target[transcript] = []
  end

  if Hash === args.last # support original code which needed two hashes
    super do |kind, line|
      @_target[transcript] << "#{output_prefix[kind]}#{line}"
    end
  else
    super(*args, opts) do |kind, line|
      @_target[transcript] << "#{output_prefix[kind]}#{line}"
    end
  end
end
system!(*args) click to toggle source

execute a system command, ensuring the result is a success

# File lib/wunderbar/builder.rb, line 610
def system!(*args)
  rc = system(args)
  
  raise RuntimeError.new("exit code: #{rc}") if rc != 0

  rc
end
target!() click to toggle source
# File lib/wunderbar/builder.rb, line 618
def target!
  begin
    JSON.pretty_generate(@_target)+ "\n"
  rescue
    @_target.to_json + "\n"
  end
end
target?(type=nil) click to toggle source
# File lib/wunderbar/builder.rb, line 626
def target?(type=nil)
  if Class === type
    type === @_target
  else
    @_target
  end
end