hyperactive 0.2.5 → 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/README CHANGED
@@ -2,6 +2,9 @@
2
2
 
3
3
  It uses archipelago for persistence, and is meaningful only in an environment where the server process doesnt restart at each request. This means that cgi environment is not really an option.
4
4
 
5
+ == Dependencies:
6
+ archipelago
7
+
5
8
  == Sub packages:
6
9
 
7
10
  Hyperactive::Record:: The base class package itself, providing you with cached selectors and rejectors, along with cached finders for any number of attributes.
data/TODO CHANGED
@@ -1,4 +1,4 @@
1
1
 
2
2
  * Create a validation framework for Hyperactive::Record::Bass
3
3
 
4
- * Create a sorted data structure, for example AA trees: http://www.eternallyconfuzzled.com/tuts/andersson.html
4
+ * Create a sorted data structure, for example AA trees: http://www.eternallyconfuzzled.com/tuts/datastructures/jsw_tut_andersson.aspx
data/lib/hyperactive.rb CHANGED
@@ -15,12 +15,7 @@
15
15
  # along with this program; if not, write to the Free Software
16
16
  # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
17
 
18
+ require 'rubygems'
19
+ require 'fastthread'
18
20
  $: << File.dirname(__FILE__)
19
21
 
20
- require 'hyperactive/hooker'
21
- require 'hyperactive/index'
22
- require 'hyperactive/transactions'
23
- require 'hyperactive/cleaner'
24
- require 'hyperactive/record'
25
- require 'hyperactive/hash'
26
- require 'hyperactive/list'
@@ -17,14 +17,16 @@
17
17
 
18
18
 
19
19
  require 'rubygems'
20
- require 'archipelago'
20
+ require 'archipelago/pirate'
21
+ require 'hyperactive/list'
22
+ require 'hyperactive/cleaner'
21
23
  require 'digest/sha1'
22
24
 
23
25
  module Hyperactive
24
26
 
25
27
  #
26
- # The package containing the Hash class that provides any
27
- # kind of index for your Hyperactive classes.
28
+ # The package containing the Hash class that provides unsorted
29
+ # indices for your Hyperactive classes.
28
30
  #
29
31
  # Is supposed to be constantly scaling, but preliminary benchmarks show some
30
32
  # problems with that assumption?
@@ -108,7 +110,7 @@ module Hyperactive
108
110
  # Insert +value+ under +key+ in this Hash.
109
111
  #
110
112
  def []=(key, value)
111
- self.list = Hyperactive::List::Head.get_instance_with_transaction(@transaction) unless self.list
113
+ self.list ||= Hyperactive::List::Head.get_instance_with_transaction(@transaction)
112
114
 
113
115
  if (element = Archipelago::Pirate::BLACKBEARD[my_key_for(key), @transaction])
114
116
  element.value = value
@@ -124,7 +126,7 @@ module Hyperactive
124
126
  # Delete +key+ from this Hash.
125
127
  #
126
128
  def delete(key)
127
- self.list = Hyperactive::List::Head.get_instance_with_transaction(@transaction) unless self.list
129
+ self.list ||= Hyperactive::List::Head.get_instance_with_transaction(@transaction)
128
130
 
129
131
  return_value = nil
130
132
 
@@ -175,7 +177,7 @@ module Hyperactive
175
177
  # Get my private key for a given +key+.
176
178
  #
177
179
  def my_key_for(key)
178
- Digest::SHA1.hexdigest("#{Marshal.dump(key)}#{self.record_id}")
180
+ Digest::SHA1.hexdigest("Hyperactive::Hash::Head:#{self.record_id}:#{Marshal.dump(key)}")
179
181
  end
180
182
 
181
183
  end
@@ -15,6 +15,10 @@
15
15
  # along with this program; if not, write to the Free Software
16
16
  # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
17
 
18
+ require 'hyperactive/hash'
19
+ require 'hyperactive/tree'
20
+ require 'hyperactive/hooker'
21
+
18
22
  module Hyperactive
19
23
 
20
24
  #
@@ -139,7 +143,7 @@ module Hyperactive
139
143
  super
140
144
  base.class_eval do
141
145
  #
142
- # We depend on lots of hooks.
146
+ # We depend on hooks.
143
147
  #
144
148
  include(Hyperactive::Hooker::Pimp)
145
149
  end
@@ -15,9 +15,8 @@
15
15
  # along with this program; if not, write to the Free Software
16
16
  # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
17
 
18
-
19
- require 'rubygems'
20
- require 'archipelago'
18
+ require 'hyperactive/record'
19
+ require 'archipelago/current'
21
20
 
22
21
  module Hyperactive
23
22
 
@@ -102,6 +101,7 @@ module Hyperactive
102
101
  end
103
102
  self.size -= 1
104
103
  element.destroy!
104
+ return nil
105
105
  end
106
106
 
107
107
  #
@@ -15,9 +15,17 @@
15
15
  # along with this program; if not, write to the Free Software
16
16
  # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
17
 
18
+ module Hyperactive
19
+ module Record
20
+ class Bass
21
+ end
22
+ end
23
+ end
18
24
 
19
25
  require 'rubygems'
20
- require 'archipelago'
26
+ require 'archipelago/pirate'
27
+ require 'hyperactive/index'
28
+ require 'hyperactive/transactions'
21
29
 
22
30
  #
23
31
  # A utility module to provide the functionality required for example
@@ -57,6 +65,10 @@ module Hyperactive
57
65
  # The transaction we are currently in.
58
66
  #
59
67
  attr_reader :transaction
68
+ #
69
+ # We depend on hooks.
70
+ #
71
+ include(Hyperactive::Hooker::Pimp)
60
72
  end
61
73
 
62
74
  base.extend(ClassMethods)
@@ -78,11 +90,12 @@ module Hyperactive
78
90
  # See Hyperactive::List::Head and Hyperactive::Hash::Head for examples of this behaviour.
79
91
  #
80
92
  def with_transaction(transaction, &block)
93
+ old_transaction = @transaction if defined?(@transaction)
81
94
  @transaction = transaction
82
95
  begin
83
96
  return yield
84
97
  ensure
85
- @transaction = nil
98
+ @transaction = old_transaction
86
99
  end
87
100
  end
88
101
 
@@ -125,6 +138,7 @@ module Hyperactive
125
138
  Archipelago::Pirate::BLACKBEARD.delete(@record_id, @transaction)
126
139
  self.freeze
127
140
  end
141
+ return nil
128
142
  end
129
143
 
130
144
  module ClassMethods
@@ -167,9 +181,19 @@ module Hyperactive
167
181
  # which is not what you usually want. Every other time you fetch it using a select or other
168
182
  # method you will instead receive a proxy object to the database. This means that nothing you
169
183
  # do to it at that point will be persistent or even necessarily have a defined result.
170
- # Therefore: do not use the instantiated object, instead call <b>my_instance.save</b>
184
+ # Therefore: do not use the instantiated object, instead call <b>my_instance.create</b> or <b>MyClass.get_instance</b>
171
185
  # to get a proxy to the object stored into the database.
172
186
  #
187
+ # NB: When a subclass is created with <b>get_instance</b>, <b>initialize</b> is called
188
+ # and then <b>create</b> is called and its return value returned.
189
+ # If you instead use <b>get_instance_with_transaction</b>, <b>initialize</b> will be called (like before)
190
+ # and then <b>create</b> with the given transaction. This means that you can not use transactions in
191
+ # <b>initialize</b> and at the same time make <b>get_instance_with_transaction</b> work, since
192
+ # the <b>initialize</b> method wont know about the transaction sent to <b>get_instance_with_transaction</b>.
193
+ # Of course, this can be avoided using varying degrees of ugly hack, but a simpler way is to try and
194
+ # make initialize <i>not</i> do transaction-dependant stuff, like create new Hyperactive::Record::Bass
195
+ # instances, but instead do that in (for example) <i>create_hooks</i> (See Hyperactive::Hooker::Pimp).
196
+ #
173
197
  class Bass
174
198
 
175
199
  include Hyperactive::Record::Persistent
@@ -0,0 +1,115 @@
1
+ # Archipelago - a distributed computing toolkit for ruby
2
+ # Copyright (C) 2006 Martin Kihlgren <zond at troja dot ath dot cx>
3
+ #
4
+ # This program is free software; you can redistribute it and/or
5
+ # modify it under the terms of the GNU General Public License
6
+ # as published by the Free Software Foundation; either version 2
7
+ # of the License, or (at your option) any later version.
8
+ #
9
+ # This program is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ # GNU General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU General Public License
15
+ # along with this program; if not, write to the Free Software
16
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
+
18
+
19
+ require 'rubygems'
20
+ require 'archipelago/pirate'
21
+ require 'hyperactive/record'
22
+ require 'digest/sha1'
23
+
24
+ module Hyperactive
25
+
26
+ #
27
+ # The package containing the Tree class that provides sorted
28
+ # indices for your Hyperactive classes.
29
+ #
30
+ # Is supposed to be logarithmically scaling.
31
+ #
32
+ module Tree
33
+
34
+ class Node < Hyperactive::Record::Bass
35
+
36
+ @@nil_node = nil
37
+ @@nil_node_record_id = nil
38
+
39
+ include Hyperactive::Cleaner::Accessors
40
+
41
+ attr_accessor :right, :left, :level, :value, :key
42
+
43
+ def initialize(options = {})
44
+ super()
45
+ self.right = options[:right] || self.class.nil_node
46
+ self.right = self if self.right == :self
47
+ self.left = options[:left] || self.class.nil_node
48
+ self.left = self if self.left == :self
49
+ self.level = options[:level] || 1
50
+ self.value = options[:value]
51
+ self.key = options[:key]
52
+ end
53
+
54
+ def insert(key, value)
55
+ if self.nil_node?
56
+ return Node.get_instance_with_transaction(transaction, :key => key, :value => value)
57
+ else
58
+ side = :left
59
+ side = :right if self.key < key
60
+ self.send("#{side}=", self.send(side).insert(key, value))
61
+ rval = self.skew
62
+ rval = rval.split
63
+ return rval
64
+ end
65
+ end
66
+
67
+ def skew
68
+ end
69
+
70
+ def split
71
+ end
72
+
73
+ def nil_node?
74
+ self.record_id == self.class.nil_node_record_id
75
+ end
76
+
77
+ def self.nil_node_record_id
78
+ @@nil_node_record_id ||= self.nil_node.record_id
79
+ end
80
+
81
+ def self.nil_node
82
+ nil_node_key = Digest::SHA1.hexdigest("Hyperactive::Tree::Node::nil_node")
83
+ @@nil_node ||= if (existing_element = Archipelago::Pirate::BLACKBEARD[nil_node_key])
84
+ existing_element
85
+ else
86
+ rval = Node.get_instance(:left => :self,
87
+ :right => :self,
88
+ :level => 0)
89
+ Archipelago::Pirate::BLACKBEARD[nil_node_key] = rval
90
+ rval
91
+ end
92
+ end
93
+
94
+ end
95
+
96
+ class Root < Hyperactive::Record::Bass
97
+
98
+ include Hyperactive::Cleaner::Accessors
99
+
100
+ attr_accessor :root
101
+
102
+ def initialize
103
+ super
104
+ self.root = Node.nil_node
105
+ end
106
+
107
+ def []=(key, value)
108
+ self.root = root.insert(key, value)
109
+ end
110
+
111
+ end
112
+
113
+ end
114
+
115
+ end
@@ -3,32 +3,6 @@ require File.join(File.dirname(__FILE__), 'test_helper')
3
3
 
4
4
  class HashBenchmark < Test::Unit::TestCase
5
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
- Archipelago::Pirate::BLACKBEARD.setup(:chest_description => {:class => 'TestChest'},
14
- :tranny_description => {:class => 'TestManager'})
15
- assert_within(20) do
16
- Set.new(Archipelago::Pirate::BLACKBEARD.chests.keys) == Set.new([@c.service_id, @c2.service_id])
17
- end
18
- assert_within(20) do
19
- Archipelago::Pirate::BLACKBEARD.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
6
  def test_set_get
33
7
  h = Hyperactive::Hash::Head.get_instance
34
8
  r = Hyperactive::Record::Bass.get_instance
data/tests/hash_test.rb CHANGED
@@ -11,33 +11,6 @@ class RecordMatcher
11
11
  end
12
12
 
13
13
  class HashTest < 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
- Archipelago::Pirate::BLACKBEARD.setup(:chest_description => {:class => 'TestChest'},
23
- :tranny_description => {:class => 'TestManager'})
24
- Archipelago::Pirate::BLACKBEARD.update_services!
25
- assert_within(10) do
26
- Archipelago::Pirate::BLACKBEARD.chests.keys.sort == [@c.service_id, @c2.service_id].sort
27
- end
28
- assert_within(10) do
29
- Archipelago::Pirate::BLACKBEARD.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
- end
41
14
 
42
15
  def test_select_reject
43
16
  h = Hyperactive::Hash::Head.get_instance
@@ -3,32 +3,6 @@ require File.join(File.dirname(__FILE__), 'test_helper')
3
3
 
4
4
  class ListBenchmark < Test::Unit::TestCase
5
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
- Archipelago::Pirate::BLACKBEARD.setup(:chest_description => {:class => 'TestChest'},
14
- :tranny_description => {:class => 'TestManager'})
15
- assert_within(20) do
16
- Set.new(Archipelago::Pirate::BLACKBEARD.chests.keys) == Set.new([@c.service_id, @c2.service_id])
17
- end
18
- assert_within(20) do
19
- Archipelago::Pirate::BLACKBEARD.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
6
  def test_set_get
33
7
  l = Hyperactive::List::Head.get_instance
34
8
  r = Hyperactive::Record::Bass.get_instance
data/tests/list_test.rb CHANGED
@@ -11,33 +11,6 @@ end
11
11
 
12
12
  class ListTest < Test::Unit::TestCase
13
13
 
14
- def setup
15
- @c = TestChest.new(:persistence_provider => Archipelago::Hashish::BerkeleyHashishProvider.new(Pathname.new(__FILE__).parent.join("chest.db")))
16
- @c.publish!
17
- @c2 = TestChest.new(:persistence_provider => Archipelago::Hashish::BerkeleyHashishProvider.new(Pathname.new(__FILE__).parent.join("chest2.db")))
18
- @c2.publish!
19
- @tm = TestManager.new(:persistence_provider => Archipelago::Hashish::BerkeleyHashishProvider.new(Pathname.new(__FILE__).parent.join("tranny1.db")))
20
- @tm.publish!
21
- Archipelago::Pirate::BLACKBEARD.setup(:chest_description => {:class => 'TestChest'},
22
- :tranny_description => {:class => 'TestManager'})
23
- Archipelago::Pirate::BLACKBEARD.update_services!
24
- assert_within(10) do
25
- Archipelago::Pirate::BLACKBEARD.chests.keys.sort == [@c.service_id, @c2.service_id].sort
26
- end
27
- assert_within(10) do
28
- Archipelago::Pirate::BLACKBEARD.trannies.keys == [@tm.service_id]
29
- end
30
- end
31
-
32
- def teardown
33
- @c.stop!
34
- @c.persistence_provider.unlink!
35
- @c2.stop!
36
- @c2.persistence_provider.unlink!
37
- @tm.stop!
38
- @tm.persistence_provider.unlink!
39
- end
40
-
41
14
  def test_clear
42
15
  l = Hyperactive::List::Head.get_instance
43
16
  l << (r = Hyperactive::Record::Bass.get_instance)
data/tests/record_test.rb CHANGED
@@ -31,21 +31,7 @@ end
31
31
  class RecordTest < Test::Unit::TestCase
32
32
 
33
33
  def setup
34
- @c = TestChest.new(:persistence_provider => Archipelago::Hashish::BerkeleyHashishProvider.new(Pathname.new(__FILE__).parent.join("chest.db")))
35
- @c.publish!
36
- @c2 = TestChest.new(:persistence_provider => Archipelago::Hashish::BerkeleyHashishProvider.new(Pathname.new(__FILE__).parent.join("chest2.db")))
37
- @c2.publish!
38
- @tm = TestManager.new(:persistence_provider => Archipelago::Hashish::BerkeleyHashishProvider.new(Pathname.new(__FILE__).parent.join("tranny1.db")))
39
- @tm.publish!
40
- Archipelago::Pirate::BLACKBEARD.setup(:chest_description => {:class => 'TestChest'},
41
- :tranny_description => {:class => 'TestManager'})
42
- Archipelago::Pirate::BLACKBEARD.update_services!
43
- assert_within(10) do
44
- Archipelago::Pirate::BLACKBEARD.chests.keys.sort == [@c.service_id, @c2.service_id].sort
45
- end
46
- assert_within(10) do
47
- Archipelago::Pirate::BLACKBEARD.trannies.keys == [@tm.service_id]
48
- end
34
+ super
49
35
  $BEFORE_SAVE = 0
50
36
  $AFTER_SAVE = 0
51
37
  $BEFORE_DESTROY = 0
@@ -54,15 +40,6 @@ class RecordTest < Test::Unit::TestCase
54
40
  $AFTER_CREATE = 0
55
41
  end
56
42
 
57
- def teardown
58
- @c.stop!
59
- @c.persistence_provider.unlink!
60
- @c2.stop!
61
- @c2.persistence_provider.unlink!
62
- @tm.stop!
63
- @tm.persistence_provider.unlink!
64
- end
65
-
66
43
  def test_index_find
67
44
  MyRecord.class_eval do
68
45
  index_by :bajs
@@ -75,7 +52,6 @@ class RecordTest < Test::Unit::TestCase
75
52
  r3.bajs = "gult"
76
53
  r4 = MyRecord.get_instance
77
54
  r4.bajs = "beige"
78
-
79
55
  assert_equal(Set.new([r2.record_id,r1.record_id]), Set.new(MyRecord.find_by_bajs("brunt").t_collect(Proc.new do |k,v|
80
56
  v.record_id
81
57
  end)))
data/tests/test_helper.rb CHANGED
@@ -1,8 +1,15 @@
1
1
 
2
+ BLACKBEARD_OPTIONS = {
3
+ :chest_description => {:class => 'TestChest'},
4
+ :tranny_description => {:class => 'TestManager'},
5
+ :initial_lookup_timeout => 0
6
+ }
7
+
2
8
  home = File.expand_path(File.dirname(__FILE__))
3
9
  $: << File.join(home, "..", "lib")
4
10
 
5
11
  require 'hyperactive'
12
+ require 'hyperactive/record'
6
13
  require 'pp'
7
14
  require 'test/unit'
8
15
  require 'benchmark'
@@ -30,6 +37,8 @@ class TestManager < Archipelago::Tranny::Manager
30
37
  end
31
38
  end
32
39
 
40
+ Archipelago::Treasure::Dubloon.debug_callable = (Proc.new do |m| puts m end)
41
+
33
42
  class TestJockey < Archipelago::Disco::Jockey
34
43
  attr_reader :remote_services, :local_services
35
44
  end
@@ -63,4 +72,32 @@ class Test::Unit::TestCase
63
72
  assert(rval)
64
73
  end
65
74
 
75
+ def setup
76
+ Archipelago::Pirate::BLACKBEARD.setup(:chest_description => {:class => 'TestChest'},
77
+ :tranny_description => {:class => 'TestManager'})
78
+ @c = TestChest.new(:persistence_directory => Pathname.new(__FILE__).parent.join("chest.db"))
79
+ @c.publish!
80
+ @c2 = TestChest.new(:persistence_directory => Pathname.new(__FILE__).parent.join("chest2.db"))
81
+ @c2.publish!
82
+ @tm = TestManager.new(:persistence_directory => Pathname.new(__FILE__).parent.join("tranny1.db"))
83
+ @tm.publish!
84
+ assert_within(10) do
85
+ Archipelago::Pirate::BLACKBEARD.update_services!
86
+ Archipelago::Pirate::BLACKBEARD.chests.keys.sort == [@c.service_id, @c2.service_id].sort
87
+ end
88
+ assert_within(10) do
89
+ Archipelago::Pirate::BLACKBEARD.update_services!
90
+ Archipelago::Pirate::BLACKBEARD.trannies.keys == [@tm.service_id]
91
+ end
92
+ end
93
+
94
+ def teardown
95
+ @c.close!
96
+ @c.persistence_provider.unlink!
97
+ @c2.close!
98
+ @c2.persistence_provider.unlink!
99
+ @tm.close!
100
+ @tm.persistence_provider.unlink!
101
+ end
102
+
66
103
  end
@@ -0,0 +1,15 @@
1
+
2
+ require File.join(File.dirname(__FILE__), 'test_helper')
3
+
4
+ class TreeTest < Test::Unit::TestCase
5
+
6
+ def test_insert
7
+ t = Hyperactive::Tree::Root.get_instance
8
+ assert(t.root.nil_node?)
9
+ t["epa"] = "apa"
10
+ assert_equal("apa", t.root.value)
11
+ assert(t.root.left.nil_node?)
12
+ assert(t.root.right.nil_node?)
13
+ end
14
+
15
+ end
metadata CHANGED
@@ -1,10 +1,10 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.8.11
2
+ rubygems_version: 0.9.0
3
3
  specification_version: 1
4
4
  name: hyperactive
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.2.5
7
- date: 2006-12-20 00:00:00 +01:00
6
+ version: 0.3.0
7
+ date: 2007-06-07 00:00:00 +02:00
8
8
  summary: A base class for persistent objects that uses archipelago for persistence. Useful for Ruby on Rails models for example.
9
9
  require_paths:
10
10
  - lib
@@ -25,30 +25,34 @@ required_ruby_version: !ruby/object:Gem::Version::Requirement
25
25
  platform: ruby
26
26
  signing_key:
27
27
  cert_chain:
28
+ post_install_message:
28
29
  authors:
29
30
  - Martin Kihlgren
30
31
  files:
31
32
  - lib/hyperactive.rb
32
- - lib/hyperactive/cleaner.rb
33
33
  - lib/hyperactive/hash.rb
34
34
  - lib/hyperactive/hooker.rb
35
35
  - lib/hyperactive/index.rb
36
+ - lib/hyperactive/transactions.rb
37
+ - lib/hyperactive/cleaner.rb
38
+ - lib/hyperactive/tree.rb
36
39
  - lib/hyperactive/list.rb
37
40
  - lib/hyperactive/record.rb
38
- - lib/hyperactive/transactions.rb
39
- - tests/hash_benchmark.rb
40
- - tests/hash_test.rb
41
- - tests/list_benchmark.rb
42
41
  - tests/list_test.rb
42
+ - tests/hash_test.rb
43
43
  - tests/record_test.rb
44
44
  - tests/test_helper.rb
45
+ - tests/tree_test.rb
46
+ - tests/hash_benchmark.rb
47
+ - tests/list_benchmark.rb
45
48
  - GPL-2
46
49
  - TODO
47
50
  - README
48
51
  test_files:
49
- - tests/hash_test.rb
50
52
  - tests/list_test.rb
53
+ - tests/hash_test.rb
51
54
  - tests/record_test.rb
55
+ - tests/tree_test.rb
52
56
  - tests/test_helper.rb
53
57
  rdoc_options:
54
58
  - --line-numbers
@@ -69,5 +73,5 @@ dependencies:
69
73
  requirements:
70
74
  - - ">="
71
75
  - !ruby/object:Gem::Version
72
- version: 0.2.0
76
+ version: 0.3.0
73
77
  version: