ar-octopus 0.0.21 → 0.0.22

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/Rakefile CHANGED
@@ -29,7 +29,7 @@ begin
29
29
  gem.authors = ["Thiago Pradi", "Mike Perham", "Amit Agarwal"]
30
30
  gem.add_development_dependency "rspec", ">= 1.2.9"
31
31
  gem.add_dependency('activerecord', '>= 3.0.0beta')
32
- gem.version = "0.0.21"
32
+ gem.version = "0.0.22"
33
33
  end
34
34
  Jeweler::GemcutterTasks.new
35
35
  rescue LoadError
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{ar-octopus}
8
- s.version = "0.0.21"
8
+ s.version = "0.0.22"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Thiago Pradi", "Mike Perham", "Amit Agarwal"]
12
- s.date = %q{2010-07-08}
12
+ s.date = %q{2010-07-09}
13
13
  s.description = %q{This gem allows you to use sharded databases with ActiveRecord. this also provides a interface for replication and for running migrations with multiples shards.}
14
14
  s.email = %q{tchandy@gmail.com}
15
15
  s.extra_rdoc_files = [
@@ -2,7 +2,11 @@ require "yaml"
2
2
 
3
3
  module Octopus
4
4
  def self.env()
5
- @env ||= defined?(Rails) ? Rails.env.to_s : 'octopus'
5
+ @env ||= 'octopus'
6
+ end
7
+
8
+ def self.rails_env()
9
+ @rails_env ||= self.rails? ? Rails.env.to_s : 'shards'
6
10
  end
7
11
 
8
12
  def self.config()
@@ -39,6 +43,10 @@ module Octopus
39
43
  def self.rails3?
40
44
  ActiveRecord::VERSION::MAJOR == 3
41
45
  end
46
+
47
+ def self.rails?
48
+ defined?(Rails)
49
+ end
42
50
  end
43
51
 
44
52
 
@@ -2,19 +2,29 @@ module Octopus::Migration
2
2
  def self.extended(base)
3
3
  class << base
4
4
  alias_method_chain :migrate, :octopus
5
+
6
+ def announce(message)
7
+ version = defined?(@version) ? @version : nil
8
+
9
+ text = "#{version} #{name}: #{message} - #{get_current_shard}"
10
+ length = [0, 75 - text.length].max
11
+ write "== %s %s" % [text, "=" * length]
12
+ end
5
13
  end
6
14
  end
7
15
 
8
16
  def using(*args, &block)
9
17
  Octopus.config()
18
+
19
+ unless defined?(::Rails) && Octopus.excluded_enviroments.include?(Rails.env.to_s)
20
+ args.each do |shard|
21
+ self.connection().check_schema_migrations(shard)
22
+ end
10
23
 
11
- args.each do |shard|
12
- self.connection().check_schema_migrations(shard)
24
+ self.connection().block = true
25
+ self.connection().current_shard = args
13
26
  end
14
-
15
- self.connection().block = true
16
- self.connection().current_shard = args
17
-
27
+
18
28
  yield if block_given?
19
29
 
20
30
  return self
@@ -23,24 +33,31 @@ module Octopus::Migration
23
33
  def using_group(*args)
24
34
  Octopus.config()
25
35
 
26
- args.each do |group_shard|
27
- shards = self.connection().instance_variable_get(:@groups)[group_shard] || []
36
+ unless defined?(::Rails) && Octopus.excluded_enviroments.include?(Rails.env.to_s)
37
+ args.each do |group_shard|
38
+ shards = self.connection().instance_variable_get(:@groups)[group_shard] || []
28
39
 
29
- shards.each do |shard|
30
- self.connection().check_schema_migrations(shard)
40
+ shards.each do |shard|
41
+ self.connection().check_schema_migrations(shard)
42
+ end
31
43
  end
32
- end
33
-
34
- self.connection().block = true
35
- self.connection().current_group = args
36
44
 
45
+ self.connection().block = true
46
+ self.connection().current_group = args
47
+ end
48
+
37
49
  return self
38
50
  end
51
+
52
+ def get_current_shard
53
+ "Shard: #{ActiveRecord::Base.connection.current_shard()}" if ActiveRecord::Base.connection.respond_to?(:current_shard)
54
+ end
55
+
39
56
 
40
57
  def migrate_with_octopus(direction)
41
58
  conn = ActiveRecord::Base.connection
42
59
  groups = conn.instance_variable_get(:@groups)
43
-
60
+
44
61
  if conn.current_group.is_a?(Array)
45
62
  conn.current_group.each { |group| conn.send_queries_to_multiple_shards(groups[group]) { migrate_without_octopus(direction) } }
46
63
  elsif conn.current_group.is_a?(Symbol)
@@ -12,7 +12,12 @@ class Octopus::Proxy
12
12
  @shards[:master] = ActiveRecord::Base.connection_pool()
13
13
  @current_shard = :master
14
14
 
15
- shards_config = config[Octopus.env()]["shards"] if have_config_for_enviroment?(config)
15
+ if have_config_for_enviroment?(config) && Octopus.rails?
16
+ shards_config = config[Octopus.env()][Rails.env().to_s]["shards"]
17
+ elsif have_config_for_enviroment?(config)
18
+ shards_config = config[Octopus.env()]["shards"]
19
+ end
20
+
16
21
  shards_config ||= []
17
22
 
18
23
  shards_config.each do |key, value|
@@ -106,4 +106,34 @@ production_entire_replicated:
106
106
  host: localhost
107
107
  database: octopus_shard5
108
108
 
109
+ octopus_rails:
110
+ excluded_enviroments:
111
+ - test
112
+ - cucumber
113
+
114
+ replicated: true
115
+
116
+ staging:
117
+ shards:
118
+ slave1:
119
+ adapter: mysql
120
+ host: localhost
121
+ database: octopus_shard2
122
+ slave2:
123
+ adapter: mysql
124
+ host: localhost
125
+ database: octopus_shard3
126
+
127
+ production:
128
+ shards:
129
+ slave3:
130
+ adapter: mysql
131
+ host: localhost
132
+ database: octopus_shard4
133
+ slave4:
134
+ adapter: mysql
135
+ host: localhost
136
+ database: octopus_shard5
137
+
138
+
109
139
 
@@ -2,7 +2,7 @@ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
2
 
3
3
  describe Octopus::Proxy do
4
4
  let(:proxy) { Octopus::Proxy.new(Octopus.config()) }
5
-
5
+
6
6
  describe "creating a new instance" do
7
7
  it "should initialize all shards and groups" do
8
8
  proxy.instance_variable_get(:@shards).keys.to_set.should == [:postgresql_shard, :alone_shard, :aug2011, :canada, :brazil, :aug2009, :russia, :aug2010, :master, :sqlite_shard].to_set
@@ -12,7 +12,7 @@ describe Octopus::Proxy do
12
12
  it "should initialize the block attribute as false" do
13
13
  proxy.block.should be_false
14
14
  end
15
-
15
+
16
16
  it "should initialize replicated attribute as false" do
17
17
  proxy.instance_variable_get(:@replicated).should be_false
18
18
  end
@@ -31,26 +31,26 @@ describe Octopus::Proxy do
31
31
  before(:each) do
32
32
  Octopus.stub!(:env).and_return("crazy_enviroment")
33
33
  end
34
-
34
+
35
35
  it "should initialize just the master shard" do
36
36
  proxy.instance_variable_get(:@shards).keys.should == [:master]
37
37
  end
38
-
38
+
39
39
  it "should not initialize the groups variable" do
40
40
  proxy.instance_variable_get(:@groups).should == {}
41
41
  end
42
-
42
+
43
43
  it "should not initialize replication" do
44
44
  proxy.instance_variable_get(:@replicated).should be_nil
45
45
  end
46
46
  end
47
47
  end
48
-
48
+
49
49
  describe "when you have a replicated enviroment" do
50
50
  before(:each) do
51
51
  Octopus.stub!(:env).and_return("production_replicated")
52
52
  end
53
-
53
+
54
54
  it "should have the replicated attribute as true" do
55
55
  proxy.instance_variable_get(:@replicated).should be_true
56
56
  end
@@ -60,6 +60,37 @@ describe Octopus::Proxy do
60
60
  end
61
61
  end
62
62
 
63
+ describe "when you have a rails application" do
64
+ before(:each) do
65
+ Rails = mock()
66
+ Octopus.stub!(:env).and_return("octopus_rails")
67
+ end
68
+
69
+ it "should initialize correctly octopus common variables for the enviroments" do
70
+ Rails.stub!(:env).and_return('staging')
71
+ Octopus.config()
72
+
73
+ proxy.instance_variable_get(:@replicated).should be_true
74
+ Octopus.excluded_enviroments.should == ["test", "cucumber"]
75
+ end
76
+
77
+ it "should initialize correctly the shards for the staging enviroment" do
78
+ Rails.stub!(:env).and_return('staging')
79
+
80
+ proxy.instance_variable_get(:@shards).keys.to_set.should == Set.new([:slave1, :slave2, :master])
81
+ end
82
+
83
+ it "should initialize correctly the shards for the production enviroment" do
84
+ Rails.stub!(:env).and_return('production')
85
+
86
+ proxy.instance_variable_get(:@shards).keys.to_set.should == Set.new([:slave3, :slave4, :master])
87
+ end
88
+
89
+ after(:each) do
90
+ Object.send(:remove_const, :Rails)
91
+ end
92
+ end
93
+
63
94
  describe "returning the correct connection" do
64
95
  describe "should return the shard name" do
65
96
  it "when current_shard is empty" do
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ar-octopus
3
3
  version: !ruby/object:Gem::Version
4
- hash: 53
4
+ hash: 51
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 21
10
- version: 0.0.21
9
+ - 22
10
+ version: 0.0.22
11
11
  platform: ruby
12
12
  authors:
13
13
  - Thiago Pradi
@@ -17,7 +17,7 @@ autorequire:
17
17
  bindir: bin
18
18
  cert_chain: []
19
19
 
20
- date: 2010-07-08 00:00:00 -03:00
20
+ date: 2010-07-09 00:00:00 -03:00
21
21
  default_executable:
22
22
  dependencies:
23
23
  - !ruby/object:Gem::Dependency