apartment 0.10.1 → 0.10.2

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/Gemfile CHANGED
@@ -1,8 +1,3 @@
1
1
  source "http://rubygems.org"
2
2
 
3
- # Uses patched version of postgresql adapter to enable apartment usage.
4
- # Current postgresql adapter in rails doesn't properly support the use of postgresql schemas
5
- # Pull request sent => https://github.com/rails/rails/pull/1604
6
- gem 'rails', '3.0.8', :git => 'git://github.com/bradrobertson/rails', :branch => '3-0-stable'
7
-
8
3
  gemspec
data/HISTORY.md CHANGED
@@ -1,3 +1,8 @@
1
+ # 0.10.2
2
+ * Sep 15, 2011
3
+
4
+ - Remove all the annoying logging for loading db schema and seeding on create
5
+
1
6
  # 0.10.1
2
7
  * Aug 11, 2011
3
8
 
data/README.md CHANGED
@@ -2,16 +2,9 @@
2
2
  *Multitenancy for Rails 3*
3
3
 
4
4
  Apartment provides tools to help you deal with multiple databases in your Rails
5
- environment. If you need to have certain data sequestered based on account or company,
5
+ application. If you need to have certain data sequestered based on account or company,
6
6
  but still allow some data to exist in a common database, Apartment can help.
7
7
 
8
- ## Caveats
9
-
10
- Apartment was built to deal with a very particular use-case - the need to spin up
11
- multiple databases within the same application instance on-demand while Rails is running.
12
- If your setup can accomodate creating new databases on deploy (by adding a new database to your
13
- database.yml), or doesn't need 100% database isolation, other solutions might be far simpler
14
- for your use case.
15
8
 
16
9
  ## Installation
17
10
 
@@ -19,11 +12,13 @@ for your use case.
19
12
 
20
13
  Add the following to your Gemfile:
21
14
 
22
- gem 'apartment'
15
+ gem 'apartment'
23
16
 
24
17
  That's all you need to set up the Apartment libraries. If you want to switch databases
25
18
  on a per-user basis, look under "Usage - Switching databases per request", below.
26
19
 
20
+ *NOTE: If using [postgresl schemas](http://www.postgresql.org/docs/9.0/static/ddl-schemas.html) you must use Rails >= 3.0.10, it contains a [patch](https://github.com/rails/rails/pull/1607) that has better postgresql schema support*
21
+
27
22
  ## Usage
28
23
 
29
24
  ### Creating new Databases
@@ -31,10 +26,10 @@ on a per-user basis, look under "Usage - Switching databases per request", below
31
26
  Before you can switch to a new apartment database, you will need to create it. Whenever
32
27
  you need to create a new database, you can run the following command:
33
28
 
34
- Apartment::Database.create('database_name')
29
+ Apartment::Database.create('database_name')
35
30
 
36
- Apartment will create a new database in the following format: "environment_database_name".
37
- In the case of a sqlite database, this will be created in your 'db/migrate' foler. With
31
+ Apartment will create a new database in the following format: "_environment_\_database_name".
32
+ In the case of a sqlite database, this will be created in your 'db/migrate' folder. With
38
33
  other databases, the database will be created as a new DB within the system.
39
34
 
40
35
  When you create a new database, all migrations will be run against that database, so it will be
@@ -43,10 +38,12 @@ up to date when create returns.
43
38
  #### Notes on PostgreSQL
44
39
 
45
40
  PostgreSQL works slightly differently than other databases when creating a new DB. If you
46
- are using PostgreSQL, Apartment will set up a new **schema** and migrate into there. This
41
+ are using PostgreSQL, Apartment by default will set up a new **schema** and migrate into there. This
47
42
  provides better performance, and allows Apartment to work on systems like Heroku, which
48
43
  would not allow a full new database to be created.
49
44
 
45
+ One can optionally use the full database creation instead if they want, though this is not recommended
46
+
50
47
  ### Switching Databases
51
48
 
52
49
  To switch databases using Apartment, use the following command:
@@ -72,14 +69,32 @@ to a database schema of the same name. It can be used like so:
72
69
  end
73
70
  end
74
71
 
72
+ ## Config
73
+
74
+ The following config options should be set up in a Rails initializer such as:
75
+
76
+ config/initializers/apartment.rb
77
+
78
+ To set config options, add this to your initializer:
79
+
80
+ Apartment.configure do |config|
81
+ # set your options (described below) here
82
+ end
83
+
75
84
  ### Excluding models
76
85
 
77
86
  If you have some models that should always access the 'root' database, you can specify this by configuring
78
87
  Apartment using `Apartment.configure`. This will yield a config object for you. You can set excluded models like so:
88
+
89
+ config.excluded_models = [User, Company] # these models will not be multi-tenanted, but remain in the global (public) namespace
90
+
91
+ ### Handling Environments
79
92
 
80
- Apartment.configure do |config|
81
- config.excluded_models = [User, Company] # these models will not be multi-tenanted, but remain in the global (public) namespace
82
- end
93
+ By default, when not using postgresql schemas, Apartment will prepend the environment to the database name
94
+ to ensure there is no conflict between your environments. This is mainly for the benefit of your development
95
+ and test environments. If you wish to turn this option off in production, you could do something like:
96
+
97
+ config.prepend_environment = !Rails.env.production?
83
98
 
84
99
  ### Managing Migrations
85
100
 
@@ -88,14 +103,10 @@ of dbs to Apartment. You can make this dynamic by providing a Proc object to be
88
103
  This object should yield an array of string representing each database name. Example:
89
104
 
90
105
  # Dynamically get database names to migrate
91
- Apartment.configure do |config|
92
- config.database_names = lambda{ Company.all.collect(&:database_name) }
93
- end
106
+ config.database_names = lambda{ Customer.select(:database_name).map(&:database_name) }
94
107
 
95
108
  # Use a static list of database names for migrate
96
- Apartment.configure do |config|
97
- config.database_names = ['db1', 'db2']
98
- end
109
+ config.database_names = ['db1', 'db2']
99
110
 
100
111
  You can then migration your databases using the rake task:
101
112
 
@@ -128,8 +139,11 @@ that a `database` attribute is set on this model *before* it is serialized, to e
128
139
  end
129
140
  end
130
141
 
131
- ## TODO
142
+ ## Contributing
132
143
 
133
- * Cross-database associations
144
+ * Please issue pull requests to the `development` branch. All development happens here, master is used for releases
145
+ * Ensure that your code is accompanied with tests. No code will be merged without tests
134
146
 
135
- ## Contributing
147
+ ## TODO
148
+
149
+ * Shared examples for testing to ensure consistency across all adapters
data/Rakefile CHANGED
@@ -11,7 +11,7 @@ end
11
11
 
12
12
  namespace :spec do
13
13
 
14
- [:tasks, :unit, :integration].each do |type|
14
+ [:tasks, :unit, :adapters, :integration].each do |type|
15
15
  RSpec::Core::RakeTask.new(type) do |spec|
16
16
  spec.pattern = "spec/#{type}/**/*_spec.rb"
17
17
  end
@@ -33,19 +33,46 @@ namespace :postgres do
33
33
 
34
34
  desc 'Build the PostgreSQL test databases'
35
35
  task :build_db do
36
- %x{ createdb -E UTF8 #{config['database']} } rescue "test db already exists"
37
- ActiveRecord::Base.establish_connection config
36
+ %x{ createdb -E UTF8 #{pg_config['database']} } rescue "test db already exists"
37
+ ActiveRecord::Base.establish_connection pg_config
38
38
  load 'spec/dummy/db/schema.rb'
39
39
  end
40
40
 
41
41
  desc "drop the PostgreSQL test database"
42
42
  task :drop_db do
43
- puts "dropping database #{config['database']}"
44
- %x{ dropdb #{config['database']} }
43
+ puts "dropping database #{pg_config['database']}"
44
+ %x{ dropdb #{pg_config['database']} }
45
45
  end
46
+
47
+ end
48
+
49
+ namespace :mysql do
50
+ require 'active_record'
51
+ require "#{File.join(File.dirname(__FILE__), 'spec', 'support', 'config')}"
46
52
 
47
- def config
48
- Apartment::Test.config['connections']['postgresql']
53
+ desc 'Build the MySQL test databases'
54
+ task :build_db do
55
+ %x{ mysqladmin -u root create #{my_config['database']} } rescue "test db already exists"
56
+ ActiveRecord::Base.establish_connection my_config
57
+ load 'spec/dummy/db/schema.rb'
49
58
  end
50
59
 
51
- end
60
+ desc "drop the MySQL test database"
61
+ task :drop_db do
62
+ puts "dropping database #{my_config['database']}"
63
+ %x{ mysqladmin -u root drop #{my_config['database']} }
64
+ end
65
+
66
+ end
67
+
68
+ def config
69
+ Apartment::Test.config['connections']
70
+ end
71
+
72
+ def pg_config
73
+ config['postgresql']
74
+ end
75
+
76
+ def my_config
77
+ config['mysql']
78
+ end
data/apartment.gemspec CHANGED
@@ -14,17 +14,19 @@ Gem::Specification.new do |s|
14
14
  s.files = `git ls-files`.split("\n")
15
15
  s.test_files = `git ls-files -- {spec}/*`.split("\n")
16
16
 
17
- s.homepage = %q{http://github.com/ryanbrunner/apartment}
17
+ s.homepage = %q{http://github.com/bradrobertson/apartment}
18
18
  s.licenses = ["MIT"]
19
19
  s.require_paths = ["lib"]
20
20
  s.rubygems_version = %q{1.3.7}
21
21
 
22
- s.add_dependency 'rails', '~> 3.0.8'
22
+ s.add_dependency 'rails', '>= 3.0.10'
23
+ s.add_development_dependency 'rake', '~> 0.8.7'
23
24
  s.add_development_dependency 'sqlite3'
24
25
  s.add_development_dependency 'rspec', '~> 2.6.0'
25
26
  s.add_development_dependency 'rspec-rails', '~> 2.6.1'
26
27
  s.add_development_dependency 'capybara', '1.0.0'
27
28
  s.add_development_dependency 'pg', '~> 0.11.0'
28
- s.add_development_dependency "silent-postgres", "~> 0.0.8"
29
+ s.add_development_dependency 'mysql2', '0.2.7'
30
+ s.add_development_dependency "silent-postgres", "~> 0.1.1"
29
31
  s.add_development_dependency 'delayed_job', '~> 2.1.4'
30
32
  end
data/lib/apartment.rb CHANGED
@@ -3,7 +3,7 @@ require 'apartment/railtie'
3
3
  module Apartment
4
4
 
5
5
  class << self
6
- attr_accessor :use_postgres_schemas, :seed_after_create
6
+ attr_accessor :use_postgres_schemas, :seed_after_create, :prepend_environment
7
7
  attr_writer :database_names, :excluded_models
8
8
 
9
9
  # configure apartment with available options
@@ -71,4 +71,5 @@ Apartment.configure do |config|
71
71
  config.use_postgres_schemas = true
72
72
  config.database_names = []
73
73
  config.seed_after_create = false
74
+ config.prepend_environment = true
74
75
  end
@@ -10,14 +10,14 @@ module Apartment
10
10
  # @param {Hash} config Database config
11
11
  # @param {Hash} defaults Some default options
12
12
  #
13
- def initialize(config, defaults)
13
+ def initialize(config, defaults = {})
14
14
  @config = config
15
15
  @defaults = defaults
16
16
  end
17
17
 
18
- # Connect to db or schema, do stuff, switch back to previous db/schema (equivalent to a switch... do stuff... switch back)
18
+ # Connect to db, do your biz, switch back to previous db
19
19
  #
20
- # @param {String?} database Database or schema to connect to, will reset if no database passed in
20
+ # @param {String?} database Database or schema to connect to
21
21
  def process(database = nil)
22
22
  current_db = current_database
23
23
  switch(database)
@@ -30,14 +30,11 @@ module Apartment
30
30
  #
31
31
  # @param {String} database Database name
32
32
  def create(database)
33
- # TODO create_database unless using_schemas?
33
+ ActiveRecord::Base.connection.execute("CREATE DATABASE #{environmentify(sanitize(database))}")
34
34
 
35
35
  process(database) do
36
36
  import_database_schema
37
37
 
38
- # Manually init schema migrations table (apparently there were issues with Postgres when this isn't done)
39
- ActiveRecord::Base.connection.initialize_schema_migrations_table
40
-
41
38
  # Seed data if appropriate
42
39
  seed_data if Apartment.seed_after_create
43
40
  end
@@ -55,6 +52,13 @@ module Apartment
55
52
 
56
53
  connect_to_new(database)
57
54
  end
55
+
56
+ def environmentify(database)
57
+ # prepend the environment if configured and the environment isn't already there
58
+ return "#{Rails.env}_#{database}" if Apartment.prepend_environment && !database.include?(Rails.env)
59
+
60
+ database
61
+ end
58
62
 
59
63
  def seed_data
60
64
  load_or_abort("#{Rails.root}/db/seeds.rb")
@@ -68,10 +72,6 @@ module Apartment
68
72
 
69
73
  protected
70
74
 
71
- def create_schema
72
- # noop
73
- end
74
-
75
75
  def connect_to_new(database)
76
76
  ActiveRecord::Base.establish_connection multi_tenantify(database)
77
77
  end
@@ -83,7 +83,7 @@ module Apartment
83
83
  # Return a new config that is multi-tenanted
84
84
  def multi_tenantify(database)
85
85
  @config.clone.tap do |config|
86
- config['database'].gsub!(Rails.env.to_s, "#{database}_#{Rails.env}")
86
+ config[:database] = environmentify(database)
87
87
  end
88
88
  end
89
89
 
@@ -92,14 +92,12 @@ module Apartment
92
92
  database.gsub(/[\W]/,'')
93
93
  end
94
94
 
95
- # Whether or not to use postgresql schemas
96
- def using_schemas?
97
- false
98
- end
99
-
100
95
  def load_or_abort(file)
101
96
  if File.exists?(file)
102
- load(file)
97
+ # Don't log the output of loading files (such as schema or seeds)
98
+ silence_stream(STDOUT) do
99
+ load(file)
100
+ end
103
101
  else
104
102
  abort %{#{file} doesn't exist yet}
105
103
  end
@@ -107,4 +105,4 @@ module Apartment
107
105
 
108
106
  end
109
107
  end
110
- end
108
+ end
@@ -1,4 +1,11 @@
1
1
  module Apartment
2
+
3
+ module Database
4
+
5
+ def self.mysql_adapter(config)
6
+ Adapters::MysqlAdapter.new config
7
+ end
8
+ end
2
9
 
3
10
  module Adapters
4
11
 
@@ -3,56 +3,51 @@ module Apartment
3
3
  module Database
4
4
 
5
5
  def self.postgresql_adapter(config)
6
- Adapters::PostgresqlAdapter.new config, :schema_search_path => ActiveRecord::Base.connection.schema_search_path # this is the initial search path before any switches happen
6
+ Apartment.use_postgres_schemas ?
7
+ Adapters::PostgresqlSchemaAdapter.new(config, :schema_search_path => ActiveRecord::Base.connection.schema_search_path) :
8
+ Adapters::PostgresqlAdapter.new(config)
7
9
  end
8
10
  end
9
11
 
10
12
  module Adapters
11
13
 
14
+ # Default adapter when not using Postgresql Schemas
12
15
  class PostgresqlAdapter < AbstractAdapter
16
+ end
17
+
18
+ # Separate Adapter for Postgresql when using schemas
19
+ class PostgresqlSchemaAdapter < AbstractAdapter
13
20
 
14
21
  # Set schema path or connect to new db
15
- def connect_to_new(database)
16
- return ActiveRecord::Base.connection.schema_search_path = database if using_schemas?
17
-
18
- super # if !using_schemas? (implicit)
22
+ # TODO sanitize method doesn't work with schemas as the default schema uses "$user", stripping out the quotes makes it fail
23
+ def connect_to_new(database = nil)
24
+ return reset if database.nil?
25
+ ActiveRecord::Base.connection.schema_search_path = database
19
26
  rescue ActiveRecord::StatementInvalid => e
20
27
  raise SchemaNotFound, e
21
28
  end
22
29
 
23
30
  def create(database)
24
- reset
25
- # Postgres will (optionally) use 'schemas' instead of actual dbs, create a new schema while connected to main (global) db
26
- create_schema(database) if using_schemas?
27
- super(database)
31
+ ActiveRecord::Base.connection.execute("CREATE SCHEMA #{database}")
32
+
33
+ process(database) do
34
+ import_database_schema
35
+
36
+ # Seed data if appropriate
37
+ seed_data if Apartment.seed_after_create
38
+ end
39
+ rescue ActiveRecord::StatementInvalid => e
40
+ raise SchemaExists, e
28
41
  end
29
42
 
43
+ def current_database
44
+ ActiveRecord::Base.connection.schema_search_path
45
+ end
46
+
30
47
  def reset
31
- return ActiveRecord::Base.connection.schema_search_path = @defaults[:schema_search_path] if using_schemas?
32
-
33
- super # if !using_schemas?
48
+ ActiveRecord::Base.connection.schema_search_path = @defaults[:schema_search_path]
34
49
  end
35
50
 
36
- def current_database
37
- return ActiveRecord::Base.connection.schema_search_path if using_schemas?
38
-
39
- super # if !using_schemas?
40
- end
41
-
42
- protected
43
-
44
- def create_schema(database)
45
- reset
46
-
47
- ActiveRecord::Base.connection.execute("CREATE SCHEMA #{sanitize(database)}")
48
- rescue Exception => e
49
- raise SchemaExists, e
50
- end
51
-
52
- def using_schemas?
53
- Apartment.use_postgres_schemas
54
- end
55
-
56
51
  end
57
52
 
58
53
  end
@@ -1,3 +1,3 @@
1
1
  module Apartment
2
- VERSION = "0.10.1"
2
+ VERSION = "0.10.2"
3
3
  end
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+ require 'apartment/adapters/mysql_adapter' # specific adapters get dynamically loaded based on adapter name, so we must manually require here
3
+
4
+ describe Apartment::Adapters::MysqlAdapter do
5
+
6
+ before do
7
+ ActiveRecord::Base.establish_connection Apartment::Test.config['connections']['mysql']
8
+ @mysql = Apartment::Database.mysql_adapter Apartment::Test.config['connections']['mysql'].symbolize_keys
9
+ end
10
+
11
+ after do
12
+ ActiveRecord::Base.clear_all_connections!
13
+ end
14
+
15
+ context "using databases" do
16
+
17
+ let(:database1){ 'first_database' }
18
+
19
+ before do
20
+ @mysql.create(database1)
21
+ end
22
+
23
+ after do
24
+ ActiveRecord::Base.connection.drop_database(@mysql.environmentify(database1))
25
+ end
26
+
27
+ describe "#create" do
28
+ it "should create the new database" do
29
+ ActiveRecord::Base.connection.execute("SELECT schema_name FROM information_schema.schemata").collect{|row| row[0]}.should include(@mysql.environmentify(database1))
30
+ end
31
+ end
32
+
33
+ end
34
+
35
+
36
+ end
@@ -5,7 +5,7 @@ describe Apartment::Adapters::PostgresqlAdapter do
5
5
 
6
6
  before do
7
7
  ActiveRecord::Base.establish_connection Apartment::Test.config['connections']['postgresql']
8
- @pg = Apartment::Database.postgresql_adapter Apartment::Test.config['connections']['postgresql'].symbolize_keys
8
+ @schema_search_path = ActiveRecord::Base.connection.schema_search_path
9
9
  end
10
10
 
11
11
  after do
@@ -13,72 +13,79 @@ describe Apartment::Adapters::PostgresqlAdapter do
13
13
  end
14
14
 
15
15
  context "using schemas" do
16
-
17
- let(:schema1){ 'first_db_schema' }
18
- let(:schema_search_path){ ActiveRecord::Base.connection.schema_search_path }
19
16
 
17
+ let(:schema){ 'first_db_schema' }
18
+
19
+ subject{ Apartment::Database.postgresql_adapter Apartment::Test.config['connections']['postgresql'].symbolize_keys }
20
+
20
21
  before do
21
- @pg.create(schema1)
22
+ Apartment.use_postgres_schemas = true
23
+ subject.create(schema)
22
24
  end
23
25
 
24
26
  after do
25
- Apartment::Test.drop_schema(schema1)
27
+ Apartment::Test.drop_schema(schema)
26
28
  end
27
-
29
+
28
30
  describe "#create" do
31
+
29
32
  it "should create the new schema" do
30
- ActiveRecord::Base.connection.execute("SELECT nspname FROM pg_namespace;").collect{|row| row['nspname']}.should include(schema1)
33
+ ActiveRecord::Base.connection.execute("SELECT nspname FROM pg_namespace;").collect{|row| row['nspname']}.should include(schema)
31
34
  end
32
35
 
33
36
  it "should load schema.rb to new schema" do
34
- ActiveRecord::Base.connection.schema_search_path = schema1
37
+ ActiveRecord::Base.connection.schema_search_path = schema
35
38
  ActiveRecord::Base.connection.tables.should include('companies')
36
39
  end
37
40
 
38
41
  it "should reset connection when finished" do
39
- ActiveRecord::Base.connection.schema_search_path.should_not == schema1
42
+ ActiveRecord::Base.connection.schema_search_path.should_not == schema
40
43
  end
41
44
  end
42
45
 
43
46
  describe "#process" do
44
47
  it "should connect" do
45
- @pg.process(schema1) do
46
- ActiveRecord::Base.connection.schema_search_path.should == schema1
48
+ subject.process(schema) do
49
+ ActiveRecord::Base.connection.schema_search_path.should == schema
47
50
  end
48
51
  end
49
52
 
50
53
  it "should reset" do
51
- @pg.process(schema1)
52
- ActiveRecord::Base.connection.schema_search_path.should == schema_search_path
54
+ subject.process(schema)
55
+ ActiveRecord::Base.connection.schema_search_path.should == @schema_search_path
53
56
  end
54
57
  end
55
58
 
56
59
  describe "#reset" do
57
60
  it "should reset connection" do
58
- @pg.switch(schema1)
59
- @pg.reset
60
- ActiveRecord::Base.connection.schema_search_path.should == schema_search_path
61
+ subject.switch(schema)
62
+ subject.reset
63
+ ActiveRecord::Base.connection.schema_search_path.should == @schema_search_path
61
64
  end
62
65
  end
63
66
 
64
67
  describe "#switch" do
65
68
  it "should connect to new schema" do
66
- @pg.switch(schema1)
67
- ActiveRecord::Base.connection.schema_search_path.should == schema1
69
+ subject.switch(schema)
70
+ ActiveRecord::Base.connection.schema_search_path.should == schema
68
71
  end
69
72
 
70
73
  it "should reset connection if database is nil" do
71
- @pg.switch
72
- ActiveRecord::Base.connection.schema_search_path.should == schema_search_path
74
+ subject.switch
75
+ ActiveRecord::Base.connection.schema_search_path.should == @schema_search_path
73
76
  end
74
77
  end
75
78
 
76
79
  describe "#current_database" do
77
80
  it "should return the current schema name" do
78
- @pg.switch(schema1)
79
- @pg.current_database.should == schema1
81
+ subject.switch(schema)
82
+ subject.current_database.should == schema
80
83
  end
81
84
  end
82
85
 
83
86
  end
87
+
88
+ context "using databases" do
89
+ # TODO
90
+ end
84
91
  end
@@ -4,4 +4,8 @@ describe Apartment do
4
4
  it "should be valid" do
5
5
  Apartment.should be_a(Module)
6
6
  end
7
+
8
+ it "should be a valid app" do
9
+ ::Rails.application.should be_a(Dummy::Application)
10
+ end
7
11
  end
@@ -3,8 +3,10 @@ connections:
3
3
  adapter: postgresql
4
4
  database: apartment_postgresql_test
5
5
  username: root
6
- password:
7
-
6
+ password:
7
+
8
8
  mysql:
9
- adapater: mysql
10
- database: apartment_mysql_test
9
+ adapter: mysql2
10
+ database: apartment_mysql_test
11
+ username: root
12
+ password:
@@ -1,3 +1,4 @@
1
+ # encoding: UTF-8
1
2
  # This file is auto-generated from the current state of the database. Instead
2
3
  # of editing this file, please use the migrations feature of Active Record to
3
4
  # incrementally modify your database, and then regenerate this schema definition.
@@ -11,6 +11,7 @@ describe Apartment::Database do
11
11
  let(:database2){ "yet_another_database" }
12
12
 
13
13
  before do
14
+ Apartment.use_postgres_schemas = true
14
15
  ActiveRecord::Base.establish_connection config
15
16
  Apartment::Test.load_schema # load the Rails schema in the public db schema
16
17
  Apartment::Database.stub(:config).and_return config # Use postgresql database config for this test
data/spec/spec_helper.rb CHANGED
@@ -22,4 +22,10 @@ RSpec.configure do |config|
22
22
 
23
23
  config.include RSpec::Integration::CapybaraSessions, :type => :request
24
24
 
25
+ config.before(:all) do
26
+ # Ensure that each test starts with a clean connect
27
+ # Necessary as some tests will leak things like current_schema into the next
28
+ ActiveRecord::Base.clear_all_connections!
29
+ end
30
+
25
31
  end
@@ -29,5 +29,11 @@ module Apartment
29
29
  ActiveRecord::Migrator.rollback(Rails.root + ActiveRecord::Migrator.migrations_path)
30
30
  end
31
31
 
32
+ private
33
+
34
+ def sanitize(database)
35
+ database.gsub(/[\W]/,'')
36
+ end
37
+
32
38
  end
33
39
  end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: apartment
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.10.1
5
+ version: 0.10.2
6
6
  platform: ruby
7
7
  authors:
8
8
  - Ryan Brunner
@@ -19,15 +19,26 @@ dependencies:
19
19
  requirement: &id001 !ruby/object:Gem::Requirement
20
20
  none: false
21
21
  requirements:
22
- - - ~>
22
+ - - ">="
23
23
  - !ruby/object:Gem::Version
24
- version: 3.0.8
24
+ version: 3.0.10
25
25
  type: :runtime
26
26
  prerelease: false
27
27
  version_requirements: *id001
28
28
  - !ruby/object:Gem::Dependency
29
- name: sqlite3
29
+ name: rake
30
30
  requirement: &id002 !ruby/object:Gem::Requirement
31
+ none: false
32
+ requirements:
33
+ - - ~>
34
+ - !ruby/object:Gem::Version
35
+ version: 0.8.7
36
+ type: :development
37
+ prerelease: false
38
+ version_requirements: *id002
39
+ - !ruby/object:Gem::Dependency
40
+ name: sqlite3
41
+ requirement: &id003 !ruby/object:Gem::Requirement
31
42
  none: false
32
43
  requirements:
33
44
  - - ">="
@@ -35,10 +46,10 @@ dependencies:
35
46
  version: "0"
36
47
  type: :development
37
48
  prerelease: false
38
- version_requirements: *id002
49
+ version_requirements: *id003
39
50
  - !ruby/object:Gem::Dependency
40
51
  name: rspec
41
- requirement: &id003 !ruby/object:Gem::Requirement
52
+ requirement: &id004 !ruby/object:Gem::Requirement
42
53
  none: false
43
54
  requirements:
44
55
  - - ~>
@@ -46,10 +57,10 @@ dependencies:
46
57
  version: 2.6.0
47
58
  type: :development
48
59
  prerelease: false
49
- version_requirements: *id003
60
+ version_requirements: *id004
50
61
  - !ruby/object:Gem::Dependency
51
62
  name: rspec-rails
52
- requirement: &id004 !ruby/object:Gem::Requirement
63
+ requirement: &id005 !ruby/object:Gem::Requirement
53
64
  none: false
54
65
  requirements:
55
66
  - - ~>
@@ -57,10 +68,10 @@ dependencies:
57
68
  version: 2.6.1
58
69
  type: :development
59
70
  prerelease: false
60
- version_requirements: *id004
71
+ version_requirements: *id005
61
72
  - !ruby/object:Gem::Dependency
62
73
  name: capybara
63
- requirement: &id005 !ruby/object:Gem::Requirement
74
+ requirement: &id006 !ruby/object:Gem::Requirement
64
75
  none: false
65
76
  requirements:
66
77
  - - "="
@@ -68,10 +79,10 @@ dependencies:
68
79
  version: 1.0.0
69
80
  type: :development
70
81
  prerelease: false
71
- version_requirements: *id005
82
+ version_requirements: *id006
72
83
  - !ruby/object:Gem::Dependency
73
84
  name: pg
74
- requirement: &id006 !ruby/object:Gem::Requirement
85
+ requirement: &id007 !ruby/object:Gem::Requirement
75
86
  none: false
76
87
  requirements:
77
88
  - - ~>
@@ -79,21 +90,32 @@ dependencies:
79
90
  version: 0.11.0
80
91
  type: :development
81
92
  prerelease: false
82
- version_requirements: *id006
93
+ version_requirements: *id007
94
+ - !ruby/object:Gem::Dependency
95
+ name: mysql2
96
+ requirement: &id008 !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - "="
100
+ - !ruby/object:Gem::Version
101
+ version: 0.2.7
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: *id008
83
105
  - !ruby/object:Gem::Dependency
84
106
  name: silent-postgres
85
- requirement: &id007 !ruby/object:Gem::Requirement
107
+ requirement: &id009 !ruby/object:Gem::Requirement
86
108
  none: false
87
109
  requirements:
88
110
  - - ~>
89
111
  - !ruby/object:Gem::Version
90
- version: 0.0.8
112
+ version: 0.1.1
91
113
  type: :development
92
114
  prerelease: false
93
- version_requirements: *id007
115
+ version_requirements: *id009
94
116
  - !ruby/object:Gem::Dependency
95
117
  name: delayed_job
96
- requirement: &id008 !ruby/object:Gem::Requirement
118
+ requirement: &id010 !ruby/object:Gem::Requirement
97
119
  none: false
98
120
  requirements:
99
121
  - - ~>
@@ -101,7 +123,7 @@ dependencies:
101
123
  version: 2.1.4
102
124
  type: :development
103
125
  prerelease: false
104
- version_requirements: *id008
126
+ version_requirements: *id010
105
127
  description: Apartment allows Rails applications to deal with database multitenancy
106
128
  email:
107
129
  - ryan@ryanbrunner.com
@@ -135,6 +157,8 @@ files:
135
157
  - lib/apartment/railtie.rb
136
158
  - lib/apartment/version.rb
137
159
  - lib/tasks/apartment.rake
160
+ - spec/adapters/mysql_adapter_spec.rb
161
+ - spec/adapters/postgresql_adapter_spec.rb
138
162
  - spec/apartment_spec.rb
139
163
  - spec/config/database.yml
140
164
  - spec/dummy/Rakefile
@@ -173,12 +197,10 @@ files:
173
197
  - spec/dummy/public/favicon.ico
174
198
  - spec/dummy/public/stylesheets/.gitkeep
175
199
  - spec/dummy/script/rails
176
- - spec/integration/adapters/postgresql_integration_spec.rb
177
200
  - spec/integration/apartment_rake_integration_spec.rb
178
201
  - spec/integration/database_integration_spec.rb
179
202
  - spec/integration/delayed_job_integration_spec.rb
180
203
  - spec/integration/middleware/subdomain_elevator_spec.rb
181
- - spec/integration/setup_spec.rb
182
204
  - spec/spec_helper.rb
183
205
  - spec/support/apartment_helpers.rb
184
206
  - spec/support/capybara_sessions.rb
@@ -188,7 +210,7 @@ files:
188
210
  - spec/unit/middleware/subdomain_elevator_spec.rb
189
211
  - spec/unit/migrator_spec.rb
190
212
  has_rdoc: true
191
- homepage: http://github.com/ryanbrunner/apartment
213
+ homepage: http://github.com/bradrobertson/apartment
192
214
  licenses:
193
215
  - MIT
194
216
  post_install_message:
@@ -201,7 +223,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
201
223
  requirements:
202
224
  - - ">="
203
225
  - !ruby/object:Gem::Version
204
- hash: 2437262217849019999
226
+ hash: -795357038977467043
205
227
  segments:
206
228
  - 0
207
229
  version: "0"
@@ -210,7 +232,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
210
232
  requirements:
211
233
  - - ">="
212
234
  - !ruby/object:Gem::Version
213
- hash: 2437262217849019999
235
+ hash: -795357038977467043
214
236
  segments:
215
237
  - 0
216
238
  version: "0"
@@ -1,8 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe "Setup" do
4
-
5
- it "should be a valid app" do
6
- ::Rails.application.should be_a(Dummy::Application)
7
- end
8
- end