Class: BlackBoard::Folder

Inherits:
Hash
  • Object
show all
Defined in:
lib/blackboard.rb

Instance Method Summary collapse

Constructor Details

#initialize(name, items, options, &block) ⇒ Folder

Returns a new instance of Folder.

Raises:

  • (ArgumentError)


47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/blackboard.rb', line 47

def initialize name, items, options, &block
  @name = name

  @folders = []
  @ttl = options[:ttl]
  @store = options[:store]

  raise ArgumentError, "Folder.new should not receive ttl bigger than #seconds in 30 days" if @ttl > 2592000

  create_children items 

  instance_eval(&block) unless block.nil?
  instance_eval "def method_missing folder; raise BlackBoardError, \"Folder \#{folder} not found\"; end"
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(name, *args, &block) ⇒ Object

Raises:



62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/blackboard.rb', line 62

def method_missing name, *args, &block

  raise BlackBoardError, "Folder #{name} already exists" if @folders.include?(name)
  instance_eval %Q{def #{name}; self[:#{name}]._update; self[:#{name}]; end}

  options = args[-1].is_a?(Hash) ? args.delete_at(-1) : {}
  options[:ttl] ||= @ttl
  options[:store] ||= @store

  self[name] = Folder.new "#{@name}.#{name}", args, options, &block

end

Instance Method Details

#_updateObject



75
76
77
78
79
80
# File 'lib/blackboard.rb', line 75

def _update
  @items.keys.each do |k|
    self[k] = get k
  end
  @folders.each {|f| ; self[f]._update }
end

#add(name, object) ⇒ Object



99
100
101
102
103
104
105
106
107
# File 'lib/blackboard.rb', line 99

def add name, object
  obj_ttl = (@ttl - (Time.now - object.timestamp)).round
  return unless obj_ttl > 0
  return if object.timestamp < @items[name]

  @items[name] = object.timestamp
  obj = Data.new(name, object)
  @store.store "#{@name}.#{name}", obj, :expires_in => obj_ttl
end

#create_children(children) ⇒ Object



82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# File 'lib/blackboard.rb', line 82

def create_children children
  @items = {}
  children.each do |child| 
    self[child] = nil
    instance_eval %Q{
      def #{child}=(object)
        add :#{child}, object
      end

      def #{child}
        self[:#{child}] = get :#{child}
      end
    }
    @items[child] = Time.at 0 
  end
end

#get(obj_name) ⇒ Object

Raises:



109
110
111
112
113
114
# File 'lib/blackboard.rb', line 109

def get obj_name
  raise BlackBoardError, "Key #{obj_name} doesn't exist in folder #{@name}." unless @items.has_key?(obj_name)
  ret = @store["#{@name}.#{obj_name}"]
  return if ret.nil?
  ret.data
end