jsvd-blackboard 0.2.6 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/ChangeLog +4 -0
- data/README.rdoc +21 -16
- data/blackboard.gemspec +2 -2
- data/lib/blackboard.rb +19 -18
- data/spec/blackboard_spec.rb +2 -6
- metadata +5 -4
data/ChangeLog
CHANGED
data/README.rdoc
CHANGED
@@ -1,36 +1,41 @@
|
|
1
1
|
|
2
2
|
== BlackBoard
|
3
3
|
|
4
|
-
* BlackBoard provides a folder-layer to
|
4
|
+
* BlackBoard provides a folder-layer to moneta.
|
5
5
|
* BlackBoard aims for quickly writing and reading of data.
|
6
6
|
* To be attached to EventMachine, for example.
|
7
7
|
|
8
8
|
== Example
|
9
9
|
|
10
10
|
# Objects written to the blackboard must answer to :timestamp, for they will expire.
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
end
|
11
|
+
|
12
|
+
class TestObject
|
13
|
+
attr_reader :timestamp
|
14
|
+
def initialize; @timestamp = Time.now; end
|
15
|
+
end
|
15
16
|
|
16
17
|
# A BlackBoard is created with a static structure of folders and items.
|
17
|
-
|
18
|
-
|
19
|
-
folder :folder1, [:name1
|
20
|
-
|
21
|
-
|
22
|
-
|
18
|
+
|
19
|
+
bb = BlackBoard.new :ttl => 2 do
|
20
|
+
folder :folder1, [:name1] do
|
21
|
+
folder :folder1, [:name1, :name2]
|
22
|
+
folder :folder2, [:name2]
|
23
|
+
folder :folder3, [:name2]
|
24
|
+
end
|
23
25
|
|
24
26
|
# To write an item from a folder:
|
25
|
-
|
26
|
-
|
27
|
+
|
28
|
+
obj = TestObject.new
|
29
|
+
bb.folder1.folder1.name1 = obj
|
27
30
|
|
28
31
|
# To retrieve an item from a folder
|
29
|
-
|
32
|
+
|
33
|
+
obj = bb.folder1.folder1.name1
|
30
34
|
|
31
35
|
# To retrive all items in a folder:
|
32
|
-
|
33
|
-
|
36
|
+
|
37
|
+
items = bb.folder1
|
38
|
+
obj = items[:folder1][:name1]
|
34
39
|
|
35
40
|
== Installation
|
36
41
|
|
data/blackboard.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
spec = Gem::Specification.new do |s|
|
2
2
|
s.name = "blackboard"
|
3
|
-
s.version = "0.
|
3
|
+
s.version = "0.3.0"
|
4
4
|
s.platform = Gem::Platform::RUBY
|
5
5
|
s.has_rdoc = true
|
6
6
|
s.summary = ""
|
@@ -11,7 +11,7 @@ spec = Gem::Specification.new do |s|
|
|
11
11
|
s.bindir = "bin"
|
12
12
|
s.require_path = "lib"
|
13
13
|
|
14
|
-
s.add_dependency('
|
14
|
+
s.add_dependency('moneta', '>=0.5.0')
|
15
15
|
s.required_ruby_version = '>= 1.8.5'
|
16
16
|
|
17
17
|
s.files = %w(
|
data/lib/blackboard.rb
CHANGED
@@ -1,11 +1,12 @@
|
|
1
1
|
# vim: expandtab : tabstop=2 : shiftwidth=2 : softtabstop=2
|
2
|
+
require 'moneta/memcache'
|
2
3
|
|
3
4
|
class BlackBoard
|
4
5
|
|
5
6
|
require 'rubygems'
|
6
7
|
require 'memcache'
|
7
8
|
|
8
|
-
@
|
9
|
+
@store = nil
|
9
10
|
|
10
11
|
attr_reader :folders
|
11
12
|
|
@@ -13,22 +14,16 @@ class BlackBoard
|
|
13
14
|
@folders = {}
|
14
15
|
@ttl = opts[:ttl] || 60
|
15
16
|
raise ArgumentError, "BlackBoard.new should not receive ttl bigger than #seconds in 30 days" if @ttl > 2592000
|
16
|
-
@
|
17
|
-
@servers ||= "127.0.0.1:11411"
|
18
|
-
@cache = MemCache.new(@servers, :namespace => 'blackboard')
|
17
|
+
@store = opts[:store] || Moneta::Memcache.new(:server => "127.0.0.1:11411")
|
19
18
|
instance_eval(&block) unless block.nil?
|
20
19
|
end
|
21
20
|
|
22
|
-
def active?
|
23
|
-
@cache.active?
|
24
|
-
end
|
25
|
-
|
26
21
|
def has_folders?
|
27
22
|
!@folders.empty?
|
28
23
|
end
|
29
24
|
|
30
25
|
def empty?
|
31
|
-
|
26
|
+
true
|
32
27
|
end
|
33
28
|
|
34
29
|
def folder name, keys, args = {}, &block
|
@@ -36,11 +31,11 @@ class BlackBoard
|
|
36
31
|
ttl = args[:ttl]
|
37
32
|
ttl ||= @ttl
|
38
33
|
instance_eval %Q{def #{name}; @folders[:#{name}]._update; @folders[:#{name}]; end}
|
39
|
-
@folders[name] = Folder.new name, keys, :cache => @
|
34
|
+
@folders[name] = Folder.new name, keys, :cache => @store, :ttl => ttl, &block
|
40
35
|
end
|
41
36
|
|
42
|
-
def
|
43
|
-
@
|
37
|
+
def clear
|
38
|
+
@store.clear
|
44
39
|
end
|
45
40
|
|
46
41
|
def method_missing folder
|
@@ -54,7 +49,7 @@ class BlackBoard
|
|
54
49
|
|
55
50
|
@folders = []
|
56
51
|
@ttl = args[:ttl]
|
57
|
-
@
|
52
|
+
@store = args[:cache]
|
58
53
|
|
59
54
|
raise ArgumentError, "Folder.new should receive name, keys, cache and ttl" if @ttl.nil? || args[:cache].nil?
|
60
55
|
raise ArgumentError, "Folder.new should not receive ttl bigger than #seconds in 30 days" if @ttl > 2592000
|
@@ -82,7 +77,7 @@ class BlackBoard
|
|
82
77
|
ttl = args[:ttl]
|
83
78
|
ttl ||= @ttl
|
84
79
|
@folders << name
|
85
|
-
self[name] = Folder.new "#{@name}.#{name}", keys, :cache => @
|
80
|
+
self[name] = Folder.new "#{@name}.#{name}", keys, :cache => @store, :ttl => ttl, &block
|
86
81
|
instance_eval %Q{def #{name}; self[:#{name}]._update ;self[:#{name}]; end}
|
87
82
|
|
88
83
|
end
|
@@ -92,8 +87,14 @@ class BlackBoard
|
|
92
87
|
children.each do |child|
|
93
88
|
self[child] = nil
|
94
89
|
instance_eval %Q{
|
95
|
-
|
96
|
-
|
90
|
+
def #{child}=(object)
|
91
|
+
add :#{child}, object
|
92
|
+
end
|
93
|
+
|
94
|
+
def #{child}
|
95
|
+
self[:#{child}] = get :#{child}
|
96
|
+
end
|
97
|
+
}
|
97
98
|
@items[child] = Time.at 0
|
98
99
|
end
|
99
100
|
end
|
@@ -105,12 +106,12 @@ class BlackBoard
|
|
105
106
|
|
106
107
|
@items[name] = object.timestamp
|
107
108
|
obj = Data.new(name, object)
|
108
|
-
@
|
109
|
+
@store.store "#{@name}.#{name}", obj, :expires_in => obj_ttl
|
109
110
|
end
|
110
111
|
|
111
112
|
def get obj_name
|
112
113
|
raise BlackBoardError, "Key #{obj_name} doesn't exist in folder #{@name}." unless @items.has_key?(obj_name)
|
113
|
-
ret = @
|
114
|
+
ret = @store["#{@name}.#{obj_name}"]
|
114
115
|
return if ret.nil?
|
115
116
|
ret.data
|
116
117
|
end
|
data/spec/blackboard_spec.rb
CHANGED
@@ -86,10 +86,6 @@ describe BlackBoard do
|
|
86
86
|
|
87
87
|
describe "(default)" do
|
88
88
|
|
89
|
-
it "should be active?" do
|
90
|
-
@blackboard.should be_active
|
91
|
-
end
|
92
|
-
|
93
89
|
it "should have folders" do
|
94
90
|
@blackboard.should have_folders
|
95
91
|
end
|
@@ -164,7 +160,7 @@ describe BlackBoard do
|
|
164
160
|
end
|
165
161
|
|
166
162
|
it "should be empty after cleaning" do
|
167
|
-
@blackboard.
|
163
|
+
@blackboard.clear
|
168
164
|
@blackboard.should be_empty
|
169
165
|
end
|
170
166
|
|
@@ -224,7 +220,7 @@ describe BlackBoard do
|
|
224
220
|
end
|
225
221
|
|
226
222
|
after :each do
|
227
|
-
@blackboard.
|
223
|
+
@blackboard.clear
|
228
224
|
end
|
229
225
|
end
|
230
226
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jsvd-blackboard
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- "Jo\xC3\xA3o Duarte"
|
@@ -9,17 +9,18 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-02-25 00:00:00 -08:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
|
-
name:
|
16
|
+
name: moneta
|
17
|
+
type: :runtime
|
17
18
|
version_requirement:
|
18
19
|
version_requirements: !ruby/object:Gem::Requirement
|
19
20
|
requirements:
|
20
21
|
- - ">="
|
21
22
|
- !ruby/object:Gem::Version
|
22
|
-
version:
|
23
|
+
version: 0.5.0
|
23
24
|
version:
|
24
25
|
description: ""
|
25
26
|
email: jsvduarte@gmail.com
|