# class Chef::Knife::Core::ObjectLoader

### Attributes

klass[R]
ui[R]

### Public Class Methods

new(klass, ui) click to toggle source

    # File lib/chef/knife/core/object_loader.rb, line 32
    def initialize(klass, ui)
      @klass = klass
      @ui = ui
    end

### Public Instance Methods

file_exists_and_is_readable?(file) click to toggle source

    # File lib/chef/knife/core/object_loader.rb, line 104
    def file_exists_and_is_readable?(file)
      File.exists?(file) && File.readable?(file)
    end

find_all_object_dirs(path) click to toggle source

    # File lib/chef/knife/core/object_loader.rb, line 76
    def find_all_object_dirs(path)
      path = File.join(path, '*')
      objects = Dir.glob(File.expand_path(path))
      objects.delete_if { |o| !File.directory?(o) }
      objects.map { |o| File.basename(o) }
    end

find_all_objects(path) click to toggle source

Find all objects in the given location If the object type is File it will look for all *.{json,rb} files, otherwise it will lookup for folders only (useful for data_bags)

@param [String] path - base look up location

@return [Array<String>] basenames of the found objects

@api public

    # File lib/chef/knife/core/object_loader.rb, line 69
    def find_all_objects(path)
      path = File.join(path, '*')
      path << '.{json,rb}'
      objects = Dir.glob(File.expand_path(path))
      objects.map { |o| File.basename(o) }
    end

find_file(repo_location, *components) click to toggle source

When someone makes this awesome, please update the above error message.

    # File lib/chef/knife/core/object_loader.rb, line 46
    def find_file(repo_location, *components)
      if file_exists_and_is_readable?(File.expand_path( components.last ))
        File.expand_path( components.last )
      else
        relative_path = File.join(Dir.pwd, repo_location, *components)
        if file_exists_and_is_readable?(relative_path)
          relative_path
        else
          nil
        end
      end
    end

load_from(repo_location, *components) click to toggle source

    # File lib/chef/knife/core/object_loader.rb, line 37
    def load_from(repo_location, *components)
      unless object_file = find_file(repo_location, *components)
        ui.error "Could not find or open file '#{components.last}' in current directory or in '#{repo_location}/#{components.join('/')}'"
        exit 1
      end
      object_from_file(object_file)
    end

object_from_file(filename) click to toggle source

    # File lib/chef/knife/core/object_loader.rb, line 83
    def object_from_file(filename)
      case filename
      when /\.(js|json)$/
        r = Yajl::Parser.parse(IO.read(filename))

        # Chef::DataBagItem doesn't work well with the json_create method
        if @klass == Chef::DataBagItem
          r
        else
          @klass.json_create(r)
        end
      when /\.rb$/
        r = klass.new
        r.from_file(filename)
        r
      else
        ui.fatal("File must end in .js, .json, or .rb")
        exit 30
      end
    end