Class: Hiera::Filecache
- Inherits:
-
Object
- Object
- Hiera::Filecache
- Defined in:
- lib/hiera/filecache.rb
Instance Method Summary collapse
-
#initialize ⇒ Filecache
constructor
A new instance of Filecache.
-
#read(path, expected_type = Object, default = nil, &block) ⇒ Object
Reads a file, optionally parse it in some way check the output type and set a default.
-
#read_file(path, expected_type = Object) ⇒ Object
Read a file when it changes.
Constructor Details
#initialize ⇒ Filecache
Returns a new instance of Filecache.
3 4 5 |
# File 'lib/hiera/filecache.rb', line 3 def initialize @cache = {} end |
Instance Method Details
#read(path, expected_type = Object, default = nil, &block) ⇒ Object
Reads a file, optionally parse it in some way check the output type and set a default
Simply invoking it this way will return the file contents
data = read("/some/file")
But as most cases of file reading in hiera involves some kind of parsing through a serializer there's some help for those cases:
data = read("/some/file", Hash, {}) do |data|
JSON.parse(data)
end
In this case it will read the file, parse it using JSON then check that the end result is a Hash, if it's not a hash or if reading/parsing fails it will return {} instead
Prior to calling this method you should be sure the file exist
27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
# File 'lib/hiera/filecache.rb', line 27 def read(path, expected_type = Object, default=nil, &block) read_file(path, expected_type, &block) rescue TypeError => detail Hiera.debug("#{detail.}, setting defaults") @cache[path][:data] = default rescue => detail error = "Reading data from #{path} failed: #{detail.class}: #{detail}" if default.nil? raise detail else Hiera.debug(error) @cache[path][:data] = default end end |
#read_file(path, expected_type = Object) ⇒ Object
Read a file when it changes. If a file is re-read and has not changed since the last time then the last, processed, contents will be returned.
The processed data can also be checked against an expected type. If the type does not match a TypeError is raised.
No error handling is done inside this method. Any failed reads or errors in processing will be propagated to the caller
50 51 52 53 54 55 56 57 58 59 60 61 |
# File 'lib/hiera/filecache.rb', line 50 def read_file(path, expected_type = Object) if stale?(path) data = File.read(path, :encoding => 'BOM|UTF-8') @cache[path][:data] = block_given? ? yield(data) : data if !@cache[path][:data].is_a?(expected_type) raise TypeError, "Data retrieved from #{path} is #{@cache[path][:data].class} not #{expected_type}" end end @cache[path][:data] end |