apartment 1.0.1 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 25a8f63a3b5e73c32fde8b9aa28f45dabaa44008
4
- data.tar.gz: 789fc81fa177f663c4c78e3f46f492f0a55b60f9
3
+ metadata.gz: 9cdae6ddf14e715ae80d9c932ca1d6425e6f56e1
4
+ data.tar.gz: 8162a81d9eb38bf3992314a4d6fddad14bbc55a8
5
5
  SHA512:
6
- metadata.gz: 1af4150a26a832f33b80ab5099e4d625275861d2ed9815418a6243ec4c05e48b1d7abd85e12f750073d1f0753c5421b86c2f6fb5f4504e0d12ea934ca20ad1a8
7
- data.tar.gz: 37cb6bc1da7d8bff326b11013e9bc789a1c0d265f255f1753094a560719ddbabc91ffd48b8afb77c5985bcc658ef1e7ce8f644c592113212ea4ef47b96865056
6
+ metadata.gz: 8683c9692ee16ece0b1876937e2ad79d25c057106c1f750e077386f5c0d04e822b5318baf250b10bcb0f9918bbddabdde6a53aaddd9637e9de0ccb9f33748208
7
+ data.tar.gz: b76295e730aa02ac1f5a89b53459fed7499f70821bc0292321d2b2f7dc8fc036dc441995a25334f8207519102f5375063f6b99099902713db2c935f241e98238
data/.gitignore CHANGED
@@ -11,3 +11,4 @@ spec/dummy/config/database.yml
11
11
  cookbooks
12
12
  tmp
13
13
  spec/dummy/db/*.sqlite3
14
+ .DS_Store
@@ -1 +1 @@
1
- ruby-2.1
1
+ ruby-2.2
data/HISTORY.md CHANGED
@@ -1,3 +1,9 @@
1
+ # 1.0.2
2
+ * July 2, 2015
3
+
4
+ - Fix pg_dump env vars - pull/208 [MitinPavel]
5
+ - Allow custom seed data file - pull/234 [typeoneerror]
6
+
1
7
  # 1.0.1
2
8
  * April 28, 2015
3
9
 
data/README.md CHANGED
@@ -8,6 +8,19 @@ Apartment provides tools to help you deal with multiple tenants in your Rails
8
8
  application. If you need to have certain data sequestered based on account or company,
9
9
  but still allow some data to exist in a common tenant, Apartment can help.
10
10
 
11
+ ## Excessive Memory Issues on ActiveRecord 4.x
12
+
13
+ > If you're noticing ever growing memory issues (ie growing with each tenant you add)
14
+ > when using Apartment, that's because there's [an issue](https://github.com/rails/rails/issues/19578)
15
+ > with how ActiveRecord maps Postgresql data types into AR data types.
16
+ > This has been patched and will be release for AR 4.2.2. It's apparently hard
17
+ > to backport to 4.1 unfortunately.
18
+ > If you want to use this today, you can use our [4.2.1 patched version](https://github.com/influitive/rails/tree/v4.2.1.memfix) on our github account using the code sample below.
19
+
20
+ ```ruby
21
+ gem 'rails', '4.2.1', github: 'influitive/rails', tag: 'v4.2.1.memfix'
22
+ ```
23
+
11
24
 
12
25
  ## Installation
13
26
 
@@ -36,6 +49,9 @@ on a per-user basis, look under "Usage - Switching tenants per request", below.
36
49
  > * for Rails 3.1.x: _Rails ~> 3.1.2_, it contains a [patch](https://github.com/rails/rails/pull/3232) that makes prepared statements work with multiple schemas
37
50
 
38
51
  ## Usage
52
+ ### Video Tutorial
53
+ How to separate your application data into different accounts or companies.
54
+ [GoRails #47](https://gorails.com/episodes/multitenancy-with-apartment)
39
55
 
40
56
  ### Creating new Tenants
41
57
 
@@ -284,7 +300,7 @@ This would be for a config with `default_schema` set to `public` and `persistent
284
300
  4. Next: `CREATE SCHEMA IF NOT EXISTS hstore;`
285
301
  5. Finally: `CREATE EXTENSION IF NOT EXISTS hstore SCHEMA hstore;` and hit enter (`\q` to exit)
286
302
 
287
- To double check, login to the console of your Heroku app and see if `Apartment.connection.default_search_path` is `public,hstore`
303
+ To double check, login to the console of your Heroku app and see if `Apartment.connection.schema_search_path` is `public,hstore`
288
304
 
289
305
  #### 3. Ensure the schema is in the apartment config
290
306
  ```ruby
@@ -326,7 +342,7 @@ config.use_sql = true
326
342
 
327
343
  ### Managing Migrations
328
344
 
329
- In order to migrate all of your tenants (or posgresql schemas) you need to provide a list
345
+ In order to migrate all of your tenants (or postgresql schemas) you need to provide a list
330
346
  of dbs to Apartment. You can make this dynamic by providing a Proc object to be called on migrations.
331
347
  This object should yield an array of string representing each tenant name. Example:
332
348
 
@@ -378,3 +394,5 @@ config.prepend_environment = !Rails.env.production?
378
394
  ## License
379
395
 
380
396
  Apartment is released under the [MIT License](http://www.opensource.org/licenses/MIT).
397
+
398
+ [![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/influitive/apartment/trend.png)](https://bitdeli.com/free "Bitdeli Badge")
@@ -12,7 +12,7 @@ module Apartment
12
12
  extend Forwardable
13
13
 
14
14
  ACCESSOR_METHODS = [:use_schemas, :use_sql, :seed_after_create, :prepend_environment, :append_environment]
15
- WRITER_METHODS = [:tenant_names, :database_schema_file, :excluded_models, :default_schema, :persistent_schemas, :connection_class, :tld_length, :db_migrate_tenants]
15
+ WRITER_METHODS = [:tenant_names, :database_schema_file, :excluded_models, :default_schema, :persistent_schemas, :connection_class, :tld_length, :db_migrate_tenants, :seed_data_file]
16
16
 
17
17
  attr_accessor(*ACCESSOR_METHODS)
18
18
  attr_writer(*WRITER_METHODS)
@@ -62,6 +62,12 @@ module Apartment
62
62
  @database_schema_file = Rails.root.join('db', 'schema.rb')
63
63
  end
64
64
 
65
+ def seed_data_file
66
+ return @seed_data_file if defined?(@seed_data_file)
67
+
68
+ @seed_data_file = "#{Rails.root}/db/seeds.rb"
69
+ end
70
+
65
71
  def tld_length
66
72
  @tld_length || 1
67
73
  end
@@ -138,7 +138,8 @@ module Apartment
138
138
  # Load the rails seed file into the db
139
139
  #
140
140
  def seed_data
141
- silence_stream(STDOUT){ load_or_abort("#{Rails.root}/db/seeds.rb") } # Don't log the output of seeding the db
141
+ # Don't log the output of seeding the db
142
+ silence_stream(STDOUT){ load_or_abort(Apartment.seed_data_file) } if Apartment.seed_data_file
142
143
  end
143
144
  alias_method :seed, :seed_data
144
145
 
@@ -157,7 +157,7 @@ module Apartment
157
157
 
158
158
  # `pg_dump -s -x -O -n #{default_tenant} #{excluded_tables} #{dbname}`
159
159
 
160
- `pg_dump -s -x -O -n #{default_tenant} #{dbname}`
160
+ with_pg_env { `pg_dump -s -x -O -n #{default_tenant} #{dbname}` }
161
161
  end
162
162
 
163
163
  # Dump data from schema_migrations table
@@ -165,7 +165,22 @@ module Apartment
165
165
  # @return {String} raw SQL contaning inserts with data from schema_migrations
166
166
  #
167
167
  def pg_dump_schema_migrations_data
168
- `pg_dump -a --inserts -t schema_migrations -n #{default_tenant} #{dbname}`
168
+ with_pg_env { `pg_dump -a --inserts -t schema_migrations -n #{default_tenant} #{dbname}` }
169
+ end
170
+
171
+ # Temporary set Postgresql related environment variables if there are in @config
172
+ #
173
+ def with_pg_env(&block)
174
+ pghost, pgport, pguser, pgpassword = ENV['PGHOST'], ENV['PGPORT'], ENV['PGUSER'], ENV['PGPASSWORD']
175
+
176
+ ENV['PGHOST'] = @config[:host] if @config[:host]
177
+ ENV['PGPORT'] = @config[:port].to_s if @config[:port]
178
+ ENV['PGUSER'] = @config[:username].to_s if @config[:username]
179
+ ENV['PGPASSWORD'] = @config[:password].to_s if @config[:password]
180
+
181
+ block.call
182
+ ensure
183
+ ENV['PGHOST'], ENV['PGPORT'], ENV['PGUSER'], ENV['PGPASSWORD'] = pghost, pgport, pguser, pgpassword
169
184
  end
170
185
 
171
186
  # Remove "SET search_path ..." line from SQL dump and prepend search_path set to current tenant
@@ -9,14 +9,14 @@ module Apartment
9
9
  extend self
10
10
  extend Forwardable
11
11
 
12
- def_delegators :adapter, :create, :current_tenant, :current, :current_database, :default_tenant, :drop, :switch, :process_excluded_models, :reset, :seed, :switch!
12
+ def_delegators :adapter, :create, :drop, :switch, :switch!, :current, :each, :reset, :seed, :current_tenant, :default_tenant
13
13
 
14
14
  attr_writer :config
15
15
 
16
16
  # Initialize Apartment config options such as excluded_models
17
17
  #
18
18
  def init
19
- process_excluded_models
19
+ adapter.process_excluded_models
20
20
  end
21
21
 
22
22
  # Fetch the proper multi-tenant adapter based on Rails config
@@ -1,3 +1,3 @@
1
1
  module Apartment
2
- VERSION = "1.0.1"
2
+ VERSION = "1.0.2"
3
3
  end
@@ -0,0 +1,5 @@
1
+ def create_users
2
+ 6.times {|x| User.where(name: "Different User #{x}").first_or_create! }
3
+ end
4
+
5
+ create_users
@@ -150,5 +150,34 @@ describe Apartment::Tenant do
150
150
  end
151
151
  end
152
152
  end
153
+
154
+ context "seed paths" do
155
+ before do
156
+ Apartment.configure do |config|
157
+ config.excluded_models = []
158
+ config.use_schemas = true
159
+ config.seed_after_create = true
160
+ end
161
+ end
162
+
163
+ after{ subject.drop db1 }
164
+
165
+ it 'should seed from default path' do
166
+ subject.create db1
167
+ subject.switch! db1
168
+ User.count.should eq(3)
169
+ User.first.name.should eq('Some User 0')
170
+ end
171
+
172
+ it 'should seed from custom path' do
173
+ Apartment.configure do |config|
174
+ config.seed_data_file = "#{Rails.root}/db/seeds/import.rb"
175
+ end
176
+ subject.create db1
177
+ subject.switch! db1
178
+ User.count.should eq(6)
179
+ User.first.name.should eq('Different User 0')
180
+ end
181
+ end
153
182
  end
154
183
  end
@@ -5,6 +5,7 @@ describe Apartment do
5
5
  describe "#config" do
6
6
 
7
7
  let(:excluded_models){ ["Company"] }
8
+ let(:seed_data_file_path){ "#{Rails.root}/db/seeds/import.rb" }
8
9
 
9
10
  it "should yield the Apartment object" do
10
11
  Apartment.configure do |config|
@@ -28,6 +29,13 @@ describe Apartment do
28
29
  Apartment.use_schemas.should be false
29
30
  end
30
31
 
32
+ it "should set seed_data_file" do
33
+ Apartment.configure do |config|
34
+ config.seed_data_file = seed_data_file_path
35
+ end
36
+ Apartment.seed_data_file.should eq(seed_data_file_path)
37
+ end
38
+
31
39
  it "should set seed_after_create" do
32
40
  Apartment.configure do |config|
33
41
  config.excluded_models = []
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: 1.0.1
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Brunner
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-04-28 00:00:00.000000000 Z
12
+ date: 2015-07-02 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activerecord
@@ -244,6 +244,7 @@ files:
244
244
  - spec/dummy/db/migrate/20111202022214_create_table_books.rb
245
245
  - spec/dummy/db/schema.rb
246
246
  - spec/dummy/db/seeds.rb
247
+ - spec/dummy/db/seeds/import.rb
247
248
  - spec/dummy/db/test.sqlite3
248
249
  - spec/dummy/public/404.html
249
250
  - spec/dummy/public/422.html
@@ -339,7 +340,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
339
340
  version: '0'
340
341
  requirements: []
341
342
  rubyforge_project:
342
- rubygems_version: 2.4.6
343
+ rubygems_version: 2.4.5
343
344
  signing_key:
344
345
  specification_version: 4
345
346
  summary: A Ruby gem for managing database multitenancy
@@ -378,6 +379,7 @@ test_files:
378
379
  - spec/dummy/db/migrate/20111202022214_create_table_books.rb
379
380
  - spec/dummy/db/schema.rb
380
381
  - spec/dummy/db/seeds.rb
382
+ - spec/dummy/db/seeds/import.rb
381
383
  - spec/dummy/db/test.sqlite3
382
384
  - spec/dummy/public/404.html
383
385
  - spec/dummy/public/422.html