hyperactive 0.1.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.
@@ -0,0 +1,158 @@
1
+
2
+ require File.join(File.dirname(__FILE__), 'test_helper')
3
+
4
+ class MyRecord < Hyperactive::Record
5
+ attr_accessor :bajs
6
+
7
+ def self.save_hook(instance, &block)
8
+ $BEFORE_SAVE += 1
9
+ yield
10
+ $AFTER_SAVE += 1
11
+ end
12
+ save_hooks << self.method(:save_hook)
13
+
14
+ def self.create_hook(instance, &block)
15
+ $BEFORE_CREATE += 1
16
+ yield
17
+ $AFTER_CREATE += 1
18
+ end
19
+ create_hooks << self.method(:create_hook)
20
+
21
+ def self.destroy_hook(instance, &block)
22
+ $BEFORE_DESTROY += 1
23
+ yield
24
+ $AFTER_DESTROY += 1
25
+ end
26
+ destroy_hooks << self.method(:destroy_hook)
27
+ end
28
+
29
+ class RecordTest < Test::Unit::TestCase
30
+
31
+ def setup
32
+ @c = TestChest.new(:persistence_provider => Archipelago::Hashish::BerkeleyHashishProvider.new(Pathname.new(__FILE__).parent.join("chest.db")))
33
+ @c.publish!
34
+ @c2 = TestChest.new(:persistence_provider => Archipelago::Hashish::BerkeleyHashishProvider.new(Pathname.new(__FILE__).parent.join("chest2.db")))
35
+ @c2.publish!
36
+ @tm = TestManager.new(:persistence_provider => Archipelago::Hashish::BerkeleyHashishProvider.new(Pathname.new(__FILE__).parent.join("tranny1.db")))
37
+ @tm.publish!
38
+ Hyperactive::CAPTAIN.setup(:chest_description => {:class => 'TestChest'},
39
+ :tranny_description => {:class => 'TestManager'})
40
+ Hyperactive::CAPTAIN.update_services!
41
+ assert_within(10) do
42
+ Hyperactive::CAPTAIN.chests.keys.sort == [@c.service_id, @c2.service_id].sort
43
+ end
44
+ assert_within(10) do
45
+ Hyperactive::CAPTAIN.trannies.keys == [@tm.service_id]
46
+ end
47
+ $BEFORE_SAVE = 0
48
+ $AFTER_SAVE = 0
49
+ $BEFORE_DESTROY = 0
50
+ $AFTER_DESTROY = 0
51
+ $BEFORE_CREATE = 0
52
+ $AFTER_CREATE = 0
53
+ end
54
+
55
+ def teardown
56
+ @c.stop!
57
+ @c.persistence_provider.unlink
58
+ @c2.stop!
59
+ @c2.persistence_provider.unlink
60
+ @tm.stop!
61
+ @tm.persistence_provider.unlink
62
+ Archipelago::Disco::MC.clear!
63
+ Hyperactive::CAPTAIN.update_services!
64
+ assert_within(10) do
65
+ Hyperactive::CAPTAIN.chests.empty?
66
+ end
67
+ assert_within(10) do
68
+ Hyperactive::CAPTAIN.trannies.empty?
69
+ end
70
+ end
71
+
72
+ def test_index_find
73
+ MyRecord.class_eval do
74
+ index_by :bajs
75
+ end
76
+ r1 = MyRecord.get_instance
77
+ r1.bajs = "brunt"
78
+ r2 = MyRecord.get_instance
79
+ r2.bajs = "brunt"
80
+ r3 = MyRecord.get_instance
81
+ r3.bajs = "gult"
82
+ r4 = MyRecord.get_instance
83
+ r4.bajs = "beige"
84
+
85
+ assert_equal(Set.new([r2.record_id,r1.record_id]), Set.new(MyRecord.find_by_bajs("brunt").collect(Proc.new do |k,v|
86
+ v.record_id
87
+ end)))
88
+ assert_equal([r3.record_id], MyRecord.find_by_bajs("gult").collect(Proc.new do |k,v|
89
+ v.record_id
90
+ end))
91
+
92
+ r1.destroy
93
+
94
+ assert_equal([r2.record_id], MyRecord.find_by_bajs("brunt").collect(Proc.new do |k,v|
95
+ v.record_id
96
+ end))
97
+
98
+ end
99
+
100
+ def test_select_reject
101
+ MyRecord.class_eval do
102
+ select(:brunt, Proc.new do |r|
103
+ r.bajs == "brunt"
104
+ end)
105
+ reject(:not_brunt, Proc.new do |r|
106
+ r.bajs == "brunt"
107
+ end)
108
+ end
109
+ r1 = MyRecord.get_instance
110
+ r1.bajs = "brunt"
111
+ r2 = MyRecord.get_instance
112
+ r2.bajs = "brunt"
113
+ r3 = MyRecord.get_instance
114
+ r3.bajs = "gult"
115
+ r4 = MyRecord.get_instance
116
+ r4.bajs = "beige"
117
+
118
+ assert_equal(Set.new([r2.record_id,r1.record_id]), Set.new(MyRecord.brunt.collect(Proc.new do |k,v|
119
+ v.record_id
120
+ end)))
121
+ assert_equal(Set.new([r3.record_id,r4.record_id]), Set.new(MyRecord.not_brunt.collect(Proc.new do |k,v|
122
+ v.record_id
123
+ end)))
124
+
125
+ r1.destroy
126
+ r2.destroy
127
+ r3.destroy
128
+ r4.destroy
129
+
130
+ assert_equal(Set.new, Set.new(MyRecord.brunt.collect(Proc.new do |k,v|
131
+ v.record_id
132
+ end)))
133
+ assert_equal(Set.new, Set.new(MyRecord.not_brunt.collect(Proc.new do |k,v|
134
+ v.record_id
135
+ end)))
136
+ end
137
+
138
+ def test_create_update_destroy
139
+ r = MyRecord.get_instance
140
+ assert(Archipelago::Treasure::Dubloon === r)
141
+ assert_equal(1, $BEFORE_SAVE)
142
+ assert_equal(1, $AFTER_SAVE)
143
+ assert_equal(1, $BEFORE_CREATE)
144
+ assert_equal(1, $AFTER_CREATE)
145
+ r.bajs = "brunt"
146
+ assert_equal(2, $BEFORE_SAVE)
147
+ assert_equal(2, $AFTER_SAVE)
148
+ assert_equal("brunt", r.bajs)
149
+ assert_equal("brunt", Hyperactive::CAPTAIN[r.record_id].bajs)
150
+ i = r.record_id
151
+ assert_equal(r, Hyperactive::CAPTAIN[i])
152
+ r.destroy
153
+ assert_equal(1, $BEFORE_DESTROY)
154
+ assert_equal(1, $AFTER_DESTROY)
155
+ assert_equal(nil, Hyperactive::CAPTAIN[i])
156
+ end
157
+
158
+ end
@@ -0,0 +1,66 @@
1
+
2
+ home = File.expand_path(File.dirname(__FILE__))
3
+ $: << File.join(home, "..", "lib")
4
+
5
+ require 'hyperactive'
6
+ require 'pp'
7
+ require 'test/unit'
8
+ require 'benchmark'
9
+ require 'drb'
10
+ require 'archipelago'
11
+ require 'socket'
12
+ require 'ipaddr'
13
+ require 'thread'
14
+
15
+ DRb.start_service
16
+
17
+ class TestTransaction
18
+ def join(o)
19
+ end
20
+ def state
21
+ :active
22
+ end
23
+ end
24
+
25
+ class TestManager < Archipelago::Tranny::Manager
26
+ attr_reader :persistence_provider
27
+ def log_error(e)
28
+ puts e
29
+ pp e.backtrace
30
+ end
31
+ end
32
+
33
+ class TestJockey < Archipelago::Disco::Jockey
34
+ attr_reader :remote_services, :local_services
35
+ end
36
+
37
+ class TestChest < Archipelago::Treasure::Chest
38
+ attr_reader :persistence_provider
39
+ end
40
+
41
+ def bm(label = "", options = {})
42
+ n = options[:n] || 1000
43
+ width = options[:width] || 50
44
+ Benchmark.benchmark(" " * width + Benchmark::Tms::CAPTION, width, Benchmark::Tms::FMTSTR, "ms/call") do |b|
45
+ times = b.report("#{n}x#{label}") do
46
+ n.times do
47
+ yield
48
+ end
49
+ end
50
+ [times * 1000 / n.to_f]
51
+ end
52
+ end
53
+
54
+ class Test::Unit::TestCase
55
+
56
+ def assert_within(timeout, &block)
57
+ t = Time.new
58
+ rval = yield
59
+ while !rval && t > Time.new - timeout
60
+ rval = yield
61
+ sleep(0.05)
62
+ end
63
+ assert(rval)
64
+ end
65
+
66
+ end
@@ -0,0 +1,66 @@
1
+
2
+ require File.join(File.dirname(__FILE__), 'test_helper')
3
+
4
+ class TreeBenchmark < Test::Unit::TestCase
5
+
6
+ def setup
7
+ @c = TestChest.new(:persistence_provider => Archipelago::Hashish::BerkeleyHashishProvider.new(Pathname.new(__FILE__).parent.join("chest.db")))
8
+ @c.publish!
9
+ @c2 = TestChest.new(:persistence_provider => Archipelago::Hashish::BerkeleyHashishProvider.new(Pathname.new(__FILE__).parent.join("chest2.db")))
10
+ @c2.publish!
11
+ @tm = TestManager.new(:persistence_provider => Archipelago::Hashish::BerkeleyHashishProvider.new(Pathname.new(__FILE__).parent.join("tranny1.db")))
12
+ @tm.publish!
13
+ Hyperactive::CAPTAIN.setup(:chest_description => {:class => 'TestChest'},
14
+ :tranny_description => {:class => 'TestManager'})
15
+ assert_within(20) do
16
+ Set.new(Hyperactive::CAPTAIN.chests.keys) == Set.new([@c.service_id, @c2.service_id])
17
+ end
18
+ assert_within(20) do
19
+ Hyperactive::CAPTAIN.trannies.keys == [@tm.service_id]
20
+ end
21
+ end
22
+
23
+ def teardown
24
+ @c.stop!
25
+ @c.persistence_provider.unlink
26
+ @c2.stop!
27
+ @c2.persistence_provider.unlink
28
+ @tm.stop!
29
+ @tm.persistence_provider.unlink
30
+ end
31
+
32
+ def test_set_get
33
+ h = Hyperactive::Tree.get_instance
34
+ r = Hyperactive::Record.get_instance
35
+ hash_test("Tree", h, r, 100)
36
+ end
37
+
38
+ def test_regular_hash_set_get
39
+ Hyperactive::CAPTAIN["h"] = {}
40
+ h = Hyperactive::CAPTAIN["h"]
41
+ r = Hyperactive::Record.get_instance
42
+ hash_test("Hash", h, r, 100)
43
+ end
44
+
45
+ private
46
+
47
+ def hash_test(label, h, r, c)
48
+ bm("#{label}#set/get/delete", :n => c * 1) do
49
+ f = rand(1 << 32)
50
+ h[f] = r
51
+ x = h[f]
52
+ h.delete(f)
53
+ end
54
+ bm("#{label}#set", :n => c * 10) do
55
+ f = rand(1 << 32)
56
+ h[f] = r
57
+ end
58
+ bm("#{label}#set/get/delete (big)", :n => c * 1) do
59
+ f = rand(1 << 32)
60
+ h[f] = r
61
+ x = h[f]
62
+ h.delete(f)
63
+ end
64
+ end
65
+
66
+ end
@@ -0,0 +1,75 @@
1
+
2
+ require File.join(File.dirname(__FILE__), 'test_helper')
3
+
4
+ class RecordMatcher
5
+ def initialize(i)
6
+ @i = i
7
+ end
8
+ def call(k,v)
9
+ k == @i
10
+ end
11
+ end
12
+
13
+ class TreeTest < Test::Unit::TestCase
14
+
15
+ def setup
16
+ @c = TestChest.new(:persistence_provider => Archipelago::Hashish::BerkeleyHashishProvider.new(Pathname.new(__FILE__).parent.join("chest.db")))
17
+ @c.publish!
18
+ @c2 = TestChest.new(:persistence_provider => Archipelago::Hashish::BerkeleyHashishProvider.new(Pathname.new(__FILE__).parent.join("chest2.db")))
19
+ @c2.publish!
20
+ @tm = TestManager.new(:persistence_provider => Archipelago::Hashish::BerkeleyHashishProvider.new(Pathname.new(__FILE__).parent.join("tranny1.db")))
21
+ @tm.publish!
22
+ Hyperactive::CAPTAIN.setup(:chest_description => {:class => 'TestChest'},
23
+ :tranny_description => {:class => 'TestManager'})
24
+ Hyperactive::CAPTAIN.update_services!
25
+ assert_within(10) do
26
+ Hyperactive::CAPTAIN.chests.keys.sort == [@c.service_id, @c2.service_id].sort
27
+ end
28
+ assert_within(10) do
29
+ Hyperactive::CAPTAIN.trannies.keys == [@tm.service_id]
30
+ end
31
+ end
32
+
33
+ def teardown
34
+ @c.stop!
35
+ @c.persistence_provider.unlink
36
+ @c2.stop!
37
+ @c2.persistence_provider.unlink
38
+ @tm.stop!
39
+ @tm.persistence_provider.unlink
40
+ Archipelago::Disco::MC.clear!
41
+ Hyperactive::CAPTAIN.update_services!
42
+ assert_within(10) do
43
+ Hyperactive::CAPTAIN.chests.empty?
44
+ end
45
+ assert_within(10) do
46
+ Hyperactive::CAPTAIN.trannies.empty?
47
+ end
48
+ end
49
+
50
+ def test_select_reject
51
+ h = Hyperactive::Tree.get_instance
52
+ r1 = Hyperactive::Record.get_instance
53
+ r2 = Hyperactive::Record.get_instance
54
+ h[r1.record_id] = r1
55
+ h[r2.record_id] = r2
56
+ assert_equal(r1.record_id, h.select(RecordMatcher.new(r1.record_id)).first.first)
57
+ assert_equal(r1.record_id, h.reject(RecordMatcher.new(r2.record_id)).keys.first)
58
+ end
59
+
60
+ def test_set_get
61
+ h = Hyperactive::Tree.get_instance
62
+ h2 = {}
63
+ 10.times do
64
+ r = Hyperactive::Record.get_instance
65
+ h[r.record_id] = r
66
+ h2[r.record_id] = r
67
+ end
68
+
69
+ h2.each do |k,v|
70
+ assert_equal(v, h[k])
71
+ assert_equal(v, Hyperactive::CAPTAIN[h.record_id][k])
72
+ end
73
+ end
74
+
75
+ end
metadata ADDED
@@ -0,0 +1,65 @@
1
+ --- !ruby/object:Gem::Specification
2
+ rubygems_version: 0.8.11
3
+ specification_version: 1
4
+ name: hyperactive
5
+ version: !ruby/object:Gem::Version
6
+ version: 0.1.0
7
+ date: 2006-11-27 00:00:00 +01:00
8
+ summary: A base class for persistent objects that uses archipelago for persistence. Useful for Ruby on Rails models for example.
9
+ require_paths:
10
+ - lib
11
+ email: zond at troja dot ath dot cx
12
+ homepage:
13
+ rubyforge_project:
14
+ description:
15
+ autorequire: hyperactive
16
+ default_executable:
17
+ bindir: bin
18
+ has_rdoc: true
19
+ required_ruby_version: !ruby/object:Gem::Version::Requirement
20
+ requirements:
21
+ - - ">"
22
+ - !ruby/object:Gem::Version
23
+ version: 0.0.0
24
+ version:
25
+ platform: ruby
26
+ signing_key:
27
+ cert_chain:
28
+ authors:
29
+ - Martin Kihlgren
30
+ files:
31
+ - lib/hyperactive.rb
32
+ - lib/hyperactive/hooker.rb
33
+ - lib/hyperactive/record.rb
34
+ - lib/hyperactive/tree.rb
35
+ - tests/record_test.rb
36
+ - tests/test_helper.rb
37
+ - tests/tree_benchmark.rb
38
+ - tests/tree_test.rb
39
+ - GPL-2
40
+ - README
41
+ test_files:
42
+ - tests/record_test.rb
43
+ - tests/tree_test.rb
44
+ - tests/test_helper.rb
45
+ rdoc_options:
46
+ - --line-numbers
47
+ - --inline-source
48
+ extra_rdoc_files:
49
+ - README
50
+ executables: []
51
+
52
+ extensions: []
53
+
54
+ requirements: []
55
+
56
+ dependencies:
57
+ - !ruby/object:Gem::Dependency
58
+ name: archipelago
59
+ version_requirement:
60
+ version_requirements: !ruby/object:Gem::Version::Requirement
61
+ requirements:
62
+ - - ">="
63
+ - !ruby/object:Gem::Version
64
+ version: 0.2.0
65
+ version: