storey 2.1.2 → 2.2.0

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
  SHA256:
3
- metadata.gz: fe9182b67b4f2738c91562f6366b59c15f7c5db272cdc32fd837ec1159cc753a
4
- data.tar.gz: b61703b7b12878c85a3a9fbcf1cd0af5208c612f153ce8f25e8e7fe70aef6053
3
+ metadata.gz: bbbb6a1e4e73a064abdc73ec6a2730af44a48f19827288fa480a5bfca422b246
4
+ data.tar.gz: 9a2801e339b05307db2169c3d39a9bd05707b8b5b6fdaf10d5712d3ca8ba79cf
5
5
  SHA512:
6
- metadata.gz: 75fc2bdc24f43a52a7376fcd4db66484c0e53d01f06f6a65002d3a3eaa2f997867153d572dc1d032e2992979a76ba6d3d14e1234e8f3ec8fa65eeed040dd834a
7
- data.tar.gz: 67d233bff3fdb58629cc15d5cc244182514e5810a23a5c5607a1b230714eb759425b113bbce776fe1eaaff5f0dd6c3b9fdcdc41d34d91524f945497324d494a3
6
+ metadata.gz: d85cf6045e666a7c8810af9090363be9dc1cf998ba6764281d44495fa0dc845526fa25a1f7cc17e20ec0bb47f6046fa8018efae533f76f72afe10f736fcade48
7
+ data.tar.gz: b61f568f85ef3d2c75c63f2af61b16b83b4534aba7ec58950e0b963dcce676d00f7aed5256193be754ebeba0f6e324e23d6419d9bde5c439678eba1647ce0466
@@ -2,6 +2,10 @@
2
2
  All notable changes to this project will be documented in this file.
3
3
  This project adheres to [Semantic Versioning](http://semver.org/).
4
4
 
5
+ ## [2.2.0] - 2019-02-08
6
+ ### Added
7
+ - Ability to switch via a Rack app
8
+
5
9
  ## [2.1.2] - 2018-08-14
6
10
  ### Fixed
7
11
  - Instances when queries are cached between switches
data/README.md CHANGED
@@ -29,6 +29,65 @@ Storey.configure do |c|
29
29
  end
30
30
  ```
31
31
 
32
+ ## Switching in your Rack app
33
+
34
+ To switch in your application, you can just opt to call `Storey.switch`
35
+ somewhere in your app. For example, in a Rails ApplicationController it would
36
+ look like:
37
+
38
+ ```ruby
39
+ class ApplicationController
40
+ before_action :switch_to_tenant
41
+
42
+ def switch_to_tenant
43
+ subdomain = request.subdomain
44
+ Storey.switch(subdomain) if Website.exists?(subdomain: subdomain)
45
+ end
46
+ end
47
+ ```
48
+
49
+ There are some instances where you need to switch schemas before you get to your
50
+ application. A good example is Devise. Devise uses Warden to authenticate users.
51
+ Warden is inserted as a Rack application and checks to see if the user
52
+ attempting to access the page signed in.
53
+
54
+ To do this, it must check the database. If your users live on separate schemas,
55
+ there's a big chance that Warden will think the user does not exist. Especially
56
+ in this scenario, use the Rack app found in this gem. In Rails, insert this
57
+ somewhere in your `application.rb` or in an initializer:
58
+
59
+ ```ruby
60
+ Rails.application.config.middleware.
61
+ insert_before Warden::Manager, Storey::RackSwitch
62
+ ```
63
+
64
+ You must also define how to determine the schema to switch to. To do that, set
65
+ `switch_processor`:
66
+
67
+ ```ruby
68
+ Storey.configure do |c|
69
+ c.switch_processor = ->(env) do
70
+ # find the schema name based on something in the env
71
+ subdomain = find_in_env(env)
72
+ return subdomain if Website.exists?(subdomain: schema)
73
+ end
74
+
75
+ # You can pass any object that responds to call and accepts one arg: the env.
76
+ c.switch_processor = MyStoreySwitchProcessor
77
+ end
78
+
79
+ class MyStoreySwitchProcessor
80
+ def self.call(env)
81
+ subdomain = find_in_env(env)
82
+ # ...
83
+ end
84
+ end
85
+ ```
86
+
87
+ When the result of `switch_processor` is a string,
88
+ `Storey.switch('the-string-it-returns')` is called. If `nil`, no switching
89
+ happens.
90
+
32
91
  # Methods
33
92
 
34
93
  ## schema
@@ -122,3 +181,11 @@ Usage:
122
181
  ## storey:hstore:install
123
182
 
124
183
  Run `rake storey:hstore:install` to install hstore extension into the hstore schema. Ensure that 'hstore' is one of the persistent schemas.
184
+
185
+ # Development
186
+
187
+ In the storey directory, after installing the gems:
188
+
189
+ - `docker-compose up db`
190
+ - `cp spec/dummy/config/database.yml{.sample,}
191
+ - `rspec spec`
@@ -6,6 +6,7 @@ require "open3"
6
6
  require "storey/version"
7
7
  require "rails/all"
8
8
  require 'storey/railtie' if defined?(Rails)
9
+ require 'storey/rack_switch'
9
10
  require 'storey/exceptions'
10
11
  require 'storey/migrator'
11
12
  require 'storey/duplicator'
@@ -37,6 +38,7 @@ module Storey
37
38
  has :suffix, classes: [String, NilClass]
38
39
  has :persistent_schemas, classes: Array, default: []
39
40
  has :excluded_models, classes: Array, default: []
41
+ has :switch_processor
40
42
  end
41
43
 
42
44
  def self.persistent_schemas=(schemas)
@@ -0,0 +1,19 @@
1
+ module Storey
2
+ class RackSwitch
3
+
4
+ def initialize(app, processor=Storey.configuration.switch_processor)
5
+ @app, @processor = app, processor
6
+ end
7
+
8
+ def call(env)
9
+ schema = @processor.call(env)
10
+
11
+ if schema
12
+ Storey.switch(schema) { @app.call(env) }
13
+ else
14
+ @app.call(env)
15
+ end
16
+ end
17
+
18
+ end
19
+ end
@@ -1,3 +1,3 @@
1
1
  module Storey
2
- VERSION = "2.1.2"
2
+ VERSION = "2.2.0"
3
3
  end
@@ -0,0 +1,51 @@
1
+ require "spec_helper"
2
+
3
+ module Storey
4
+ RSpec.describe RackSwitch do
5
+
6
+ let(:env) do
7
+ { "env" => "here" }
8
+ end
9
+
10
+ context "processor returns nil" do
11
+ let(:processor) { ->(env) { nil } }
12
+ before do
13
+ Storey.create("original_schema")
14
+ Storey.switch("original_schema")
15
+ end
16
+
17
+ it "does not switch and continues with the next rack app" do
18
+ schema_in_app = nil
19
+ app = ->(env) { schema_in_app = Storey.schema }
20
+
21
+ expect(processor).to receive(:call).with(env).
22
+ and_call_original
23
+
24
+ switch = described_class.new(app, processor)
25
+ switch.(env)
26
+
27
+ expect(schema_in_app).to eq "original_schema"
28
+ end
29
+ end
30
+
31
+ context "processor returns a string" do
32
+ let(:processor) { ->(env) { "tenant" } }
33
+ before do
34
+ Storey.create("tenant")
35
+ end
36
+
37
+ it "switches to the string returned by the processor" do
38
+ schema_in_app = nil
39
+ app = ->(env) { schema_in_app = Storey.schema }
40
+
41
+ expect(processor).to receive(:call).with(env).
42
+ and_call_original
43
+
44
+ switch = described_class.new(app, processor)
45
+ switch.(env)
46
+
47
+ expect(schema_in_app).to eq "tenant"
48
+ end
49
+ end
50
+ end
51
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: storey
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.2
4
+ version: 2.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ramon Tayag
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-09-14 00:00:00.000000000 Z
11
+ date: 2019-02-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec-rails
@@ -129,6 +129,7 @@ files:
129
129
  - lib/storey/hstore.rb
130
130
  - lib/storey/migrator.rb
131
131
  - lib/storey/native_schema_matcher.rb
132
+ - lib/storey/rack_switch.rb
132
133
  - lib/storey/railtie.rb
133
134
  - lib/storey/resets_column_info.rb
134
135
  - lib/storey/ruby_dumper.rb
@@ -179,6 +180,7 @@ files:
179
180
  - spec/dummy/public/favicon.ico
180
181
  - spec/dummy/script/rails
181
182
  - spec/fixtures/.gitkeep
183
+ - spec/lib/storey/rack_switch_spec.rb
182
184
  - spec/lib/storey_spec.rb
183
185
  - spec/migrator_spec.rb
184
186
  - spec/spec_helper.rb
@@ -276,6 +278,7 @@ test_files:
276
278
  - spec/dummy/public/favicon.ico
277
279
  - spec/dummy/script/rails
278
280
  - spec/fixtures/.gitkeep
281
+ - spec/lib/storey/rack_switch_spec.rb
279
282
  - spec/lib/storey_spec.rb
280
283
  - spec/migrator_spec.rb
281
284
  - spec/spec_helper.rb