saasable 0.1.6 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +2 -0
- data/Gemfile.lock +26 -8
- data/README.rdoc +1 -1
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/lib/saasable/middleware.rb +20 -0
- data/lib/saasable/{saas_document.rb → mongoid/saas_document.rb} +10 -6
- data/lib/saasable/{scoped_document.rb → mongoid/scoped_document.rb} +1 -1
- data/lib/saasable/mongoid.rb +5 -0
- data/lib/saasable/railtie.rb +9 -0
- data/lib/saasable/railties/helpers.rb +16 -0
- data/lib/saasable/railties.rb +4 -0
- data/lib/saasable.rb +8 -6
- data/saasable.gemspec +21 -14
- metadata +65 -73
- data/lib/saasable/scoped_controller.rb +0 -26
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,21 +1,38 @@
|
|
1
1
|
GEM
|
2
2
|
remote: http://rubygems.org/
|
3
3
|
specs:
|
4
|
+
activemodel (3.1.1)
|
5
|
+
activesupport (= 3.1.1)
|
6
|
+
builder (~> 3.0.0)
|
7
|
+
i18n (~> 0.6)
|
8
|
+
activesupport (3.1.1)
|
9
|
+
multi_json (~> 1.0)
|
10
|
+
bson (1.4.0)
|
11
|
+
builder (3.0.0)
|
4
12
|
diff-lcs (1.1.3)
|
5
13
|
git (1.2.5)
|
14
|
+
i18n (0.6.0)
|
6
15
|
jeweler (1.6.4)
|
7
16
|
bundler (~> 1.0)
|
8
17
|
git (>= 1.2.5)
|
9
18
|
rake
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
19
|
+
mongo (1.4.0)
|
20
|
+
bson (= 1.4.0)
|
21
|
+
mongoid (2.3.3)
|
22
|
+
activemodel (~> 3.1)
|
23
|
+
mongo (~> 1.3)
|
24
|
+
tzinfo (~> 0.3.22)
|
25
|
+
multi_json (1.0.3)
|
26
|
+
rake (0.9.2.2)
|
27
|
+
rspec (2.7.0)
|
28
|
+
rspec-core (~> 2.7.0)
|
29
|
+
rspec-expectations (~> 2.7.0)
|
30
|
+
rspec-mocks (~> 2.7.0)
|
31
|
+
rspec-core (2.7.1)
|
32
|
+
rspec-expectations (2.7.0)
|
17
33
|
diff-lcs (~> 1.1.2)
|
18
|
-
rspec-mocks (2.
|
34
|
+
rspec-mocks (2.7.0)
|
35
|
+
tzinfo (0.3.31)
|
19
36
|
|
20
37
|
PLATFORMS
|
21
38
|
ruby
|
@@ -23,4 +40,5 @@ PLATFORMS
|
|
23
40
|
DEPENDENCIES
|
24
41
|
bundler
|
25
42
|
jeweler
|
43
|
+
mongoid
|
26
44
|
rspec
|
data/README.rdoc
CHANGED
data/Rakefile
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.0
|
@@ -0,0 +1,20 @@
|
|
1
|
+
class Saasable::Middleware
|
2
|
+
def initialize app
|
3
|
+
@app = app
|
4
|
+
end
|
5
|
+
|
6
|
+
def call env
|
7
|
+
# Loads all models so we know how to apply the scopes on Rails
|
8
|
+
Rails::Mongoid.load_models(Rails.application) if defined?(Rails::Mongoid)
|
9
|
+
|
10
|
+
env[:saasable] = {:current_saas => saas_for_host(env["SERVER_NAME"])}
|
11
|
+
env[:saasable][:current_saas].activate!
|
12
|
+
|
13
|
+
@app.call env
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
def saas_for_host hostname
|
18
|
+
Saasable::Mongoid::SaasDocument.saas_document.find_by_host!(hostname)
|
19
|
+
end
|
20
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
module Saasable::SaasDocument
|
1
|
+
module Saasable::Mongoid::SaasDocument
|
2
2
|
@saas_document = nil
|
3
3
|
|
4
4
|
def self.included klass
|
@@ -11,7 +11,11 @@ module Saasable::SaasDocument
|
|
11
11
|
klass.extend ClassMethods
|
12
12
|
klass.send(:include, InstanceMethods)
|
13
13
|
klass.class_eval do
|
14
|
+
# Fields
|
14
15
|
field :hosts, :type => Array
|
16
|
+
|
17
|
+
# Validations
|
18
|
+
validates_uniqueness_of :hosts
|
15
19
|
end
|
16
20
|
end
|
17
21
|
|
@@ -21,7 +25,7 @@ module Saasable::SaasDocument
|
|
21
25
|
|
22
26
|
module InstanceMethods
|
23
27
|
def activate!
|
24
|
-
Saasable::ScopedDocument.scoped_documents.each do |klass|
|
28
|
+
Saasable::Mongoid::ScopedDocument.scoped_documents.each do |klass|
|
25
29
|
# Create a default scope without messing with the ones already in place.
|
26
30
|
klass.default_scoping ||= {}
|
27
31
|
klass.default_scoping[:where] ||= {:saas_id => nil}
|
@@ -34,7 +38,7 @@ module Saasable::SaasDocument
|
|
34
38
|
|
35
39
|
module ClassMethods
|
36
40
|
def find_by_host! a_host
|
37
|
-
if Saasable::SaasDocument.saas_document.nil?
|
41
|
+
if Saasable::Mongoid::SaasDocument.saas_document.nil?
|
38
42
|
if Rails.env.production?
|
39
43
|
raise Saasable::Errors::NoSaasDocuments, "you need to set one Saasable::SaasDocument"
|
40
44
|
else
|
@@ -42,11 +46,11 @@ module Saasable::SaasDocument
|
|
42
46
|
end
|
43
47
|
end
|
44
48
|
|
45
|
-
possible_saas = Saasable::SaasDocument.saas_document.where(:hosts => a_host)
|
49
|
+
possible_saas = Saasable::Mongoid::SaasDocument.saas_document.where(:hosts => a_host)
|
46
50
|
if possible_saas.empty?
|
47
|
-
raise Saasable::Errors::SaasNotFound, "no #{Saasable::SaasDocument.saas_document.name} found for the host: \"#{a_host}\""
|
51
|
+
raise Saasable::Errors::SaasNotFound, "no #{Saasable::Mongoid::SaasDocument.saas_document.name} found for the host: \"#{a_host}\""
|
48
52
|
elsif possible_saas.count > 1
|
49
|
-
raise Saasable::Errors::MultipleSaasFound, "more then 1 #{Saasable::SaasDocument.saas_document.name} found for the host: \"#{a_host}\""
|
53
|
+
raise Saasable::Errors::MultipleSaasFound, "more then 1 #{Saasable::Mongoid::SaasDocument.saas_document.name} found for the host: \"#{a_host}\""
|
50
54
|
else
|
51
55
|
return possible_saas.first
|
52
56
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Saasable::Railties
|
2
|
+
module Helpers
|
3
|
+
def self.included klass
|
4
|
+
klass.send(:include, InstanceMethods)
|
5
|
+
klass.class_eval do
|
6
|
+
helper_method :current_saas
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
module InstanceMethods
|
11
|
+
def current_saas
|
12
|
+
@current_saas ||= request.env[:saasable][:current_saas]
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/lib/saasable.rb
CHANGED
@@ -2,10 +2,12 @@ module Saasable
|
|
2
2
|
# Errors
|
3
3
|
autoload :Errors, "saasable/errors"
|
4
4
|
|
5
|
-
#
|
6
|
-
autoload :
|
7
|
-
autoload :ScopedDocument, "saasable/scoped_document"
|
5
|
+
# Middleware
|
6
|
+
autoload :Middleware, "saasable/middleware"
|
8
7
|
|
9
|
-
#
|
10
|
-
autoload :
|
11
|
-
end
|
8
|
+
# Mongoid
|
9
|
+
autoload :Mongoid, "saasable/mongoid"
|
10
|
+
end
|
11
|
+
|
12
|
+
# Railtie
|
13
|
+
require "saasable/railtie" if defined?(Rails)
|
data/saasable.gemspec
CHANGED
@@ -4,14 +4,14 @@
|
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
|
-
s.name =
|
8
|
-
s.version = "0.
|
7
|
+
s.name = "saasable"
|
8
|
+
s.version = "0.2.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
-
s.authors = [
|
12
|
-
s.date =
|
13
|
-
s.description =
|
14
|
-
s.email =
|
11
|
+
s.authors = ["Educa2", "Rafael Gaspar"]
|
12
|
+
s.date = "2011-11-06"
|
13
|
+
s.description = "A gem for making a Multi-Tenant SaaS using Mongoid"
|
14
|
+
s.email = "suporte@educa2.com.br"
|
15
15
|
s.extra_rdoc_files = [
|
16
16
|
"LICENSE.txt",
|
17
17
|
"README.rdoc"
|
@@ -27,32 +27,39 @@ Gem::Specification.new do |s|
|
|
27
27
|
"VERSION",
|
28
28
|
"lib/saasable.rb",
|
29
29
|
"lib/saasable/errors.rb",
|
30
|
-
"lib/saasable/
|
31
|
-
"lib/saasable/
|
32
|
-
"lib/saasable/
|
30
|
+
"lib/saasable/middleware.rb",
|
31
|
+
"lib/saasable/mongoid.rb",
|
32
|
+
"lib/saasable/mongoid/saas_document.rb",
|
33
|
+
"lib/saasable/mongoid/scoped_document.rb",
|
34
|
+
"lib/saasable/railtie.rb",
|
35
|
+
"lib/saasable/railties.rb",
|
36
|
+
"lib/saasable/railties/helpers.rb",
|
33
37
|
"saasable.gemspec",
|
34
38
|
"spec/saasable_spec.rb",
|
35
39
|
"spec/spec_helper.rb"
|
36
40
|
]
|
37
|
-
s.homepage =
|
38
|
-
s.licenses = [
|
39
|
-
s.require_paths = [
|
40
|
-
s.rubygems_version =
|
41
|
-
s.summary =
|
41
|
+
s.homepage = "http://github.com/educa2/saasable"
|
42
|
+
s.licenses = ["MIT"]
|
43
|
+
s.require_paths = ["lib"]
|
44
|
+
s.rubygems_version = "1.8.10"
|
45
|
+
s.summary = "A gem for making a Multi-Tenant SaaS using Mongoid"
|
42
46
|
|
43
47
|
if s.respond_to? :specification_version then
|
44
48
|
s.specification_version = 3
|
45
49
|
|
46
50
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
51
|
+
s.add_runtime_dependency(%q<mongoid>, [">= 0"])
|
47
52
|
s.add_development_dependency(%q<rspec>, [">= 0"])
|
48
53
|
s.add_development_dependency(%q<bundler>, [">= 0"])
|
49
54
|
s.add_development_dependency(%q<jeweler>, [">= 0"])
|
50
55
|
else
|
56
|
+
s.add_dependency(%q<mongoid>, [">= 0"])
|
51
57
|
s.add_dependency(%q<rspec>, [">= 0"])
|
52
58
|
s.add_dependency(%q<bundler>, [">= 0"])
|
53
59
|
s.add_dependency(%q<jeweler>, [">= 0"])
|
54
60
|
end
|
55
61
|
else
|
62
|
+
s.add_dependency(%q<mongoid>, [">= 0"])
|
56
63
|
s.add_dependency(%q<rspec>, [">= 0"])
|
57
64
|
s.add_dependency(%q<bundler>, [">= 0"])
|
58
65
|
s.add_dependency(%q<jeweler>, [">= 0"])
|
metadata
CHANGED
@@ -1,75 +1,69 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: saasable
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.0
|
5
5
|
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 1
|
9
|
-
- 6
|
10
|
-
version: 0.1.6
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Educa2
|
14
9
|
- Rafael Gaspar
|
15
10
|
autorequire:
|
16
11
|
bindir: bin
|
17
12
|
cert_chain: []
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
13
|
+
date: 2011-11-06 00:00:00.000000000 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: mongoid
|
17
|
+
requirement: &70170140248740 !ruby/object:Gem::Requirement
|
18
|
+
none: false
|
19
|
+
requirements:
|
20
|
+
- - ! '>='
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '0'
|
23
|
+
type: :runtime
|
23
24
|
prerelease: false
|
24
|
-
|
25
|
+
version_requirements: *70170140248740
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: rspec
|
28
|
+
requirement: &70170140280100 !ruby/object:Gem::Requirement
|
25
29
|
none: false
|
26
|
-
requirements:
|
27
|
-
- -
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
|
30
|
-
segments:
|
31
|
-
- 0
|
32
|
-
version: "0"
|
33
|
-
version_requirements: *id001
|
30
|
+
requirements:
|
31
|
+
- - ! '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
34
|
type: :development
|
35
|
-
- !ruby/object:Gem::Dependency
|
36
|
-
name: bundler
|
37
35
|
prerelease: false
|
38
|
-
|
36
|
+
version_requirements: *70170140280100
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: bundler
|
39
|
+
requirement: &70170140277920 !ruby/object:Gem::Requirement
|
39
40
|
none: false
|
40
|
-
requirements:
|
41
|
-
- -
|
42
|
-
- !ruby/object:Gem::Version
|
43
|
-
|
44
|
-
segments:
|
45
|
-
- 0
|
46
|
-
version: "0"
|
47
|
-
version_requirements: *id002
|
41
|
+
requirements:
|
42
|
+
- - ! '>='
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: '0'
|
48
45
|
type: :development
|
49
|
-
- !ruby/object:Gem::Dependency
|
50
|
-
name: jeweler
|
51
46
|
prerelease: false
|
52
|
-
|
47
|
+
version_requirements: *70170140277920
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: jeweler
|
50
|
+
requirement: &70170140273980 !ruby/object:Gem::Requirement
|
53
51
|
none: false
|
54
|
-
requirements:
|
55
|
-
- -
|
56
|
-
- !ruby/object:Gem::Version
|
57
|
-
|
58
|
-
segments:
|
59
|
-
- 0
|
60
|
-
version: "0"
|
61
|
-
version_requirements: *id003
|
52
|
+
requirements:
|
53
|
+
- - ! '>='
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0'
|
62
56
|
type: :development
|
57
|
+
prerelease: false
|
58
|
+
version_requirements: *70170140273980
|
63
59
|
description: A gem for making a Multi-Tenant SaaS using Mongoid
|
64
60
|
email: suporte@educa2.com.br
|
65
61
|
executables: []
|
66
|
-
|
67
62
|
extensions: []
|
68
|
-
|
69
|
-
extra_rdoc_files:
|
63
|
+
extra_rdoc_files:
|
70
64
|
- LICENSE.txt
|
71
65
|
- README.rdoc
|
72
|
-
files:
|
66
|
+
files:
|
73
67
|
- .document
|
74
68
|
- .rspec
|
75
69
|
- Gemfile
|
@@ -80,44 +74,42 @@ files:
|
|
80
74
|
- VERSION
|
81
75
|
- lib/saasable.rb
|
82
76
|
- lib/saasable/errors.rb
|
83
|
-
- lib/saasable/
|
84
|
-
- lib/saasable/
|
85
|
-
- lib/saasable/
|
77
|
+
- lib/saasable/middleware.rb
|
78
|
+
- lib/saasable/mongoid.rb
|
79
|
+
- lib/saasable/mongoid/saas_document.rb
|
80
|
+
- lib/saasable/mongoid/scoped_document.rb
|
81
|
+
- lib/saasable/railtie.rb
|
82
|
+
- lib/saasable/railties.rb
|
83
|
+
- lib/saasable/railties/helpers.rb
|
86
84
|
- saasable.gemspec
|
87
85
|
- spec/saasable_spec.rb
|
88
86
|
- spec/spec_helper.rb
|
89
87
|
homepage: http://github.com/educa2/saasable
|
90
|
-
licenses:
|
88
|
+
licenses:
|
91
89
|
- MIT
|
92
90
|
post_install_message:
|
93
91
|
rdoc_options: []
|
94
|
-
|
95
|
-
require_paths:
|
92
|
+
require_paths:
|
96
93
|
- lib
|
97
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
94
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
98
95
|
none: false
|
99
|
-
requirements:
|
100
|
-
- -
|
101
|
-
- !ruby/object:Gem::Version
|
102
|
-
|
103
|
-
segments:
|
96
|
+
requirements:
|
97
|
+
- - ! '>='
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: '0'
|
100
|
+
segments:
|
104
101
|
- 0
|
105
|
-
|
106
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
102
|
+
hash: -3690055476265726699
|
103
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
107
104
|
none: false
|
108
|
-
requirements:
|
109
|
-
- -
|
110
|
-
- !ruby/object:Gem::Version
|
111
|
-
|
112
|
-
segments:
|
113
|
-
- 0
|
114
|
-
version: "0"
|
105
|
+
requirements:
|
106
|
+
- - ! '>='
|
107
|
+
- !ruby/object:Gem::Version
|
108
|
+
version: '0'
|
115
109
|
requirements: []
|
116
|
-
|
117
110
|
rubyforge_project:
|
118
|
-
rubygems_version: 1.8.
|
111
|
+
rubygems_version: 1.8.10
|
119
112
|
signing_key:
|
120
113
|
specification_version: 3
|
121
114
|
summary: A gem for making a Multi-Tenant SaaS using Mongoid
|
122
115
|
test_files: []
|
123
|
-
|
@@ -1,26 +0,0 @@
|
|
1
|
-
module Saasable::ScopedController
|
2
|
-
def self.included klass
|
3
|
-
klass.send(:include, InstanceMethods)
|
4
|
-
klass.class_eval do
|
5
|
-
before_filter :fetch_current_saas
|
6
|
-
before_filter :scope_models_by_saas
|
7
|
-
|
8
|
-
helper_method :current_saas
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
module InstanceMethods
|
13
|
-
def current_saas
|
14
|
-
@current_saas
|
15
|
-
end
|
16
|
-
|
17
|
-
private
|
18
|
-
def fetch_current_saas
|
19
|
-
@current_saas = Saasable::SaasDocument.saas_document.find_by_host!(request.host)
|
20
|
-
end
|
21
|
-
|
22
|
-
def scope_models_by_saas
|
23
|
-
@current_saas.activate!
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|