Parent

Class/Module Index [+]

Quicksearch

Chef::JSONCompat

Public Class Methods

class_for_json_class(json_class) click to toggle source
# File lib/chef/json_compat.rb, line 111
def class_for_json_class(json_class)
  case json_class
  when CHEF_APICLIENT
    Chef::ApiClient
  when CHEF_CHECKSUM
    Chef::Checksum
  when CHEF_COOKBOOKVERSION
    Chef::CookbookVersion
  when CHEF_DATABAG
    Chef::DataBag
  when CHEF_DATABAGITEM
    Chef::DataBagItem
  when CHEF_ENVIRONMENT
    Chef::Environment
  when CHEF_NODE
    Chef::Node
  when CHEF_ROLE
    Chef::Role
  when CHEF_SANDBOX
    Chef::Sandbox
  when CHEF_RESOURCE
    Chef::Resource
  when CHEF_RESOURCECOLLECTION
    Chef::ResourceCollection
  when CHEF_WEBUIUSER
    Chef::WebUIUser
  when CHEF_OPENIDREGISTRAION
    Chef::OpenIDRegistration
  when /^Chef::Resource/
    Chef::Resource.find_subclass_by_name(json_class)
  else
    raise JSON::ParserError, "Unsupported `json_class` type '#{json_class}'"
  end
end
from_json(source, opts = {}) click to toggle source

Just call the JSON gem's parse method with a modified :max_nesting field

# File lib/chef/json_compat.rb, line 56
def from_json(source, opts = {})
  obj = ::Yajl::Parser.parse(source)

  unless obj.kind_of?(Hash) || obj.kind_of?(Array)
    raise JSON::ParserError, "Top level JSON object must be a Hash or Array (actual: #{obj.class})"
  end

  # The old default in the json gem (which we are mimicing because we
  # sadly rely on this misfeature) is to "create additions" i.e., convert
  # JSON objects into ruby objects. Explicit :create_additions => false
  # is required to turn it off.
  if opts[:create_additions].nil? || opts[:create_additions]
    map_to_rb_obj(obj)
  else
    obj
  end
rescue Yajl::ParseError => e
  raise JSON::ParserError, e.message
end
map_hash_to_rb_obj(json_hash) click to toggle source
# File lib/chef/json_compat.rb, line 95
def map_hash_to_rb_obj(json_hash)
  json_hash.each do |key, value|
    json_hash[key] = map_to_rb_obj(value)
  end
  json_hash
end
map_to_rb_obj(json_obj) click to toggle source

Look at an object that's a basic type (from json parse) and convert it to an instance of Chef classes if desired.

# File lib/chef/json_compat.rb, line 78
def map_to_rb_obj(json_obj)
  res = case json_obj
  when Hash
    mapped_hash = map_hash_to_rb_obj(json_obj)
    if json_obj.has_key?(JSON_CLASS) && (class_to_inflate = class_for_json_class(json_obj[JSON_CLASS]))
      class_to_inflate.json_create(mapped_hash)
    else
      mapped_hash
    end
  when Array
    json_obj.map {|e| map_to_rb_obj(e) }
  else
    json_obj
  end
  res
end
opts_add_max_nesting(opts) click to toggle source

See CHEF-1292/PL-538. Increase the max nesting for JSON, which defaults to 19, and isn't enough for some (for example, a Node within a Node) structures.

# File lib/chef/json_compat.rb, line 47
def opts_add_max_nesting(opts)
  if opts.nil? || !opts.has_key?(:max_nesting)
    opts = opts.nil? ? Hash.new : opts.clone
    opts[:max_nesting] = JSON_MAX_NESTING
  end
  opts
end
to_json(obj, opts = nil) click to toggle source
# File lib/chef/json_compat.rb, line 102
def to_json(obj, opts = nil)
  obj.to_json(opts_add_max_nesting(opts))
end
to_json_pretty(obj, opts = nil) click to toggle source
# File lib/chef/json_compat.rb, line 106
def to_json_pretty(obj, opts = nil)
  ::JSON.pretty_generate(obj, opts_add_max_nesting(opts))
end

[Validate]

Generated with the Darkfish Rdoc Generator 2.