saasable 4.0.2 → 5.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 +48 -49
- data/VERSION +1 -1
- data/lib/saasable/errors.rb +4 -4
- data/lib/saasable/middleware.rb +3 -8
- data/lib/saasable/mongoid/saas_document.rb +10 -27
- data/lib/saasable/mongoid/scoped_document.rb +5 -10
- data/lib/saasable/mongoid.rb +1 -1
- data/lib/saasable/railtie.rb +2 -2
- data/lib/saasable/railties/helpers.rb +2 -2
- data/lib/saasable/railties.rb +1 -1
- data/lib/saasable.rb +3 -3
- data/saasable.gemspec +7 -7
- data/spec/spec_helper.rb +1 -1
- 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: e713b6114bc528a35836f8533322fe5d99f43b11
|
4
|
+
data.tar.gz: 4bbf520d6c716841f9aae74cd1d7ca8774e97303
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8720af7407fa29ce8abecd173d7264c81f36f623d6cae6a4ebfbff1fd0251e2239742cb1d0e6a7de9a42c41a4fe9d0c6c5f1a696d5b020f3710ab1d18382eb48
|
7
|
+
data.tar.gz: 6562a424cf45252f5bb110ecf3a26534f72363ed9ebd5a771c71485aea03873f550b05217b423a00388e16a8a20370a14d755d451daa35030fad535cf75d33d5
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
ruby-2.
|
1
|
+
ruby-2.2
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,36 +1,35 @@
|
|
1
1
|
GEM
|
2
2
|
remote: http://rubygems.org/
|
3
3
|
specs:
|
4
|
-
activemodel (4.
|
5
|
-
activesupport (= 4.
|
4
|
+
activemodel (4.2.5)
|
5
|
+
activesupport (= 4.2.5)
|
6
6
|
builder (~> 3.1)
|
7
|
-
activesupport (4.
|
8
|
-
i18n (~> 0.
|
7
|
+
activesupport (4.2.5)
|
8
|
+
i18n (~> 0.7)
|
9
9
|
json (~> 1.7, >= 1.7.7)
|
10
10
|
minitest (~> 5.1)
|
11
|
-
thread_safe (~> 0.
|
11
|
+
thread_safe (~> 0.3, >= 0.3.4)
|
12
12
|
tzinfo (~> 1.1)
|
13
|
-
addressable (2.3.
|
14
|
-
bson (2.
|
13
|
+
addressable (2.3.8)
|
14
|
+
bson (3.2.6)
|
15
15
|
builder (3.2.2)
|
16
|
-
connection_pool (2.0.0)
|
17
16
|
descendants_tracker (0.0.4)
|
18
17
|
thread_safe (~> 0.3, >= 0.3.1)
|
19
18
|
diff-lcs (1.2.5)
|
20
|
-
faraday (0.9.
|
19
|
+
faraday (0.9.2)
|
21
20
|
multipart-post (>= 1.2, < 3)
|
22
|
-
git (1.2.
|
23
|
-
github_api (0.
|
21
|
+
git (1.2.9.1)
|
22
|
+
github_api (0.13.0)
|
24
23
|
addressable (~> 2.3)
|
25
|
-
descendants_tracker (~> 0.0.
|
24
|
+
descendants_tracker (~> 0.0.4)
|
26
25
|
faraday (~> 0.8, < 0.10)
|
27
|
-
hashie (>=
|
26
|
+
hashie (>= 3.4)
|
28
27
|
multi_json (>= 1.7.5, < 2.0)
|
29
|
-
nokogiri (~> 1.6.
|
28
|
+
nokogiri (~> 1.6.6)
|
30
29
|
oauth2
|
31
|
-
hashie (3.
|
32
|
-
highline (1.
|
33
|
-
i18n (0.
|
30
|
+
hashie (3.4.3)
|
31
|
+
highline (1.7.8)
|
32
|
+
i18n (0.7.0)
|
34
33
|
jeweler (2.0.1)
|
35
34
|
builder
|
36
35
|
bundler (>= 1.0)
|
@@ -40,50 +39,47 @@ GEM
|
|
40
39
|
nokogiri (>= 1.5.10)
|
41
40
|
rake
|
42
41
|
rdoc
|
43
|
-
json (1.8.
|
44
|
-
jwt (1.
|
45
|
-
mini_portile (0.6.
|
46
|
-
minitest (5.
|
47
|
-
|
42
|
+
json (1.8.3)
|
43
|
+
jwt (1.5.2)
|
44
|
+
mini_portile (0.6.2)
|
45
|
+
minitest (5.8.3)
|
46
|
+
mongo (2.1.2)
|
47
|
+
bson (~> 3.0)
|
48
|
+
mongoid (5.0.1)
|
48
49
|
activemodel (~> 4.0)
|
49
|
-
|
50
|
+
mongo (~> 2.1)
|
50
51
|
origin (~> 2.1)
|
51
52
|
tzinfo (>= 0.3.37)
|
52
|
-
|
53
|
-
bson (~> 2.2)
|
54
|
-
connection_pool (~> 2.0)
|
55
|
-
optionable (~> 0.2.0)
|
56
|
-
multi_json (1.10.1)
|
53
|
+
multi_json (1.11.2)
|
57
54
|
multi_xml (0.5.5)
|
58
55
|
multipart-post (2.0.0)
|
59
|
-
nokogiri (1.6.
|
60
|
-
mini_portile (
|
56
|
+
nokogiri (1.6.6.4)
|
57
|
+
mini_portile (~> 0.6.0)
|
61
58
|
oauth2 (1.0.0)
|
62
59
|
faraday (>= 0.8, < 0.10)
|
63
60
|
jwt (~> 1.0)
|
64
61
|
multi_json (~> 1.3)
|
65
62
|
multi_xml (~> 0.5)
|
66
63
|
rack (~> 1.2)
|
67
|
-
optionable (0.2.0)
|
68
64
|
origin (2.1.1)
|
69
|
-
rack (1.
|
70
|
-
rake (10.
|
71
|
-
rdoc (4.
|
72
|
-
|
73
|
-
|
74
|
-
rspec-
|
75
|
-
rspec-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
65
|
+
rack (1.6.4)
|
66
|
+
rake (10.4.2)
|
67
|
+
rdoc (4.2.0)
|
68
|
+
rspec (3.4.0)
|
69
|
+
rspec-core (~> 3.4.0)
|
70
|
+
rspec-expectations (~> 3.4.0)
|
71
|
+
rspec-mocks (~> 3.4.0)
|
72
|
+
rspec-core (3.4.1)
|
73
|
+
rspec-support (~> 3.4.0)
|
74
|
+
rspec-expectations (3.4.0)
|
75
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
76
|
+
rspec-support (~> 3.4.0)
|
77
|
+
rspec-mocks (3.4.0)
|
80
78
|
diff-lcs (>= 1.2.0, < 2.0)
|
81
|
-
rspec-support (~> 3.
|
82
|
-
rspec-
|
83
|
-
|
84
|
-
|
85
|
-
thread_safe (0.3.4)
|
86
|
-
tzinfo (1.2.1)
|
79
|
+
rspec-support (~> 3.4.0)
|
80
|
+
rspec-support (3.4.1)
|
81
|
+
thread_safe (0.3.5)
|
82
|
+
tzinfo (1.2.2)
|
87
83
|
thread_safe (~> 0.1)
|
88
84
|
|
89
85
|
PLATFORMS
|
@@ -92,6 +88,9 @@ PLATFORMS
|
|
92
88
|
DEPENDENCIES
|
93
89
|
bundler
|
94
90
|
jeweler
|
95
|
-
mongoid (
|
91
|
+
mongoid (>= 4.0.0)
|
96
92
|
rdoc
|
97
93
|
rspec
|
94
|
+
|
95
|
+
BUNDLED WITH
|
96
|
+
1.10.6
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
5.0.0
|
data/lib/saasable/errors.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module Saasable::Errors
|
2
|
-
class MultipleSaasDocuments < StandardError; end
|
3
|
-
class NoSaasDocuments < StandardError; end
|
4
|
-
|
2
|
+
class MultipleSaasDocuments < StandardError; end
|
3
|
+
class NoSaasDocuments < StandardError; end
|
4
|
+
|
5
5
|
class MultipleSaasFound < StandardError; end
|
6
6
|
class SaasNotFound < StandardError; end
|
7
|
-
end
|
7
|
+
end
|
data/lib/saasable/middleware.rb
CHANGED
@@ -1,20 +1,15 @@
|
|
1
1
|
class Saasable::Middleware
|
2
2
|
def initialize app
|
3
3
|
@app = app
|
4
|
-
|
5
|
-
# Loads all models so we know how to apply the scopes on Rails
|
6
|
-
Rails::Mongoid.load_models(Rails.application) if defined?(Rails::Mongoid)
|
7
4
|
end
|
8
5
|
|
9
6
|
def call env
|
10
7
|
return @app.call(env) if env['PATH_INFO'].start_with?('/assets')
|
11
8
|
|
12
|
-
|
13
|
-
|
9
|
+
saas = saas_for_host(env['SERVER_NAME'])
|
10
|
+
saas.activate! if saas
|
14
11
|
|
15
|
-
@app.call(env).tap
|
16
|
-
env[:saasable][:current_saas].deactivate! if env[:saasable][:current_saas]
|
17
|
-
end
|
12
|
+
@app.call(env).tap { saas.deactivate! if saas }
|
18
13
|
end
|
19
14
|
|
20
15
|
private
|
@@ -12,7 +12,7 @@ module Saasable::Mongoid::SaasDocument
|
|
12
12
|
klass.send(:include, InstanceMethods)
|
13
13
|
klass.class_eval do
|
14
14
|
# Fields
|
15
|
-
field :hosts, :
|
15
|
+
field :hosts, type: Array, default: []
|
16
16
|
|
17
17
|
# Validations
|
18
18
|
validates_uniqueness_of :hosts
|
@@ -21,7 +21,6 @@ module Saasable::Mongoid::SaasDocument
|
|
21
21
|
index({hosts: 1})
|
22
22
|
end
|
23
23
|
|
24
|
-
klass.instance_variable_set("@_active_saas", nil)
|
25
24
|
klass.instance_variable_set("@_after_activate_chain", [])
|
26
25
|
klass.instance_variable_set("@_after_deactivate_chain", [])
|
27
26
|
end
|
@@ -30,17 +29,13 @@ module Saasable::Mongoid::SaasDocument
|
|
30
29
|
@saas_document
|
31
30
|
end
|
32
31
|
|
32
|
+
def self.active_saas
|
33
|
+
@saas_document.active_saas
|
34
|
+
end
|
35
|
+
|
33
36
|
module InstanceMethods
|
34
37
|
def activate!
|
35
|
-
|
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
|
41
|
-
end
|
42
|
-
|
43
|
-
self.class.instance_variable_set("@_active_saas", self)
|
38
|
+
Thread.current[:saasable_active_saas] = self
|
44
39
|
self.class.instance_variable_get("@_after_activate_chain").each { |method_name| send(method_name) }
|
45
40
|
end
|
46
41
|
|
@@ -51,28 +46,16 @@ module Saasable::Mongoid::SaasDocument
|
|
51
46
|
|
52
47
|
module ClassMethods
|
53
48
|
def deactivate_all!
|
54
|
-
|
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
|
-
klass.fields["saas_id"].default_val = nil
|
59
|
-
klass.fields["saas_id"].options.delete(:default)
|
60
|
-
end
|
61
|
-
|
62
|
-
last_active_saas, @_active_saas = active_saas, nil
|
49
|
+
last_active_saas, Thread.current[:saasable_active_saas] = active_saas, nil
|
63
50
|
@_after_deactivate_chain.each { |method_name| last_active_saas.send(method_name) }
|
64
51
|
end
|
65
52
|
|
66
53
|
def find_by_host! a_host
|
67
54
|
if Saasable::Mongoid::SaasDocument.saas_document.nil?
|
68
|
-
|
69
|
-
raise Saasable::Errors::NoSaasDocuments, "you need to set one Saasable::SaasDocument"
|
70
|
-
else
|
71
|
-
return nil
|
72
|
-
end
|
55
|
+
raise Saasable::Errors::NoSaasDocuments, "you need to set one Saasable::SaasDocument"
|
73
56
|
end
|
74
57
|
|
75
|
-
possible_saas = Saasable::Mongoid::SaasDocument.saas_document.where(:
|
58
|
+
possible_saas = Saasable::Mongoid::SaasDocument.saas_document.where(hosts: a_host.gsub(/^www\./, '')).to_a
|
76
59
|
if possible_saas.empty?
|
77
60
|
raise Saasable::Errors::SaasNotFound, "no #{Saasable::Mongoid::SaasDocument.saas_document.name} found for the host: \"#{a_host}\""
|
78
61
|
elsif possible_saas.count > 1
|
@@ -83,7 +66,7 @@ module Saasable::Mongoid::SaasDocument
|
|
83
66
|
end
|
84
67
|
|
85
68
|
def active_saas
|
86
|
-
|
69
|
+
Thread.current[:saasable_active_saas]
|
87
70
|
end
|
88
71
|
|
89
72
|
def after_activate *method_names
|
@@ -1,13 +1,12 @@
|
|
1
1
|
module Saasable::Mongoid::ScopedDocument
|
2
|
-
@scoped_documents = []
|
3
|
-
|
4
2
|
def self.included klass
|
5
|
-
@scoped_documents << klass unless @scoped_documents.include? klass
|
6
|
-
|
7
3
|
klass.extend ClassMethods
|
8
4
|
klass.class_eval do
|
9
5
|
# Fields
|
10
|
-
field :saas_id, :
|
6
|
+
field :saas_id, type: BSON::ObjectId, default: ->{ Saasable::Mongoid::SaasDocument.active_saas }
|
7
|
+
|
8
|
+
# Default scope
|
9
|
+
default_scope ->{ Saasable::Mongoid::SaasDocument.active_saas ? where(saas_id: Saasable::Mongoid::SaasDocument.active_saas) : all }
|
11
10
|
|
12
11
|
# Indexes
|
13
12
|
index({saas_id: 1})
|
@@ -19,10 +18,6 @@ module Saasable::Mongoid::ScopedDocument
|
|
19
18
|
end
|
20
19
|
end
|
21
20
|
|
22
|
-
def self.scoped_documents
|
23
|
-
@scoped_documents
|
24
|
-
end
|
25
|
-
|
26
21
|
def saas= a_saas
|
27
22
|
self.saas_id = a_saas._id
|
28
23
|
end
|
@@ -40,7 +35,7 @@ module Saasable::Mongoid::ScopedDocument
|
|
40
35
|
validates_with(Mongoid::Validatable::UniquenessValidator, attributes)
|
41
36
|
end
|
42
37
|
|
43
|
-
def index_with_saasable(spec, options =
|
38
|
+
def index_with_saasable(spec, options = {})
|
44
39
|
index_without_saasable(spec, options.merge({unique: false}))
|
45
40
|
index_without_saasable({saas_id: 1}.merge(spec), options) unless spec.include?(:saas_id)
|
46
41
|
end
|
data/lib/saasable/mongoid.rb
CHANGED
data/lib/saasable/railtie.rb
CHANGED
@@ -5,7 +5,7 @@ module Saasable::Railties
|
|
5
5
|
klass.send(:include, InstanceMethods)
|
6
6
|
klass.class_eval do
|
7
7
|
helper_method :current_saas
|
8
|
-
|
8
|
+
|
9
9
|
before_filter :_redirect_if_saas_not_found unless Rails.env.development?
|
10
10
|
saas_not_found_redirect_to "/404.html"
|
11
11
|
|
@@ -36,7 +36,7 @@ module Saasable::Railties
|
|
36
36
|
|
37
37
|
module InstanceMethods
|
38
38
|
def current_saas
|
39
|
-
|
39
|
+
Saasable::Mongoid::SaasDocument.active_saas
|
40
40
|
end
|
41
41
|
end
|
42
42
|
end
|
data/lib/saasable/railties.rb
CHANGED
data/lib/saasable.rb
CHANGED
data/saasable.gemspec
CHANGED
@@ -2,16 +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
|
5
|
+
# stub: saasable 5.0.0 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = "saasable"
|
9
|
-
s.version = "
|
9
|
+
s.version = "5.0.0"
|
10
10
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
12
12
|
s.require_paths = ["lib"]
|
13
13
|
s.authors = ["Educa2", "Rafael Gaspar"]
|
14
|
-
s.date = "
|
14
|
+
s.date = "2015-11-24"
|
15
15
|
s.description = "A gem for making a Multi-Tenant SaaS using Mongoid"
|
16
16
|
s.email = "suporte@educa2.com.br"
|
17
17
|
s.extra_rdoc_files = [
|
@@ -44,27 +44,27 @@ Gem::Specification.new do |s|
|
|
44
44
|
]
|
45
45
|
s.homepage = "http://github.com/educa2/saasable"
|
46
46
|
s.licenses = ["MIT"]
|
47
|
-
s.rubygems_version = "2.
|
47
|
+
s.rubygems_version = "2.4.5.1"
|
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"])
|
data/spec/spec_helper.rb
CHANGED
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:
|
4
|
+
version: 5.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Educa2
|
@@ -9,20 +9,20 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2015-11-24 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: mongoid
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
requirements:
|
18
|
-
- - "
|
18
|
+
- - ">="
|
19
19
|
- !ruby/object:Gem::Version
|
20
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
27
|
version: 4.0.0
|
28
28
|
- !ruby/object:Gem::Dependency
|
@@ -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.4.5.1
|
135
135
|
signing_key:
|
136
136
|
specification_version: 4
|
137
137
|
summary: A gem for making a Multi-Tenant SaaS using Mongoid
|