data_fabric 1.1.0 → 1.2.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.
Files changed (86) hide show
  1. data/CHANGELOG +4 -0
  2. data/Manifest +73 -0
  3. data/README.rdoc +1 -1
  4. data/Rakefile +34 -8
  5. data/data_fabric.gemspec +7 -7
  6. data/example/app/models/figment.rb +1 -1
  7. data/example/db/development.sqlite3 +0 -0
  8. data/example/db/s0_development.sqlite3 +0 -0
  9. data/example/db/s0_test.sqlite3 +0 -0
  10. data/example/db/s1_development.sqlite3 +0 -0
  11. data/example/db/s1_test.sqlite3 +0 -0
  12. data/example/db/test.sqlite3 +0 -0
  13. data/example/vendor/plugins/data_fabric/init.rb +1 -0
  14. data/example/vendor/plugins/data_fabric/lib/data_fabric.rb +106 -0
  15. data/example/vendor/plugins/data_fabric/lib/data_fabric/ar20.rb +135 -0
  16. data/example/vendor/plugins/data_fabric/lib/data_fabric/ar22.rb +172 -0
  17. data/example/vendor/plugins/data_fabric/lib/data_fabric/version.rb +5 -0
  18. data/example22/Rakefile +58 -0
  19. data/example22/app/controllers/accounts_controller.rb +22 -0
  20. data/example22/app/controllers/application.rb +39 -0
  21. data/example22/app/controllers/figments_controller.rb +8 -0
  22. data/example22/app/helpers/application_helper.rb +3 -0
  23. data/example22/app/models/account.rb +3 -0
  24. data/example22/app/models/figment.rb +4 -0
  25. data/example22/app/views/accounts/index.html.erb +47 -0
  26. data/example22/app/views/layouts/application.html.erb +8 -0
  27. data/example22/config/boot.rb +109 -0
  28. data/example22/config/database.yml +21 -0
  29. data/example22/config/environment.rb +76 -0
  30. data/example22/config/environments/development.rb +17 -0
  31. data/example22/config/environments/production.rb +24 -0
  32. data/example22/config/environments/test.rb +22 -0
  33. data/example22/config/initializers/inflections.rb +10 -0
  34. data/example22/config/initializers/mime_types.rb +5 -0
  35. data/example22/config/initializers/new_rails_defaults.rb +17 -0
  36. data/example22/config/locales/en.yml +5 -0
  37. data/example22/config/routes.rb +46 -0
  38. data/example22/db/migrate/20080702154628_create_accounts.rb +14 -0
  39. data/example22/db/migrate/20080702154820_create_figments.rb +14 -0
  40. data/example22/public/404.html +30 -0
  41. data/example22/public/422.html +30 -0
  42. data/example22/public/500.html +33 -0
  43. data/example22/public/dispatch.cgi +10 -0
  44. data/example22/public/dispatch.fcgi +24 -0
  45. data/example22/public/dispatch.rb +10 -0
  46. data/example22/public/favicon.ico +0 -0
  47. data/example22/public/images/rails.png +0 -0
  48. data/example22/public/index.html +274 -0
  49. data/example22/public/javascripts/application.js +2 -0
  50. data/example22/public/javascripts/controls.js +963 -0
  51. data/example22/public/javascripts/dragdrop.js +973 -0
  52. data/example22/public/javascripts/effects.js +1128 -0
  53. data/example22/public/javascripts/prototype.js +4320 -0
  54. data/example22/public/robots.txt +5 -0
  55. data/example22/script/about +4 -0
  56. data/example22/script/console +3 -0
  57. data/example22/script/dbconsole +3 -0
  58. data/example22/script/destroy +3 -0
  59. data/example22/script/generate +3 -0
  60. data/example22/script/performance/benchmarker +3 -0
  61. data/example22/script/performance/profiler +3 -0
  62. data/example22/script/performance/request +3 -0
  63. data/example22/script/plugin +3 -0
  64. data/example22/script/process/inspector +3 -0
  65. data/example22/script/process/reaper +3 -0
  66. data/example22/script/process/spawner +3 -0
  67. data/example22/script/runner +3 -0
  68. data/example22/script/server +3 -0
  69. data/example22/test/fixtures/accounts.yml +7 -0
  70. data/example22/test/functional/accounts_controller_test.rb +12 -0
  71. data/example22/test/integration/account_figments_test.rb +97 -0
  72. data/example22/test/performance/browsing_test.rb +9 -0
  73. data/example22/test/test_helper.rb +38 -0
  74. data/lib/data_fabric.rb +7 -132
  75. data/lib/data_fabric/ar20.rb +133 -0
  76. data/lib/data_fabric/ar22.rb +172 -0
  77. data/lib/data_fabric/version.rb +1 -1
  78. data/test/connection_test.rb +6 -2
  79. data/test/database_test.rb +26 -2
  80. data/test/test_helper.rb +34 -28
  81. data/test/thread_test.rb +19 -11
  82. data/test/vr_austin_master.db +0 -0
  83. data/test/vr_austin_slave.db +0 -0
  84. data/test/vr_dallas_master.db +0 -0
  85. data/test/vr_dallas_slave.db +0 -0
  86. metadata +79 -5
@@ -0,0 +1,172 @@
1
+ module DataFabric
2
+ module Extensions
3
+ def self.included(model)
4
+ # Wire up ActiveRecord::Base
5
+ model.extend ClassMethods
6
+ ConnectionProxy.shard_pools = {}
7
+ end
8
+
9
+ # Class methods injected into ActiveRecord::Base
10
+ module ClassMethods
11
+ def data_fabric(options)
12
+ DataFabric.log { "Creating data_fabric proxy for class #{name}" }
13
+ @proxy = DataFabric::ConnectionProxy.new(self, options)
14
+
15
+ class << self
16
+ def connection
17
+ @proxy
18
+ end
19
+
20
+ def connected?
21
+ @proxy.connected?
22
+ end
23
+
24
+ def remove_connection(klass)
25
+ DataFabric.log(Logger::ERROR) { "remove_connection not implemented by data_fabric" }
26
+ end
27
+
28
+ def connection_pool
29
+ raise "dynamic connection switching means you cannot get direct access to a pool"
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+
36
+ class ConnectionProxy
37
+ cattr_accessor :shard_pools
38
+
39
+ def initialize(model_class, options)
40
+ @model_class = model_class
41
+ @replicated = options[:replicated]
42
+ @shard_group = options[:shard_by]
43
+ @prefix = options[:prefix]
44
+ set_role('slave') if @replicated
45
+
46
+ @model_class.send :include, ActiveRecordConnectionMethods if @replicated
47
+ end
48
+
49
+ delegate :insert, :update, :delete, :create_table, :rename_table, :drop_table, :add_column, :remove_column,
50
+ :change_column, :change_column_default, :rename_column, :add_index, :remove_index, :initialize_schema_information,
51
+ :dump_schema_information, :execute, :execute_ignore_duplicate, :to => :master
52
+
53
+ delegate :insert_many, :to => :master # ar-extensions bulk insert support
54
+
55
+ def transaction(start_db_transaction = true, &block)
56
+ # Transaction is not re-entrant in SQLite 3 so we
57
+ # need to track if we've already started an XA to avoid
58
+ # calling it twice.
59
+ return yield if in_transaction?
60
+
61
+ with_master do
62
+ connection.transaction(start_db_transaction, &block)
63
+ end
64
+ end
65
+
66
+ def method_missing(method, *args, &block)
67
+ DataFabric.log(Logger::DEBUG) { "Calling #{method} on #{connection}" }
68
+ connection.send(method, *args, &block)
69
+ end
70
+
71
+ def connection_name
72
+ connection_name_builder.join('_')
73
+ end
74
+
75
+ def with_master
76
+ # Allow nesting of with_master.
77
+ old_role = current_role
78
+ set_role('master')
79
+ yield
80
+ ensure
81
+ set_role(old_role)
82
+ end
83
+
84
+ def connected?
85
+ current_pool.connected?
86
+ end
87
+
88
+ private
89
+
90
+ def in_transaction?
91
+ current_role == 'master'
92
+ end
93
+
94
+ def current_pool
95
+ name = connection_name
96
+ self.class.shard_pools[name] ||= begin
97
+ config = ActiveRecord::Base.configurations[name]
98
+ raise ArgumentError, "Unknown database config: #{name}, have #{ActiveRecord::Base.configurations.inspect}" unless config
99
+ ActiveRecord::ConnectionAdapters::ConnectionPool.new(spec_for(config))
100
+ end
101
+ end
102
+
103
+ def spec_for(config)
104
+ # XXX This looks pretty fragile. Will break if AR changes how it initializes connections and adapters.
105
+ config = config.symbolize_keys
106
+ adapter_method = "#{config[:adapter]}_connection"
107
+ initialize_adapter(config[:adapter])
108
+ ActiveRecord::Base::ConnectionSpecification.new(config, adapter_method)
109
+ end
110
+
111
+ def initialize_adapter(adapter)
112
+ begin
113
+ require 'rubygems'
114
+ gem "activerecord-#{adapter}-adapter"
115
+ require "active_record/connection_adapters/#{adapter}_adapter"
116
+ rescue LoadError
117
+ begin
118
+ require "active_record/connection_adapters/#{adapter}_adapter"
119
+ rescue LoadError
120
+ raise "Please install the #{adapter} adapter: `gem install activerecord-#{adapter}-adapter` (#{$!})"
121
+ end
122
+ end
123
+ end
124
+
125
+ def connection_name_builder
126
+ @connection_name_builder ||= begin
127
+ clauses = []
128
+ clauses << @prefix if @prefix
129
+ clauses << @shard_group if @shard_group
130
+ clauses << StringProxy.new { DataFabric.active_shard(@shard_group) } if @shard_group
131
+ clauses << RAILS_ENV
132
+ clauses << StringProxy.new { current_role } if @replicated
133
+ clauses
134
+ end
135
+ end
136
+
137
+ def connection
138
+ current_pool.connection
139
+ end
140
+
141
+ def set_role(role)
142
+ Thread.current[:data_fabric_role] = role
143
+ end
144
+
145
+ def current_role
146
+ Thread.current[:data_fabric_role]
147
+ end
148
+
149
+ def master
150
+ with_master { return connection }
151
+ end
152
+ end
153
+
154
+ module ActiveRecordConnectionMethods
155
+ def self.included(base)
156
+ base.alias_method_chain :reload, :master
157
+ end
158
+
159
+ def reload_with_master(*args, &block)
160
+ connection.with_master { reload_without_master }
161
+ end
162
+ end
163
+
164
+ class StringProxy
165
+ def initialize(&block)
166
+ @proc = block
167
+ end
168
+ def to_s
169
+ @proc.call
170
+ end
171
+ end
172
+ end
@@ -1,5 +1,5 @@
1
1
  module DataFabric
2
2
  module Version
3
- STRING = "1.1.0"
3
+ STRING = "1.2.0"
4
4
  end
5
5
  end
@@ -36,7 +36,7 @@ end
36
36
 
37
37
  class RawConnection
38
38
  def method_missing(name, *args)
39
- puts "#{self.class.name} missing '#{name}': #{args.inspect}"
39
+ puts "#{self.class.name} missing '#{name}': #{args.inspect}"
40
40
  end
41
41
  end
42
42
 
@@ -96,7 +96,11 @@ class ConnectionTest < Test::Unit::TestCase
96
96
  private
97
97
 
98
98
  def setup_configuration_for(clazz, name)
99
- flexmock(clazz).should_receive(:mysql_connection).and_return(AdapterMock.new(RawConnection.new))
99
+ if ar22?
100
+ flexmock(ActiveRecord::ConnectionAdapters::ConnectionPool).new_instances.should_receive(:new_connection).and_return(AdapterMock.new(RawConnection.new))
101
+ else
102
+ flexmock(clazz).should_receive(:mysql_connection).and_return(AdapterMock.new(RawConnection.new))
103
+ end
100
104
  ActiveRecord::Base.configurations ||= HashWithIndifferentAccess.new
101
105
  ActiveRecord::Base.configurations[name] = HashWithIndifferentAccess.new({ :adapter => 'mysql', :database => name, :host => 'localhost'})
102
106
  end
@@ -10,6 +10,29 @@ class DatabaseTest < Test::Unit::TestCase
10
10
 
11
11
  def setup
12
12
  ActiveRecord::Base.configurations = load_database_yml
13
+ if ar22?
14
+ DataFabric::ConnectionProxy.shard_pools.clear
15
+ end
16
+ end
17
+
18
+ def test_ar22_features
19
+ return unless ar22?
20
+
21
+ DataFabric.activate_shard :city => :dallas do
22
+ assert_equal 'fiveruns_city_dallas_test_slave', TheWholeBurrito.connection.connection_name
23
+
24
+ assert_raises RuntimeError do
25
+ TheWholeBurrito.connection_pool
26
+ end
27
+
28
+ assert !TheWholeBurrito.connected?
29
+
30
+ # Should use the slave
31
+ burrito = TheWholeBurrito.find(1)
32
+ assert_match 'vr_dallas_slave', burrito.name
33
+
34
+ assert TheWholeBurrito.connected?
35
+ end
13
36
  end
14
37
 
15
38
  def test_live_burrito
@@ -19,18 +42,19 @@ class DatabaseTest < Test::Unit::TestCase
19
42
  # Should use the slave
20
43
  burrito = TheWholeBurrito.find(1)
21
44
  assert_match 'vr_dallas_slave', burrito.name
22
-
45
+
23
46
  # Should use the master
24
47
  burrito.reload
25
48
  assert_match 'vr_dallas_master', burrito.name
26
49
 
27
50
  # ...but immediately set it back to default to the slave
28
51
  assert_equal 'fiveruns_city_dallas_test_slave', TheWholeBurrito.connection.connection_name
29
-
52
+
30
53
  # Should use the master
31
54
  TheWholeBurrito.transaction do
32
55
  burrito = TheWholeBurrito.find(1)
33
56
  assert_match 'vr_dallas_master', burrito.name
57
+ burrito.name = 'foo'
34
58
  burrito.save!
35
59
  end
36
60
  end
data/test/test_helper.rb CHANGED
@@ -1,34 +1,40 @@
1
- if !defined?(ROOT_PATH) # Don't evaluate this file twice.
2
- ENV['RAILS_ENV'] = 'test'
3
- RAILS_ENV = 'test'
4
- ROOT_PATH = File.expand_path(File.join(File.dirname(__FILE__), ".."))
5
- DATABASE_YML_PATH = File.join(ROOT_PATH, "test", "database.yml")
6
- Dir.chdir(ROOT_PATH)
1
+ ENV['RAILS_ENV'] = 'test'
2
+ RAILS_ENV = 'test'
3
+ ROOT_PATH = File.expand_path(File.join(File.dirname(__FILE__), ".."))
4
+ DATABASE_YML_PATH = File.join(ROOT_PATH, "test", "database.yml")
5
+ Dir.chdir(ROOT_PATH)
7
6
 
8
- require 'rubygems'
9
- require 'test/unit'
7
+ require 'rubygems'
8
+ require 'test/unit'
10
9
 
11
- # Bootstrap AR
12
- gem 'activerecord', '=2.0.2'
13
- require 'active_record'
14
- require 'active_record/version'
15
- ActiveRecord::Base.logger = Logger.new(STDOUT)
16
- ActiveRecord::Base.logger.level = Logger::WARN
17
- ActiveRecord::Base.allow_concurrency = false
10
+ version = ENV['AR_VERSION']
11
+ if version
12
+ puts "Testing ActiveRecord #{version}"
13
+ gem 'activerecord', "=#{version}"
14
+ end
15
+
16
+ require 'active_record'
17
+ require 'active_record/version'
18
+ ActiveRecord::Base.logger = Logger.new(STDOUT)
19
+ ActiveRecord::Base.logger.level = Logger::WARN
18
20
 
19
- # Bootstrap DF
20
- Dependencies.load_paths << File.join(File.dirname(__FILE__), '../lib')
21
- require 'init'
21
+ # Bootstrap DF
22
+ deps = defined?(ActiveSupport::Dependencies) ? ActiveSupport::Dependencies : Dependencies
23
+ deps.load_paths << File.join(File.dirname(__FILE__), '../lib')
24
+ require 'init'
22
25
 
23
- def load_database_yml
24
- filename = DATABASE_YML_PATH
25
- YAML::load(ERB.new(IO.read(filename)).result)
26
- end
26
+ def load_database_yml
27
+ filename = DATABASE_YML_PATH
28
+ YAML::load(ERB.new(IO.read(filename)).result)
29
+ end
30
+
31
+ def ar22?
32
+ ActiveRecord::VERSION::STRING >= '2.2.0'
33
+ end
27
34
 
28
- if !File.exist?(DATABASE_YML_PATH)
29
- STDERR.puts "\n*** ERROR ***:\n" <<
30
- "You must have a 'test/database.yml' file in order to run the unit tests. " <<
31
- "An example is provided in 'test/database.yml.example'.\n\n"
32
- exit 1
33
- end
35
+ if !File.exist?(DATABASE_YML_PATH)
36
+ puts "\n*** ERROR ***:\n" <<
37
+ "You must have a 'test/database.yml' file in order to run the unit tests. " <<
38
+ "An example is provided in 'test/database.yml.example'.\n\n"
39
+ exit 1
34
40
  end
data/test/thread_test.rb CHANGED
@@ -4,20 +4,28 @@ require 'erb'
4
4
  class ThreadTest < Test::Unit::TestCase
5
5
 
6
6
  MUTEX = Mutex.new
7
-
8
- def test_concurrency_not_allowed
9
- assert_raise ArgumentError do
10
- Object.class_eval %{
11
- class ThreadedEnchilada < ActiveRecord::Base
12
- self.allow_concurrency = true
13
- set_table_name :enchiladas
14
- data_fabric :prefix => 'fiveruns', :replicated => true, :shard_by => :city
15
- end
16
- }
7
+
8
+ if ActiveRecord::VERSION::STRING < '2.2.0'
9
+ def test_concurrency_not_allowed
10
+ assert_raise ArgumentError do
11
+ Object.class_eval %{
12
+ class ThreadedEnchilada < ActiveRecord::Base
13
+ self.allow_concurrency = true
14
+ set_table_name :enchiladas
15
+ data_fabric :prefix => 'fiveruns', :replicated => true, :shard_by => :city
16
+ end
17
+ }
18
+ end
17
19
  end
18
20
  end
19
21
 
20
- def xtest_class_and_instance_connections
22
+ def test_class_and_instance_connections
23
+ Object.class_eval %{
24
+ class ThreadedEnchilada < ActiveRecord::Base
25
+ set_table_name :enchiladas
26
+ data_fabric :prefix => 'fiveruns', :replicated => true, :shard_by => :city
27
+ end
28
+ }
21
29
  ActiveRecord::Base.configurations = load_database_yml
22
30
 
23
31
  cconn = ThreadedEnchilada.connection
Binary file
Binary file
Binary file
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: data_fabric
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Perham
@@ -9,11 +9,11 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-11-22 00:00:00 -06:00
12
+ date: 2008-12-01 00:00:00 -06:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
16
- description: Sharding and replication support for ActiveRecord 2.0 and 2.1
16
+ description: Sharding and replication support for ActiveRecord 2.x
17
17
  email: mperham@gmail.com
18
18
  executables: []
19
19
 
@@ -21,6 +21,8 @@ extensions: []
21
21
 
22
22
  extra_rdoc_files:
23
23
  - CHANGELOG
24
+ - lib/data_fabric/ar20.rb
25
+ - lib/data_fabric/ar22.rb
24
26
  - lib/data_fabric/version.rb
25
27
  - lib/data_fabric.rb
26
28
  - README.rdoc
@@ -46,9 +48,15 @@ files:
46
48
  - example/config/initializers/mime_types.rb
47
49
  - example/config/initializers/new_rails_defaults.rb
48
50
  - example/config/routes.rb
51
+ - example/db/development.sqlite3
49
52
  - example/db/migrate/20080702154628_create_accounts.rb
50
53
  - example/db/migrate/20080702154820_create_figments.rb
54
+ - example/db/s0_development.sqlite3
55
+ - example/db/s0_test.sqlite3
56
+ - example/db/s1_development.sqlite3
57
+ - example/db/s1_test.sqlite3
51
58
  - example/db/schema.rb
59
+ - example/db/test.sqlite3
52
60
  - example/public/404.html
53
61
  - example/public/422.html
54
62
  - example/public/500.html
@@ -82,7 +90,70 @@ files:
82
90
  - example/test/functional/accounts_controller_test.rb
83
91
  - example/test/integration/account_figments_test.rb
84
92
  - example/test/test_helper.rb
93
+ - example/vendor/plugins/data_fabric/init.rb
94
+ - example/vendor/plugins/data_fabric/lib/data_fabric/ar20.rb
95
+ - example/vendor/plugins/data_fabric/lib/data_fabric/ar22.rb
96
+ - example/vendor/plugins/data_fabric/lib/data_fabric/version.rb
97
+ - example/vendor/plugins/data_fabric/lib/data_fabric.rb
98
+ - example22/app/controllers/accounts_controller.rb
99
+ - example22/app/controllers/application.rb
100
+ - example22/app/controllers/figments_controller.rb
101
+ - example22/app/helpers/application_helper.rb
102
+ - example22/app/models/account.rb
103
+ - example22/app/models/figment.rb
104
+ - example22/app/views/accounts/index.html.erb
105
+ - example22/app/views/layouts/application.html.erb
106
+ - example22/config/boot.rb
107
+ - example22/config/database.yml
108
+ - example22/config/environment.rb
109
+ - example22/config/environments/development.rb
110
+ - example22/config/environments/production.rb
111
+ - example22/config/environments/test.rb
112
+ - example22/config/initializers/inflections.rb
113
+ - example22/config/initializers/mime_types.rb
114
+ - example22/config/initializers/new_rails_defaults.rb
115
+ - example22/config/locales/en.yml
116
+ - example22/config/routes.rb
117
+ - example22/db/migrate/20080702154628_create_accounts.rb
118
+ - example22/db/migrate/20080702154820_create_figments.rb
119
+ - example22/public/404.html
120
+ - example22/public/422.html
121
+ - example22/public/500.html
122
+ - example22/public/dispatch.cgi
123
+ - example22/public/dispatch.fcgi
124
+ - example22/public/dispatch.rb
125
+ - example22/public/favicon.ico
126
+ - example22/public/images/rails.png
127
+ - example22/public/index.html
128
+ - example22/public/javascripts/application.js
129
+ - example22/public/javascripts/controls.js
130
+ - example22/public/javascripts/dragdrop.js
131
+ - example22/public/javascripts/effects.js
132
+ - example22/public/javascripts/prototype.js
133
+ - example22/public/robots.txt
134
+ - example22/Rakefile
135
+ - example22/script/about
136
+ - example22/script/console
137
+ - example22/script/dbconsole
138
+ - example22/script/destroy
139
+ - example22/script/generate
140
+ - example22/script/performance/benchmarker
141
+ - example22/script/performance/profiler
142
+ - example22/script/performance/request
143
+ - example22/script/plugin
144
+ - example22/script/process/inspector
145
+ - example22/script/process/reaper
146
+ - example22/script/process/spawner
147
+ - example22/script/runner
148
+ - example22/script/server
149
+ - example22/test/fixtures/accounts.yml
150
+ - example22/test/functional/accounts_controller_test.rb
151
+ - example22/test/integration/account_figments_test.rb
152
+ - example22/test/performance/browsing_test.rb
153
+ - example22/test/test_helper.rb
85
154
  - init.rb
155
+ - lib/data_fabric/ar20.rb
156
+ - lib/data_fabric/ar22.rb
86
157
  - lib/data_fabric/version.rb
87
158
  - lib/data_fabric.rb
88
159
  - Manifest
@@ -95,6 +166,10 @@ files:
95
166
  - test/shard_test.rb
96
167
  - test/test_helper.rb
97
168
  - test/thread_test.rb
169
+ - test/vr_austin_master.db
170
+ - test/vr_austin_slave.db
171
+ - test/vr_dallas_master.db
172
+ - test/vr_dallas_slave.db
98
173
  - TESTING.rdoc
99
174
  - data_fabric.gemspec
100
175
  has_rdoc: true
@@ -127,10 +202,9 @@ rubyforge_project: fiveruns
127
202
  rubygems_version: 1.3.1
128
203
  signing_key:
129
204
  specification_version: 2
130
- summary: Sharding and replication support for ActiveRecord 2.0 and 2.1
205
+ summary: Sharding and replication support for ActiveRecord 2.x
131
206
  test_files:
132
207
  - test/connection_test.rb
133
208
  - test/database_test.rb
134
209
  - test/shard_test.rb
135
- - test/test_helper.rb
136
210
  - test/thread_test.rb