apartment 0.18.0 → 0.19.0

Sign up to get free protection for your applications and to get access to all the features.
data/HISTORY.md CHANGED
@@ -1,3 +1,10 @@
1
+ # 0.19.0
2
+ * Dec 29, 2012
3
+
4
+ - Apartment is now threadsafe
5
+ - New postgis adapter [zonpantli]
6
+ - Removed ActionDispatch dependency for use with Rack apps (regression)
7
+
1
8
  # 0.18.0
2
9
  * Nov 27, 2012
3
10
 
data/README.md CHANGED
@@ -164,7 +164,7 @@ of dbs to Apartment. You can make this dynamic by providing a Proc object to be
164
164
  This object should yield an array of string representing each database name. Example:
165
165
 
166
166
  # Dynamically get database names to migrate
167
- config.database_names = lambda{ Customer.select(:database_name).map(&:database_name) }
167
+ config.database_names = lambda{ Customer.pluck(:database_name) }
168
168
 
169
169
  # Use a static list of database names for migrate
170
170
  config.database_names = ['db1', 'db2']
@@ -234,4 +234,4 @@ All jobs *must* stored in the global (public) namespace, so add it to the list o
234
234
 
235
235
  ## License
236
236
 
237
- Apartment is released under the [MIT License](http://www.opensource.org/licenses/MIT).
237
+ Apartment is released under the [MIT License](http://www.opensource.org/licenses/MIT).
data/apartment.gemspec CHANGED
@@ -25,8 +25,8 @@ Gem::Specification.new do |s|
25
25
  s.add_development_dependency 'rails', '>= 3.1.2'
26
26
  s.add_development_dependency 'rake', '~> 0.9.2'
27
27
  s.add_development_dependency 'sqlite3'
28
- s.add_development_dependency 'rspec', '~> 2.10.0'
29
- s.add_development_dependency 'rspec-rails', '~> 2.10.0'
28
+ s.add_development_dependency 'rspec', '~> 2.11'
29
+ s.add_development_dependency 'rspec-rails', '~> 2.11'
30
30
  s.add_development_dependency 'capybara', '~> 1.0.0'
31
31
  s.add_development_dependency 'pg', '>= 0.11.0'
32
32
  s.add_development_dependency 'mysql2', '~> 0.3.10'
data/lib/apartment.rb CHANGED
@@ -1,9 +1,11 @@
1
1
  require 'apartment/railtie' if defined?(Rails)
2
+ require 'active_support/core_ext/module/delegation'
3
+ require 'active_support/core_ext/object/blank'
2
4
 
3
5
  module Apartment
4
6
 
5
7
  class << self
6
- ACCESSOR_METHODS = [:use_postgres_schemas, :seed_after_create, :prepend_environment, :append_environment]
8
+ ACCESSOR_METHODS = [:use_schemas, :seed_after_create, :prepend_environment, :append_environment]
7
9
  WRITER_METHODS = [:database_names, :excluded_models, :default_schema, :persistent_schemas, :connection_class]
8
10
 
9
11
  attr_accessor(*ACCESSOR_METHODS)
@@ -16,11 +18,6 @@ module Apartment
16
18
  yield self if block_given?
17
19
  end
18
20
 
19
- # Default switch schema to public
20
- def schema_to_switch
21
- @schema_to_switch || "public"
22
- end
23
-
24
21
  # Be careful not to use `return` here so both Proc and lambda can be used without breaking
25
22
  def database_names
26
23
  @database_names.respond_to?(:call) ? @database_names.call : @database_names
@@ -48,6 +45,16 @@ module Apartment
48
45
  (ACCESSOR_METHODS + WRITER_METHODS).each{|method| instance_variable_set(:"@#{method}", nil) }
49
46
  end
50
47
 
48
+ def use_postgres_schemas
49
+ warn "[Deprecation Warning] `use_postgresql_schemas` is now deprecated, please use `use_schemas`"
50
+ use_schemas
51
+ end
52
+
53
+ def use_postgres_schemas=(to_use_or_not_to_use)
54
+ warn "[Deprecation Warning] `use_postgresql_schemas=` is now deprecated, please use `use_schemas=`"
55
+ self.use_schemas = to_use_or_not_to_use
56
+ end
57
+
51
58
  end
52
59
 
53
60
  autoload :Database, 'apartment/database'
@@ -8,11 +8,9 @@ module Apartment
8
8
 
9
9
  # @constructor
10
10
  # @param {Hash} config Database config
11
- # @param {Hash} defaults Some default options
12
11
  #
13
- def initialize(config, defaults = {})
12
+ def initialize(config)
14
13
  @config = config
15
- @defaults = defaults
16
14
  end
17
15
 
18
16
  # Create a new database, import schema, seed if appropriate
@@ -39,7 +37,12 @@ module Apartment
39
37
  def current_database
40
38
  Apartment.connection.current_database
41
39
  end
42
- alias_method :current, :current_database
40
+
41
+ # Note alias_method here doesn't work with inheritence apparently ??
42
+ #
43
+ def current
44
+ current_database
45
+ end
43
46
 
44
47
  # Drop the database
45
48
  #
@@ -0,0 +1,15 @@
1
+ # handle postgis adapter as if it were postgresql,
2
+ # only override the adapter_method used for initialization
3
+ require "apartment/adapters/postgresql_adapter"
4
+
5
+ module Apartment
6
+
7
+ module Database
8
+
9
+ def self.postgis_adapter(config)
10
+ Apartment.use_schemas ?
11
+ Adapters::PostgresqlSchemaAdapter.new(config) :
12
+ Adapters::PostgresqlAdapter.new(config)
13
+ end
14
+ end
15
+ end
@@ -3,7 +3,7 @@ module Apartment
3
3
  module Database
4
4
 
5
5
  def self.postgresql_adapter(config)
6
- Apartment.use_postgres_schemas ?
6
+ Apartment.use_schemas ?
7
7
  Adapters::PostgresqlSchemaAdapter.new(config) :
8
8
  Adapters::PostgresqlAdapter.new(config)
9
9
  end
@@ -33,8 +33,6 @@ module Apartment
33
33
  # Separate Adapter for Postgresql when using schemas
34
34
  class PostgresqlSchemaAdapter < AbstractAdapter
35
35
 
36
- attr_reader :current_database
37
-
38
36
  # Drop the database schema
39
37
  #
40
38
  # @param {String} database Database (schema) to drop
@@ -81,6 +79,10 @@ module Apartment
81
79
  Apartment.connection.schema_search_path = full_search_path
82
80
  end
83
81
 
82
+ def current_database
83
+ @current_database || Apartment.default_schema
84
+ end
85
+
84
86
  protected
85
87
 
86
88
  # Set schema search path to new schema
@@ -23,7 +23,7 @@ module Apartment
23
23
  # @return {subclass of Apartment::AbstractAdapter}
24
24
  #
25
25
  def adapter
26
- @adapter ||= begin
26
+ Thread.current[:apartment_adapter] ||= begin
27
27
  adapter_method = "#{config[:adapter]}_adapter"
28
28
 
29
29
  begin
@@ -43,7 +43,7 @@ module Apartment
43
43
  # Reset config and adapter so they are regenerated
44
44
  #
45
45
  def reload!
46
- @adapter = nil
46
+ Thread.current[:apartment_adapter] = nil
47
47
  @config = nil
48
48
  end
49
49
 
@@ -10,7 +10,7 @@ module Apartment
10
10
  end
11
11
 
12
12
  def call(env)
13
- request = ActionDispatch::Request.new(env)
13
+ request = Rack::Request.new(env)
14
14
 
15
15
  database = @processor.call(request)
16
16
 
@@ -6,7 +6,29 @@ module Apartment
6
6
  class Subdomain < Generic
7
7
 
8
8
  def parse_database_name(request)
9
- request.subdomain.present? && request.subdomain || nil
9
+ database = subdomain(request.host)
10
+
11
+ database.present? && database || nil
12
+ end
13
+
14
+ private
15
+
16
+ # *Almost* a direct ripoff of ActionDispatch::Request subdomain methods
17
+
18
+ # Only care about the first subdomain for the database name
19
+ def subdomain(host)
20
+ subdomains(host).first
21
+ end
22
+
23
+ # Assuming tld_length of 1, might need to make this configurable in Apartment in the future for things like .co.uk
24
+ def subdomains(host, tld_length = 1)
25
+ return [] unless named_host?(host)
26
+
27
+ host.split('.')[0..-(tld_length + 2)]
28
+ end
29
+
30
+ def named_host?(host)
31
+ !(host.nil? || /\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/.match(host))
10
32
  end
11
33
  end
12
34
  end
@@ -10,7 +10,7 @@ module Apartment
10
10
  config.before_initialize do
11
11
  Apartment.configure do |config|
12
12
  config.excluded_models = []
13
- config.use_postgres_schemas = true
13
+ config.use_schemas = true
14
14
  config.database_names = []
15
15
  config.seed_after_create = false
16
16
  config.prepend_environment = false
@@ -1,3 +1,3 @@
1
1
  module Apartment
2
- VERSION = "0.18.0"
2
+ VERSION = "0.19.0"
3
3
  end
@@ -10,7 +10,7 @@ Apartment.configure do |config|
10
10
  }
11
11
 
12
12
  # use postgres schemas?
13
- config.use_postgres_schemas = true
13
+ config.use_schemas = true
14
14
 
15
15
  # configure persistent schemas (E.g. hstore )
16
16
  # config.persistent_schemas = %w{ hstore }
@@ -8,7 +8,7 @@ describe Apartment::Adapters::PostgresqlAdapter do
8
8
 
9
9
  context "using schemas" do
10
10
 
11
- before{ Apartment.use_postgres_schemas = true }
11
+ before{ Apartment.use_schemas = true }
12
12
 
13
13
  # Not sure why, but somehow using let(:database_names) memoizes for the whole example group, not just each test
14
14
  def database_names
@@ -23,7 +23,7 @@ describe Apartment::Adapters::PostgresqlAdapter do
23
23
 
24
24
  context "using databases" do
25
25
 
26
- before{ Apartment.use_postgres_schemas = false }
26
+ before{ Apartment.use_schemas = false }
27
27
 
28
28
  # Not sure why, but somehow using let(:database_names) memoizes for the whole example group, not just each test
29
29
  def database_names
@@ -55,7 +55,7 @@ describe Apartment::Database do
55
55
  let(:database2){ Apartment::Test.next_db }
56
56
 
57
57
  before do
58
- Apartment.use_postgres_schemas = true
58
+ Apartment.use_schemas = true
59
59
  ActiveRecord::Base.establish_connection config
60
60
  Apartment::Test.load_schema # load the Rails schema in the public db schema
61
61
  subject.stub(:config).and_return config # Use postgresql database config for this test
@@ -79,6 +79,16 @@ describe Apartment::Database do
79
79
  }.to raise_error
80
80
  end
81
81
 
82
+ context "threadsafety" do
83
+ before { subject.create database }
84
+
85
+ it 'has a threadsafe adapter' do
86
+ subject.switch(database)
87
+ thread = Thread.new { subject.current_database.should == Apartment.default_schema }
88
+ thread.join
89
+ subject.current_database.should == database
90
+ end
91
+ end
82
92
  end
83
93
 
84
94
  context "with schemas" do
@@ -86,7 +96,7 @@ describe Apartment::Database do
86
96
  before do
87
97
  Apartment.configure do |config|
88
98
  config.excluded_models = []
89
- config.use_postgres_schemas = true
99
+ config.use_schemas = true
90
100
  config.seed_after_create = true
91
101
  end
92
102
  subject.create database
@@ -95,6 +95,7 @@ shared_examples_for "a generic apartment adapter" do
95
95
  it "should return the current db name" do
96
96
  subject.switch(db1)
97
97
  subject.current_database.should == db1
98
+ subject.current.should == db1
98
99
  end
99
100
  end
100
101
  end
@@ -204,12 +204,14 @@ shared_examples_for "a schema based apartment adapter" do
204
204
  it "should return the current schema name" do
205
205
  subject.switch(schema1)
206
206
  subject.current_database.should == schema1
207
+ subject.current.should == schema1
207
208
  end
208
209
 
209
210
  context "persistent_schemas", :persistent_schemas => true do
210
211
  it "should exlude persistent_schemas" do
211
212
  subject.switch(schema1)
212
213
  subject.current_database.should == schema1
214
+ subject.current.should == schema1
213
215
  end
214
216
  end
215
217
  end
@@ -16,7 +16,7 @@ describe Apartment::Delayed do
16
16
  Apartment::Database.stub(:config).and_return config # Use postgresql database config for this test
17
17
 
18
18
  Apartment.configure do |config|
19
- config.use_postgres_schemas = true
19
+ config.use_schemas = true
20
20
  end
21
21
 
22
22
  Apartment::Database.create database
@@ -3,7 +3,7 @@ require 'spec_helper'
3
3
  describe Apartment::Elevators::FirstSubdomain do
4
4
  describe "subdomain" do
5
5
  subject { described_class.new("test").parse_database_name(request) }
6
- let(:request) { double(:request, :subdomain => subdomain)}
6
+ let(:request) { double(:request, :host => "#{subdomain}.example.com") }
7
7
 
8
8
  context "one subdomain" do
9
9
  let(:subdomain) { "test" }
@@ -5,7 +5,7 @@ module Apartment
5
5
 
6
6
  def reset
7
7
  Apartment.excluded_models = nil
8
- Apartment.use_postgres_schemas = nil
8
+ Apartment.use_schemas = nil
9
9
  Apartment.seed_after_create = nil
10
10
  Apartment.default_schema = nil
11
11
  end
@@ -28,7 +28,7 @@ shared_context "elevators", :elevator => true do
28
28
  before do
29
29
  Apartment.reset # reset all config
30
30
  Apartment.seed_after_create = false
31
- Apartment.use_postgres_schemas = true
31
+ Apartment.use_schemas = true
32
32
  api.reload! # reload adapter
33
33
 
34
34
  api.create(database1)
@@ -20,12 +20,12 @@ describe Apartment do
20
20
  Apartment.excluded_models.should == excluded_models
21
21
  end
22
22
 
23
- it "should set postgres_schemas" do
23
+ it "should set use_schemas" do
24
24
  Apartment.configure do |config|
25
25
  config.excluded_models = []
26
- config.use_postgres_schemas = false
26
+ config.use_schemas = false
27
27
  end
28
- Apartment.use_postgres_schemas.should be_false
28
+ Apartment.use_schemas.should be_false
29
29
  end
30
30
 
31
31
  it "should set seed_after_create" do
@@ -12,7 +12,7 @@ describe Apartment::Migrator do
12
12
  @original_schema = ActiveRecord::Base.connection.schema_search_path
13
13
 
14
14
  Apartment.configure do |config|
15
- config.use_postgres_schemas = true
15
+ config.use_schemas = true
16
16
  config.excluded_models = []
17
17
  config.database_names = [schema_name]
18
18
  end
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.18.0
4
+ version: 0.19.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: 2012-11-28 00:00:00.000000000 Z
13
+ date: 2012-12-30 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activerecord
@@ -115,7 +115,7 @@ dependencies:
115
115
  requirements:
116
116
  - - ~>
117
117
  - !ruby/object:Gem::Version
118
- version: 2.10.0
118
+ version: '2.11'
119
119
  type: :development
120
120
  prerelease: false
121
121
  version_requirements: !ruby/object:Gem::Requirement
@@ -123,7 +123,7 @@ dependencies:
123
123
  requirements:
124
124
  - - ~>
125
125
  - !ruby/object:Gem::Version
126
- version: 2.10.0
126
+ version: '2.11'
127
127
  - !ruby/object:Gem::Dependency
128
128
  name: rspec-rails
129
129
  requirement: !ruby/object:Gem::Requirement
@@ -131,7 +131,7 @@ dependencies:
131
131
  requirements:
132
132
  - - ~>
133
133
  - !ruby/object:Gem::Version
134
- version: 2.10.0
134
+ version: '2.11'
135
135
  type: :development
136
136
  prerelease: false
137
137
  version_requirements: !ruby/object:Gem::Requirement
@@ -139,7 +139,7 @@ dependencies:
139
139
  requirements:
140
140
  - - ~>
141
141
  - !ruby/object:Gem::Version
142
- version: 2.10.0
142
+ version: '2.11'
143
143
  - !ruby/object:Gem::Dependency
144
144
  name: capybara
145
145
  requirement: !ruby/object:Gem::Requirement
@@ -244,6 +244,7 @@ files:
244
244
  - lib/apartment.rb
245
245
  - lib/apartment/adapters/abstract_adapter.rb
246
246
  - lib/apartment/adapters/mysql2_adapter.rb
247
+ - lib/apartment/adapters/postgis_adapter.rb
247
248
  - lib/apartment/adapters/postgresql_adapter.rb
248
249
  - lib/apartment/console.rb
249
250
  - lib/apartment/database.rb
@@ -342,7 +343,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
342
343
  version: '0'
343
344
  segments:
344
345
  - 0
345
- hash: -2510818630049995736
346
+ hash: -3842088920209676639
346
347
  required_rubygems_version: !ruby/object:Gem::Requirement
347
348
  none: false
348
349
  requirements:
@@ -351,7 +352,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
351
352
  version: '0'
352
353
  segments:
353
354
  - 0
354
- hash: -2510818630049995736
355
+ hash: -3842088920209676639
355
356
  requirements: []
356
357
  rubyforge_project:
357
358
  rubygems_version: 1.8.24