class Driskell::Listen::Record
@private api
Attributes
root[R]
Public Class Methods
new(directory)
click to toggle source
# File lib/driskell-listen/record.rb, line 8 def initialize(directory) @tree = _auto_hash @tree['.'] = _auto_hash @root = directory.to_s end
Public Instance Methods
build()
click to toggle source
# File lib/driskell-listen/record.rb, line 42 def build @tree = _auto_hash # TODO: test with a file name given # TODO: test other permissions # TODO: test with mixed encoding remaining = ::Queue.new remaining << Entry.new(root, nil, nil) _fast_build_dir(remaining) until remaining.empty? end
dir_entries(rel_path)
click to toggle source
# File lib/driskell-listen/record.rb, line 36 def dir_entries(rel_path) rel_path = rel_path.to_s # Do not store anything for the directory when querying tree.has_key?(rel_path) ? tree[rel_path] : {} end
file_data(rel_path)
click to toggle source
# File lib/driskell-listen/record.rb, line 29 def file_data(rel_path) dirname, basename = Pathname(rel_path).split.map(&:to_s) tree[dirname] ||= {} tree[dirname][basename] ||= {} tree[dirname][basename].dup end
unset_path(rel_path)
click to toggle source
# File lib/driskell-listen/record.rb, line 24 def unset_path(rel_path) dirname, basename = Pathname(rel_path).split.map(&:to_s) _fast_unset_path(rel_path, dirname, basename) end
update_dir(rel_path)
click to toggle source
# File lib/driskell-listen/record.rb, line 14 def update_dir(rel_path) dirname, basename = Pathname(rel_path).split.map(&:to_s) _fast_update_dir(rel_path, dirname, basename) end
update_file(rel_path, data)
click to toggle source
# File lib/driskell-listen/record.rb, line 19 def update_file(rel_path, data) dirname, basename = Pathname(rel_path).split.map(&:to_s) _fast_update_file(dirname, basename, data) end
Private Instance Methods
_auto_hash()
click to toggle source
# File lib/driskell-listen/record.rb, line 54 def _auto_hash Hash.new { |h, k| h[k] = Hash.new } end
_fast_build_dir(remaining)
click to toggle source
# File lib/driskell-listen/record.rb, line 85 def _fast_build_dir(remaining) entry = remaining.pop fail Errno::ENOTDIR if ::File.symlink?(entry.sys_path) children = entry.children children.each { |child| remaining << child } return if entry.name.nil? _fast_update_dir(entry.record_dir_key, entry.relative, entry.name) rescue Errno::ENOTDIR _fast_try_file(entry) rescue SystemCallError _fast_unset_path(entry.relative, entry.name) end
_fast_try_file(entry)
click to toggle source
# File lib/driskell-listen/record.rb, line 98 def _fast_try_file(entry) _fast_update_file(entry.relative, entry.name, entry.meta) rescue SystemCallError _fast_unset_path(entry.record_dir_key, entry.relative, entry.name) end
_fast_unset_path(rel_path, dirname, basename)
click to toggle source
# File lib/driskell-listen/record.rb, line 77 def _fast_unset_path(rel_path, dirname, basename) # this may need to be reworked to properly remove # entries from a tree, without adding non-existing dirs to the record return unless tree.key?(dirname) tree[dirname].delete basename tree.delete rel_path end
_fast_update_dir(record_as_key, dirname, basename)
click to toggle source
# File lib/driskell-listen/record.rb, line 62 def _fast_update_dir(record_as_key, dirname, basename) tree[record_as_key] ||= {} tree[dirname] ||= {} exists = tree[dirname].has_key?(basename) tree[dirname].merge!(basename => {}) if basename != '.' exists end
_fast_update_file(dirname, basename, data)
click to toggle source
# File lib/driskell-listen/record.rb, line 70 def _fast_update_file(dirname, basename, data) tree[dirname] ||= {} exists = tree[dirname].has_key?(basename) tree[dirname][basename] = (tree[dirname][basename] || {}).merge(data) exists end
tree()
click to toggle source
# File lib/driskell-listen/record.rb, line 58 def tree @tree end