diff options
Diffstat (limited to 'lib/chef/chef_fs/file_system/base_fs_object.rb')
-rw-r--r-- | lib/chef/chef_fs/file_system/base_fs_object.rb | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/lib/chef/chef_fs/file_system/base_fs_object.rb b/lib/chef/chef_fs/file_system/base_fs_object.rb new file mode 100644 index 0000000000..855892fc89 --- /dev/null +++ b/lib/chef/chef_fs/file_system/base_fs_object.rb @@ -0,0 +1,121 @@ +# +# Author:: John Keiser (<jkeiser@opscode.com>) +# Copyright:: Copyright (c) 2012 Opscode, Inc. +# License:: Apache License, Version 2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +require 'chef/chef_fs/path_utils' + +class Chef + module ChefFS + module FileSystem + class BaseFSObject + def initialize(name, parent) + @parent = parent + @name = name + if parent + @path = Chef::ChefFS::PathUtils::join(parent.path, name) + else + if name != '' + raise ArgumentError, "Name of root object must be empty string: was '#{name}' instead" + end + @path = '/' + end + end + + attr_reader :name + attr_reader :parent + attr_reader :path + + def root + parent ? parent.root : self + end + + def path_for_printing + if parent + parent_path = parent.path_for_printing + if parent_path == '.' + name + else + Chef::ChefFS::PathUtils::join(parent.path_for_printing, name) + end + else + name + end + end + + def dir? + false + end + + def exists? + true + end + + def child(name) + NonexistentFSObject.new(name, self) + end + + # Override can_have_child? to report whether a given file *could* be added + # to this directory. (Some directories can't have subdirs, some can only have .json + # files, etc.) + def can_have_child?(name, is_dir) + false + end + + # Override this if you have a special comparison algorithm that can tell + # you whether this entry is the same as another--either a quicker or a + # more reliable one. Callers will use this to decide whether to upload, + # download or diff an object. + # + # You should not override this if you're going to do the standard + # +self.read == other.read+. If you return +nil+, the caller will call + # +other.compare_to(you)+ instead. Give them a chance :) + # + # ==== Parameters + # + # * +other+ - the entry to compare to + # + # ==== Returns + # + # * +[ are_same, value, other_value ]+ + # +are_same+ may be +true+, +false+ or +nil+ (which means "don't know"). + # +value+ and +other_value+ must either be the text of +self+ or +other+, + # +:none+ (if the entry does not exist or has no value) or +nil+ if the + # value was not retrieved. + # * +nil+ if a definitive answer cannot be had and nothing was retrieved. + # + # ==== Example + # + # are_same, value, other_value = entry.compare_to(other) + # if are_same.nil? + # are_same, other_value, value = other.compare_to(entry) + # end + # if are_same.nil? + # value = entry.read if value.nil? + # other_value = entry.read if other_value.nil? + # are_same = (value == other_value) + # end + def compare_to(other) + return nil + end + + # Important directory attributes: name, parent, path, root + # Overridable attributes: dir?, child(name), path_for_printing + # Abstract: read, write, delete, children + end + end + end +end |