multitenant-mysql 1.2.0 → 1.2.1
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/CHANGELOG.rdoc +3 -0
- data/lib/multitenant-mysql/active_record_extension.rb +9 -5
- data/lib/multitenant-mysql/configs/base.rb +8 -0
- data/lib/multitenant-mysql/db.rb +4 -0
- data/lib/multitenant-mysql/version.rb +1 -1
- data/spec/bucket_spec.rb +28 -0
- data/spec/conf/database.yml +3 -0
- data/spec/rails/active_record_base_spec.rb +23 -3
- data/spec/spec_helper.rb +4 -5
- metadata +6 -2
data/CHANGELOG.rdoc
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
class ActiveRecord::Base
|
|
2
2
|
def self.acts_as_tenants_bucket
|
|
3
3
|
after_create do
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
password = Multitenant::Mysql::DB.configs['password']
|
|
5
|
+
tenant_name = self.send(Multitenant::Mysql.configs.bucket_field)
|
|
6
|
+
connection = Multitenant::Mysql::DB.connection
|
|
7
|
+
connection.execute "GRANT ALL PRIVILEGES ON *.* TO '#{tenant_name}'@'localhost' IDENTIFIED BY '#{password}' WITH GRANT OPTION;"
|
|
8
|
+
connection.execute "flush privileges;"
|
|
8
9
|
end
|
|
9
10
|
end
|
|
10
11
|
|
|
@@ -29,13 +30,16 @@ class ActiveRecord::Base
|
|
|
29
30
|
end
|
|
30
31
|
|
|
31
32
|
def self.inherited(child)
|
|
33
|
+
super
|
|
34
|
+
|
|
32
35
|
model_name = child.to_s
|
|
33
36
|
if Multitenant::Mysql.configs.models.include? model_name
|
|
34
37
|
child.send :acts_as_tenant
|
|
35
38
|
end
|
|
36
39
|
|
|
37
|
-
if Multitenant::Mysql.configs.tenant
|
|
40
|
+
if Multitenant::Mysql.configs.tenant? child
|
|
38
41
|
child.send :acts_as_tenants_bucket
|
|
39
42
|
end
|
|
43
|
+
|
|
40
44
|
end
|
|
41
45
|
end
|
data/lib/multitenant-mysql/db.rb
CHANGED
data/spec/bucket_spec.rb
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Multitenant::Mysql::Configs::Bucket do
|
|
4
|
+
context '#field' do
|
|
5
|
+
subject { Multitenant::Mysql::Configs::Bucket.new('Post') }
|
|
6
|
+
|
|
7
|
+
before do
|
|
8
|
+
create_table('posts')
|
|
9
|
+
Multitenant::Mysql.stub_chain(:configs, :tenant?).and_return(true)
|
|
10
|
+
Multitenant::Mysql.stub_chain(:configs, :models).and_return([])
|
|
11
|
+
class Post < ActiveRecord::Base; end;
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it 'should use default' do
|
|
15
|
+
expect(subject.field).to eql(:name)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
it 'should use specific one' do
|
|
19
|
+
subject.field = 'tenant'
|
|
20
|
+
expect(subject.field).to eql('tenant')
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
it 'should raise error for invalid field' do
|
|
24
|
+
subject.field = 'unexisting column'
|
|
25
|
+
expect { subject.field }.to raise_error(Multitenant::Mysql::InvalidBucketFieldError)
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -11,10 +11,10 @@ describe ActiveRecord::Base do
|
|
|
11
11
|
end
|
|
12
12
|
|
|
13
13
|
it 'should redefine table name and primary key and keep original table name' do
|
|
14
|
-
ActiveRecord::Base.stub_chain(:connection, :table_exists?).and_return(true)
|
|
15
|
-
|
|
16
14
|
Multitenant::Mysql.stub_chain(:configs, :models).and_return(['Book'])
|
|
17
|
-
Multitenant::Mysql.stub_chain(:configs, :tenant).and_return(false)
|
|
15
|
+
Multitenant::Mysql.stub_chain(:configs, :tenant?).and_return(false)
|
|
16
|
+
create_table('books')
|
|
17
|
+
create_view_for_table('books')
|
|
18
18
|
|
|
19
19
|
class Book < ActiveRecord::Base
|
|
20
20
|
end
|
|
@@ -23,4 +23,24 @@ describe ActiveRecord::Base do
|
|
|
23
23
|
expect(Book.primary_key).to eql('id')
|
|
24
24
|
expect(Book.original_table_name).to eql('books')
|
|
25
25
|
end
|
|
26
|
+
|
|
27
|
+
context 'bucket' do
|
|
28
|
+
it 'should create new mysql account' do
|
|
29
|
+
Multitenant::Mysql.stub_chain(:configs, :models).and_return([])
|
|
30
|
+
Multitenant::Mysql.stub_chain(:configs, :tenant?).and_return(true)
|
|
31
|
+
Multitenant::Mysql.stub_chain(:configs, :bucket_field).and_return('name')
|
|
32
|
+
Multitenant::Mysql::DB.stub_chain(:configs, :[]).and_return($cnf['password'])
|
|
33
|
+
|
|
34
|
+
create_table('users')
|
|
35
|
+
create_view_for_table('users')
|
|
36
|
+
class User < ActiveRecord::Base; end;
|
|
37
|
+
|
|
38
|
+
mock_connection = double
|
|
39
|
+
mock_connection.should_receive(:execute).with("GRANT ALL PRIVILEGES ON *.* TO 'default_name'@'localhost' IDENTIFIED BY '#{$cnf['password']}' WITH GRANT OPTION;").once
|
|
40
|
+
mock_connection.should_receive(:execute).with("flush privileges;").once
|
|
41
|
+
Multitenant::Mysql::DB.stub(:connection).and_return(mock_connection)
|
|
42
|
+
|
|
43
|
+
expect(User.create(name: 'default_name', tenant: 'bla bla bla')).to be
|
|
44
|
+
end
|
|
45
|
+
end
|
|
26
46
|
end
|
data/spec/spec_helper.rb
CHANGED
|
@@ -10,13 +10,12 @@ Coveralls.wear!
|
|
|
10
10
|
|
|
11
11
|
GEM_ROOT_PATH = File.expand_path('../../', __FILE__)
|
|
12
12
|
|
|
13
|
+
require 'yaml'
|
|
14
|
+
$cnf = YAML::load_file(File.join(File.dirname(File.expand_path(__FILE__)), './conf/database.yml'))
|
|
15
|
+
ActiveRecord::Base.establish_connection($cnf)
|
|
16
|
+
|
|
13
17
|
RSpec.configure do |config|
|
|
14
18
|
config.before do
|
|
15
|
-
ActiveRecord::Base.establish_connection({
|
|
16
|
-
adapter: 'mysql2',
|
|
17
|
-
username: 'root',
|
|
18
|
-
password: ''
|
|
19
|
-
})
|
|
20
19
|
ActiveRecord::Base.connection.execute('drop database if exists `tenant_test`;')
|
|
21
20
|
ActiveRecord::Base.connection.execute('create database `tenant_test`;')
|
|
22
21
|
ActiveRecord::Base.connection.execute('use `tenant_test`;')
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: multitenant-mysql
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.2.
|
|
4
|
+
version: 1.2.1
|
|
5
5
|
prerelease:
|
|
6
6
|
platform: ruby
|
|
7
7
|
authors:
|
|
@@ -9,7 +9,7 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date: 2013-
|
|
12
|
+
date: 2013-04-02 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: rspec
|
|
@@ -73,6 +73,8 @@ files:
|
|
|
73
73
|
- lib/multitenant-mysql/version.rb
|
|
74
74
|
- multitenant-mysql.gemspec
|
|
75
75
|
- rails/init.rb
|
|
76
|
+
- spec/bucket_spec.rb
|
|
77
|
+
- spec/conf/database.yml
|
|
76
78
|
- spec/configs_spec.rb
|
|
77
79
|
- spec/connection_switcher_spec.rb
|
|
78
80
|
- spec/db_spec.rb
|
|
@@ -109,6 +111,8 @@ signing_key:
|
|
|
109
111
|
specification_version: 3
|
|
110
112
|
summary: Add multi-tenancy to Rails application using MySql views
|
|
111
113
|
test_files:
|
|
114
|
+
- spec/bucket_spec.rb
|
|
115
|
+
- spec/conf/database.yml
|
|
112
116
|
- spec/configs_spec.rb
|
|
113
117
|
- spec/connection_switcher_spec.rb
|
|
114
118
|
- spec/db_spec.rb
|