Module: Chef::ResourceInspector

Defined in:
lib/chef/resource_inspector.rb

Class Method Summary collapse

Class Method Details

.extract_cookbook(path, complete) ⇒ Object



82
83
84
85
86
87
88
89
90
91
92
93
94
95
# File 'lib/chef/resource_inspector.rb', line 82

def self.extract_cookbook(path, complete)
  path = File.expand_path(path)
  dir, name = File.split(path)
  Chef::Cookbook::FileVendor.fetch_from_disk(path)
  loader = Chef::CookbookLoader.new(dir)
  cookbook = loader.load_cookbook(name)
  resources = cookbook.files_for(:resources)

  resources.each_with_object({}) do |r, res|
    pth = r["full_path"]
    cur = Chef::Resource::LWRPBase.build_from_file(name, pth, Chef::RunContext.new(Chef::Node.new, nil, nil))
    res[cur.resource_name] = extract_resource(cur, complete)
  end
end

.extract_resource(resource, complete = false) ⇒ Object



44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/chef/resource_inspector.rb', line 44

def self.extract_resource(resource, complete = false)
  data = {}
  data[:description] = resource.description
  data[:default_action] = resource.default_action
  data[:actions] = {}
  resource.allowed_actions.each do |action|
    data[:actions][action] = resource.new(resource.to_s, nil).action_description(action)
  end

  data[:examples] = resource.examples
  data[:introduced] = resource.introduced
  data[:preview] = resource.preview_resource

  properties = unless complete
                 resource.properties.reject { |_, k| k.options[:declared_in] == Chef::Resource || k.options[:skip_docs] }
               else
                 resource.properties.reject { |_, k| k.options[:skip_docs] }
               end

  data[:properties] = properties.each_with_object([]) do |(n, k), acc|
    opts = k.options
    acc << { name: n, description: opts[:description],
             introduced: opts[:introduced], is: opts[:is],
             deprecated: opts[:deprecated] || false,
             required: opts[:required] || false,
             default: opts[:default_description] || get_default(opts[:default]),
             name_property: opts[:name_property] || false,
             equal_to: sort_equal_to(opts[:equal_to]) }
  end
  data
end

.get_default(default) ⇒ Object



33
34
35
36
37
38
39
40
41
42
# File 'lib/chef/resource_inspector.rb', line 33

def self.get_default(default)
  if default.is_a?(Chef::DelayedEvaluator)
    # ideally we'd get the block we pass to `lazy`, but the best we can do
    # is to get the source location, which then results in reparsing the source
    # code for the resource ourselves and just no
    "lazy default"
  else
    default.is_a?(Symbol) ? default.inspect : default # inspect properly returns symbols
  end
end

.inspect(arguments = [], complete: false) ⇒ String

If we’re given no resources, dump all of Chef’s built ins otherwise, if we have a path then extract all the resources from the cookbook or else do a list of built in resources

Parameters:

  • arguments (Array, String) (defaults to: [])

    One of more paths to a cookbook or a resource file to inspect

  • complete (TrueClass, FalseClass) (defaults to: false)

    Whether to show properties defined in the base Resource class

Returns:

  • (String)

    JSON formatting of all resources



104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
# File 'lib/chef/resource_inspector.rb', line 104

def self.inspect(arguments = [], complete: false)
  output = if arguments.empty?
             ObjectSpace.each_object(Class).select { |k| k < Chef::Resource }.each_with_object({}) { |klass, acc| acc[klass.resource_name] = extract_resource(klass) }
           else
             Array(arguments).each_with_object({}) do |arg, acc|
               if File.directory?(arg)
                 extract_cookbook(arg, complete).each { |k, v| acc[k] = v }
               else
                 r = Chef::ResourceResolver.resolve(arg.to_sym)
                 acc[r.resource_name] = extract_resource(r, complete)
               end
             end
           end

  Chef::JSONCompat.to_json_pretty(output)
end

.sort_equal_to(equal_to) ⇒ Object



76
77
78
79
80
# File 'lib/chef/resource_inspector.rb', line 76

def self.sort_equal_to(equal_to)
  Array(equal_to).sort.map(&:inspect)
rescue ArgumentError
  Array(equal_to).map(&:inspect)
end

.startObject



121
122
123
# File 'lib/chef/resource_inspector.rb', line 121

def self.start
  puts inspect(ARGV, complete: true)
end