ar-octopus 0.0.13 → 0.0.14
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 +1 -1
- data/ar-octopus.gemspec +1 -1
- data/lib/octopus.rb +15 -0
- data/lib/octopus/model.rb +3 -2
- data/lib/octopus/proxy.rb +6 -1
- data/lib/octopus/scope_proxy.rb +1 -0
- data/spec/config/shards.yml +4 -0
- data/spec/octopus/model_spec.rb +2 -0
- data/spec/octopus/octopus_spec.rb +23 -0
- data/spec/octopus/replication_specs.rb +16 -0
- metadata +3 -3
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.
|
32
|
+
gem.version = "0.0.14"
|
33
33
|
end
|
34
34
|
Jeweler::GemcutterTasks.new
|
35
35
|
rescue LoadError
|
data/ar-octopus.gemspec
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{ar-octopus}
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.14"
|
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"]
|
data/lib/octopus.rb
CHANGED
@@ -14,6 +14,21 @@ module Octopus
|
|
14
14
|
def self.directory()
|
15
15
|
@directory ||= defined?(Rails) ? Rails.root.to_s : Dir.pwd
|
16
16
|
end
|
17
|
+
|
18
|
+
# This is the default way to do Octopus Setup
|
19
|
+
# Available variables:
|
20
|
+
# :excluded_enviroments => the enviroments that octopus will not run. default: :development, :cucumber and :test
|
21
|
+
def self.setup
|
22
|
+
yield self
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.excluded_enviroments=(excluded_enviroments)
|
26
|
+
@excluded_enviroments = excluded_enviroments.map {|element| element.to_s }
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.excluded_enviroments
|
30
|
+
@excluded_enviroments || ['development',"cucumber", "test"]
|
31
|
+
end
|
17
32
|
end
|
18
33
|
|
19
34
|
require "octopus/proxy"
|
data/lib/octopus/model.rb
CHANGED
@@ -2,7 +2,7 @@ module Octopus::Model
|
|
2
2
|
def self.extended(base)
|
3
3
|
base.send(:include, InstanceMethods)
|
4
4
|
base.extend(ClassMethods)
|
5
|
-
base.hijack_connection() unless defined?(::Rails) && (Rails.env
|
5
|
+
base.hijack_connection() unless defined?(::Rails) && Octopus.excluded_enviroments.include?(Rails.env.to_s)
|
6
6
|
end
|
7
7
|
|
8
8
|
module SharedMethods
|
@@ -11,7 +11,8 @@ module Octopus::Model
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def using(shard, &block)
|
14
|
-
return if defined?(::Rails) && (Rails.env
|
14
|
+
return self if defined?(::Rails) && Octopus.excluded_enviroments.include?(Rails.env.to_s)
|
15
|
+
|
15
16
|
hijack_connection()
|
16
17
|
clean_table_name()
|
17
18
|
|
data/lib/octopus/proxy.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
class Octopus::Proxy
|
2
2
|
attr_accessor :current_model, :current_shard, :current_group, :block, :using_enabled, :last_current_shard
|
3
3
|
|
4
|
-
def initialize(config)
|
4
|
+
def initialize(config)
|
5
5
|
initialize_shards(config)
|
6
6
|
initialize_replication(config) if have_a_valid_configuration?(config) && config[Octopus.env()]["replicated"]
|
7
7
|
end
|
@@ -11,6 +11,11 @@ class Octopus::Proxy
|
|
11
11
|
@groups = {}
|
12
12
|
@shards[:master] = ActiveRecord::Base.connection_pool()
|
13
13
|
@current_shard = :master
|
14
|
+
|
15
|
+
if have_a_valid_configuration?(config) && config[Octopus.env()]['excluded_enviroments']
|
16
|
+
Octopus.excluded_enviroments = config[Octopus.env()]['excluded_enviroments']
|
17
|
+
end
|
18
|
+
|
14
19
|
shards_config = config[Octopus.env()]["shards"] if have_a_valid_configuration?(config)
|
15
20
|
shards_config ||= []
|
16
21
|
|
data/lib/octopus/scope_proxy.rb
CHANGED
data/spec/config/shards.yml
CHANGED
data/spec/octopus/model_spec.rb
CHANGED
@@ -205,6 +205,8 @@ describe Octopus::Model do
|
|
205
205
|
end
|
206
206
|
|
207
207
|
it "transaction" do
|
208
|
+
#TODO - Investigate this - why we need to set to master!?
|
209
|
+
ActiveRecord::Base.connection_proxy.current_shard = :master
|
208
210
|
u = User.create!(:name => "Thiago")
|
209
211
|
|
210
212
|
User.using(:brazil).count.should == 0
|
@@ -18,4 +18,27 @@ describe Octopus do
|
|
18
18
|
Octopus.env().should == 'octopus'
|
19
19
|
end
|
20
20
|
end
|
21
|
+
|
22
|
+
describe "#setup method" do
|
23
|
+
it "should load from YAML" do
|
24
|
+
Octopus.excluded_enviroments.should == ["cucumber", "test", "staging"]
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should have the default excluded enviroments" do
|
28
|
+
Octopus.instance_variable_set(:@excluded_enviroments, nil)
|
29
|
+
Octopus.excluded_enviroments.should == ["development", "cucumber", "test"]
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should configure the excluded enviroments" do
|
33
|
+
Octopus.setup do |config|
|
34
|
+
config.excluded_enviroments = [:cucumber, :test]
|
35
|
+
end
|
36
|
+
|
37
|
+
Octopus.excluded_enviroments.should == ['cucumber', 'test']
|
38
|
+
|
39
|
+
Octopus.setup do |config|
|
40
|
+
config.excluded_enviroments = [:cucumber, :test, :staging]
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
21
44
|
end
|
@@ -11,6 +11,14 @@ describe "when the database is replicated" do
|
|
11
11
|
User.count.should == 1
|
12
12
|
User.find(u.id).should == u
|
13
13
|
end
|
14
|
+
|
15
|
+
it "should send all writes queries to master" do
|
16
|
+
u = Cat.using(:slave4).create!(:name => "Slave Cat")
|
17
|
+
u1 = Cat.using(:slave4).first
|
18
|
+
u1.name = "Miau"
|
19
|
+
u1.save()
|
20
|
+
Cat.using(:slave4).first.name.should == "Slave Cat"
|
21
|
+
end
|
14
22
|
|
15
23
|
it "should send read queries to slaves, when you have a replicated model, using a round robin algorithm" do
|
16
24
|
u = Cat.create!(:name => "master")
|
@@ -44,6 +52,14 @@ describe "when the database is replicated and the entire application is replicat
|
|
44
52
|
Octopus.stub!(:env).and_return("production_entire_replicated")
|
45
53
|
clean_connection_proxy()
|
46
54
|
end
|
55
|
+
|
56
|
+
it "should send all writes queries to master" do
|
57
|
+
u = Client.using(:slave4).create!(:name => "Slave Client")
|
58
|
+
u1 = Client.using(:slave4).first
|
59
|
+
u1.name = "Client"
|
60
|
+
u1.save()
|
61
|
+
Client.using(:slave4).first.name.should == "Slave Client"
|
62
|
+
end
|
47
63
|
|
48
64
|
it "should send read queries to slaves,to all models, using a round robin algorithm" do
|
49
65
|
u = Cat.create!(:name => "master")
|
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:
|
4
|
+
hash: 3
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 14
|
10
|
+
version: 0.0.14
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Thiago Pradi
|