storey 0.1.0 → 0.2.0

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/README.md CHANGED
@@ -17,6 +17,9 @@ Typically set in an initializer: config/initializer/storey.rb
17
17
  # Used for obscuring the schema name - which is important when performing schema duplication.
18
18
  # Storey.suffix = "_suffix"
19
19
 
20
+ # Defines schemas that should always stay in the search path, apart from the one you switched to.
21
+ # Storey.persistent_schemas = %w(hstore)
22
+
20
23
  # Methods
21
24
 
22
25
  ## schemas
@@ -10,12 +10,13 @@ module Storey
10
10
 
11
11
  autoload :Duplicator, 'storey/duplicator'
12
12
 
13
- mattr_accessor :suffix, :default_search_path
13
+ mattr_accessor :suffix, :default_search_path, :persistent_schemas
14
14
  mattr_reader :excluded_models
15
15
 
16
16
  def init
17
17
  @@default_search_path = schema
18
18
  self.excluded_models ||= []
19
+ self.persistent_schemas ||= []
19
20
  process_excluded_models
20
21
  end
21
22
 
@@ -89,19 +90,28 @@ module Storey
89
90
  result
90
91
  else
91
92
  reset and return if name.blank?
92
- name = suffixify name
93
- ActiveRecord::Base.connection.schema_search_path = name
93
+ path = self.schema_search_path_for(name)
94
+ ActiveRecord::Base.connection.schema_search_path = path
94
95
  end
95
96
  rescue ActiveRecord::StatementInvalid => e
96
97
  if e.to_s =~ /invalid value for parameter "search_path"/
97
- fail Storey::SchemaNotFound, %{The schema "#{name}" cannot be found.}
98
+ fail Storey::SchemaNotFound, %{The schema "#{path}" cannot be found.}
98
99
  else
99
100
  raise e
100
101
  end
101
102
  end
102
103
 
104
+ def schema_search_path_for(schema_name)
105
+ path = [suffixify(schema_name)]
106
+ self.persistent_schemas.each do |schema|
107
+ path << suffixify(schema)
108
+ end
109
+ path.uniq.join(',')
110
+ end
111
+
103
112
  def reload_config!
104
113
  self.excluded_models = []
114
+ self.persistent_schemas = []
105
115
  self.suffix = nil
106
116
  end
107
117
 
@@ -123,7 +133,20 @@ module Storey
123
133
  end
124
134
 
125
135
  def unsuffixify(name)
126
- Storey.suffix && name =~ /(\w+)#{Storey.suffix}/ ? $1 : name
136
+ search_path = name
137
+ if Storey.suffix
138
+ paths = []
139
+ name.split(',').each do |schema|
140
+ result = if schema =~ /(\w+)#{Storey.suffix}/
141
+ $1
142
+ else
143
+ schema
144
+ end
145
+ paths << result
146
+ end
147
+ search_path = paths.join(',')
148
+ end
149
+ search_path
127
150
  end
128
151
 
129
152
  protected
@@ -133,7 +156,8 @@ module Storey
133
156
  end
134
157
 
135
158
  def reset
136
- ActiveRecord::Base.connection.schema_search_path = self.default_search_path
159
+ path = self.schema_search_path_for(self.default_search_path)
160
+ ActiveRecord::Base.connection.schema_search_path = path
137
161
  end
138
162
 
139
163
  # Loads the Rails schema.rb into the current schema
@@ -1,3 +1,3 @@
1
1
  module Storey
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -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.
@@ -9,9 +9,21 @@ require 'database_cleaner'
9
9
  # Include rake so we can instantiate the @rake variable and call rake tasks
10
10
  require 'rake'
11
11
 
12
- require 'ruby-debug'
12
+ require 'pry'
13
13
 
14
14
  RSpec.configure do |config|
15
+ config.before(:suite) do
16
+ # Clean the public schema
17
+ Storey.switch do
18
+ tables = ActiveRecord::Base.connection.tables
19
+ # Don't invoke DatabaseCleaner if there are no tables,
20
+ # since that library chokes and tries to drop tables without names
21
+ if tables.size != 1 or tables[0] != 'schema_migrations'
22
+ DatabaseCleaner.clean_with :truncation
23
+ end
24
+ end
25
+ end
26
+
15
27
  config.before(:each) do
16
28
  # We don't want configuration to leak into other tests
17
29
  Storey.reload_config!
@@ -0,0 +1,4 @@
1
+ require 'spec_helper'
2
+
3
+ describe Storey do
4
+ end
@@ -99,4 +99,62 @@ describe Storey, "#switch" do
99
99
  end
100
100
  end
101
101
  end
102
+
103
+ context 'when persitent schemas are set' do
104
+
105
+ context 'when suffixes are not set' do
106
+ before do
107
+ Storey.create 'foobar'
108
+ persistent_schemas = %w(handle bar foo)
109
+ persistent_schemas.each do |schema|
110
+ Storey.create schema
111
+ end
112
+ Storey.persistent_schemas = persistent_schemas
113
+ end
114
+
115
+ it 'should switch to the schema with the persitent schemas still in the search path' do
116
+ Storey.switch 'foobar'
117
+ Storey.schema.should == %{foobar,handle,bar,foo}
118
+
119
+ Storey.switch
120
+ Storey.schema.should == %{"$user",public,handle,bar,foo}
121
+ end
122
+ end
123
+
124
+ context 'when suffixes are set' do
125
+ before do
126
+ Storey.suffix = '_boomboom'
127
+ Storey.create 'foobar'
128
+ persistent_schemas = %w(handle bar foo)
129
+ persistent_schemas.each do |schema|
130
+ Storey.create schema
131
+ end
132
+ Storey.persistent_schemas = persistent_schemas
133
+ end
134
+
135
+ it 'should switch to the schema with the persitent schemas still in the search path' do
136
+ Storey.switch 'foobar'
137
+ Storey.schema.should == %{foobar,handle,bar,foo}
138
+
139
+ Storey.switch
140
+ Storey.schema.should == %{"$user",public,handle,bar,foo}
141
+ end
142
+ end
143
+
144
+ context 'when switching to one of the persistent schemas' do
145
+ before do
146
+ persistent_schemas = %w(handle bar foo)
147
+ persistent_schemas.each do |schema|
148
+ Storey.create schema
149
+ end
150
+ Storey.persistent_schemas = persistent_schemas
151
+ end
152
+
153
+ it 'should not have duplicate schemas in the search path' do
154
+ Storey.switch 'bar'
155
+ Storey.schema.should == %{bar,handle,foo}
156
+ end
157
+ end
158
+
159
+ end
102
160
  end
@@ -22,6 +22,6 @@ Gem::Specification.new do |s|
22
22
  s.add_development_dependency "rspec-rails"
23
23
  s.add_development_dependency "pg", "~> 0.12.2"
24
24
  s.add_development_dependency "database_cleaner"
25
- s.add_development_dependency "ruby-debug"
25
+ s.add_development_dependency "pry"
26
26
  s.add_runtime_dependency "rails", "~> 3.2.2"
27
27
  end
metadata CHANGED
@@ -1,107 +1,79 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: storey
3
- version: !ruby/object:Gem::Version
4
- hash: 27
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0
5
5
  prerelease:
6
- segments:
7
- - 0
8
- - 1
9
- - 0
10
- version: 0.1.0
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Ramon Tayag
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2012-03-17 00:00:00 +08:00
19
- default_executable:
20
- dependencies:
21
- - !ruby/object:Gem::Dependency
12
+ date: 2012-06-17 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
22
15
  name: rspec-rails
23
- prerelease: false
24
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: &82245390 !ruby/object:Gem::Requirement
25
17
  none: false
26
- requirements:
27
- - - ">="
28
- - !ruby/object:Gem::Version
29
- hash: 3
30
- segments:
31
- - 0
32
- version: "0"
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
33
22
  type: :development
34
- version_requirements: *id001
35
- - !ruby/object:Gem::Dependency
36
- name: pg
37
23
  prerelease: false
38
- requirement: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: *82245390
25
+ - !ruby/object:Gem::Dependency
26
+ name: pg
27
+ requirement: &82244830 !ruby/object:Gem::Requirement
39
28
  none: false
40
- requirements:
29
+ requirements:
41
30
  - - ~>
42
- - !ruby/object:Gem::Version
43
- hash: 43
44
- segments:
45
- - 0
46
- - 12
47
- - 2
31
+ - !ruby/object:Gem::Version
48
32
  version: 0.12.2
49
33
  type: :development
50
- version_requirements: *id002
51
- - !ruby/object:Gem::Dependency
52
- name: database_cleaner
53
34
  prerelease: false
54
- requirement: &id003 !ruby/object:Gem::Requirement
35
+ version_requirements: *82244830
36
+ - !ruby/object:Gem::Dependency
37
+ name: database_cleaner
38
+ requirement: &82244090 !ruby/object:Gem::Requirement
55
39
  none: false
56
- requirements:
57
- - - ">="
58
- - !ruby/object:Gem::Version
59
- hash: 3
60
- segments:
61
- - 0
62
- version: "0"
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
63
44
  type: :development
64
- version_requirements: *id003
65
- - !ruby/object:Gem::Dependency
66
- name: ruby-debug
67
45
  prerelease: false
68
- requirement: &id004 !ruby/object:Gem::Requirement
46
+ version_requirements: *82244090
47
+ - !ruby/object:Gem::Dependency
48
+ name: pry
49
+ requirement: &82243450 !ruby/object:Gem::Requirement
69
50
  none: false
70
- requirements:
71
- - - ">="
72
- - !ruby/object:Gem::Version
73
- hash: 3
74
- segments:
75
- - 0
76
- version: "0"
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
77
55
  type: :development
78
- version_requirements: *id004
79
- - !ruby/object:Gem::Dependency
80
- name: rails
81
56
  prerelease: false
82
- requirement: &id005 !ruby/object:Gem::Requirement
57
+ version_requirements: *82243450
58
+ - !ruby/object:Gem::Dependency
59
+ name: rails
60
+ requirement: &82242810 !ruby/object:Gem::Requirement
83
61
  none: false
84
- requirements:
62
+ requirements:
85
63
  - - ~>
86
- - !ruby/object:Gem::Version
87
- hash: 11
88
- segments:
89
- - 3
90
- - 2
91
- - 2
64
+ - !ruby/object:Gem::Version
92
65
  version: 3.2.2
93
66
  type: :runtime
94
- version_requirements: *id005
95
- description: Storey aims to simplify the implementation of managing a multi-tenant application.
96
- email:
67
+ prerelease: false
68
+ version_requirements: *82242810
69
+ description: Storey aims to simplify the implementation of managing a multi-tenant
70
+ application.
71
+ email:
97
72
  - ramon@tayag.net
98
73
  executables: []
99
-
100
74
  extensions: []
101
-
102
75
  extra_rdoc_files: []
103
-
104
- files:
76
+ files:
105
77
  - .gitignore
106
78
  - .rspec
107
79
  - .rvmrc
@@ -162,44 +134,34 @@ files:
162
134
  - spec/storey/drop_spec.rb
163
135
  - spec/storey/duplicate_spec.rb
164
136
  - spec/storey/excluded_models_spec.rb
137
+ - spec/storey/persistent_schemas_spec.rb
165
138
  - spec/storey/schema_spec.rb
166
139
  - spec/storey/schemas_spec.rb
167
140
  - spec/storey/switch_spec.rb
168
141
  - spec/tasks/storey_rake_spec.rb
169
142
  - storey.gemspec
170
- has_rdoc: true
171
143
  homepage: https://github.com/ramontayag/storey
172
144
  licenses: []
173
-
174
145
  post_install_message:
175
146
  rdoc_options: []
176
-
177
- require_paths:
147
+ require_paths:
178
148
  - lib
179
- required_ruby_version: !ruby/object:Gem::Requirement
149
+ required_ruby_version: !ruby/object:Gem::Requirement
180
150
  none: false
181
- requirements:
182
- - - ">="
183
- - !ruby/object:Gem::Version
184
- hash: 3
185
- segments:
186
- - 0
187
- version: "0"
188
- required_rubygems_version: !ruby/object:Gem::Requirement
151
+ requirements:
152
+ - - ! '>='
153
+ - !ruby/object:Gem::Version
154
+ version: '0'
155
+ required_rubygems_version: !ruby/object:Gem::Requirement
189
156
  none: false
190
- requirements:
191
- - - ">="
192
- - !ruby/object:Gem::Version
193
- hash: 3
194
- segments:
195
- - 0
196
- version: "0"
157
+ requirements:
158
+ - - ! '>='
159
+ - !ruby/object:Gem::Version
160
+ version: '0'
197
161
  requirements: []
198
-
199
162
  rubyforge_project: storey
200
- rubygems_version: 1.6.2
163
+ rubygems_version: 1.8.11
201
164
  signing_key:
202
165
  specification_version: 3
203
166
  summary: Manage multiple PostgreSQL schemas in your multi-tenant app.
204
167
  test_files: []
205
-