jsvd-blackboard 0.3.1 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +4 -0
- data/README.rdoc +12 -14
- data/blackboard.gemspec +1 -1
- data/lib/blackboard.rb +29 -30
- data/spec/blackboard_spec.rb +22 -22
- metadata +1 -1
data/ChangeLog
CHANGED
data/README.rdoc
CHANGED
@@ -2,12 +2,12 @@
|
|
2
2
|
== BlackBoard
|
3
3
|
|
4
4
|
* BlackBoard provides a folder-layer to moneta.
|
5
|
-
* BlackBoard aims for quickly writing and reading
|
5
|
+
* BlackBoard aims for quickly writing and reading data.
|
6
6
|
* To be attached to EventMachine, for example.
|
7
7
|
|
8
8
|
== Example
|
9
9
|
|
10
|
-
# Objects written to the blackboard must answer to :timestamp,
|
10
|
+
# Objects written to the blackboard must answer to :timestamp, since they'll expire.
|
11
11
|
|
12
12
|
class TestObject
|
13
13
|
attr_reader :timestamp
|
@@ -17,13 +17,14 @@
|
|
17
17
|
# A BlackBoard is created with a static structure of folders and items.
|
18
18
|
|
19
19
|
bb = BlackBoard.new :ttl => 2 do
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
20
|
+
folder1 :name1 do
|
21
|
+
folder1 :name1, :name2
|
22
|
+
folder2 :name2
|
23
|
+
folder3 :name2, :ttl => 3
|
24
|
+
end
|
25
|
+
end
|
25
26
|
|
26
|
-
# To write an item
|
27
|
+
# To write an item to a folder:
|
27
28
|
|
28
29
|
obj = TestObject.new
|
29
30
|
bb.folder1.folder1.name1 = obj
|
@@ -32,24 +33,21 @@
|
|
32
33
|
|
33
34
|
obj = bb.folder1.folder1.name1
|
34
35
|
|
35
|
-
# To
|
36
|
+
# To retrieve all items in a folder:
|
36
37
|
|
37
38
|
items = bb.folder1
|
38
39
|
obj = items[:folder1][:name1]
|
39
40
|
|
40
41
|
== Installation
|
41
42
|
|
42
|
-
=== Archive Installation
|
43
|
-
|
44
|
-
rake install
|
45
|
-
|
46
43
|
=== Gem Installation
|
47
44
|
|
48
|
-
gem install blackboard
|
45
|
+
gem install jsvd-blackboard -s http://gems.github.com
|
49
46
|
|
50
47
|
== Features/Problems
|
51
48
|
|
52
49
|
* Broken #empty?
|
50
|
+
* Unspecced Folder class since 0.4.0
|
53
51
|
|
54
52
|
== Synopsis
|
55
53
|
|
data/blackboard.gemspec
CHANGED
data/lib/blackboard.rb
CHANGED
@@ -14,6 +14,7 @@ class BlackBoard
|
|
14
14
|
raise ArgumentError, "BlackBoard.new should not receive ttl bigger than #seconds in 30 days" if @ttl > 2592000
|
15
15
|
@store = opts[:store] || Moneta::Memcache.new(:server => "127.0.0.1:11411")
|
16
16
|
instance_eval(&block) unless block.nil?
|
17
|
+
instance_eval "def method_missing folder; raise BlackBoardError, \"Folder \#{folder} not found\"; end"
|
17
18
|
end
|
18
19
|
|
19
20
|
def has_folders?
|
@@ -24,60 +25,58 @@ class BlackBoard
|
|
24
25
|
true
|
25
26
|
end
|
26
27
|
|
27
|
-
def folder name, keys, args = {}, &block
|
28
|
-
raise BlackBoardError, "Folder #{name} already exists" if @folders.has_key?(name)
|
29
|
-
ttl = args[:ttl]
|
30
|
-
ttl ||= @ttl
|
31
|
-
instance_eval %Q{def #{name}; @folders[:#{name}]._update; @folders[:#{name}]; end}
|
32
|
-
@folders[name] = Folder.new name, keys, :cache => @store, :ttl => ttl, &block
|
33
|
-
end
|
34
|
-
|
35
28
|
def clear
|
36
29
|
@store.clear
|
37
30
|
end
|
38
31
|
|
39
|
-
def method_missing
|
40
|
-
|
32
|
+
def method_missing name, *args, &block
|
33
|
+
|
34
|
+
raise BlackBoardError, "Folder #{name} already exists" if @folders.has_key?(name)
|
35
|
+
instance_eval %Q{def #{name}; @folders[:#{name}]._update; @folders[:#{name}]; end}
|
36
|
+
|
37
|
+
options = args[-1].is_a?(Hash) ? args.delete_at(-1) : {}
|
38
|
+
options[:ttl] ||= @ttl
|
39
|
+
options[:store] ||= @store
|
40
|
+
|
41
|
+
@folders[name] = Folder.new name, args, options, &block
|
42
|
+
|
41
43
|
end
|
42
44
|
|
43
45
|
class Folder < Hash
|
44
46
|
|
45
|
-
def initialize name,
|
47
|
+
def initialize name, items, options, &block
|
46
48
|
@name = name
|
47
49
|
|
48
50
|
@folders = []
|
49
|
-
@ttl =
|
50
|
-
@store =
|
51
|
+
@ttl = options[:ttl]
|
52
|
+
@store = options[:store]
|
51
53
|
|
52
|
-
raise ArgumentError, "Folder.new should receive name, keys, cache and ttl" if @ttl.nil? || args[:cache].nil?
|
53
54
|
raise ArgumentError, "Folder.new should not receive ttl bigger than #seconds in 30 days" if @ttl > 2592000
|
54
55
|
|
55
|
-
create_children
|
56
|
+
create_children items
|
56
57
|
|
57
58
|
instance_eval(&block) unless block.nil?
|
58
|
-
|
59
|
+
instance_eval "def method_missing folder; raise BlackBoardError, \"Folder \#{folder} not found\"; end"
|
59
60
|
end
|
60
61
|
|
61
|
-
def method_missing
|
62
|
-
|
62
|
+
def method_missing name, *args, &block
|
63
|
+
|
64
|
+
raise BlackBoardError, "Folder #{name} already exists" if @folders.include?(name)
|
65
|
+
instance_eval %Q{def #{name}; self[:#{name}]._update; self[:#{name}]; end}
|
66
|
+
|
67
|
+
options = args[-1].is_a?(Hash) ? args.delete_at(-1) : {}
|
68
|
+
options[:ttl] ||= @ttl
|
69
|
+
options[:store] ||= @store
|
70
|
+
|
71
|
+
self[name] = Folder.new "#{@name}.#{name}", args, options, &block
|
72
|
+
|
63
73
|
end
|
64
74
|
|
65
75
|
def _update
|
66
76
|
@items.keys.each do |k|
|
67
77
|
self[k] = get k
|
68
78
|
end
|
69
|
-
@folders.each {|f| self[f]._update }
|
70
|
-
end
|
71
|
-
|
72
|
-
private
|
73
|
-
def folder name, keys, args = {}, &block
|
74
|
-
raise BlackBoardError, "Folder #{name} already exists" if self.has_key?(name)
|
75
|
-
ttl = args[:ttl]
|
76
|
-
ttl ||= @ttl
|
77
|
-
@folders << name
|
78
|
-
self[name] = Folder.new "#{@name}.#{name}", keys, :cache => @store, :ttl => ttl, &block
|
79
|
-
instance_eval %Q{def #{name}; self[:#{name}]._update ;self[:#{name}]; end}
|
80
|
-
|
79
|
+
@folders.each {|f| ; self[f]._update }
|
81
80
|
end
|
82
81
|
|
83
82
|
def create_children children
|
data/spec/blackboard_spec.rb
CHANGED
@@ -81,7 +81,7 @@ describe BlackBoard do
|
|
81
81
|
before :all do
|
82
82
|
`memcached -d -p 11411 -P /tmp/memcached-test.pid`
|
83
83
|
@blackboard = BlackBoard.new :ttl => 2 do
|
84
|
-
|
84
|
+
folder1 :name1, :name2
|
85
85
|
end
|
86
86
|
end
|
87
87
|
|
@@ -104,7 +104,7 @@ describe BlackBoard do
|
|
104
104
|
|
105
105
|
it "should have folders after adding one" do
|
106
106
|
bb = BlackBoard.new do
|
107
|
-
|
107
|
+
folder1 :name1, :name2
|
108
108
|
end
|
109
109
|
bb.should have_folders
|
110
110
|
bb.folders.keys.should include(:folder1)
|
@@ -129,8 +129,8 @@ describe BlackBoard do
|
|
129
129
|
|
130
130
|
before :all do
|
131
131
|
@blackboard = BlackBoard.new :ttl => 2 do
|
132
|
-
|
133
|
-
|
132
|
+
folder1 :name1, :name2, :name3
|
133
|
+
folder2 :name4, :name5, :name6
|
134
134
|
end
|
135
135
|
@blackboard.folders.keys.should include(:folder1)
|
136
136
|
end
|
@@ -231,8 +231,8 @@ describe BlackBoard do
|
|
231
231
|
|
232
232
|
lambda {
|
233
233
|
@blackboard = BlackBoard.new :ttl => 2 do
|
234
|
-
|
235
|
-
|
234
|
+
folder1 :name1, :name2, :name3 do
|
235
|
+
folder2 :name4, :name5
|
236
236
|
end
|
237
237
|
end
|
238
238
|
}.should_not raise_error
|
@@ -244,8 +244,8 @@ describe BlackBoard do
|
|
244
244
|
it "should be possible to write to a subfolder" do
|
245
245
|
|
246
246
|
@blackboard = BlackBoard.new :ttl => 2 do
|
247
|
-
|
248
|
-
|
247
|
+
folder1 :name1, :name2, :name3 do
|
248
|
+
folder2 :name4, :name5
|
249
249
|
end
|
250
250
|
end
|
251
251
|
|
@@ -267,8 +267,8 @@ describe BlackBoard do
|
|
267
267
|
|
268
268
|
it "should allow different ttl for subfolders" do
|
269
269
|
@blackboard = BlackBoard.new :ttl => 2 do
|
270
|
-
|
271
|
-
|
270
|
+
folder1 :name1, :ttl => 1
|
271
|
+
folder2 :name2, :ttl => 2
|
272
272
|
end
|
273
273
|
obj = TestObject.new
|
274
274
|
obj.color = :green
|
@@ -286,8 +286,8 @@ describe BlackBoard do
|
|
286
286
|
|
287
287
|
it "should allow different ttl between folder and subfolder" do
|
288
288
|
@blackboard = BlackBoard.new :ttl => 2 do
|
289
|
-
|
290
|
-
|
289
|
+
folder1 :name1, :ttl => 1 do
|
290
|
+
folder2 :name2, :ttl => 2
|
291
291
|
end
|
292
292
|
end
|
293
293
|
obj = TestObject.new
|
@@ -307,8 +307,8 @@ describe BlackBoard do
|
|
307
307
|
|
308
308
|
it "should propagate tll to subfolders " do
|
309
309
|
@blackboard = BlackBoard.new :ttl => 2 do
|
310
|
-
|
311
|
-
|
310
|
+
folder1 :name1, :ttl => 1 do
|
311
|
+
folder2 :name2
|
312
312
|
end
|
313
313
|
end
|
314
314
|
obj = TestObject.new
|
@@ -328,8 +328,8 @@ describe BlackBoard do
|
|
328
328
|
|
329
329
|
it "should support writing to two elements with same name on different folders" do
|
330
330
|
@blackboard = BlackBoard.new :ttl => 10 do
|
331
|
-
|
332
|
-
|
331
|
+
folder1 :name1
|
332
|
+
folder2 :name1
|
333
333
|
end
|
334
334
|
obj = TestObject.new
|
335
335
|
obj.color = :green
|
@@ -344,12 +344,12 @@ describe BlackBoard do
|
|
344
344
|
|
345
345
|
it "should not complain when creating sub sub folders" do
|
346
346
|
lambda { @blackboard = BlackBoard.new :ttl => 10 do
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
347
|
+
folder1 :name1 do
|
348
|
+
folder1 :name1 do
|
349
|
+
folder1 :name1 do
|
350
|
+
folder1 :name1 do
|
351
|
+
folder1 :name1 do
|
352
|
+
folder1 :name1
|
353
353
|
end
|
354
354
|
end
|
355
355
|
end
|