houser 1.0.2 → 1.1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a37a9a6b52d4e15a8bf6f4be8b69a19386f2272a
4
- data.tar.gz: f0f2777b9488166cd7172e8aca074fb876cda626
3
+ metadata.gz: d50dc68ec3f594a6648bee55ba34edb32125b769
4
+ data.tar.gz: 6f892bba2adb73499b267b31b33b9c5e166d7fac
5
5
  SHA512:
6
- metadata.gz: b4589b6cd35ef614f1ec56e309e7d8f4a4498e867c4544179c9054f90eade5da87eb26e889f0d9c033d5b5160ca79dd21e2274537274ed1440b2127ef37daffa
7
- data.tar.gz: 33bf73317fe420f8bcef9768f04c700fa4c71c5fc609a3cdcdf90912b6767b29aedef009b8a2a67d7e5c6387ebb8d0533e28f7b1679139ab09d27c7b29321c6e
6
+ metadata.gz: 9aa002ff57efc25dab9b52d5f9ec16ef678477a51c24a6092589529462a7a795c3244e991ececcd07feb895c32c77f6710789a80696cc10b39537471e5b71e24
7
+ data.tar.gz: 2ef326f2e61d8faab3f3a8927890a86fb36377347303698299a6d2a4bf1587cda249a59c168402df290eaa482946538492725e2d0718c75ec3edd889fa817658
data/.travis.yml CHANGED
@@ -1 +1,4 @@
1
1
  script: 'bundle exec rspec spec'
2
+ gemfile:
3
+ - gemfiles/rails3.gemfile
4
+ - gemfiles/rails4.gemfile
data/Appraisals ADDED
@@ -0,0 +1,7 @@
1
+ appraise "rails3" do
2
+ gem "rails", "3.2.17"
3
+ end
4
+
5
+ appraise "rails4" do
6
+ gem "rails", "4.0.4"
7
+ end
data/README.md CHANGED
@@ -28,7 +28,26 @@ If you're using a TLD like `.co.uk` instead of `.com`, you will need to specify
28
28
  config.middleware.use Houser::Middleware,
29
29
  :class_name => 'Model',
30
30
  :tld_length => 2
31
+
32
+ ## Usage
33
+
34
+ There are two rack environment variables set by the Houser middleware that you can use throughout your application to scope resources.
35
+
36
+ If no object is found for the subdomain the request is received on, both of these variables will be nil.
37
+
38
+ ### `env['X-Houser-Subdomain']`
39
+
40
+ The complete subdomain of the request. The following domains have the following subdomains:
41
+
42
+ * `sub1.example.com => sub1`
43
+ * `sub2.sub1.example.com => sub2.sub1`
44
+ * `sub1.example.co.uk => sub1`
45
+ * `sub2.sub1.example.co.uk => sub2.sub1`
46
+
47
+ ### `env['X-Houser-Object']`
48
+
49
+ The instance of the Class that is found based on the subdomain.
31
50
 
32
51
  ## Contributing
33
52
 
34
- Please see [CONTRIBUTING.md](https://github.com/radar/houser/CONTRIBUTING.md)
53
+ Please see [CONTRIBUTING.md](https://github.com/radar/houser/CONTRIBUTING.md)
data/Rakefile CHANGED
@@ -1 +1,7 @@
1
1
  require "bundler/gem_tasks"
2
+ require 'appraisal'
3
+ require 'rspec/core/rake_task'
4
+
5
+ RSpec::Core::RakeTask.new(:spec)
6
+
7
+ task :default => :spec
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", "3.2.17"
6
+
7
+ gemspec :path=>"../"
@@ -0,0 +1,120 @@
1
+ PATH
2
+ remote: ../
3
+ specs:
4
+ houser (1.0.2)
5
+ rack
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ actionmailer (3.2.17)
11
+ actionpack (= 3.2.17)
12
+ mail (~> 2.5.4)
13
+ actionpack (3.2.17)
14
+ activemodel (= 3.2.17)
15
+ activesupport (= 3.2.17)
16
+ builder (~> 3.0.0)
17
+ erubis (~> 2.7.0)
18
+ journey (~> 1.0.4)
19
+ rack (~> 1.4.5)
20
+ rack-cache (~> 1.2)
21
+ rack-test (~> 0.6.1)
22
+ sprockets (~> 2.2.1)
23
+ activemodel (3.2.17)
24
+ activesupport (= 3.2.17)
25
+ builder (~> 3.0.0)
26
+ activerecord (3.2.17)
27
+ activemodel (= 3.2.17)
28
+ activesupport (= 3.2.17)
29
+ arel (~> 3.0.2)
30
+ tzinfo (~> 0.3.29)
31
+ activeresource (3.2.17)
32
+ activemodel (= 3.2.17)
33
+ activesupport (= 3.2.17)
34
+ activesupport (3.2.17)
35
+ i18n (~> 0.6, >= 0.6.4)
36
+ multi_json (~> 1.0)
37
+ appraisal (0.5.2)
38
+ bundler
39
+ rake
40
+ arel (3.0.3)
41
+ builder (3.0.4)
42
+ coderay (1.1.0)
43
+ diff-lcs (1.2.5)
44
+ erubis (2.7.0)
45
+ hike (1.2.3)
46
+ i18n (0.6.9)
47
+ journey (1.0.4)
48
+ json (1.8.1)
49
+ mail (2.5.4)
50
+ mime-types (~> 1.16)
51
+ treetop (~> 1.4.8)
52
+ method_source (0.8.2)
53
+ mime-types (1.25.1)
54
+ multi_json (1.9.2)
55
+ polyglot (0.3.4)
56
+ pry (0.9.12.6)
57
+ coderay (~> 1.0)
58
+ method_source (~> 0.8)
59
+ slop (~> 3.4)
60
+ rack (1.4.5)
61
+ rack-cache (1.2)
62
+ rack (>= 0.4)
63
+ rack-ssl (1.3.4)
64
+ rack
65
+ rack-test (0.6.2)
66
+ rack (>= 1.0)
67
+ rails (3.2.17)
68
+ actionmailer (= 3.2.17)
69
+ actionpack (= 3.2.17)
70
+ activerecord (= 3.2.17)
71
+ activeresource (= 3.2.17)
72
+ activesupport (= 3.2.17)
73
+ bundler (~> 1.0)
74
+ railties (= 3.2.17)
75
+ railties (3.2.17)
76
+ actionpack (= 3.2.17)
77
+ activesupport (= 3.2.17)
78
+ rack-ssl (~> 1.3.2)
79
+ rake (>= 0.8.7)
80
+ rdoc (~> 3.4)
81
+ thor (>= 0.14.6, < 2.0)
82
+ rake (10.2.2)
83
+ rdoc (3.12.2)
84
+ json (~> 1.4)
85
+ rspec-core (2.99.0.beta1)
86
+ rspec-expectations (2.99.0.beta1)
87
+ diff-lcs (>= 1.1.3, < 2.0)
88
+ rspec-mocks (2.99.0.beta1)
89
+ rspec-rails (2.99.0.beta1)
90
+ actionpack (>= 3.0)
91
+ activemodel (>= 3.0)
92
+ activesupport (>= 3.0)
93
+ railties (>= 3.0)
94
+ rspec-core (= 2.99.0.beta1)
95
+ rspec-expectations (= 2.99.0.beta1)
96
+ rspec-mocks (= 2.99.0.beta1)
97
+ slop (3.5.0)
98
+ sprockets (2.2.2)
99
+ hike (~> 1.2)
100
+ multi_json (~> 1.0)
101
+ rack (~> 1.0)
102
+ tilt (~> 1.1, != 1.3.0)
103
+ thor (0.19.1)
104
+ tilt (1.4.1)
105
+ treetop (1.4.15)
106
+ polyglot
107
+ polyglot (>= 0.3.1)
108
+ tzinfo (0.3.39)
109
+
110
+ PLATFORMS
111
+ ruby
112
+
113
+ DEPENDENCIES
114
+ appraisal (~> 0.5.2)
115
+ bundler (~> 1.5)
116
+ houser!
117
+ pry
118
+ rails (= 3.2.17)
119
+ rake
120
+ rspec-rails (= 2.99.0.beta1)
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", "4.0.4"
6
+
7
+ gemspec :path=>"../"
@@ -0,0 +1,115 @@
1
+ PATH
2
+ remote: ../
3
+ specs:
4
+ houser (1.0.2)
5
+ rack
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ actionmailer (4.0.4)
11
+ actionpack (= 4.0.4)
12
+ mail (~> 2.5.4)
13
+ actionpack (4.0.4)
14
+ activesupport (= 4.0.4)
15
+ builder (~> 3.1.0)
16
+ erubis (~> 2.7.0)
17
+ rack (~> 1.5.2)
18
+ rack-test (~> 0.6.2)
19
+ activemodel (4.0.4)
20
+ activesupport (= 4.0.4)
21
+ builder (~> 3.1.0)
22
+ activerecord (4.0.4)
23
+ activemodel (= 4.0.4)
24
+ activerecord-deprecated_finders (~> 1.0.2)
25
+ activesupport (= 4.0.4)
26
+ arel (~> 4.0.0)
27
+ activerecord-deprecated_finders (1.0.3)
28
+ activesupport (4.0.4)
29
+ i18n (~> 0.6, >= 0.6.9)
30
+ minitest (~> 4.2)
31
+ multi_json (~> 1.3)
32
+ thread_safe (~> 0.1)
33
+ tzinfo (~> 0.3.37)
34
+ appraisal (0.5.2)
35
+ bundler
36
+ rake
37
+ arel (4.0.2)
38
+ atomic (1.1.16)
39
+ builder (3.1.4)
40
+ coderay (1.1.0)
41
+ diff-lcs (1.2.5)
42
+ erubis (2.7.0)
43
+ hike (1.2.3)
44
+ i18n (0.6.9)
45
+ mail (2.5.4)
46
+ mime-types (~> 1.16)
47
+ treetop (~> 1.4.8)
48
+ method_source (0.8.2)
49
+ mime-types (1.25.1)
50
+ minitest (4.7.5)
51
+ multi_json (1.9.2)
52
+ polyglot (0.3.4)
53
+ pry (0.9.12.6)
54
+ coderay (~> 1.0)
55
+ method_source (~> 0.8)
56
+ slop (~> 3.4)
57
+ rack (1.5.2)
58
+ rack-test (0.6.2)
59
+ rack (>= 1.0)
60
+ rails (4.0.4)
61
+ actionmailer (= 4.0.4)
62
+ actionpack (= 4.0.4)
63
+ activerecord (= 4.0.4)
64
+ activesupport (= 4.0.4)
65
+ bundler (>= 1.3.0, < 2.0)
66
+ railties (= 4.0.4)
67
+ sprockets-rails (~> 2.0.0)
68
+ railties (4.0.4)
69
+ actionpack (= 4.0.4)
70
+ activesupport (= 4.0.4)
71
+ rake (>= 0.8.7)
72
+ thor (>= 0.18.1, < 2.0)
73
+ rake (10.2.2)
74
+ rspec-core (2.99.0.beta1)
75
+ rspec-expectations (2.99.0.beta1)
76
+ diff-lcs (>= 1.1.3, < 2.0)
77
+ rspec-mocks (2.99.0.beta1)
78
+ rspec-rails (2.99.0.beta1)
79
+ actionpack (>= 3.0)
80
+ activemodel (>= 3.0)
81
+ activesupport (>= 3.0)
82
+ railties (>= 3.0)
83
+ rspec-core (= 2.99.0.beta1)
84
+ rspec-expectations (= 2.99.0.beta1)
85
+ rspec-mocks (= 2.99.0.beta1)
86
+ slop (3.5.0)
87
+ sprockets (2.12.0)
88
+ hike (~> 1.2)
89
+ multi_json (~> 1.0)
90
+ rack (~> 1.0)
91
+ tilt (~> 1.1, != 1.3.0)
92
+ sprockets-rails (2.0.1)
93
+ actionpack (>= 3.0)
94
+ activesupport (>= 3.0)
95
+ sprockets (~> 2.8)
96
+ thor (0.19.1)
97
+ thread_safe (0.3.1)
98
+ atomic (>= 1.1.7, < 2)
99
+ tilt (1.4.1)
100
+ treetop (1.4.15)
101
+ polyglot
102
+ polyglot (>= 0.3.1)
103
+ tzinfo (0.3.39)
104
+
105
+ PLATFORMS
106
+ ruby
107
+
108
+ DEPENDENCIES
109
+ appraisal (~> 0.5.2)
110
+ bundler (~> 1.5)
111
+ houser!
112
+ pry
113
+ rails (= 4.0.4)
114
+ rake
115
+ rspec-rails (= 2.99.0.beta1)
data/houser.gemspec CHANGED
@@ -24,4 +24,5 @@ Gem::Specification.new do |spec|
24
24
  spec.add_development_dependency "rake"
25
25
  spec.add_development_dependency "rspec-rails", "2.99.0.beta1"
26
26
  spec.add_development_dependency "pry"
27
+ spec.add_development_dependency 'appraisal', '~> 0.5.2'
27
28
  end
@@ -6,6 +6,7 @@ module Houser
6
6
 
7
7
  def initialize(app, options={})
8
8
  @options = options
9
+ @options[:subdomain_column] ||= "subdomain"
9
10
  @options[:class] = Object.const_get(options[:class_name])
10
11
  @options[:tld_length] ||= 1
11
12
  @app = app
@@ -15,7 +16,8 @@ module Houser
15
16
  domain_parts = env['HTTP_HOST'].split('.')
16
17
 
17
18
  if domain_parts.length > 1 + options[:tld_length]
18
- subdomain = domain_parts[0]
19
+ domain_name = domain_parts[(-options[:tld_length] - 1)..-1]
20
+ subdomain = (domain_parts - domain_name).join('.')
19
21
  find_tenant(env, subdomain)
20
22
  end
21
23
 
@@ -25,7 +27,7 @@ module Houser
25
27
  private
26
28
 
27
29
  def find_tenant(env, subdomain)
28
- object = options[:class].find_by(subdomain: subdomain)
30
+ object = options[:class].where(options[:subdomain_column].to_sym => subdomain).first
29
31
  if object
30
32
  env['X-Houser-Subdomain'] = subdomain
31
33
  env['X-Houser-Object'] = object
@@ -1,3 +1,3 @@
1
1
  module Houser
2
- VERSION = "1.0.2"
2
+ VERSION = "1.1.0"
3
3
  end
data/spec/houser_spec.rb CHANGED
@@ -27,7 +27,7 @@ describe Houser::Middleware do
27
27
  end
28
28
 
29
29
  it "does nothing for non-subdomained requests" do
30
- expect(Account).to_not receive(:find_by)
30
+ expect(Account).to_not receive(:where)
31
31
  code, env = middleware.call(env_for("http://example.com"))
32
32
  expect(env['X-Houser-Subdomain']).to be_nil
33
33
  expect(env['X-Houser-Object']).to be_nil
@@ -35,19 +35,32 @@ describe Houser::Middleware do
35
35
 
36
36
  it "sets X-HOUSER-ID header for known subdomains" do
37
37
  account = double(id: 1)
38
- expect(Account).to receive(:find_by).with(subdomain: subdomain).and_return(account)
38
+ expect(Account).to receive(:where).with(subdomain: subdomain).and_return([account])
39
39
  code, env = middleware.call(env_for("http://#{subdomain}.example.com"))
40
40
  expect(env['X-Houser-Subdomain']).to eq(subdomain)
41
41
  expect(env['X-Houser-Object']).to eq(account)
42
42
  end
43
43
 
44
44
  it "returns no headers for unknown subdomains" do
45
- expect(Account).to receive(:find_by).with(subdomain: subdomain).and_return(nil)
45
+ expect(Account).to receive(:where).with(subdomain: subdomain).and_return([])
46
46
  code, env = middleware.call(env_for("http://#{subdomain}.example.com"))
47
47
  expect(env['X-Houser-Subdomain']).to be_nil
48
48
  expect(env['X-Houser-Object']).to be_nil
49
49
  end
50
50
 
51
+
52
+ context "double subdomain" do
53
+ let(:subdomain) { 'ruby.melbourne' }
54
+
55
+ it "sets X-HOUSER-ID header for known subdomains within subdomains" do
56
+ account = double(id: 1)
57
+ expect(Account).to receive(:where).with(subdomain: subdomain).and_return([account])
58
+ code, env = middleware.call(env_for("http://#{subdomain}.example.com"))
59
+ expect(env['X-Houser-Subdomain']).to eq(subdomain)
60
+ expect(env['X-Houser-Object']).to eq(account)
61
+ end
62
+ end
63
+
51
64
  context "with a different class name" do
52
65
  let(:options) do
53
66
  {
@@ -62,8 +75,8 @@ describe Houser::Middleware do
62
75
  end
63
76
 
64
77
  it "calls the right class" do
65
- expect(Account).to_not receive(:find_by)
66
- expect(Store).to receive(:find_by).with(subdomain: subdomain).and_return(store)
78
+ expect(Account).to_not receive(:where)
79
+ expect(Store).to receive(:where).with(subdomain: subdomain).and_return([store])
67
80
  code, env = middleware.call(env_for("http://#{subdomain}.example.com"))
68
81
  expect(env['X-Houser-Subdomain']).to eq(subdomain)
69
82
  expect(env['X-Houser-Object']).to eq(store)
@@ -79,10 +92,39 @@ describe Houser::Middleware do
79
92
  end
80
93
 
81
94
  it "supports more than one-level of TLD" do
82
- expect(Account).to_not receive(:find_by)
95
+ expect(Account).to_not receive(:where)
83
96
  code, env = middleware.call(env_for("http://example.co.uk"))
84
97
  expect(env['X-Houser-Subdomain']).to be_nil
85
98
  expect(env['X-Houser-ID']).to be_nil
86
99
  end
100
+
101
+ context "double subdomain" do
102
+ let(:subdomain) { 'ruby.melbourne' }
103
+
104
+ it "sets X-HOUSER-ID header for known subdomains within subdomains" do
105
+ account = double(id: 1)
106
+ expect(Account).to receive(:where).with(subdomain: subdomain).and_return([account])
107
+ code, env = middleware.call(env_for("http://#{subdomain}.example.co.uk"))
108
+ expect(env['X-Houser-Subdomain']).to eq(subdomain)
109
+ expect(env['X-Houser-Object']).to eq(account)
110
+ end
111
+ end
112
+ end
113
+
114
+ context "with a different column name" do
115
+ let(:options) do
116
+ {
117
+ subdomain_column: 'foo',
118
+ class_name: 'Account'
119
+ }
120
+ end
121
+
122
+ it "finds by an alternative column" do
123
+ account = double(id: 1)
124
+ expect(Account).to receive(:where).with(:foo => subdomain).and_return([account])
125
+ code, env = middleware.call(env_for("http://#{subdomain}.example.com"))
126
+ expect(env['X-Houser-Subdomain']).to eq(subdomain)
127
+ expect(env['X-Houser-Object']).to eq(account)
128
+ end
87
129
  end
88
130
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: houser
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Bigg
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-01-25 00:00:00.000000000 Z
11
+ date: 2014-03-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
@@ -80,6 +80,20 @@ dependencies:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: appraisal
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 0.5.2
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 0.5.2
83
97
  description: Lightweight multitenancy gem.
84
98
  email:
85
99
  - radarlistener@gmail.com
@@ -89,11 +103,16 @@ extra_rdoc_files: []
89
103
  files:
90
104
  - ".gitignore"
91
105
  - ".travis.yml"
106
+ - Appraisals
92
107
  - CONTRIBUTING.md
93
108
  - Gemfile
94
109
  - LICENSE.txt
95
110
  - README.md
96
111
  - Rakefile
112
+ - gemfiles/rails3.gemfile
113
+ - gemfiles/rails3.gemfile.lock
114
+ - gemfiles/rails4.gemfile
115
+ - gemfiles/rails4.gemfile.lock
97
116
  - houser.gemspec
98
117
  - lib/houser.rb
99
118
  - lib/houser/middleware.rb