Class: Chef::ChefFS::FileSystem::Repository::FileSystemEntry

Inherits:
BaseFSDir show all
Defined in:
lib/chef/chef_fs/file_system/repository/file_system_entry.rb

Instance Attribute Summary collapse

Attributes inherited from BaseFSObject

#name, #parent, #path

Instance Method Summary collapse

Methods inherited from BaseFSDir

#empty?

Methods inherited from BaseFSObject

#child, #compare_to, #root

Constructor Details

#initialize(name, parent, file_path = nil, data_handler = nil) ⇒ FileSystemEntry

Returns a new instance of FileSystemEntry


30
31
32
33
34
# File 'lib/chef/chef_fs/file_system/repository/file_system_entry.rb', line 30

def initialize(name, parent, file_path = nil, data_handler = nil)
  super(name, parent)
  @file_path = file_path || "#{parent.file_path}/#{name}"
  @data_handler = data_handler
end

Instance Attribute Details

#file_pathObject (readonly)

Returns the value of attribute file_path


36
37
38
# File 'lib/chef/chef_fs/file_system/repository/file_system_entry.rb', line 36

def file_path
  @file_path
end

Instance Method Details

#can_have_child?(name, is_dir) ⇒ Boolean

Returns:

  • (Boolean)

61
62
63
# File 'lib/chef/chef_fs/file_system/repository/file_system_entry.rb', line 61

def can_have_child?(name, is_dir)
  !is_dir && File.extname(name) == ".json"
end

#chef_objectObject


54
55
56
57
58
59
# File 'lib/chef/chef_fs/file_system/repository/file_system_entry.rb', line 54

def chef_object
  data_handler.chef_object(Chef::JSONCompat.parse(read))
rescue
  Chef::Log.error("Could not read #{path_for_printing} into a Chef object: #{$!}")
  nil
end

#childrenObject


81
82
83
84
85
86
87
88
# File 'lib/chef/chef_fs/file_system/repository/file_system_entry.rb', line 81

def children
  # Except cookbooks and data bag dirs, all things must be json files
  Dir.entries(file_path).sort.
    map { |child_name| make_child_entry(child_name) }.
    select { |new_child| new_child.fs_entry_valid? && can_have_child?(new_child.name, new_child.dir?) }
rescue Errno::ENOENT
  raise Chef::ChefFS::FileSystem::NotFoundError.new(self, $!)
end

#create_child(child_name, file_contents = nil) ⇒ Object


90
91
92
93
94
95
96
97
98
99
100
101
102
103
# File 'lib/chef/chef_fs/file_system/repository/file_system_entry.rb', line 90

def create_child(child_name, file_contents = nil)
  child = make_child_entry(child_name)
  if child.exists?
    raise Chef::ChefFS::FileSystem::AlreadyExistsError.new(:create_child, child)
  end
  if file_contents
    child.write(file_contents)
  else
    Dir.mkdir(child.file_path)
  end
  child
rescue Errno::EEXIST
  raise Chef::ChefFS::FileSystem::AlreadyExistsError.new(:create_child, child)
end

#data_handlerObject


46
47
48
# File 'lib/chef/chef_fs/file_system/repository/file_system_entry.rb', line 46

def data_handler
  @data_handler || parent.data_handler
end

#delete(recurse) ⇒ Object


109
110
111
112
113
114
115
116
117
118
119
120
# File 'lib/chef/chef_fs/file_system/repository/file_system_entry.rb', line 109

def delete(recurse)
  if dir?
    if !recurse
      raise MustDeleteRecursivelyError.new(self, $!)
    end
    FileUtils.rm_r(file_path)
  else
    File.delete(file_path)
  end
rescue Errno::ENOENT
  raise Chef::ChefFS::FileSystem::NotFoundError.new(self, $!)
end

#dir?Boolean

Returns:

  • (Boolean)

105
106
107
# File 'lib/chef/chef_fs/file_system/repository/file_system_entry.rb', line 105

def dir?
  File.directory?(file_path)
end

#exists?Boolean

Returns:

  • (Boolean)

122
123
124
# File 'lib/chef/chef_fs/file_system/repository/file_system_entry.rb', line 122

def exists?
  File.exists?(file_path) && (parent.nil? || parent.can_have_child?(name, dir?))
end

#fs_entry_valid?Boolean

basic implementation to support Repository::Directory API

Returns:

  • (Boolean)

70
71
72
# File 'lib/chef/chef_fs/file_system/repository/file_system_entry.rb', line 70

def fs_entry_valid?
  name_valid? && File.exist?(file_path)
end

#minimize(file_contents, entry) ⇒ Object


74
75
76
77
78
79
# File 'lib/chef/chef_fs/file_system/repository/file_system_entry.rb', line 74

def minimize(file_contents, entry)
  object = Chef::JSONCompat.parse(file_contents)
  object = data_handler.normalize(object, entry)
  object = data_handler.minimize(object, entry)
  Chef::JSONCompat.to_json_pretty(object)
end

#name_valid?Boolean

Returns:

  • (Boolean)

65
66
67
# File 'lib/chef/chef_fs/file_system/repository/file_system_entry.rb', line 65

def name_valid?
  !name.start_with?(".")
end

#path_for_printingObject


50
51
52
# File 'lib/chef/chef_fs/file_system/repository/file_system_entry.rb', line 50

def path_for_printing
  file_path
end

#readObject


126
127
128
129
130
# File 'lib/chef/chef_fs/file_system/repository/file_system_entry.rb', line 126

def read
  File.open(file_path, "rb") { |f| f.read }
rescue Errno::ENOENT
  raise Chef::ChefFS::FileSystem::NotFoundError.new(self, $!)
end

#write(file_contents) ⇒ Object Also known as: create


132
133
134
135
136
137
138
139
# File 'lib/chef/chef_fs/file_system/repository/file_system_entry.rb', line 132

def write(file_contents)
  if file_contents && write_pretty_json && File.extname(name) == ".json"
    file_contents = minimize(file_contents, self)
  end
  File.open(file_path, "wb") do |file|
    file.write(file_contents)
  end
end

#write_pretty_jsonObject


42
43
44
# File 'lib/chef/chef_fs/file_system/repository/file_system_entry.rb', line 42

def write_pretty_json
  @write_pretty_json.nil? ? root.write_pretty_json : @write_pretty_json
end

#write_pretty_json=(value) ⇒ Object


38
39
40
# File 'lib/chef/chef_fs/file_system/repository/file_system_entry.rb', line 38

def write_pretty_json=(value)
  @write_pretty_json = value
end