apartment 0.19.0 → 0.20.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.
- data/.travis.yml +1 -0
- data/Gemfile +13 -1
- data/HISTORY.md +17 -0
- data/README.md +4 -1
- data/apartment.gemspec +8 -20
- data/lib/apartment.rb +13 -4
- data/lib/apartment/adapters/abstract_adapter.rb +2 -1
- data/lib/apartment/adapters/mysql2_adapter.rb +54 -2
- data/lib/apartment/database.rb +5 -4
- data/lib/apartment/delayed_job/enqueue.rb +7 -1
- data/lib/apartment/delayed_job/psych_ext.rb +61 -0
- data/lib/apartment/delayed_job/requirements.rb +1 -1
- data/lib/apartment/delayed_job/{active_record.rb → syck_ext.rb} +0 -0
- data/lib/apartment/version.rb +1 -1
- data/spec/adapters/mysql2_adapter_spec.rb +35 -5
- data/spec/adapters/postgresql_adapter_spec.rb +4 -4
- data/spec/dummy/config/boot.rb +0 -3
- data/spec/examples/{db_adapter_examples.rb → connection_adapter_examples.rb} +1 -3
- data/spec/examples/generic_adapter_examples.rb +6 -0
- data/spec/support/config.rb +2 -3
- data/spec/support/requirements.rb +10 -1
- metadata +70 -184
- data/.DS_Store +0 -0
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
@@ -1,3 +1,15 @@
|
|
1
|
-
source
|
1
|
+
source 'http://rubygems.org'
|
2
2
|
|
3
3
|
gemspec
|
4
|
+
|
5
|
+
gem 'pry'
|
6
|
+
gem 'rails', '>= 3.1.2'
|
7
|
+
gem 'rake', '~> 0.9.2'
|
8
|
+
gem 'sqlite3'
|
9
|
+
gem 'rspec', '~> 2.11'
|
10
|
+
gem 'rspec-rails', '~> 2.11'
|
11
|
+
gem 'capybara', '~> 1.0'
|
12
|
+
gem 'pg', '>= 0.11.0'
|
13
|
+
gem 'mysql2', '~> 0.3.10'
|
14
|
+
gem 'delayed_job', '~> 3.0'
|
15
|
+
gem 'delayed_job_active_record'
|
data/HISTORY.md
CHANGED
@@ -1,3 +1,20 @@
|
|
1
|
+
# 0.20.0
|
2
|
+
* Feb 6, 2013
|
3
|
+
|
4
|
+
- Mysql now has a 'schema like' option to perform like Postgresql (default)
|
5
|
+
- This should be significantly more performant than using connections
|
6
|
+
- Psych is now supported for Delayed::Job yaml parsing
|
7
|
+
|
8
|
+
# 0.19.2
|
9
|
+
* Jan 30, 2013
|
10
|
+
|
11
|
+
- Database schema file can now be set manually or skipped altogether
|
12
|
+
|
13
|
+
# 0.19.1
|
14
|
+
* Jan 30, 2013
|
15
|
+
|
16
|
+
- Allow schema.rb import file to be specified in config or skip schema.rb import altogether
|
17
|
+
|
1
18
|
# 0.19.0
|
2
19
|
* Dec 29, 2012
|
3
20
|
|
data/README.md
CHANGED
@@ -187,7 +187,10 @@ and test environments. If you wish to turn this option off in production, you c
|
|
187
187
|
## Delayed::Job
|
188
188
|
|
189
189
|
If using Rails ~> 3.2, you *must* use `delayed_job ~> 3.0`. It has better Rails 3 support plus has some major changes that affect the serialization of models.
|
190
|
-
|
190
|
+
|
191
|
+
### If using Ruby 1.9.3-p362 you MUST use psych as your parser. YAML seems to fall down using syck
|
192
|
+
|
193
|
+
### If you're using syck on an earlier version of ruby, here's what you must do (in a rails app for instance)
|
191
194
|
This can be done in the `boot.rb` of your rails config *just above* where Bundler requires the gems from the Gemfile. It will look something like:
|
192
195
|
|
193
196
|
require 'rubygems'
|
data/apartment.gemspec
CHANGED
@@ -6,30 +6,18 @@ Gem::Specification.new do |s|
|
|
6
6
|
s.name = %q{apartment}
|
7
7
|
s.version = Apartment::VERSION
|
8
8
|
|
9
|
-
s.authors
|
10
|
-
s.summary
|
11
|
-
s.description
|
12
|
-
s.email
|
13
|
-
s.files = `git ls-files`.split(
|
14
|
-
s.
|
9
|
+
s.authors = ["Ryan Brunner", "Brad Robertson"]
|
10
|
+
s.summary = %q{A Ruby gem for managing database multitenancy}
|
11
|
+
s.description = %q{Apartment allows Rack applications to deal with database multitenancy through ActiveRecord}
|
12
|
+
s.email = ["ryan@influitive.com", "brad@influitive.com"]
|
13
|
+
s.files = `git ls-files`.split($/)
|
14
|
+
s.executables = s.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
15
|
+
s.test_files = s.files.grep(%r{^(test|spec|features)/})
|
16
|
+
s.require_paths = ["lib"]
|
15
17
|
|
16
18
|
s.homepage = %q{https://github.com/influitive/apartment}
|
17
19
|
s.licenses = ["MIT"]
|
18
|
-
s.require_paths = ["lib"]
|
19
|
-
s.rubygems_version = %q{1.3.7}
|
20
20
|
|
21
21
|
s.add_dependency 'activerecord', '>= 3.1.2' # must be >= 3.1.2 due to bug in prepared_statements
|
22
22
|
s.add_dependency 'rack', '>= 1.3.6'
|
23
|
-
|
24
|
-
s.add_development_dependency 'pry', '~> 0.9.9'
|
25
|
-
s.add_development_dependency 'rails', '>= 3.1.2'
|
26
|
-
s.add_development_dependency 'rake', '~> 0.9.2'
|
27
|
-
s.add_development_dependency 'sqlite3'
|
28
|
-
s.add_development_dependency 'rspec', '~> 2.11'
|
29
|
-
s.add_development_dependency 'rspec-rails', '~> 2.11'
|
30
|
-
s.add_development_dependency 'capybara', '~> 1.0.0'
|
31
|
-
s.add_development_dependency 'pg', '>= 0.11.0'
|
32
|
-
s.add_development_dependency 'mysql2', '~> 0.3.10'
|
33
|
-
s.add_development_dependency 'delayed_job', '~> 3.0'
|
34
|
-
s.add_development_dependency 'delayed_job_active_record'
|
35
23
|
end
|
data/lib/apartment.rb
CHANGED
@@ -1,17 +1,20 @@
|
|
1
1
|
require 'apartment/railtie' if defined?(Rails)
|
2
|
-
require 'active_support/core_ext/module/delegation'
|
3
2
|
require 'active_support/core_ext/object/blank'
|
3
|
+
require 'forwardable'
|
4
4
|
|
5
5
|
module Apartment
|
6
6
|
|
7
7
|
class << self
|
8
|
+
|
9
|
+
extend Forwardable
|
10
|
+
|
8
11
|
ACCESSOR_METHODS = [:use_schemas, :seed_after_create, :prepend_environment, :append_environment]
|
9
|
-
WRITER_METHODS = [:database_names, :excluded_models, :default_schema, :persistent_schemas, :connection_class]
|
12
|
+
WRITER_METHODS = [:database_names, :database_schema_file, :excluded_models, :default_schema, :persistent_schemas, :connection_class]
|
10
13
|
|
11
14
|
attr_accessor(*ACCESSOR_METHODS)
|
12
15
|
attr_writer(*WRITER_METHODS)
|
13
16
|
|
14
|
-
|
17
|
+
def_delegators :connection_class, :connection, :establish_connection
|
15
18
|
|
16
19
|
# configure apartment with available options
|
17
20
|
def configure
|
@@ -40,9 +43,15 @@ module Apartment
|
|
40
43
|
@connection_class || ActiveRecord::Base
|
41
44
|
end
|
42
45
|
|
46
|
+
def database_schema_file
|
47
|
+
return @database_schema_file if defined?(@database_schema_file)
|
48
|
+
|
49
|
+
@database_schema_file = Rails.root.join('db', 'schema.rb')
|
50
|
+
end
|
51
|
+
|
43
52
|
# Reset all the config for Apartment
|
44
53
|
def reset
|
45
|
-
(ACCESSOR_METHODS + WRITER_METHODS).each{|method|
|
54
|
+
(ACCESSOR_METHODS + WRITER_METHODS).each{|method| remove_instance_variable(:"@#{method}") if instance_variable_defined?(:"@#{method}") }
|
46
55
|
end
|
47
56
|
|
48
57
|
def use_postgres_schemas
|
@@ -157,7 +157,8 @@ module Apartment
|
|
157
157
|
#
|
158
158
|
def import_database_schema
|
159
159
|
ActiveRecord::Schema.verbose = false # do not log schema load output.
|
160
|
-
|
160
|
+
|
161
|
+
load_or_abort(Apartment.database_schema_file) if Apartment.database_schema_file
|
161
162
|
end
|
162
163
|
|
163
164
|
# Return a new config that is multi-tenanted
|
@@ -3,7 +3,9 @@ module Apartment
|
|
3
3
|
module Database
|
4
4
|
|
5
5
|
def self.mysql2_adapter(config)
|
6
|
-
|
6
|
+
Apartment.use_schemas ?
|
7
|
+
Adapters::Mysql2SchemaAdapter.new(config) :
|
8
|
+
Adapters::Mysql2Adapter.new(config)
|
7
9
|
end
|
8
10
|
end
|
9
11
|
|
@@ -19,12 +21,62 @@ module Apartment
|
|
19
21
|
#
|
20
22
|
# @param {String} database Database name
|
21
23
|
#
|
22
|
-
def connect_to_new(database)
|
24
|
+
def connect_to_new(database = nil)
|
23
25
|
super
|
24
26
|
rescue Mysql2::Error
|
25
27
|
Apartment::Database.reset
|
26
28
|
raise DatabaseNotFound, "Cannot find database #{environmentify(database)}"
|
27
29
|
end
|
28
30
|
end
|
31
|
+
|
32
|
+
class Mysql2SchemaAdapter < AbstractAdapter
|
33
|
+
attr_reader :default_database
|
34
|
+
|
35
|
+
def initialize(config)
|
36
|
+
@default_database = config[:database]
|
37
|
+
|
38
|
+
super
|
39
|
+
end
|
40
|
+
|
41
|
+
# Reset current_database to the default_database
|
42
|
+
#
|
43
|
+
def reset
|
44
|
+
connect_to_new(default_database)
|
45
|
+
end
|
46
|
+
|
47
|
+
# Set the table_name to always use the default database for excluded models
|
48
|
+
#
|
49
|
+
def process_excluded_models
|
50
|
+
Apartment.excluded_models.each{ |model| process_excluded_model(model) }
|
51
|
+
end
|
52
|
+
|
53
|
+
protected
|
54
|
+
|
55
|
+
# Set schema current_database to new db
|
56
|
+
#
|
57
|
+
def connect_to_new(database)
|
58
|
+
return reset if database.nil?
|
59
|
+
|
60
|
+
Apartment.connection.execute "use #{database}"
|
61
|
+
|
62
|
+
rescue ActiveRecord::StatementInvalid
|
63
|
+
Apartment::Database.reset
|
64
|
+
raise DatabaseNotFound, "Cannot find database #{environmentify(database)}"
|
65
|
+
end
|
66
|
+
|
67
|
+
def process_excluded_model(model)
|
68
|
+
model.constantize.tap do |klass|
|
69
|
+
# some models (such as delayed_job) seem to load and cache their column names before this,
|
70
|
+
# so would never get the default prefix, so reset first
|
71
|
+
klass.reset_column_information
|
72
|
+
|
73
|
+
# Ensure that if a schema *was* set, we override
|
74
|
+
table_name = klass.table_name.split('.', 2).last
|
75
|
+
|
76
|
+
# Not sure why, but Delayed::Job somehow ignores table_name_prefix... so we'll just manually set table name instead
|
77
|
+
klass.table_name = "#{default_database}.#{table_name}"
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
29
81
|
end
|
30
82
|
end
|
data/lib/apartment/database.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require '
|
1
|
+
require 'forwardable'
|
2
2
|
|
3
3
|
module Apartment
|
4
4
|
|
@@ -7,8 +7,9 @@ module Apartment
|
|
7
7
|
module Database
|
8
8
|
|
9
9
|
extend self
|
10
|
+
extend Forwardable
|
10
11
|
|
11
|
-
|
12
|
+
def_delegators :adapter, :create, :current_database, :current, :drop, :process, :process_excluded_models, :reset, :seed, :switch
|
12
13
|
|
13
14
|
attr_writer :config
|
14
15
|
|
@@ -42,9 +43,9 @@ module Apartment
|
|
42
43
|
|
43
44
|
# Reset config and adapter so they are regenerated
|
44
45
|
#
|
45
|
-
def reload!
|
46
|
+
def reload!(config = nil)
|
46
47
|
Thread.current[:apartment_adapter] = nil
|
47
|
-
@config =
|
48
|
+
@config = config
|
48
49
|
end
|
49
50
|
|
50
51
|
private
|
@@ -1,5 +1,11 @@
|
|
1
1
|
require 'delayed_job'
|
2
|
-
require '
|
2
|
+
require 'yaml'
|
3
|
+
|
4
|
+
if YAML.parser.class.name =~ /syck|yecht/i
|
5
|
+
require 'apartment/delayed_job/syck_ext'
|
6
|
+
else
|
7
|
+
require 'apartment/delayed_job/psych_ext'
|
8
|
+
end
|
3
9
|
|
4
10
|
module Apartment
|
5
11
|
module Delayed
|
@@ -0,0 +1,61 @@
|
|
1
|
+
if defined?(ActiveRecord)
|
2
|
+
class ActiveRecord::Base
|
3
|
+
# @override
|
4
|
+
# serialize to YAML
|
5
|
+
def encode_with(coder)
|
6
|
+
coder["attributes"] = @attributes
|
7
|
+
coder["database"] = @database unless @database.nil?
|
8
|
+
coder.tag = ['!ruby/ActiveRecord', self.class.name].join(':')
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
module Psych
|
14
|
+
module Visitors
|
15
|
+
class ToRuby
|
16
|
+
# @override
|
17
|
+
#
|
18
|
+
# NOTE I don't have a great idea what's going on here...
|
19
|
+
# The only change is the `Apartment::Database.process`
|
20
|
+
#
|
21
|
+
def visit_Psych_Nodes_Mapping_with_class_and_db(object)
|
22
|
+
return revive(Psych.load_tags[object.tag], object) if Psych.load_tags[object.tag]
|
23
|
+
|
24
|
+
case object.tag
|
25
|
+
when /^!ruby\/ActiveRecord:(.+)$/
|
26
|
+
klass = resolve_class($1)
|
27
|
+
payload = Hash[*object.children.map { |c| accept c }]
|
28
|
+
id = payload["attributes"][klass.primary_key]
|
29
|
+
begin
|
30
|
+
Apartment::Database.process(payload['database']) do
|
31
|
+
klass.unscoped.find(id)
|
32
|
+
end
|
33
|
+
rescue ActiveRecord::RecordNotFound
|
34
|
+
raise Delayed::DeserializationError
|
35
|
+
end
|
36
|
+
when /^!ruby\/Mongoid:(.+)$/
|
37
|
+
klass = resolve_class($1)
|
38
|
+
payload = Hash[*object.children.map { |c| accept c }]
|
39
|
+
begin
|
40
|
+
klass.find(payload["attributes"]["_id"])
|
41
|
+
rescue Mongoid::Errors::DocumentNotFound
|
42
|
+
raise Delayed::DeserializationError
|
43
|
+
end
|
44
|
+
when /^!ruby\/DataMapper:(.+)$/
|
45
|
+
klass = resolve_class($1)
|
46
|
+
payload = Hash[*object.children.map { |c| accept c }]
|
47
|
+
begin
|
48
|
+
primary_keys = klass.properties.select { |p| p.key? }
|
49
|
+
key_names = primary_keys.map { |p| p.name.to_s }
|
50
|
+
klass.get!(*key_names.map { |k| payload["attributes"][k] })
|
51
|
+
rescue DataMapper::ObjectNotFoundError
|
52
|
+
raise Delayed::DeserializationError
|
53
|
+
end
|
54
|
+
else
|
55
|
+
visit_Psych_Nodes_Mapping_without_class_and_db(object)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
alias_method_chain :visit_Psych_Nodes_Mapping, :class_and_db
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
File without changes
|
data/lib/apartment/version.rb
CHANGED
@@ -3,8 +3,8 @@ require 'apartment/adapters/mysql2_adapter'
|
|
3
3
|
|
4
4
|
describe Apartment::Adapters::Mysql2Adapter do
|
5
5
|
|
6
|
-
let(:config){ Apartment::Test.config['connections']['mysql'] }
|
7
|
-
subject{ Apartment::Database.mysql2_adapter config
|
6
|
+
let(:config){ Apartment::Test.config['connections']['mysql'].symbolize_keys }
|
7
|
+
subject(:adapter){ Apartment::Database.mysql2_adapter config }
|
8
8
|
|
9
9
|
def database_names
|
10
10
|
ActiveRecord::Base.connection.execute("SELECT schema_name FROM information_schema.schemata").collect{|row| row[0]}
|
@@ -12,6 +12,36 @@ describe Apartment::Adapters::Mysql2Adapter do
|
|
12
12
|
|
13
13
|
let(:default_database){ subject.process{ ActiveRecord::Base.connection.current_database } }
|
14
14
|
|
15
|
-
|
16
|
-
|
17
|
-
|
15
|
+
context "using - the equivalent of - schemas" do
|
16
|
+
before { Apartment.use_schemas = true }
|
17
|
+
|
18
|
+
it_should_behave_like "a generic apartment adapter"
|
19
|
+
|
20
|
+
describe "#default_database" do
|
21
|
+
its(:default_database){ should == config[:database] }
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "#init" do
|
25
|
+
include Apartment::Spec::AdapterRequirements
|
26
|
+
|
27
|
+
before do
|
28
|
+
Apartment.configure do |config|
|
29
|
+
config.excluded_models = ["Company"]
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should process model exclusions" do
|
34
|
+
Apartment::Database.init
|
35
|
+
|
36
|
+
Company.table_name.should == "#{default_database}.companies"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
context "using connections" do
|
42
|
+
before { Apartment.use_schemas = false }
|
43
|
+
|
44
|
+
it_should_behave_like "a generic apartment adapter"
|
45
|
+
it_should_behave_like "a connection based apartment adapter"
|
46
|
+
end
|
47
|
+
end
|
@@ -3,8 +3,8 @@ require 'apartment/adapters/postgresql_adapter'
|
|
3
3
|
|
4
4
|
describe Apartment::Adapters::PostgresqlAdapter do
|
5
5
|
|
6
|
-
let(:config){ Apartment::Test.config['connections']['postgresql'] }
|
7
|
-
subject{ Apartment::Database.postgresql_adapter config
|
6
|
+
let(:config){ Apartment::Test.config['connections']['postgresql'].symbolize_keys }
|
7
|
+
subject{ Apartment::Database.postgresql_adapter config }
|
8
8
|
|
9
9
|
context "using schemas" do
|
10
10
|
|
@@ -21,7 +21,7 @@ describe Apartment::Adapters::PostgresqlAdapter do
|
|
21
21
|
it_should_behave_like "a schema based apartment adapter"
|
22
22
|
end
|
23
23
|
|
24
|
-
context "using
|
24
|
+
context "using connections" do
|
25
25
|
|
26
26
|
before{ Apartment.use_schemas = false }
|
27
27
|
|
@@ -33,6 +33,6 @@ describe Apartment::Adapters::PostgresqlAdapter do
|
|
33
33
|
let(:default_database){ subject.process{ ActiveRecord::Base.connection.current_database } }
|
34
34
|
|
35
35
|
it_should_behave_like "a generic apartment adapter"
|
36
|
-
it_should_behave_like "a
|
36
|
+
it_should_behave_like "a connection based apartment adapter"
|
37
37
|
end
|
38
38
|
end
|
data/spec/dummy/config/boot.rb
CHANGED
@@ -1,17 +1,15 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
shared_examples_for "a
|
3
|
+
shared_examples_for "a connection based apartment adapter" do
|
4
4
|
include Apartment::Spec::AdapterRequirements
|
5
5
|
|
6
6
|
let(:default_database){ subject.process{ ActiveRecord::Base.connection.current_database } }
|
7
7
|
|
8
8
|
describe "#init" do
|
9
|
-
|
10
9
|
it "should process model exclusions" do
|
11
10
|
Apartment.configure do |config|
|
12
11
|
config.excluded_models = ["Company"]
|
13
12
|
end
|
14
|
-
|
15
13
|
Apartment::Database.init
|
16
14
|
|
17
15
|
Company.connection.object_id.should_not == ActiveRecord::Base.connection.object_id
|
@@ -89,6 +89,12 @@ shared_examples_for "a generic apartment adapter" do
|
|
89
89
|
subject.switch
|
90
90
|
subject.current_database.should == default_database
|
91
91
|
end
|
92
|
+
|
93
|
+
it "should raise an error if database is invalid" do
|
94
|
+
expect {
|
95
|
+
subject.switch 'unknown_database'
|
96
|
+
}.to raise_error(Apartment::ApartmentError)
|
97
|
+
end
|
92
98
|
end
|
93
99
|
|
94
100
|
describe "#current_database" do
|
data/spec/support/config.rb
CHANGED
@@ -16,7 +16,9 @@ module Apartment
|
|
16
16
|
let(:connection){ ActiveRecord::Base.connection }
|
17
17
|
|
18
18
|
before do
|
19
|
+
Apartment::Database.reload!(config.symbolize_keys)
|
19
20
|
ActiveRecord::Base.establish_connection config
|
21
|
+
|
20
22
|
subject.create(db1)
|
21
23
|
subject.create(db2)
|
22
24
|
end
|
@@ -29,8 +31,15 @@ module Apartment
|
|
29
31
|
subject.drop(db1) rescue true
|
30
32
|
subject.drop(db2) rescue true
|
31
33
|
|
34
|
+
# This is annoying, but for each sublcass that establishes its own connection (ie Company for excluded models for connection based adapters)
|
35
|
+
# a separate connection is maintained (clear_all_connections! doesn't appear to deal with these)
|
36
|
+
# This causes problems because previous tests that established this connection could F up the next test, so we'll just remove them all for each test :(
|
37
|
+
Apartment.excluded_models.each do |m|
|
38
|
+
klass = m.constantize
|
39
|
+
Apartment.connection_class.remove_connection(klass)
|
40
|
+
klass.reset_table_name
|
41
|
+
end
|
32
42
|
ActiveRecord::Base.clear_all_connections!
|
33
|
-
Apartment::Database.reload!
|
34
43
|
end
|
35
44
|
end
|
36
45
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: apartment
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.20.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2013-02-13 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: activerecord
|
@@ -44,182 +44,6 @@ dependencies:
|
|
44
44
|
- - ! '>='
|
45
45
|
- !ruby/object:Gem::Version
|
46
46
|
version: 1.3.6
|
47
|
-
- !ruby/object:Gem::Dependency
|
48
|
-
name: pry
|
49
|
-
requirement: !ruby/object:Gem::Requirement
|
50
|
-
none: false
|
51
|
-
requirements:
|
52
|
-
- - ~>
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: 0.9.9
|
55
|
-
type: :development
|
56
|
-
prerelease: false
|
57
|
-
version_requirements: !ruby/object:Gem::Requirement
|
58
|
-
none: false
|
59
|
-
requirements:
|
60
|
-
- - ~>
|
61
|
-
- !ruby/object:Gem::Version
|
62
|
-
version: 0.9.9
|
63
|
-
- !ruby/object:Gem::Dependency
|
64
|
-
name: rails
|
65
|
-
requirement: !ruby/object:Gem::Requirement
|
66
|
-
none: false
|
67
|
-
requirements:
|
68
|
-
- - ! '>='
|
69
|
-
- !ruby/object:Gem::Version
|
70
|
-
version: 3.1.2
|
71
|
-
type: :development
|
72
|
-
prerelease: false
|
73
|
-
version_requirements: !ruby/object:Gem::Requirement
|
74
|
-
none: false
|
75
|
-
requirements:
|
76
|
-
- - ! '>='
|
77
|
-
- !ruby/object:Gem::Version
|
78
|
-
version: 3.1.2
|
79
|
-
- !ruby/object:Gem::Dependency
|
80
|
-
name: rake
|
81
|
-
requirement: !ruby/object:Gem::Requirement
|
82
|
-
none: false
|
83
|
-
requirements:
|
84
|
-
- - ~>
|
85
|
-
- !ruby/object:Gem::Version
|
86
|
-
version: 0.9.2
|
87
|
-
type: :development
|
88
|
-
prerelease: false
|
89
|
-
version_requirements: !ruby/object:Gem::Requirement
|
90
|
-
none: false
|
91
|
-
requirements:
|
92
|
-
- - ~>
|
93
|
-
- !ruby/object:Gem::Version
|
94
|
-
version: 0.9.2
|
95
|
-
- !ruby/object:Gem::Dependency
|
96
|
-
name: sqlite3
|
97
|
-
requirement: !ruby/object:Gem::Requirement
|
98
|
-
none: false
|
99
|
-
requirements:
|
100
|
-
- - ! '>='
|
101
|
-
- !ruby/object:Gem::Version
|
102
|
-
version: '0'
|
103
|
-
type: :development
|
104
|
-
prerelease: false
|
105
|
-
version_requirements: !ruby/object:Gem::Requirement
|
106
|
-
none: false
|
107
|
-
requirements:
|
108
|
-
- - ! '>='
|
109
|
-
- !ruby/object:Gem::Version
|
110
|
-
version: '0'
|
111
|
-
- !ruby/object:Gem::Dependency
|
112
|
-
name: rspec
|
113
|
-
requirement: !ruby/object:Gem::Requirement
|
114
|
-
none: false
|
115
|
-
requirements:
|
116
|
-
- - ~>
|
117
|
-
- !ruby/object:Gem::Version
|
118
|
-
version: '2.11'
|
119
|
-
type: :development
|
120
|
-
prerelease: false
|
121
|
-
version_requirements: !ruby/object:Gem::Requirement
|
122
|
-
none: false
|
123
|
-
requirements:
|
124
|
-
- - ~>
|
125
|
-
- !ruby/object:Gem::Version
|
126
|
-
version: '2.11'
|
127
|
-
- !ruby/object:Gem::Dependency
|
128
|
-
name: rspec-rails
|
129
|
-
requirement: !ruby/object:Gem::Requirement
|
130
|
-
none: false
|
131
|
-
requirements:
|
132
|
-
- - ~>
|
133
|
-
- !ruby/object:Gem::Version
|
134
|
-
version: '2.11'
|
135
|
-
type: :development
|
136
|
-
prerelease: false
|
137
|
-
version_requirements: !ruby/object:Gem::Requirement
|
138
|
-
none: false
|
139
|
-
requirements:
|
140
|
-
- - ~>
|
141
|
-
- !ruby/object:Gem::Version
|
142
|
-
version: '2.11'
|
143
|
-
- !ruby/object:Gem::Dependency
|
144
|
-
name: capybara
|
145
|
-
requirement: !ruby/object:Gem::Requirement
|
146
|
-
none: false
|
147
|
-
requirements:
|
148
|
-
- - ~>
|
149
|
-
- !ruby/object:Gem::Version
|
150
|
-
version: 1.0.0
|
151
|
-
type: :development
|
152
|
-
prerelease: false
|
153
|
-
version_requirements: !ruby/object:Gem::Requirement
|
154
|
-
none: false
|
155
|
-
requirements:
|
156
|
-
- - ~>
|
157
|
-
- !ruby/object:Gem::Version
|
158
|
-
version: 1.0.0
|
159
|
-
- !ruby/object:Gem::Dependency
|
160
|
-
name: pg
|
161
|
-
requirement: !ruby/object:Gem::Requirement
|
162
|
-
none: false
|
163
|
-
requirements:
|
164
|
-
- - ! '>='
|
165
|
-
- !ruby/object:Gem::Version
|
166
|
-
version: 0.11.0
|
167
|
-
type: :development
|
168
|
-
prerelease: false
|
169
|
-
version_requirements: !ruby/object:Gem::Requirement
|
170
|
-
none: false
|
171
|
-
requirements:
|
172
|
-
- - ! '>='
|
173
|
-
- !ruby/object:Gem::Version
|
174
|
-
version: 0.11.0
|
175
|
-
- !ruby/object:Gem::Dependency
|
176
|
-
name: mysql2
|
177
|
-
requirement: !ruby/object:Gem::Requirement
|
178
|
-
none: false
|
179
|
-
requirements:
|
180
|
-
- - ~>
|
181
|
-
- !ruby/object:Gem::Version
|
182
|
-
version: 0.3.10
|
183
|
-
type: :development
|
184
|
-
prerelease: false
|
185
|
-
version_requirements: !ruby/object:Gem::Requirement
|
186
|
-
none: false
|
187
|
-
requirements:
|
188
|
-
- - ~>
|
189
|
-
- !ruby/object:Gem::Version
|
190
|
-
version: 0.3.10
|
191
|
-
- !ruby/object:Gem::Dependency
|
192
|
-
name: delayed_job
|
193
|
-
requirement: !ruby/object:Gem::Requirement
|
194
|
-
none: false
|
195
|
-
requirements:
|
196
|
-
- - ~>
|
197
|
-
- !ruby/object:Gem::Version
|
198
|
-
version: '3.0'
|
199
|
-
type: :development
|
200
|
-
prerelease: false
|
201
|
-
version_requirements: !ruby/object:Gem::Requirement
|
202
|
-
none: false
|
203
|
-
requirements:
|
204
|
-
- - ~>
|
205
|
-
- !ruby/object:Gem::Version
|
206
|
-
version: '3.0'
|
207
|
-
- !ruby/object:Gem::Dependency
|
208
|
-
name: delayed_job_active_record
|
209
|
-
requirement: !ruby/object:Gem::Requirement
|
210
|
-
none: false
|
211
|
-
requirements:
|
212
|
-
- - ! '>='
|
213
|
-
- !ruby/object:Gem::Version
|
214
|
-
version: '0'
|
215
|
-
type: :development
|
216
|
-
prerelease: false
|
217
|
-
version_requirements: !ruby/object:Gem::Requirement
|
218
|
-
none: false
|
219
|
-
requirements:
|
220
|
-
- - ! '>='
|
221
|
-
- !ruby/object:Gem::Version
|
222
|
-
version: '0'
|
223
47
|
description: Apartment allows Rack applications to deal with database multitenancy
|
224
48
|
through ActiveRecord
|
225
49
|
email:
|
@@ -229,7 +53,6 @@ executables: []
|
|
229
53
|
extensions: []
|
230
54
|
extra_rdoc_files: []
|
231
55
|
files:
|
232
|
-
- .DS_Store
|
233
56
|
- .gitignore
|
234
57
|
- .pryrc
|
235
58
|
- .rspec
|
@@ -248,10 +71,11 @@ files:
|
|
248
71
|
- lib/apartment/adapters/postgresql_adapter.rb
|
249
72
|
- lib/apartment/console.rb
|
250
73
|
- lib/apartment/database.rb
|
251
|
-
- lib/apartment/delayed_job/active_record.rb
|
252
74
|
- lib/apartment/delayed_job/enqueue.rb
|
253
75
|
- lib/apartment/delayed_job/hooks.rb
|
76
|
+
- lib/apartment/delayed_job/psych_ext.rb
|
254
77
|
- lib/apartment/delayed_job/requirements.rb
|
78
|
+
- lib/apartment/delayed_job/syck_ext.rb
|
255
79
|
- lib/apartment/elevators/domain.rb
|
256
80
|
- lib/apartment/elevators/first_subdomain.rb
|
257
81
|
- lib/apartment/elevators/generic.rb
|
@@ -306,7 +130,7 @@ files:
|
|
306
130
|
- spec/dummy/public/favicon.ico
|
307
131
|
- spec/dummy/public/stylesheets/.gitkeep
|
308
132
|
- spec/dummy/script/rails
|
309
|
-
- spec/examples/
|
133
|
+
- spec/examples/connection_adapter_examples.rb
|
310
134
|
- spec/examples/elevator_examples.rb
|
311
135
|
- spec/examples/generic_adapter_examples.rb
|
312
136
|
- spec/examples/schema_adapter_examples.rb
|
@@ -343,7 +167,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
343
167
|
version: '0'
|
344
168
|
segments:
|
345
169
|
- 0
|
346
|
-
hash:
|
170
|
+
hash: 1986473667684990578
|
347
171
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
348
172
|
none: false
|
349
173
|
requirements:
|
@@ -352,11 +176,73 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
352
176
|
version: '0'
|
353
177
|
segments:
|
354
178
|
- 0
|
355
|
-
hash:
|
179
|
+
hash: 1986473667684990578
|
356
180
|
requirements: []
|
357
181
|
rubyforge_project:
|
358
182
|
rubygems_version: 1.8.24
|
359
183
|
signing_key:
|
360
184
|
specification_version: 3
|
361
185
|
summary: A Ruby gem for managing database multitenancy
|
362
|
-
test_files:
|
186
|
+
test_files:
|
187
|
+
- spec/adapters/mysql2_adapter_spec.rb
|
188
|
+
- spec/adapters/postgresql_adapter_spec.rb
|
189
|
+
- spec/apartment_spec.rb
|
190
|
+
- spec/config/database.yml.sample
|
191
|
+
- spec/database_spec.rb
|
192
|
+
- spec/dummy/Rakefile
|
193
|
+
- spec/dummy/app/controllers/application_controller.rb
|
194
|
+
- spec/dummy/app/helpers/application_helper.rb
|
195
|
+
- spec/dummy/app/models/company.rb
|
196
|
+
- spec/dummy/app/models/user.rb
|
197
|
+
- spec/dummy/app/views/application/index.html.erb
|
198
|
+
- spec/dummy/app/views/layouts/application.html.erb
|
199
|
+
- spec/dummy/config.ru
|
200
|
+
- spec/dummy/config/application.rb
|
201
|
+
- spec/dummy/config/boot.rb
|
202
|
+
- spec/dummy/config/database.yml.sample
|
203
|
+
- spec/dummy/config/environment.rb
|
204
|
+
- spec/dummy/config/environments/development.rb
|
205
|
+
- spec/dummy/config/environments/production.rb
|
206
|
+
- spec/dummy/config/environments/test.rb
|
207
|
+
- spec/dummy/config/initializers/apartment.rb
|
208
|
+
- spec/dummy/config/initializers/backtrace_silencers.rb
|
209
|
+
- spec/dummy/config/initializers/inflections.rb
|
210
|
+
- spec/dummy/config/initializers/mime_types.rb
|
211
|
+
- spec/dummy/config/initializers/secret_token.rb
|
212
|
+
- spec/dummy/config/initializers/session_store.rb
|
213
|
+
- spec/dummy/config/locales/en.yml
|
214
|
+
- spec/dummy/config/routes.rb
|
215
|
+
- spec/dummy/db/migrate/20110613152810_create_dummy_models.rb
|
216
|
+
- spec/dummy/db/migrate/20111202022214_create_table_books.rb
|
217
|
+
- spec/dummy/db/schema.rb
|
218
|
+
- spec/dummy/db/seeds.rb
|
219
|
+
- spec/dummy/db/test.sqlite3
|
220
|
+
- spec/dummy/lib/fake_dj_class.rb
|
221
|
+
- spec/dummy/public/404.html
|
222
|
+
- spec/dummy/public/422.html
|
223
|
+
- spec/dummy/public/500.html
|
224
|
+
- spec/dummy/public/favicon.ico
|
225
|
+
- spec/dummy/public/stylesheets/.gitkeep
|
226
|
+
- spec/dummy/script/rails
|
227
|
+
- spec/examples/connection_adapter_examples.rb
|
228
|
+
- spec/examples/elevator_examples.rb
|
229
|
+
- spec/examples/generic_adapter_examples.rb
|
230
|
+
- spec/examples/schema_adapter_examples.rb
|
231
|
+
- spec/integration/apartment_rake_integration_spec.rb
|
232
|
+
- spec/integration/delayed_job_integration_spec.rb
|
233
|
+
- spec/integration/middleware/domain_elevator_spec.rb
|
234
|
+
- spec/integration/middleware/first_subdomain_elevator_spec.rb
|
235
|
+
- spec/integration/middleware/generic_elevator_spec.rb
|
236
|
+
- spec/integration/middleware/subdomain_elevator_spec.rb
|
237
|
+
- spec/spec_helper.rb
|
238
|
+
- spec/support/apartment_helpers.rb
|
239
|
+
- spec/support/capybara_sessions.rb
|
240
|
+
- spec/support/config.rb
|
241
|
+
- spec/support/contexts.rb
|
242
|
+
- spec/support/requirements.rb
|
243
|
+
- spec/tasks/apartment_rake_spec.rb
|
244
|
+
- spec/unit/config_spec.rb
|
245
|
+
- spec/unit/middleware/domain_elevator_spec.rb
|
246
|
+
- spec/unit/middleware/subdomain_elevator_spec.rb
|
247
|
+
- spec/unit/migrator_spec.rb
|
248
|
+
- spec/unit/reloader_spec.rb
|
data/.DS_Store
DELETED
Binary file
|