apartment 0.21.0 → 0.21.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -9,3 +9,4 @@ spec/config/database.yml
9
9
  spec/dummy/config/database.yml
10
10
  cookbooks
11
11
  tmp
12
+ spec/dummy/db/*.sqlite3
@@ -2,5 +2,6 @@ language: ruby
2
2
  rvm:
3
3
  - 1.9.2
4
4
  - 1.9.3
5
+ - 2.0.0
5
6
  - jruby-19mode
6
7
  bundler_args: --without local --verbose
data/Gemfile CHANGED
@@ -13,6 +13,7 @@ gem 'delayed_job_active_record'
13
13
  platform :ruby do
14
14
  gem 'mysql2', '~> 0.3.10'
15
15
  gem 'pg', '>= 0.11.0'
16
+ gem 'sqlite3'
16
17
  end
17
18
 
18
19
  platform :jruby do
@@ -26,4 +27,4 @@ end
26
27
 
27
28
  group :local do
28
29
  gem 'pry'
29
- end
30
+ end
data/HISTORY.md CHANGED
@@ -1,3 +1,9 @@
1
+ # 0.21.1
2
+ * May 31, 2013
3
+
4
+ - Clearing the AR::QueryCache after switching databases.
5
+ - Fixes issue with stale model being loaded for schema adapters
6
+
1
7
  # 0.21.0
2
8
  * April 24, 2013
3
9
 
data/README.md CHANGED
@@ -1,5 +1,5 @@
1
1
  # Apartment
2
- [![Code Climate](https://codeclimate.com/badge.png)](https://codeclimate.com/github/influitive/apartment)
2
+ [![Code Climate](https://codeclimate.com/github/influitive/apartment.png)](https://codeclimate.com/github/influitive/apartment)
3
3
  [![Build Status](https://secure.travis-ci.org/influitive/apartment.png?branch=development)](http://travis-ci.org/influitive/apartment)
4
4
 
5
5
  *Multitenancy for Rails 3 and ActiveRecord*
@@ -1,9 +1,7 @@
1
1
  require 'active_record'
2
2
 
3
3
  module Apartment
4
-
5
4
  module Adapters
6
-
7
5
  class AbstractAdapter
8
6
 
9
7
  # @constructor
@@ -52,7 +50,7 @@ module Apartment
52
50
  # Apartment.connection.drop_database note that drop_database will not throw an exception, so manually execute
53
51
  Apartment.connection.execute("DROP DATABASE #{environmentify(database)}" )
54
52
 
55
- rescue ActiveRecord::StatementInvalid
53
+ rescue *rescuable_exceptions
56
54
  raise DatabaseNotFound, "The database #{environmentify(database)} cannot be found"
57
55
  end
58
56
 
@@ -74,13 +72,6 @@ module Apartment
74
72
  def process_excluded_models
75
73
  # All other models will shared a connection (at Apartment.connection_class) and we can modify at will
76
74
  Apartment.excluded_models.each do |excluded_model|
77
- # Note that due to rails reloading, we now take string references to classes rather than
78
- # actual object references. This way when we contantize, we always get the proper class reference
79
- if excluded_model.is_a? Class
80
- warn "[Deprecation Warning] Passing class references to excluded models is now deprecated, please use a string instead"
81
- excluded_model = excluded_model.name
82
- end
83
-
84
75
  excluded_model.constantize.establish_connection @config
85
76
  end
86
77
  end
@@ -99,7 +90,9 @@ module Apartment
99
90
  # Just connect to default db and return
100
91
  return reset if database.nil?
101
92
 
102
- connect_to_new(database)
93
+ connect_to_new(database).tap do
94
+ ActiveRecord::Base.connection.clear_query_cache
95
+ end
103
96
  end
104
97
 
105
98
  # Load the rails seed file into the db
@@ -118,7 +111,7 @@ module Apartment
118
111
  def create_database(database)
119
112
  Apartment.connection.create_database( environmentify(database) )
120
113
 
121
- rescue ActiveRecord::StatementInvalid
114
+ rescue *rescuable_exceptions
122
115
  raise DatabaseExists, "The database #{environmentify(database)} already exists."
123
116
  end
124
117
 
@@ -130,7 +123,7 @@ module Apartment
130
123
  Apartment.establish_connection multi_tenantify(database)
131
124
  Apartment.connection.active? # call active? to manually check if this connection is valid
132
125
 
133
- rescue ActiveRecord::StatementInvalid
126
+ rescue *rescuable_exceptions
134
127
  raise DatabaseNotFound, "The database #{environmentify(database)} cannot be found."
135
128
  end
136
129
 
@@ -179,6 +172,17 @@ module Apartment
179
172
  end
180
173
  end
181
174
 
175
+ # Exceptions to rescue from on db operations
176
+ #
177
+ def rescuable_exceptions
178
+ [ActiveRecord::StatementInvalid] + [rescue_from].flatten
179
+ end
180
+
181
+ # Extra exceptions to rescue from
182
+ #
183
+ def rescue_from
184
+ []
185
+ end
182
186
  end
183
187
  end
184
- end
188
+ end
@@ -1,43 +1,8 @@
1
1
  module Apartment
2
-
3
2
  module Adapters
4
-
5
3
  class AbstractJDBCAdapter < AbstractAdapter
6
4
 
7
- # Drop the database
8
- #
9
- # @param {String} database Database name
10
- #
11
- def drop(database)
12
- super(database)
13
-
14
- rescue ActiveRecord::StatementInvalid, ActiveRecord::JDBCError
15
- raise DatabaseNotFound, "The database #{environmentify(database)} cannot be found"
16
- end
17
-
18
- protected
19
-
20
- # Create the database
21
- #
22
- # @param {String} database Database name
23
- #
24
- def create_database(database)
25
- super(database)
26
-
27
- rescue ActiveRecord::StatementInvalid, ActiveRecord::JDBCError
28
- raise DatabaseExists, "The database #{environmentify(database)} already exists."
29
- end
30
-
31
- # Connect to new database
32
- #
33
- # @param {String} database Database name
34
- #
35
- def connect_to_new(database)
36
- super(database)
37
-
38
- rescue ActiveRecord::StatementInvalid, ActiveRecord::JDBCError
39
- raise DatabaseNotFound, "The database #{environmentify(database)} cannot be found."
40
- end
5
+ protected
41
6
 
42
7
  # Return a new config that is multi-tenanted
43
8
  #
@@ -46,6 +11,11 @@ module Apartment
46
11
  config[:url] = "#{config[:url].gsub(/(\S+)\/.+$/, '\1')}/#{environmentify(database)}"
47
12
  end
48
13
  end
14
+ private
15
+
16
+ def rescue_from
17
+ ActiveRecord::JDBCError
18
+ end
49
19
  end
50
20
  end
51
- end
21
+ end
@@ -1,5 +1,6 @@
1
- module Apartment
1
+ require 'apartment/adapters/postgresql_adapter'
2
2
 
3
+ module Apartment
3
4
  module Database
4
5
 
5
6
  def self.jdbc_postgresql_adapter(config)
@@ -12,91 +13,42 @@ module Apartment
12
13
  module Adapters
13
14
 
14
15
  # Default adapter when not using Postgresql Schemas
15
- class JDBCPostgresqlAdapter < AbstractJDBCAdapter
16
+ class JDBCPostgresqlAdapter < PostgresqlAdapter
16
17
 
17
- protected
18
-
19
- # Connect to new database
20
- # Abstract adapter will catch generic ActiveRecord error
21
- # Catch specific adapter errors here
22
- #
23
- # @param {String} database Database name
24
- #
25
- def connect_to_new(database)
26
- super(database)
27
- rescue ActiveRecord::StatementInvalid, ActiveRecord::JDBCError
28
- raise DatabaseNotFound, "Cannot find database #{environmentify(database)}"
29
- end
18
+ protected
30
19
 
31
20
  def create_database(database)
32
21
  # There is a bug in activerecord-jdbcpostgresql-adapter (1.2.5) that will cause
33
22
  # an exception if no options are passed into the create_database call.
34
23
  Apartment.connection.create_database(environmentify(database), { :thisisahack => '' })
35
24
 
36
- rescue ActiveRecord::StatementInvalid, ActiveRecord::JDBCError
25
+ rescue *rescuable_exceptions
37
26
  raise DatabaseExists, "The database #{environmentify(database)} already exists."
38
27
  end
39
- end
40
-
41
- # Separate Adapter for Postgresql when using schemas
42
- class JDBCPostgresqlSchemaAdapter < AbstractJDBCAdapter
43
-
44
- # Drop the database schema
45
- #
46
- # @param {String} database Database (schema) to drop
47
- #
48
- def drop(database)
49
- Apartment.connection.execute(%{DROP SCHEMA "#{database}" CASCADE})
50
-
51
- rescue ActiveRecord::StatementInvalid, ActiveRecord::JDBCError
52
- raise SchemaNotFound, "The schema #{database.inspect} cannot be found."
53
- end
54
28
 
55
- # Reset search path to default search_path
56
- # Set the table_name to always use the default namespace for excluded models
29
+ # Return a new config that is multi-tenanted
57
30
  #
58
- def process_excluded_models
59
- Apartment.excluded_models.each do |excluded_model|
60
- # Note that due to rails reloading, we now take string references to classes rather than
61
- # actual object references. This way when we contantize, we always get the proper class reference
62
- if excluded_model.is_a? Class
63
- warn "[Deprecation Warning] Passing class references to excluded models is now deprecated, please use a string instead"
64
- excluded_model = excluded_model.name
65
- end
66
-
67
- excluded_model.constantize.tap do |klass|
68
- # some models (such as delayed_job) seem to load and cache their column names before this,
69
- # so would never get the default prefix, so reset first
70
- klass.reset_column_information
71
-
72
- # Ensure that if a schema *was* set, we override
73
- table_name = klass.table_name.split('.', 2).last
74
-
75
- # Not sure why, but Delayed::Job somehow ignores table_name_prefix... so we'll just manually set table name instead
76
- klass.table_name = "#{Apartment.default_schema}.#{table_name}"
77
- end
31
+ def multi_tenantify(database)
32
+ @config.clone.tap do |config|
33
+ config[:url] = "#{config[:url].gsub(/(\S+)\/.+$/, '\1')}/#{environmentify(database)}"
78
34
  end
79
35
  end
80
36
 
81
- # Reset schema search path to the default schema_search_path
82
- #
83
- # @return {String} default schema search path
84
- #
85
- def reset
86
- @current_database = Apartment.default_schema
87
- Apartment.connection.schema_search_path = full_search_path
88
- end
37
+ private
89
38
 
90
- def current_database
91
- @current_database || Apartment.default_schema
39
+ def rescue_from
40
+ ActiveRecord::JDBCError
92
41
  end
42
+ end
93
43
 
94
- protected
44
+ # Separate Adapter for Postgresql when using schemas
45
+ class JDBCPostgresqlSchemaAdapter < PostgresqlSchemaAdapter
95
46
 
96
47
  # Set schema search path to new schema
97
48
  #
98
49
  def connect_to_new(database = nil)
99
50
  return reset if database.nil?
51
+ raise ActiveRecord::StatementInvalid.new unless Apartment.connection.all_schemas.include? database.to_s
100
52
 
101
53
  @current_database = database.to_s
102
54
  Apartment.connection.schema_search_path = full_search_path
@@ -105,22 +57,10 @@ module Apartment
105
57
  raise SchemaNotFound, "One of the following schema(s) is invalid: #{full_search_path}"
106
58
  end
107
59
 
108
- # Create the new schema
109
- #
110
- def create_database(database)
111
- Apartment.connection.execute(%{CREATE SCHEMA "#{database}"})
60
+ private
112
61
 
113
- rescue ActiveRecord::StatementInvalid, ActiveRecord::JDBCError
114
- raise SchemaExists, "The schema #{database} already exists."
115
- end
116
-
117
- private
118
-
119
- # Generate the final search path to set including persistent_schemas
120
- #
121
- def full_search_path
122
- persistent_schemas = Apartment.persistent_schemas.join(', ')
123
- @current_database.to_s + (persistent_schemas.empty? ? "" : ", #{persistent_schemas}")
62
+ def rescue_from
63
+ ActiveRecord::JDBCError
124
64
  end
125
65
  end
126
66
  end
@@ -14,20 +14,11 @@ module Apartment
14
14
  # Default adapter when not using Postgresql Schemas
15
15
  class PostgresqlAdapter < AbstractAdapter
16
16
 
17
- protected
17
+ private
18
18
 
19
- # Connect to new database
20
- # Abstract adapter will catch generic ActiveRecord error
21
- # Catch specific adapter errors here
22
- #
23
- # @param {String} database Database name
24
- #
25
- def connect_to_new(database)
26
- super
27
- rescue PGError
28
- raise DatabaseNotFound, "Cannot find database #{environmentify(database)}"
19
+ def rescue_from
20
+ PGError
29
21
  end
30
-
31
22
  end
32
23
 
33
24
  # Separate Adapter for Postgresql when using schemas
@@ -40,7 +31,7 @@ module Apartment
40
31
  def drop(database)
41
32
  Apartment.connection.execute(%{DROP SCHEMA "#{database}" CASCADE})
42
33
 
43
- rescue ActiveRecord::StatementInvalid
34
+ rescue *rescuable_exceptions
44
35
  raise SchemaNotFound, "The schema #{database.inspect} cannot be found."
45
36
  end
46
37
 
@@ -49,13 +40,6 @@ module Apartment
49
40
  #
50
41
  def process_excluded_models
51
42
  Apartment.excluded_models.each do |excluded_model|
52
- # Note that due to rails reloading, we now take string references to classes rather than
53
- # actual object references. This way when we contantize, we always get the proper class reference
54
- if excluded_model.is_a? Class
55
- warn "[Deprecation Warning] Passing class references to excluded models is now deprecated, please use a string instead"
56
- excluded_model = excluded_model.name
57
- end
58
-
59
43
  excluded_model.constantize.tap do |klass|
60
44
  # some models (such as delayed_job) seem to load and cache their column names before this,
61
45
  # so would never get the default prefix, so reset first
@@ -89,11 +73,12 @@ module Apartment
89
73
  #
90
74
  def connect_to_new(database = nil)
91
75
  return reset if database.nil?
76
+ raise ActiveRecord::StatementInvalid.new unless Apartment.connection.schema_exists? database
92
77
 
93
78
  @current_database = database.to_s
94
79
  Apartment.connection.schema_search_path = full_search_path
95
80
 
96
- rescue ActiveRecord::StatementInvalid
81
+ rescue *rescuable_exceptions
97
82
  raise SchemaNotFound, "One of the following schema(s) is invalid: #{full_search_path}"
98
83
  end
99
84
 
@@ -102,7 +87,7 @@ module Apartment
102
87
  def create_database(database)
103
88
  Apartment.connection.execute(%{CREATE SCHEMA "#{database}"})
104
89
 
105
- rescue ActiveRecord::StatementInvalid
90
+ rescue *rescuable_exceptions
106
91
  raise SchemaExists, "The schema #{database} already exists."
107
92
  end
108
93
 
@@ -116,4 +101,4 @@ module Apartment
116
101
  end
117
102
  end
118
103
  end
119
- end
104
+ end
@@ -0,0 +1,51 @@
1
+ module Apartment
2
+ module Database
3
+ def self.sqlite3_adapter(config)
4
+ Adapters::Sqlite3Adapter.new(config)
5
+ end
6
+ end
7
+
8
+ module Adapters
9
+ class Sqlite3Adapter < AbstractAdapter
10
+ def initialize(config)
11
+ @default_dir = File.expand_path(File.dirname(config[:database]))
12
+
13
+ super
14
+ end
15
+
16
+ def drop(database)
17
+ raise DatabaseNotFound,
18
+ "The database #{environmentify(database)} cannot be found." unless File.exists?(database_file(database))
19
+
20
+ File.delete(database_file(database))
21
+ end
22
+
23
+ def current_database
24
+ File.basename(Apartment.connection.instance_variable_get(:@config)[:database], '.sqlite3')
25
+ end
26
+
27
+ protected
28
+
29
+ def connect_to_new(database)
30
+ raise DatabaseNotFound,
31
+ "The database #{environmentify(database)} cannot be found." unless File.exists?(database_file(database))
32
+
33
+ super database_file(database)
34
+ end
35
+
36
+ def create_database(database)
37
+ raise DatabaseExists,
38
+ "The database #{environmentify(database)} already exists." if File.exists?(database_file(database))
39
+
40
+ f = File.new(database_file(database), File::CREAT)
41
+ f.close
42
+ end
43
+
44
+ private
45
+
46
+ def database_file(database)
47
+ "#{@default_dir}/#{database}.sqlite3"
48
+ end
49
+ end
50
+ end
51
+ end
@@ -1,14 +1,15 @@
1
1
  module Apartment
2
2
  module Elevators
3
- # Provides a rack based db switching solution based on subdomains
4
- # Assumes that database name should match subdomain
3
+ # Provides a rack based db switching solution based on the first subdomain
4
+ # of a given domain name.
5
+ # eg:
6
+ # - example1.domain.com => example1
7
+ # - example2.something.domain.com => example2
5
8
  class FirstSubdomain < Subdomain
6
9
 
7
10
  def parse_database_name(request)
8
- subdomain = super(request)
9
- subdomain && subdomain.match(/(\w+)(\.\w+)?/)[1]
11
+ super.split('.')[0]
10
12
  end
11
-
12
13
  end
13
14
  end
14
15
  end
@@ -1,3 +1,3 @@
1
1
  module Apartment
2
- VERSION = "0.21.0"
2
+ VERSION = "0.21.1"
3
3
  end
@@ -0,0 +1,28 @@
1
+ require 'spec_helper'
2
+ require 'apartment/adapters/sqlite3_adapter'
3
+
4
+ describe Apartment::Adapters::Sqlite3Adapter do
5
+ unless defined?(JRUBY_VERSION)
6
+
7
+ let(:config){ Apartment::Test.config['connections']['sqlite'].symbolize_keys }
8
+ subject{ Apartment::Database.sqlite3_adapter config }
9
+
10
+ context "using connections" do
11
+ def database_names
12
+ db_dir = File.expand_path("../../dummy/db", __FILE__)
13
+ Dir.glob("#{db_dir}/*.sqlite3").map { |file| File.basename(file, '.sqlite3') }
14
+ end
15
+
16
+ let(:default_database) do
17
+ subject.process { File.basename(Apartment::Test.config['connections']['sqlite']['database'], '.sqlite3') }
18
+ end
19
+
20
+ it_should_behave_like "a generic apartment adapter"
21
+ it_should_behave_like "a connection based apartment adapter"
22
+
23
+ after(:all) do
24
+ File.delete(Apartment::Test.config['connections']['sqlite']['database'])
25
+ end
26
+ end
27
+ end
28
+ end
@@ -34,4 +34,8 @@ connections:
34
34
  database: apartment_mysql_test
35
35
  username: root
36
36
  password:
37
- <% end %>
37
+
38
+ sqlite:
39
+ adapter: sqlite3
40
+ database: <%= File.expand_path('../spec/dummy/db', __FILE__) %>/default.sqlite3
41
+ <% end %>
@@ -43,18 +43,28 @@ describe Apartment::Delayed do
43
43
  user.database.should == database
44
44
  end
45
45
 
46
- it "should not overwrite any previous after_initialize declarations" do
47
- User.class_eval do
48
- after_find :set_name
46
+ context 'when there are defined callbacks' do
47
+ before do
48
+ User.class_eval do
49
+ after_find :set_name
50
+
51
+ def set_name
52
+ self.name = "Some Name"
53
+ end
54
+ end
55
+ end
49
56
 
50
- def set_name
51
- self.name = "Some Name"
57
+ after do
58
+ User.class_eval do
59
+ reset_callbacks :find
52
60
  end
53
61
  end
54
62
 
55
- user = User.first
56
- user.database.should == database
57
- user.name.should == "Some Name"
63
+ it "should not overwrite any previous after_initialize declarations" do
64
+ user = User.first
65
+ user.database.should == database
66
+ user.name.should == "Some Name"
67
+ end
58
68
  end
59
69
 
60
70
  it "should set the db on a new record before it saves" do
@@ -0,0 +1,37 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'query caching' do
4
+ before do
5
+ Apartment.configure do |config|
6
+ config.excluded_models = ["Company"]
7
+ config.database_names = lambda{ Company.scoped.collect(&:database) }
8
+ end
9
+
10
+ db_names.each do |db_name|
11
+ Apartment::Database.create(db_name)
12
+ Company.create :database => db_name
13
+ end
14
+ end
15
+
16
+ after do
17
+ db_names.each{ |db| Apartment::Database.drop(db) }
18
+ Company.delete_all
19
+ end
20
+
21
+ let(:db_names) { 2.times.map{ Apartment::Test.next_db } }
22
+
23
+ it 'clears the ActiveRecord::QueryCache after switching databases' do
24
+ db_names.each do |db_name|
25
+ Apartment::Database.switch db_name
26
+ User.create! name: db_name
27
+ end
28
+
29
+ ActiveRecord::Base.connection.enable_query_cache!
30
+
31
+ Apartment::Database.switch db_names.first
32
+ User.find_by_name(db_names.first).name.should == db_names.first
33
+
34
+ Apartment::Database.switch db_names.last
35
+ User.find_by_name(db_names.first).should be_nil
36
+ end
37
+ end
metadata CHANGED
@@ -1,50 +1,51 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: apartment
3
3
  version: !ruby/object:Gem::Version
4
- prerelease:
5
- version: 0.21.0
4
+ version: 0.21.1
5
+ prerelease:
6
6
  platform: ruby
7
7
  authors:
8
8
  - Ryan Brunner
9
9
  - Brad Robertson
10
- autorequire:
10
+ autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2013-04-25 00:00:00.000000000 Z
13
+ date: 2013-05-31 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activerecord
17
- version_requirements: !ruby/object:Gem::Requirement
17
+ requirement: !ruby/object:Gem::Requirement
18
+ none: false
18
19
  requirements:
19
- - - ">="
20
+ - - ! '>='
20
21
  - !ruby/object:Gem::Version
21
22
  version: 3.1.2
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
22
26
  none: false
23
- requirement: !ruby/object:Gem::Requirement
24
27
  requirements:
25
- - - ">="
28
+ - - ! '>='
26
29
  - !ruby/object:Gem::Version
27
30
  version: 3.1.2
28
- none: false
29
- prerelease: false
30
- type: :runtime
31
31
  - !ruby/object:Gem::Dependency
32
32
  name: rack
33
- version_requirements: !ruby/object:Gem::Requirement
33
+ requirement: !ruby/object:Gem::Requirement
34
+ none: false
34
35
  requirements:
35
- - - ">="
36
+ - - ! '>='
36
37
  - !ruby/object:Gem::Version
37
38
  version: 1.3.6
39
+ type: :runtime
40
+ prerelease: false
41
+ version_requirements: !ruby/object:Gem::Requirement
38
42
  none: false
39
- requirement: !ruby/object:Gem::Requirement
40
43
  requirements:
41
- - - ">="
44
+ - - ! '>='
42
45
  - !ruby/object:Gem::Version
43
46
  version: 1.3.6
44
- none: false
45
- prerelease: false
46
- type: :runtime
47
- description: Apartment allows Rack applications to deal with database multitenancy through ActiveRecord
47
+ description: Apartment allows Rack applications to deal with database multitenancy
48
+ through ActiveRecord
48
49
  email:
49
50
  - ryan@influitive.com
50
51
  - brad@influitive.com
@@ -52,12 +53,12 @@ executables: []
52
53
  extensions: []
53
54
  extra_rdoc_files: []
54
55
  files:
55
- - ".gitignore"
56
- - ".pryrc"
57
- - ".rspec"
58
- - ".rvmrc"
59
- - ".travis.yml"
60
- - ".vagrant"
56
+ - .gitignore
57
+ - .pryrc
58
+ - .rspec
59
+ - .rvmrc
60
+ - .travis.yml
61
+ - .vagrant
61
62
  - Cheffile
62
63
  - Cheffile.lock
63
64
  - Gemfile
@@ -75,6 +76,7 @@ files:
75
76
  - lib/apartment/adapters/mysql2_adapter.rb
76
77
  - lib/apartment/adapters/postgis_adapter.rb
77
78
  - lib/apartment/adapters/postgresql_adapter.rb
79
+ - lib/apartment/adapters/sqlite3_adapter.rb
78
80
  - lib/apartment/console.rb
79
81
  - lib/apartment/database.rb
80
82
  - lib/apartment/delayed_job/enqueue.rb
@@ -100,6 +102,7 @@ files:
100
102
  - spec/adapters/jdbc_postgresql_adapter_spec.rb
101
103
  - spec/adapters/mysql2_adapter_spec.rb
102
104
  - spec/adapters/postgresql_adapter_spec.rb
105
+ - spec/adapters/sqlite3_adapter_spec.rb
103
106
  - spec/apartment_spec.rb
104
107
  - spec/config/database.yml.sample
105
108
  - spec/database_spec.rb
@@ -148,6 +151,7 @@ files:
148
151
  - spec/integration/middleware/first_subdomain_elevator_spec.rb
149
152
  - spec/integration/middleware/generic_elevator_spec.rb
150
153
  - spec/integration/middleware/subdomain_elevator_spec.rb
154
+ - spec/integration/query_caching_spec.rb
151
155
  - spec/spec_helper.rb
152
156
  - spec/support/apartment_helpers.rb
153
157
  - spec/support/capybara_sessions.rb
@@ -163,34 +167,32 @@ files:
163
167
  homepage: https://github.com/influitive/apartment
164
168
  licenses:
165
169
  - MIT
166
- post_install_message:
170
+ post_install_message:
167
171
  rdoc_options: []
168
172
  require_paths:
169
173
  - lib
170
174
  required_ruby_version: !ruby/object:Gem::Requirement
175
+ none: false
171
176
  requirements:
172
- - - ">="
177
+ - - ! '>='
173
178
  - !ruby/object:Gem::Version
179
+ version: '0'
174
180
  segments:
175
181
  - 0
176
- hash: 2
177
- version: !binary |-
178
- MA==
179
- none: false
182
+ hash: 2789245529283699970
180
183
  required_rubygems_version: !ruby/object:Gem::Requirement
184
+ none: false
181
185
  requirements:
182
- - - ">="
186
+ - - ! '>='
183
187
  - !ruby/object:Gem::Version
188
+ version: '0'
184
189
  segments:
185
190
  - 0
186
- hash: 2
187
- version: !binary |-
188
- MA==
189
- none: false
191
+ hash: 2789245529283699970
190
192
  requirements: []
191
- rubyforge_project:
192
- rubygems_version: 1.8.24
193
- signing_key:
193
+ rubyforge_project:
194
+ rubygems_version: 1.8.25
195
+ signing_key:
194
196
  specification_version: 3
195
197
  summary: A Ruby gem for managing database multitenancy
196
198
  test_files:
@@ -198,6 +200,7 @@ test_files:
198
200
  - spec/adapters/jdbc_postgresql_adapter_spec.rb
199
201
  - spec/adapters/mysql2_adapter_spec.rb
200
202
  - spec/adapters/postgresql_adapter_spec.rb
203
+ - spec/adapters/sqlite3_adapter_spec.rb
201
204
  - spec/apartment_spec.rb
202
205
  - spec/config/database.yml.sample
203
206
  - spec/database_spec.rb
@@ -246,6 +249,7 @@ test_files:
246
249
  - spec/integration/middleware/first_subdomain_elevator_spec.rb
247
250
  - spec/integration/middleware/generic_elevator_spec.rb
248
251
  - spec/integration/middleware/subdomain_elevator_spec.rb
252
+ - spec/integration/query_caching_spec.rb
249
253
  - spec/spec_helper.rb
250
254
  - spec/support/apartment_helpers.rb
251
255
  - spec/support/capybara_sessions.rb