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