apartment 0.10.1 → 0.10.2

Sign up to get free protection for your applications and to get access to all the features.
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