jsvd-blackboard 0.3.1 → 0.4.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 +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
|