saasable 0.1.6 → 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/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
|