ar_shard 0.2.3 → 1.0.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.
- checksums.yaml +4 -4
- data/Appraisals +7 -0
- data/CHANGELOG.md +3 -0
- data/Gemfile.lock +10 -10
- data/README.md +31 -4
- data/ar_shard.gemspec +4 -5
- data/gemfiles/.bundle/config +2 -0
- data/gemfiles/rails_5.gemfile +9 -0
- data/gemfiles/rails_5.gemfile.lock +49 -0
- data/gemfiles/rails_6.gemfile +9 -0
- data/gemfiles/rails_6.gemfile.lock +49 -0
- data/lib/ar_shard/active_record.rb +11 -2
- data/lib/ar_shard/version.rb +1 -1
- metadata +23 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 53c8a38a9c28498c974beb9599fbc5487ed5675565cbe779fff0c8eafa728225
|
4
|
+
data.tar.gz: b486fafe4cef8535a1e6a84bbe9d5e1411e5ca9371fcba8b53e5cddbb7cc41f5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 675548c725fab7f9de04f0808ef2af806bdd0453a9a4e9ba83f84301f36bc35999a106c26be335ad2e45dfd0e4818d2c4c80525eec40313950512071bd3bb483
|
7
|
+
data.tar.gz: 8c33acf1a6deb0fc423e757a869b17bc9d4cffed952dabd899162959096f956446cbfeeb05152bbaa5be464c2b127380e9607bc0c7f6ca686a51a1f2f22013f5
|
data/Appraisals
ADDED
data/CHANGELOG.md
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
ar_shard (0.
|
5
|
-
activerecord (>=
|
4
|
+
ar_shard (1.0.0)
|
5
|
+
activerecord (>= 5.2, < 7)
|
6
6
|
|
7
7
|
GEM
|
8
8
|
remote: https://rubygems.org/
|
@@ -18,17 +18,17 @@ GEM
|
|
18
18
|
minitest (~> 5.1)
|
19
19
|
tzinfo (~> 1.1)
|
20
20
|
zeitwerk (~> 2.2, >= 2.2.2)
|
21
|
-
|
21
|
+
appraisal (2.3.0)
|
22
|
+
bundler
|
23
|
+
rake
|
24
|
+
thor (>= 0.14.0)
|
22
25
|
concurrent-ruby (1.1.7)
|
23
26
|
i18n (1.8.5)
|
24
27
|
concurrent-ruby (~> 1.0)
|
25
|
-
|
26
|
-
|
27
|
-
pry (0.13.1)
|
28
|
-
coderay (~> 1.1)
|
29
|
-
method_source (~> 1.0)
|
30
|
-
rake (12.3.2)
|
28
|
+
minitest (5.14.1)
|
29
|
+
rake (12.3.3)
|
31
30
|
sqlite3 (1.4.2)
|
31
|
+
thor (1.0.1)
|
32
32
|
thread_safe (0.3.6)
|
33
33
|
tzinfo (1.2.7)
|
34
34
|
thread_safe (~> 0.1)
|
@@ -38,9 +38,9 @@ PLATFORMS
|
|
38
38
|
ruby
|
39
39
|
|
40
40
|
DEPENDENCIES
|
41
|
+
appraisal (~> 2.3)
|
41
42
|
ar_shard!
|
42
43
|
minitest (~> 5.0)
|
43
|
-
pry
|
44
44
|
rake (~> 12.0)
|
45
45
|
sqlite3 (~> 1.4)
|
46
46
|
|
data/README.md
CHANGED
@@ -1,20 +1,25 @@
|
|
1
1
|
# AR Shard
|
2
2
|
|
3
|
-
AR Shard is non-intrusive extenstion for ActiveRecord to add threadsafe Model based sharding or just multidatabase connection. As this gem uses connection_handlers it can work only with ActiveRecord
|
3
|
+
AR Shard is non-intrusive extenstion for ActiveRecord to add threadsafe Model based sharding or just multidatabase connection. As this gem uses connection_handlers it can work only with ActiveRecord version 5 and above.
|
4
4
|
|
5
5
|
## Features
|
6
|
+
- Multiple Databases support for Rails5
|
7
|
+
- Define config as a Proc
|
6
8
|
- Shard only part of you ActiveRecord w/o sharing connection
|
7
9
|
- Work with you Sharded Model and AR model at the same time
|
8
10
|
- Threadsafe. Battle-tested with Sidekiq and 4 mixed Databases
|
9
|
-
- Define config as a Proc. `Due to nature of connection_handlers all DB connections are established at boot time`
|
10
11
|
|
12
|
+
## Limitations
|
13
|
+
- Doesn't care about migrations
|
14
|
+
- Due to nature of connection_handlers all DB connections are established at boot time
|
15
|
+
- if data structure is different between databases you should use `ModelName.reset_column_information`
|
11
16
|
|
12
17
|
## Installation
|
13
18
|
|
14
19
|
Add this line to your application’s Gemfile:
|
15
20
|
|
16
21
|
```ruby
|
17
|
-
gem 'ar_shard', '~> 0
|
22
|
+
gem 'ar_shard', '~> 1.0'
|
18
23
|
```
|
19
24
|
|
20
25
|
## Usage
|
@@ -43,6 +48,28 @@ class ShardRecord < ActiveRecord::Base
|
|
43
48
|
end
|
44
49
|
```
|
45
50
|
|
51
|
+
Where `shards.yml` is like:
|
52
|
+
|
53
|
+
```yaml
|
54
|
+
- shard_1:
|
55
|
+
adapter: mysql2
|
56
|
+
host: blabla
|
57
|
+
username: blabla
|
58
|
+
password: secret
|
59
|
+
database: remote_database_name
|
60
|
+
port: 3306
|
61
|
+
pool: 10
|
62
|
+
- shard_2:
|
63
|
+
adapter: postgresql
|
64
|
+
host: blabla
|
65
|
+
username: blabla
|
66
|
+
password: secret
|
67
|
+
database: shard_name
|
68
|
+
port: 5432
|
69
|
+
pool: 10
|
70
|
+
```
|
71
|
+
|
72
|
+
|
46
73
|
given we have models like:
|
47
74
|
|
48
75
|
```ruby
|
@@ -81,7 +108,7 @@ To get started with development:
|
|
81
108
|
git clone https://github.com/noma4i/ar_shard.git
|
82
109
|
cd ar_shard
|
83
110
|
bundle install
|
84
|
-
bundle exec rake test
|
111
|
+
bundle exec appraisal rake test
|
85
112
|
```
|
86
113
|
|
87
114
|
## License
|
data/ar_shard.gemspec
CHANGED
@@ -13,19 +13,18 @@ Gem::Specification.new do |spec|
|
|
13
13
|
spec.required_ruby_version = Gem::Requirement.new('>= 2.3.0')
|
14
14
|
|
15
15
|
spec.metadata['homepage_uri'] = spec.homepage
|
16
|
-
spec.metadata['source_code_uri'] =
|
16
|
+
spec.metadata['source_code_uri'] = spec.homepage
|
17
17
|
|
18
|
-
# Specify which files should be added to the gem when it is released.
|
19
|
-
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
20
18
|
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
21
19
|
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
22
20
|
end
|
21
|
+
|
23
22
|
spec.bindir = 'exe'
|
24
23
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
25
24
|
spec.require_paths = ['lib']
|
26
25
|
|
27
|
-
spec.add_dependency 'activerecord', '>=
|
26
|
+
spec.add_dependency 'activerecord', ['>= 5.2', '< 7']
|
28
27
|
|
29
|
-
spec.add_development_dependency 'pry'
|
30
28
|
spec.add_development_dependency 'sqlite3', '~> 1.4'
|
29
|
+
spec.add_development_dependency 'appraisal', '~> 2.3'
|
31
30
|
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
PATH
|
2
|
+
remote: ..
|
3
|
+
specs:
|
4
|
+
ar_shard (1.0.0)
|
5
|
+
activerecord (>= 5.2, < 7)
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: https://rubygems.org/
|
9
|
+
specs:
|
10
|
+
activemodel (5.2.4.3)
|
11
|
+
activesupport (= 5.2.4.3)
|
12
|
+
activerecord (5.2.4.3)
|
13
|
+
activemodel (= 5.2.4.3)
|
14
|
+
activesupport (= 5.2.4.3)
|
15
|
+
arel (>= 9.0)
|
16
|
+
activesupport (5.2.4.3)
|
17
|
+
concurrent-ruby (~> 1.0, >= 1.0.2)
|
18
|
+
i18n (>= 0.7, < 2)
|
19
|
+
minitest (~> 5.1)
|
20
|
+
tzinfo (~> 1.1)
|
21
|
+
appraisal (2.3.0)
|
22
|
+
bundler
|
23
|
+
rake
|
24
|
+
thor (>= 0.14.0)
|
25
|
+
arel (9.0.0)
|
26
|
+
concurrent-ruby (1.1.7)
|
27
|
+
i18n (1.8.5)
|
28
|
+
concurrent-ruby (~> 1.0)
|
29
|
+
minitest (5.11.3)
|
30
|
+
rake (12.3.3)
|
31
|
+
sqlite3 (1.4.2)
|
32
|
+
thor (1.0.1)
|
33
|
+
thread_safe (0.3.6)
|
34
|
+
tzinfo (1.2.7)
|
35
|
+
thread_safe (~> 0.1)
|
36
|
+
|
37
|
+
PLATFORMS
|
38
|
+
ruby
|
39
|
+
|
40
|
+
DEPENDENCIES
|
41
|
+
activerecord (~> 5.0)
|
42
|
+
appraisal (~> 2.3)
|
43
|
+
ar_shard!
|
44
|
+
minitest (~> 5.0)
|
45
|
+
rake (~> 12.0)
|
46
|
+
sqlite3 (~> 1.4)
|
47
|
+
|
48
|
+
BUNDLED WITH
|
49
|
+
1.17.3
|
@@ -0,0 +1,49 @@
|
|
1
|
+
PATH
|
2
|
+
remote: ..
|
3
|
+
specs:
|
4
|
+
ar_shard (1.0.0)
|
5
|
+
activerecord (>= 5.2, < 7)
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: https://rubygems.org/
|
9
|
+
specs:
|
10
|
+
activemodel (6.0.3.2)
|
11
|
+
activesupport (= 6.0.3.2)
|
12
|
+
activerecord (6.0.3.2)
|
13
|
+
activemodel (= 6.0.3.2)
|
14
|
+
activesupport (= 6.0.3.2)
|
15
|
+
activesupport (6.0.3.2)
|
16
|
+
concurrent-ruby (~> 1.0, >= 1.0.2)
|
17
|
+
i18n (>= 0.7, < 2)
|
18
|
+
minitest (~> 5.1)
|
19
|
+
tzinfo (~> 1.1)
|
20
|
+
zeitwerk (~> 2.2, >= 2.2.2)
|
21
|
+
appraisal (2.3.0)
|
22
|
+
bundler
|
23
|
+
rake
|
24
|
+
thor (>= 0.14.0)
|
25
|
+
concurrent-ruby (1.1.7)
|
26
|
+
i18n (1.8.5)
|
27
|
+
concurrent-ruby (~> 1.0)
|
28
|
+
minitest (5.11.3)
|
29
|
+
rake (12.3.3)
|
30
|
+
sqlite3 (1.4.2)
|
31
|
+
thor (1.0.1)
|
32
|
+
thread_safe (0.3.6)
|
33
|
+
tzinfo (1.2.7)
|
34
|
+
thread_safe (~> 0.1)
|
35
|
+
zeitwerk (2.4.0)
|
36
|
+
|
37
|
+
PLATFORMS
|
38
|
+
ruby
|
39
|
+
|
40
|
+
DEPENDENCIES
|
41
|
+
activerecord (~> 6.0)
|
42
|
+
appraisal (~> 2.3)
|
43
|
+
ar_shard!
|
44
|
+
minitest (~> 5.0)
|
45
|
+
rake (~> 12.0)
|
46
|
+
sqlite3 (~> 1.4)
|
47
|
+
|
48
|
+
BUNDLED WITH
|
49
|
+
1.17.3
|
@@ -14,6 +14,8 @@ module ActiveRecord
|
|
14
14
|
end
|
15
15
|
|
16
16
|
module ConnectionHandling
|
17
|
+
mattr_accessor :connection_handlers, instance_accessor: false, default: {}
|
18
|
+
|
17
19
|
def connected_shards(shards: nil)
|
18
20
|
@connected_shards ||= begin
|
19
21
|
config_data = parse_config(shards)
|
@@ -45,14 +47,21 @@ module ActiveRecord
|
|
45
47
|
end
|
46
48
|
|
47
49
|
def lookup_connect(handler_key)
|
48
|
-
connection_handlers
|
50
|
+
if defined?(connection_handlers)
|
51
|
+
connection_handlers[handler_key] ||= ActiveRecord::ConnectionAdapters::ConnectionHandler.new
|
52
|
+
else
|
53
|
+
@@connection_handlers[handler_key] ||= ActiveRecord::ConnectionAdapters::ConnectionHandler.new
|
54
|
+
end
|
49
55
|
end
|
50
56
|
|
51
57
|
def with_shard(handler_key, &blk)
|
52
58
|
shard_model.isolated_connection = connected_shards[handler_key].connection
|
53
|
-
yield
|
59
|
+
return_value = yield
|
60
|
+
return_value.load if return_value.is_a? ActiveRecord::Relation
|
61
|
+
return_value
|
54
62
|
ensure
|
55
63
|
shard_model.isolated_connection = nil
|
56
64
|
end
|
57
65
|
end
|
58
66
|
end
|
67
|
+
|
data/lib/ar_shard/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ar_shard
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alex Tsirel
|
@@ -16,42 +16,48 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '5.2'
|
20
|
+
- - "<"
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '7'
|
20
23
|
type: :runtime
|
21
24
|
prerelease: false
|
22
25
|
version_requirements: !ruby/object:Gem::Requirement
|
23
26
|
requirements:
|
24
27
|
- - ">="
|
25
28
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
29
|
+
version: '5.2'
|
30
|
+
- - "<"
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '7'
|
27
33
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
34
|
+
name: sqlite3
|
29
35
|
requirement: !ruby/object:Gem::Requirement
|
30
36
|
requirements:
|
31
|
-
- - "
|
37
|
+
- - "~>"
|
32
38
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
39
|
+
version: '1.4'
|
34
40
|
type: :development
|
35
41
|
prerelease: false
|
36
42
|
version_requirements: !ruby/object:Gem::Requirement
|
37
43
|
requirements:
|
38
|
-
- - "
|
44
|
+
- - "~>"
|
39
45
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
46
|
+
version: '1.4'
|
41
47
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
48
|
+
name: appraisal
|
43
49
|
requirement: !ruby/object:Gem::Requirement
|
44
50
|
requirements:
|
45
51
|
- - "~>"
|
46
52
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
53
|
+
version: '2.3'
|
48
54
|
type: :development
|
49
55
|
prerelease: false
|
50
56
|
version_requirements: !ruby/object:Gem::Requirement
|
51
57
|
requirements:
|
52
58
|
- - "~>"
|
53
59
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
60
|
+
version: '2.3'
|
55
61
|
description: Isolated Multibase Support for ActiveRecord Models with dynamic config
|
56
62
|
email:
|
57
63
|
- noma4i@gmail.com
|
@@ -61,6 +67,7 @@ extra_rdoc_files: []
|
|
61
67
|
files:
|
62
68
|
- ".gitignore"
|
63
69
|
- ".travis.yml"
|
70
|
+
- Appraisals
|
64
71
|
- CHANGELOG.md
|
65
72
|
- Gemfile
|
66
73
|
- Gemfile.lock
|
@@ -70,6 +77,11 @@ files:
|
|
70
77
|
- ar_shard.gemspec
|
71
78
|
- bin/console
|
72
79
|
- bin/setup
|
80
|
+
- gemfiles/.bundle/config
|
81
|
+
- gemfiles/rails_5.gemfile
|
82
|
+
- gemfiles/rails_5.gemfile.lock
|
83
|
+
- gemfiles/rails_6.gemfile
|
84
|
+
- gemfiles/rails_6.gemfile.lock
|
73
85
|
- lib/ar_shard.rb
|
74
86
|
- lib/ar_shard/active_record.rb
|
75
87
|
- lib/ar_shard/version.rb
|