data_fabric 1.1.0 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
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