switch_point 0.4.4 → 0.5.0.pre

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c6b1805e5054f11a52d44b88cd368c7d818d5d68
4
- data.tar.gz: b4f1be476532072424bfa41ce5222248c313975c
3
+ metadata.gz: d937f9d15338cf8a36af264c6c5ff63c985edd11
4
+ data.tar.gz: 77fb0385c14264cb283ed32f41493dde3aa2ec7a
5
5
  SHA512:
6
- metadata.gz: c7a172fbd91894e792564c1116e596ae918c0c33f42ce81c11e0c19650684faf2ccf27f096a35e65b3fcc964dc6d0e0945d625a3c22da251e8dd27612eb2c5d4
7
- data.tar.gz: bfad8456783ebfa78e92a06af283adf7f0f2168dcf5dbba049e2c2db47ea1b4cd97b68e61ff56916f36a96391d889b94433afb5c4f8c08f236c57ce88ca6ad17
6
+ metadata.gz: 3dfd6368a9967952b2eb83770ae3e700fe2f2299965364d3ebdca23f986f14303fb565a54b71c32b459df632067dcad8dd941dc1c6d3bc4cd6f97dc95fd3b1f8
7
+ data.tar.gz: 750d9ea20a474e5d453208dc95fef6df37fa3f6e4ce466a6d341a5ada8b6709a3797abbbef9e37340a1da03f8d9f0e640e55bb607d9cb06a37c6315850764551
@@ -1,12 +1,15 @@
1
1
  language: ruby
2
2
  rvm:
3
3
  - 2.0.0
4
- - 2.1.1
4
+ - 2.1
5
+ - 2.2
5
6
  - ruby-head
6
7
  gemfile:
7
8
  - gemfiles/rails_3.2.gemfile
8
9
  - gemfiles/rails_4.0.gemfile
9
10
  - gemfiles/rails_4.1.gemfile
11
+ - gemfiles/rails_edge.gemfile
10
12
  matrix:
11
13
  allow_failures:
12
14
  - rvm: ruby-head
15
+ - gemfile: gemfiles/rails_edge.gemfile
data/Appraisals CHANGED
@@ -10,4 +10,8 @@ appraise 'rails-4.1' do
10
10
  gem 'activerecord', '~> 4.1'
11
11
  end
12
12
 
13
+ appraise 'rails-edge' do
14
+ gem 'activerecord', git: 'https://github.com/rails/rails'
15
+ end
16
+
13
17
  # vim: set ft=ruby:
@@ -1,3 +1,8 @@
1
+ ## 0.5.0 (XXXX-XX-XX)
2
+ - Rename `SwitchPoint.with_connection` to `SwitchPoint.with_mode`
3
+ - To avoid confusion with `ActiveRecord::ConnectionPool#with_connection`
4
+ - Inherit superclass' switch_point configuration
5
+
1
6
  ## 0.4.4 (2014-07-14)
2
7
  - Memorize switch_point config to ConnectionSpecification#config instead of ConnectionPool
3
8
  - To support multi-threaded environment since Rails 4.0.
data/README.md CHANGED
@@ -21,8 +21,75 @@ Or install it yourself as:
21
21
  $ gem install switch_point
22
22
 
23
23
  ## Usage
24
-
25
- See [spec/models](spec/models.rb).
24
+ Suppose you have 4 databases: db-blog-master, db-blog-slave, db-comment-master and db-comment-slave.
25
+ Article model and Category model are stored in db-blog-{master,slave} and Comment model is stored in db-comment-{master,slave}.
26
+
27
+ ### Configuration
28
+ In database.yml:
29
+
30
+ ```yaml
31
+ production_blog_master:
32
+ adapter: mysql2
33
+ username: blog_writable
34
+ host: db-blog-master
35
+ production_blog_slave:
36
+ adapter: mysql2
37
+ username: blog_readonly
38
+ host: db-blog-slave
39
+ production_comment_master:
40
+ ...
41
+ ```
42
+
43
+ In initializer:
44
+
45
+ ```ruby
46
+ SwitchPoint.configure do |config|
47
+ config.define_switch_point :blog,
48
+ readonly: :"#{Rails.env}_blog_slave",
49
+ writable: :"#{Rails.env}_blog_master"
50
+ config.define_switch_point :comment,
51
+ readonly: :"#{Rails.env}_comment_slave",
52
+ writable: :"#{Rails.env}_comment_master"
53
+ end
54
+ ```
55
+
56
+ In models:
57
+
58
+ ```ruby
59
+ class Article < ActiveRecord::Base
60
+ use_switch_point :blog
61
+ end
62
+
63
+ class Category < ActiveRecord::Base
64
+ use_switch_point :blog
65
+ end
66
+
67
+ class Comment < ActiveRecord::Base
68
+ use_switch_point :comment
69
+ end
70
+ ```
71
+
72
+ ### Switching connections
73
+
74
+ ```ruby
75
+ Article.with_readonly { Article.first } # Read from db-blog-slave
76
+ Category.with_readonly { Category.first } # Also read from db-blog-slave
77
+ Comment.with_readonly { Comment.first } # Read from db-comment-slave
78
+
79
+ Article.with_readonly do
80
+ article = Article.first # Read from db-blog-slave
81
+ article.title = 'new title'
82
+ Article.with_writable do
83
+ article.save! # Write to db-blog-master
84
+ article.reload # Read from db-blog-master
85
+ Category.first # Read from db-blog-master
86
+ end
87
+ end
88
+ ```
89
+
90
+ Note that Article and Category shares their connections.
91
+
92
+ ## Notes
26
93
 
27
94
  ### auto_writable
28
95
  `auto_writable` is disabled by default.
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "activerecord", :git => "https://github.com/rails/rails"
6
+
7
+ gemspec :path => "../"
@@ -33,17 +33,17 @@ module SwitchPoint
33
33
  end
34
34
 
35
35
  def with_readonly(*names, &block)
36
- with_connection(:readonly, *names, &block)
36
+ with_mode(:readonly, *names, &block)
37
37
  end
38
38
 
39
39
  def with_writable(*names, &block)
40
- with_connection(:writable, *names, &block)
40
+ with_mode(:writable, *names, &block)
41
41
  end
42
42
 
43
- def with_connection(mode, *names, &block)
43
+ def with_mode(mode, *names, &block)
44
44
  names.reverse.inject(block) do |func, name|
45
45
  lambda do
46
- ProxyRepository.checkout(name).with_connection(mode, &func)
46
+ ProxyRepository.checkout(name).with_mode(mode, &func)
47
47
  end
48
48
  end.call
49
49
  end
@@ -11,7 +11,7 @@ module SwitchPoint
11
11
 
12
12
  module ClassMethods
13
13
  def connection_with_switch_point
14
- if @switch_point_name
14
+ if switch_point_proxy
15
15
  switch_point_proxy.connection
16
16
  else
17
17
  connection_without_switch_point
@@ -42,8 +42,10 @@ module SwitchPoint
42
42
  def switch_point_proxy
43
43
  if @switch_point_name
44
44
  ProxyRepository.checkout(@switch_point_name)
45
- else
45
+ elsif self == ActiveRecord::Base
46
46
  nil
47
+ else
48
+ superclass.switch_point_proxy
47
49
  end
48
50
  end
49
51
 
@@ -84,14 +84,14 @@ module SwitchPoint
84
84
  end
85
85
 
86
86
  def with_readonly(&block)
87
- with_connection(:readonly, &block)
87
+ with_mode(:readonly, &block)
88
88
  end
89
89
 
90
90
  def with_writable(&block)
91
- with_connection(:writable, &block)
91
+ with_mode(:writable, &block)
92
92
  end
93
93
 
94
- def with_connection(new_mode, &block)
94
+ def with_mode(new_mode, &block)
95
95
  unless AVAILABLE_MODES.include?(new_mode)
96
96
  raise ArgumentError.new("Unknown mode: #{new_mode}")
97
97
  end
@@ -1,3 +1,3 @@
1
1
  module SwitchPoint
2
- VERSION = "0.4.4"
2
+ VERSION = "0.5.0.pre"
3
3
  end
@@ -73,6 +73,18 @@ class Nanika3 < ActiveRecord::Base
73
73
  use_switch_point :nanika3
74
74
  end
75
75
 
76
+ class AbstractNanika < ActiveRecord::Base
77
+ use_switch_point :main
78
+ self.abstract_class = true
79
+ end
80
+
81
+ class DerivedNanika1 < AbstractNanika
82
+ end
83
+
84
+ class DerivedNanika2 < AbstractNanika
85
+ use_switch_point :main2
86
+ end
87
+
76
88
  base = { adapter: 'sqlite3' }
77
89
  ActiveRecord::Base.configurations = {
78
90
  'main_readonly' => base.merge(database: 'main_readonly.sqlite3'),
@@ -101,6 +101,35 @@ RSpec.describe SwitchPoint::Model do
101
101
  end
102
102
  end
103
103
 
104
+ context 'when superclass uses use_switch_point' do
105
+ context 'without use_switch_point in derived class' do
106
+ it 'inherits switch_point configuration' do
107
+ expect(DerivedNanika1).to connect_to('main_readonly.sqlite3')
108
+ end
109
+
110
+ it 'shares connection with superclass' do
111
+ expect(DerivedNanika1.connection).to equal(AbstractNanika.connection)
112
+ end
113
+ end
114
+
115
+ context 'with use_switch_point in derived class' do
116
+ it 'overrides superclass' do
117
+ expect(DerivedNanika2).to connect_to('main2_readonly.sqlite3')
118
+ end
119
+ end
120
+
121
+ context 'when superclass changes switch_point' do
122
+ after do
123
+ AbstractNanika.use_switch_point :main
124
+ end
125
+
126
+ it 'follows' do
127
+ AbstractNanika.use_switch_point :main2
128
+ expect(DerivedNanika1).to connect_to('main2_readonly.sqlite3')
129
+ end
130
+ end
131
+ end
132
+
104
133
  context 'without :writable' do
105
134
  it 'sends destructive queries to ActiveRecord::Base' do
106
135
  expect(Nanika1).to connect_to('main_readonly.sqlite3')
@@ -233,9 +262,9 @@ RSpec.describe SwitchPoint::Model do
233
262
  end
234
263
  end
235
264
 
236
- describe '#with_connection' do
265
+ describe '#with_mode' do
237
266
  it 'raises error if unknown mode is given' do
238
- expect { SwitchPoint::ProxyRepository.checkout(:main).with_connection(:typo) }.to raise_error
267
+ expect { SwitchPoint::ProxyRepository.checkout(:main).with_mode(:typo) }.to raise_error
239
268
  end
240
269
  end
241
270
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: switch_point
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.4
4
+ version: 0.5.0.pre
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kohei Suzuki
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-14 00:00:00.000000000 Z
11
+ date: 2014-11-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: appraisal
@@ -128,6 +128,7 @@ files:
128
128
  - gemfiles/rails_3.2.gemfile
129
129
  - gemfiles/rails_4.0.gemfile
130
130
  - gemfiles/rails_4.1.gemfile
131
+ - gemfiles/rails_edge.gemfile
131
132
  - lib/switch_point.rb
132
133
  - lib/switch_point/config.rb
133
134
  - lib/switch_point/connection.rb
@@ -155,9 +156,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
155
156
  version: '0'
156
157
  required_rubygems_version: !ruby/object:Gem::Requirement
157
158
  requirements:
158
- - - ">="
159
+ - - ">"
159
160
  - !ruby/object:Gem::Version
160
- version: '0'
161
+ version: 1.3.1
161
162
  requirements: []
162
163
  rubyforge_project:
163
164
  rubygems_version: 2.2.2