Class: ChefFS::FileSystem::RestListEntry
- Inherits:
-
BaseFSObject
- Object
- BaseFSObject
- ChefFS::FileSystem::RestListEntry
- Defined in:
- lib/chef_fs/file_system/rest_list_entry.rb
Direct Known Subclasses
Instance Attribute Summary
Attributes inherited from BaseFSObject
Instance Method Summary collapse
- #_read_hash ⇒ Object
- #api_child_name ⇒ Object
- #api_path ⇒ Object
- #chef_object ⇒ Object
- #compare_to(other) ⇒ Object
- #data_handler ⇒ Object
- #delete(recurse) ⇒ Object
- #environment ⇒ Object
- #exists? ⇒ Boolean
-
#initialize(name, parent, exists = nil) ⇒ RestListEntry
constructor
A new instance of RestListEntry.
- #minimize_value(value) ⇒ Object
- #org ⇒ Object
- #read ⇒ Object
- #rest ⇒ Object
- #write(file_contents) ⇒ Object
Methods inherited from BaseFSObject
#can_have_child?, #child, #children, #create_child, #dir?, #path_for_printing, #root
Constructor Details
#initialize(name, parent, exists = nil) ⇒ RestListEntry
Returns a new instance of RestListEntry.
29 30 31 32 |
# File 'lib/chef_fs/file_system/rest_list_entry.rb', line 29 def initialize(name, parent, exists = nil) super(name, parent) @exists = exists end |
Instance Method Details
#_read_hash ⇒ Object
86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
# File 'lib/chef_fs/file_system/rest_list_entry.rb', line 86 def _read_hash begin json = ChefFS::RawRequest.raw_request(rest, api_path) rescue Timeout::Error => e raise ChefFS::FileSystem::OperationFailedError.new(:read, self, e), "Timeout reading: #{e}" rescue Net::HTTPServerException => e if $!.response.code == "404" raise ChefFS::FileSystem::NotFoundError.new(self, e) else raise ChefFS::FileSystem::OperationFailedError.new(:read, self, e), "HTTP error reading: #{e}" end end # Minimize the value (get rid of defaults) so the results don't look terrible minimize_value(JSON.parse(json, :create_additions => false)) end |
#api_child_name ⇒ Object
38 39 40 41 42 43 |
# File 'lib/chef_fs/file_system/rest_list_entry.rb', line 38 def api_child_name if name.length < 5 || name[-5,5] != ".json" raise "Invalid name #{path}: must end in .json" end name[0,name.length-5] end |
#api_path ⇒ Object
45 46 47 |
# File 'lib/chef_fs/file_system/rest_list_entry.rb', line 45 def api_path "#{parent.api_path}/#{api_child_name}" end |
#chef_object ⇒ Object
102 103 104 105 |
# File 'lib/chef_fs/file_system/rest_list_entry.rb', line 102 def chef_object # REST will inflate the Chef object using json_class data_handler.json_class.json_create(read) end |
#compare_to(other) ⇒ Object
111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 |
# File 'lib/chef_fs/file_system/rest_list_entry.rb', line 111 def compare_to(other) # TODO this pair of reads can be parallelized # Grab the other value begin other_value_json = other.read rescue ChefFS::FileSystem::NotFoundError return [ nil, nil, :none ] end # Grab this value begin value = _read_hash rescue ChefFS::FileSystem::NotFoundError return [ false, :none, other_value_json ] end # Minimize (and normalize) both values for easy and beautiful diffs value = minimize_value(value) value_json = Chef::JSONCompat.to_json_pretty(value) begin other_value = JSON.parse(other_value_json, :create_additions => false) rescue JSON::ParserError => e Chef::Log.warn("Parse error reading #{other.path_for_printing} as JSON: #{e}") return [ nil, value_json, other_value_json ] end other_value = minimize_value(other_value) other_value_json = Chef::JSONCompat.to_json_pretty(other_value) [ value == other_value, value_json, other_value_json ] end |
#data_handler ⇒ Object
34 35 36 |
# File 'lib/chef_fs/file_system/rest_list_entry.rb', line 34 def data_handler parent.data_handler end |
#delete(recurse) ⇒ Object
68 69 70 71 72 73 74 75 76 77 78 79 80 |
# File 'lib/chef_fs/file_system/rest_list_entry.rb', line 68 def delete(recurse) begin rest.delete_rest(api_path) rescue Timeout::Error => e raise ChefFS::FileSystem::OperationFailedError.new(:delete, self, e), "Timeout deleting: #{e}" rescue Net::HTTPServerException => e if e.response.code == "404" raise ChefFS::FileSystem::NotFoundError.new(self, e) else raise ChefFS::FileSystem::OperationFailedError.new(:delete, self, e), "Timeout deleting: #{e}" end end end |
#environment ⇒ Object
53 54 55 |
# File 'lib/chef_fs/file_system/rest_list_entry.rb', line 53 def environment parent.environment end |
#exists? ⇒ Boolean
57 58 59 60 61 62 63 64 65 66 |
# File 'lib/chef_fs/file_system/rest_list_entry.rb', line 57 def exists? if @exists.nil? begin @exists = parent.children.any? { |child| child.name == name } rescue ChefFS::FileSystem::NotFoundError @exists = false end end @exists end |
#minimize_value(value) ⇒ Object
107 108 109 |
# File 'lib/chef_fs/file_system/rest_list_entry.rb', line 107 def minimize_value(value) data_handler.minimize(data_handler.normalize(value, self), self) end |
#org ⇒ Object
49 50 51 |
# File 'lib/chef_fs/file_system/rest_list_entry.rb', line 49 def org parent.org end |
#read ⇒ Object
82 83 84 |
# File 'lib/chef_fs/file_system/rest_list_entry.rb', line 82 def read Chef::JSONCompat.to_json_pretty(_read_hash) end |
#rest ⇒ Object
143 144 145 |
# File 'lib/chef_fs/file_system/rest_list_entry.rb', line 143 def rest parent.rest end |
#write(file_contents) ⇒ Object
147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 |
# File 'lib/chef_fs/file_system/rest_list_entry.rb', line 147 def write(file_contents) begin object = JSON.parse(file_contents, :create_additions => false) rescue JSON::ParserError => e raise ChefFS::FileSystem::OperationFailedError.new(:write, self, e), "Parse error reading JSON: #{e}" end if data_handler object = data_handler.normalize_for_put(object, self) data_handler.verify_integrity(object, self) do |error| raise ChefFS::FileSystem::OperationFailedError.new(:write, self), "#{error}" end end begin rest.put_rest(api_path, object) rescue Timeout::Error => e raise ChefFS::FileSystem::OperationFailedError.new(:write, self, e), "Timeout writing: #{e}" rescue Net::HTTPServerException => e if e.response.code == "404" raise ChefFS::FileSystem::NotFoundError.new(self, e) else raise ChefFS::FileSystem::OperationFailedError.new(:write, self, e), "HTTP error writing: #{e}" end end end |