saasable 0.3.5 → 4.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.ruby-version +1 -1
- data/Gemfile +1 -1
- data/Gemfile.lock +71 -53
- data/VERSION +1 -1
- data/lib/saasable/middleware.rb +9 -7
- data/lib/saasable/mongoid/saas_document.rb +30 -30
- data/lib/saasable/mongoid/scoped_document.rb +13 -4
- data/lib/saasable/railties/helpers.rb +9 -9
- data/saasable.gemspec +8 -8
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 96efcc9b26a6dfa1ac4461fc8bbefddcf8c9794d
|
4
|
+
data.tar.gz: cbea1ffd6c0b5f188d6eb948410dd639584f3da3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9aec30de71488cfeafd46ef598b094e1b10103e339da448955f9dbc7293e962b2fe402f76124f2f8dbbeb70ef1038162f4a823fecd71bec6092c7cd88153aed1
|
7
|
+
data.tar.gz: f032f197e8adb948c6048a1fc50127ae7d8f33285a9436fda2865da14095b6760c0a592fe1d01e8c2892edff6c8729fbd5c1089d8166a3720e74b7790b3206eb
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
ruby-2.
|
1
|
+
ruby-2.1
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,72 +1,90 @@
|
|
1
1
|
GEM
|
2
2
|
remote: http://rubygems.org/
|
3
3
|
specs:
|
4
|
-
activemodel (
|
5
|
-
activesupport (=
|
6
|
-
builder (~> 3.
|
7
|
-
activesupport (
|
8
|
-
i18n (~> 0.6, >= 0.6.
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
4
|
+
activemodel (4.1.4)
|
5
|
+
activesupport (= 4.1.4)
|
6
|
+
builder (~> 3.1)
|
7
|
+
activesupport (4.1.4)
|
8
|
+
i18n (~> 0.6, >= 0.6.9)
|
9
|
+
json (~> 1.7, >= 1.7.7)
|
10
|
+
minitest (~> 5.1)
|
11
|
+
thread_safe (~> 0.1)
|
12
|
+
tzinfo (~> 1.1)
|
13
|
+
addressable (2.3.6)
|
14
|
+
bson (2.3.0)
|
15
|
+
builder (3.2.2)
|
16
|
+
connection_pool (2.0.0)
|
17
|
+
descendants_tracker (0.0.4)
|
18
|
+
thread_safe (~> 0.3, >= 0.3.1)
|
13
19
|
diff-lcs (1.2.5)
|
14
|
-
faraday (0.
|
15
|
-
multipart-post (
|
16
|
-
git (1.2.
|
17
|
-
github_api (0.
|
18
|
-
addressable
|
19
|
-
|
20
|
+
faraday (0.9.0)
|
21
|
+
multipart-post (>= 1.2, < 3)
|
22
|
+
git (1.2.7)
|
23
|
+
github_api (0.11.3)
|
24
|
+
addressable (~> 2.3)
|
25
|
+
descendants_tracker (~> 0.0.1)
|
26
|
+
faraday (~> 0.8, < 0.10)
|
20
27
|
hashie (>= 1.2)
|
21
|
-
multi_json (
|
22
|
-
nokogiri (~> 1.
|
28
|
+
multi_json (>= 1.7.5, < 2.0)
|
29
|
+
nokogiri (~> 1.6.0)
|
23
30
|
oauth2
|
24
|
-
hashie (2.0
|
25
|
-
highline (1.6.
|
26
|
-
|
27
|
-
|
28
|
-
jeweler (1.8.8)
|
31
|
+
hashie (3.2.0)
|
32
|
+
highline (1.6.21)
|
33
|
+
i18n (0.6.11)
|
34
|
+
jeweler (2.0.1)
|
29
35
|
builder
|
30
|
-
bundler (
|
36
|
+
bundler (>= 1.0)
|
31
37
|
git (>= 1.2.5)
|
32
|
-
github_api
|
38
|
+
github_api
|
33
39
|
highline (>= 1.6.15)
|
34
|
-
nokogiri (
|
40
|
+
nokogiri (>= 1.5.10)
|
35
41
|
rake
|
36
42
|
rdoc
|
37
43
|
json (1.8.1)
|
38
|
-
jwt (0.
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
tzinfo (
|
46
|
-
|
44
|
+
jwt (1.0.0)
|
45
|
+
mini_portile (0.6.0)
|
46
|
+
minitest (5.4.0)
|
47
|
+
mongoid (4.0.0)
|
48
|
+
activemodel (~> 4.0)
|
49
|
+
moped (~> 2.0.0)
|
50
|
+
origin (~> 2.1)
|
51
|
+
tzinfo (>= 0.3.37)
|
52
|
+
moped (2.0.0)
|
53
|
+
bson (~> 2.2)
|
54
|
+
connection_pool (~> 2.0)
|
55
|
+
optionable (~> 0.2.0)
|
56
|
+
multi_json (1.10.1)
|
47
57
|
multi_xml (0.5.5)
|
48
|
-
multipart-post (
|
49
|
-
nokogiri (1.
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
jwt (~>
|
54
|
-
multi_json (~> 1.
|
58
|
+
multipart-post (2.0.0)
|
59
|
+
nokogiri (1.6.2.1)
|
60
|
+
mini_portile (= 0.6.0)
|
61
|
+
oauth2 (1.0.0)
|
62
|
+
faraday (>= 0.8, < 0.10)
|
63
|
+
jwt (~> 1.0)
|
64
|
+
multi_json (~> 1.3)
|
55
65
|
multi_xml (~> 0.5)
|
56
66
|
rack (~> 1.2)
|
67
|
+
optionable (0.2.0)
|
68
|
+
origin (2.1.1)
|
57
69
|
rack (1.5.2)
|
58
|
-
rake (10.
|
59
|
-
rdoc (4.
|
70
|
+
rake (10.3.2)
|
71
|
+
rdoc (4.1.1)
|
60
72
|
json (~> 1.4)
|
61
|
-
rspec (
|
62
|
-
rspec-core (~>
|
63
|
-
rspec-expectations (~>
|
64
|
-
rspec-mocks (~>
|
65
|
-
rspec-core (
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
73
|
+
rspec (3.0.0)
|
74
|
+
rspec-core (~> 3.0.0)
|
75
|
+
rspec-expectations (~> 3.0.0)
|
76
|
+
rspec-mocks (~> 3.0.0)
|
77
|
+
rspec-core (3.0.2)
|
78
|
+
rspec-support (~> 3.0.0)
|
79
|
+
rspec-expectations (3.0.2)
|
80
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
81
|
+
rspec-support (~> 3.0.0)
|
82
|
+
rspec-mocks (3.0.2)
|
83
|
+
rspec-support (~> 3.0.0)
|
84
|
+
rspec-support (3.0.2)
|
85
|
+
thread_safe (0.3.4)
|
86
|
+
tzinfo (1.2.1)
|
87
|
+
thread_safe (~> 0.1)
|
70
88
|
|
71
89
|
PLATFORMS
|
72
90
|
ruby
|
@@ -74,6 +92,6 @@ PLATFORMS
|
|
74
92
|
DEPENDENCIES
|
75
93
|
bundler
|
76
94
|
jeweler
|
77
|
-
mongoid (~>
|
95
|
+
mongoid (~> 4.0.0)
|
78
96
|
rdoc
|
79
97
|
rspec
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
4.0.0
|
data/lib/saasable/middleware.rb
CHANGED
@@ -7,7 +7,9 @@ class Saasable::Middleware
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def call env
|
10
|
-
env
|
10
|
+
return @app.call(env) if env['PATH_INFO'].start_with?('/assets')
|
11
|
+
|
12
|
+
env[:saasable] = {:current_saas => saas_for_host(env['SERVER_NAME'])}
|
11
13
|
env[:saasable][:current_saas].activate! if env[:saasable][:current_saas]
|
12
14
|
|
13
15
|
@app.call(env).tap do
|
@@ -16,9 +18,9 @@ class Saasable::Middleware
|
|
16
18
|
end
|
17
19
|
|
18
20
|
private
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
end
|
21
|
+
def saas_for_host hostname
|
22
|
+
Saasable::Mongoid::SaasDocument.saas_document.find_by_host!(hostname)
|
23
|
+
rescue Saasable::Errors::SaasNotFound
|
24
|
+
nil # Saas not found is treated by the Rails Helper
|
25
|
+
end
|
26
|
+
end
|
@@ -1,68 +1,68 @@
|
|
1
1
|
module Saasable::Mongoid::SaasDocument
|
2
2
|
@saas_document = nil
|
3
|
-
|
3
|
+
|
4
4
|
def self.included klass
|
5
5
|
if @saas_document and @saas_document.name != klass.name
|
6
6
|
raise Saasable::Errors::MultipleSaasDocuments, "you can only have one Saasable::SaasDocument"
|
7
7
|
else
|
8
8
|
@saas_document = klass
|
9
9
|
end
|
10
|
-
|
10
|
+
|
11
11
|
klass.extend ClassMethods
|
12
12
|
klass.send(:include, InstanceMethods)
|
13
13
|
klass.class_eval do
|
14
14
|
# Fields
|
15
15
|
field :hosts, :type => Array
|
16
|
-
|
16
|
+
|
17
17
|
# Validations
|
18
18
|
validates_uniqueness_of :hosts
|
19
|
-
|
19
|
+
|
20
20
|
# Indexes
|
21
|
-
index
|
21
|
+
index({hosts: 1})
|
22
22
|
end
|
23
|
-
|
23
|
+
|
24
24
|
klass.instance_variable_set("@_active_saas", nil)
|
25
25
|
klass.instance_variable_set("@_after_activate_chain", [])
|
26
26
|
klass.instance_variable_set("@_after_deactivate_chain", [])
|
27
27
|
end
|
28
|
-
|
28
|
+
|
29
29
|
def self.saas_document
|
30
30
|
@saas_document
|
31
31
|
end
|
32
|
-
|
32
|
+
|
33
33
|
module InstanceMethods
|
34
34
|
def activate!
|
35
35
|
Saasable::Mongoid::ScopedDocument.scoped_documents.each do |klass|
|
36
|
-
|
37
|
-
klass.default_scoping
|
38
|
-
|
39
|
-
|
40
|
-
klass.
|
41
|
-
klass.class_eval "field :saas_id, :type => BSON::ObjectId, :default => BSON::ObjectId(\"#{self._id}\")"
|
36
|
+
saasble_criteria = Mongoid::Criteria.new(klass).where(saas_id: self._id)
|
37
|
+
klass.default_scoping = klass.default_scoping? ? saasble_criteria.merge(klass.default_scoping.call).to_proc : saasble_criteria.to_proc
|
38
|
+
|
39
|
+
klass.fields["saas_id"].default_val = self._id
|
40
|
+
klass.fields["saas_id"].options[:default] = self._id
|
42
41
|
end
|
43
|
-
|
42
|
+
|
44
43
|
self.class.instance_variable_set("@_active_saas", self)
|
45
44
|
self.class.instance_variable_get("@_after_activate_chain").each { |method_name| send(method_name) }
|
46
45
|
end
|
47
|
-
|
46
|
+
|
48
47
|
def deactivate!
|
49
48
|
self.class.deactivate_all!
|
50
49
|
end
|
51
50
|
end
|
52
|
-
|
51
|
+
|
53
52
|
module ClassMethods
|
54
53
|
def deactivate_all!
|
55
54
|
Saasable::Mongoid::ScopedDocument.scoped_documents.each do |klass|
|
56
|
-
klass.
|
57
|
-
|
55
|
+
saasble_criteria = Mongoid::Criteria.new(klass).where(saas_id: @_active_saas._id)
|
56
|
+
klass.default_scoping = klass.default_scoping.call.remove_scoping(saasble_criteria).to_proc
|
57
|
+
|
58
58
|
klass.fields["saas_id"].default_val = nil
|
59
59
|
klass.fields["saas_id"].options.delete(:default)
|
60
60
|
end
|
61
|
-
|
61
|
+
|
62
62
|
last_active_saas, @_active_saas = active_saas, nil
|
63
63
|
@_after_deactivate_chain.each { |method_name| last_active_saas.send(method_name) }
|
64
|
-
end
|
65
|
-
|
64
|
+
end
|
65
|
+
|
66
66
|
def find_by_host! a_host
|
67
67
|
if Saasable::Mongoid::SaasDocument.saas_document.nil?
|
68
68
|
if Rails.env.production?
|
@@ -71,8 +71,8 @@ module Saasable::Mongoid::SaasDocument
|
|
71
71
|
return nil
|
72
72
|
end
|
73
73
|
end
|
74
|
-
|
75
|
-
possible_saas = Saasable::Mongoid::SaasDocument.saas_document.where(:hosts => a_host)
|
74
|
+
|
75
|
+
possible_saas = Saasable::Mongoid::SaasDocument.saas_document.where(:hosts => a_host).to_a
|
76
76
|
if possible_saas.empty?
|
77
77
|
raise Saasable::Errors::SaasNotFound, "no #{Saasable::Mongoid::SaasDocument.saas_document.name} found for the host: \"#{a_host}\""
|
78
78
|
elsif possible_saas.count > 1
|
@@ -81,25 +81,25 @@ module Saasable::Mongoid::SaasDocument
|
|
81
81
|
return possible_saas.first
|
82
82
|
end
|
83
83
|
end
|
84
|
-
|
84
|
+
|
85
85
|
def active_saas
|
86
86
|
@_active_saas
|
87
87
|
end
|
88
|
-
|
88
|
+
|
89
89
|
def after_activate *method_names
|
90
90
|
@_after_activate_chain += method_names
|
91
91
|
end
|
92
|
-
|
92
|
+
|
93
93
|
def after_deactivate *method_names
|
94
94
|
@_after_deactivate_chain += method_names
|
95
95
|
end
|
96
|
-
|
96
|
+
|
97
97
|
def remove_after_activate *method_names
|
98
98
|
@_after_activate_chain -= method_names
|
99
99
|
end
|
100
|
-
|
100
|
+
|
101
101
|
def remove_after_deactivate *method_names
|
102
102
|
@_after_deactivate_chain -= method_names
|
103
103
|
end
|
104
104
|
end
|
105
|
-
end
|
105
|
+
end
|
@@ -8,10 +8,14 @@ module Saasable::Mongoid::ScopedDocument
|
|
8
8
|
klass.class_eval do
|
9
9
|
# Fields
|
10
10
|
field :saas_id, :type => BSON::ObjectId
|
11
|
-
|
11
|
+
|
12
12
|
# Indexes
|
13
|
-
index
|
14
|
-
index
|
13
|
+
index({saas_id: 1})
|
14
|
+
index({saad_id: 1, _id: 1})
|
15
|
+
|
16
|
+
class << self
|
17
|
+
alias_method_chain :index, :saasable
|
18
|
+
end
|
15
19
|
end
|
16
20
|
end
|
17
21
|
|
@@ -33,7 +37,12 @@ module Saasable::Mongoid::ScopedDocument
|
|
33
37
|
attributes[:scope] ||= []
|
34
38
|
attributes[:scope] << :saas_id unless attributes[:scope].include?(:saas_id)
|
35
39
|
|
36
|
-
validates_with(Mongoid::
|
40
|
+
validates_with(Mongoid::Validatable::UniquenessValidator, attributes)
|
41
|
+
end
|
42
|
+
|
43
|
+
def index_with_saasable(spec, options = nil)
|
44
|
+
index_without_saasable(spec, options.except(:unique)) # Never create this one with unique since it's only unique in the saas scope.
|
45
|
+
index_without_saasable({saas_id: 1}.merge(spec), options) unless spec.include?(:saas_id)
|
37
46
|
end
|
38
47
|
end
|
39
48
|
end
|
@@ -6,16 +6,16 @@ module Saasable::Railties
|
|
6
6
|
klass.class_eval do
|
7
7
|
helper_method :current_saas
|
8
8
|
|
9
|
-
before_filter :_redirect_if_saas_not_found
|
9
|
+
before_filter :_redirect_if_saas_not_found unless Rails.env.development?
|
10
10
|
saas_not_found_redirect_to "/404.html"
|
11
|
-
|
11
|
+
|
12
12
|
private
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
def _skip_saasable
|
14
|
+
current_saas.deactivate! if current_saas
|
15
|
+
end
|
16
16
|
end
|
17
17
|
end
|
18
|
-
|
18
|
+
|
19
19
|
module ClassMethods
|
20
20
|
def saas_not_found_redirect_to path_or_url
|
21
21
|
self.class_eval <<-METHOD, __FILE__, __LINE__ + 1
|
@@ -27,17 +27,17 @@ module Saasable::Railties
|
|
27
27
|
end
|
28
28
|
METHOD
|
29
29
|
end
|
30
|
-
|
30
|
+
|
31
31
|
def skip_saasable options
|
32
32
|
skip_before_filter :_redirect_if_saas_not_found, options
|
33
33
|
before_filter :_skip_saasable, options
|
34
34
|
end
|
35
35
|
end
|
36
|
-
|
36
|
+
|
37
37
|
module InstanceMethods
|
38
38
|
def current_saas
|
39
39
|
@current_saas ||= request.env[:saasable][:current_saas]
|
40
40
|
end
|
41
41
|
end
|
42
42
|
end
|
43
|
-
end
|
43
|
+
end
|
data/saasable.gemspec
CHANGED
@@ -2,15 +2,16 @@
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
3
|
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
-
# stub: saasable 0.
|
5
|
+
# stub: saasable 4.0.0 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = "saasable"
|
9
|
-
s.version = "0.
|
9
|
+
s.version = "4.0.0"
|
10
10
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
12
|
+
s.require_paths = ["lib"]
|
12
13
|
s.authors = ["Educa2", "Rafael Gaspar"]
|
13
|
-
s.date = "
|
14
|
+
s.date = "2014-07-17"
|
14
15
|
s.description = "A gem for making a Multi-Tenant SaaS using Mongoid"
|
15
16
|
s.email = "suporte@educa2.com.br"
|
16
17
|
s.extra_rdoc_files = [
|
@@ -43,28 +44,27 @@ Gem::Specification.new do |s|
|
|
43
44
|
]
|
44
45
|
s.homepage = "http://github.com/educa2/saasable"
|
45
46
|
s.licenses = ["MIT"]
|
46
|
-
s.
|
47
|
-
s.rubygems_version = "2.1.11"
|
47
|
+
s.rubygems_version = "2.2.2"
|
48
48
|
s.summary = "A gem for making a Multi-Tenant SaaS using Mongoid"
|
49
49
|
|
50
50
|
if s.respond_to? :specification_version then
|
51
51
|
s.specification_version = 4
|
52
52
|
|
53
53
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
54
|
-
s.add_runtime_dependency(%q<mongoid>, ["~>
|
54
|
+
s.add_runtime_dependency(%q<mongoid>, ["~> 4.0.0"])
|
55
55
|
s.add_development_dependency(%q<rspec>, [">= 0"])
|
56
56
|
s.add_development_dependency(%q<bundler>, [">= 0"])
|
57
57
|
s.add_development_dependency(%q<jeweler>, [">= 0"])
|
58
58
|
s.add_development_dependency(%q<rdoc>, [">= 0"])
|
59
59
|
else
|
60
|
-
s.add_dependency(%q<mongoid>, ["~>
|
60
|
+
s.add_dependency(%q<mongoid>, ["~> 4.0.0"])
|
61
61
|
s.add_dependency(%q<rspec>, [">= 0"])
|
62
62
|
s.add_dependency(%q<bundler>, [">= 0"])
|
63
63
|
s.add_dependency(%q<jeweler>, [">= 0"])
|
64
64
|
s.add_dependency(%q<rdoc>, [">= 0"])
|
65
65
|
end
|
66
66
|
else
|
67
|
-
s.add_dependency(%q<mongoid>, ["~>
|
67
|
+
s.add_dependency(%q<mongoid>, ["~> 4.0.0"])
|
68
68
|
s.add_dependency(%q<rspec>, [">= 0"])
|
69
69
|
s.add_dependency(%q<bundler>, [">= 0"])
|
70
70
|
s.add_dependency(%q<jeweler>, [">= 0"])
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: saasable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 4.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Educa2
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2014-07-17 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: mongoid
|
@@ -17,14 +17,14 @@ dependencies:
|
|
17
17
|
requirements:
|
18
18
|
- - ~>
|
19
19
|
- !ruby/object:Gem::Version
|
20
|
-
version:
|
20
|
+
version: 4.0.0
|
21
21
|
type: :runtime
|
22
22
|
prerelease: false
|
23
23
|
version_requirements: !ruby/object:Gem::Requirement
|
24
24
|
requirements:
|
25
25
|
- - ~>
|
26
26
|
- !ruby/object:Gem::Version
|
27
|
-
version:
|
27
|
+
version: 4.0.0
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
29
|
name: rspec
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
@@ -131,7 +131,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
131
131
|
version: '0'
|
132
132
|
requirements: []
|
133
133
|
rubyforge_project:
|
134
|
-
rubygems_version: 2.
|
134
|
+
rubygems_version: 2.2.2
|
135
135
|
signing_key:
|
136
136
|
specification_version: 4
|
137
137
|
summary: A gem for making a Multi-Tenant SaaS using Mongoid
|