Path  Path::Store

Parent

  • Object
Generated with Razzle Dazzle Redfish

[Validate]

Store

TODO: I would like to remove the depth parameter, which would be easy enough if we had a null/nack object, ie. a type of nil that returns itself on missing methods.

Public Class Methods

load(dir) click to toggle source

(Not documented)

# File lib/path/store.rb, line 12
    def self.load(dir)
      o = new(dir)
      o.prime!
      o
    end
new(dir, data={}, depth=0) click to toggle source
# File lib/path/store.rb, line 19
    def initialize(dir, data={}, depth=0)
      require 'yaml'

      @dir   = dir
      @data  = data
      @depth = depth

      #@save  = []
    end

Public Instance Methods

[](name) click to toggle source
# File lib/path/store.rb, line 30
    def [](name)
      name = name.to_s
      if @data.key?(name)
        @data[name]
      else
        @data[name] = read!(name)
      end
    end
[]=(name, value) click to toggle source

TODO: what if name is a directory?

# File lib/path/store.rb, line 40
    def []=(name, value)
      name = name.to_s
      #@save << name
      @data[name] = value
    end
branch!(name, depth=1) click to toggle source

Specify a node in the store as a branch with a fixed depth.

# File lib/path/store.rb, line 151
    def branch!(name, depth=1)
      path = File.join(@dir, name)
      self[name] = self.class.new(path, {}, depth)
    end
each(&block) click to toggle source
# File lib/path/store.rb, line 55
    def each(&block)
      @data.each(&block)
    end
method_missing(name, *a, &b) click to toggle source

TODO: raise if arguments are wrong.

# File lib/path/store.rb, line 76
    def method_missing(name, *a, &b)
      name = name.to_s
      case name
      when /\=$/
        self[name.chomp('=')] = a.first
      when /\?$/
        self[name.chomp('?')]
      when /\!$/
        super
      else
        self[name]
      end
    end
prime!(hash=nil) click to toggle source
# File lib/path/store.rb, line 129
    def prime!(hash=nil)
      if hash
        hash.each do |k,v|
          case v
          when Hash
            self[k] = self.class.new(File.join(@dir,k),v)
          when self.class
            self[k] = self.class.new(File.join(@dir,k),v.to_h)
          else
            self[k] = v
          end
        end
      else
        entries = Dir.entries(@dir) - [ '.', '..' ]
        entries.each do |fname|
          v = self[fname]
          v.prime! if self.class === v
        end
      end
    end
read!(name) click to toggle source

(Not documented)

# File lib/path/store.rb, line 90
    def read!(name)
      file = File.join(@dir, name)
      if File.file?(file)
        YAML.load(File.new(file))
      elsif File.directory?(file)
        if @depth.zero?
          self.class.new(file)
        else
          self.class.new(file, depth - 1)
        end
      else
        if @depth.zero?
          nil
        else
          self.class.new(file)
        end
      end
    end
save!() click to toggle source
# File lib/path/store.rb, line 110
    def save!
      @data.each do |name, value|
        file  = File.join(@dir,name)
        case value
        when self.class
          FileUtils.mkdir_p(@dir)
          value.save!
        else
          old = File.read(file) if File.exist?(file)
          new = value.to_yaml
          if old != new
            FileUtils.mkdir_p(@dir)
            File.open(file, 'w'){ |f| f << new }
          end
        end
      end
    end
to_h() click to toggle source
# File lib/path/store.rb, line 47
    def to_h
      Dir.entries(@dir).each do |fname|
        self[fname]
      end
      @data.dup
    end
to_yaml( opts = {} ) click to toggle source

def to_yaml(opts={})

  @data.to_yaml(opts={})

end

# File lib/path/store.rb, line 64
    def to_yaml( opts = {} )
      YAML::quick_emit(self, opts) do |out|
        out.map(@data.taguri, to_yaml_style) do |map|
          each do |k, v|
            map.add(k, v)
          end
        end
      end
    end

Disabled; run with --debug to generate this.