saasable 0.2.2 → 0.3.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 CHANGED
@@ -1,6 +1,6 @@
1
1
  source "http://rubygems.org"
2
2
 
3
- gem "mongoid"
3
+ gem "mongoid", "< 3.0.0"
4
4
 
5
5
  # Add dependencies to develop your gem here.
6
6
  # Include everything needed to run rake, tests, features, etc.
data/Gemfile.lock CHANGED
@@ -1,41 +1,42 @@
1
1
  GEM
2
2
  remote: http://rubygems.org/
3
3
  specs:
4
- activemodel (3.1.1)
5
- activesupport (= 3.1.1)
4
+ activemodel (3.2.9)
5
+ activesupport (= 3.2.9)
6
6
  builder (~> 3.0.0)
7
+ activesupport (3.2.9)
7
8
  i18n (~> 0.6)
8
- activesupport (3.1.1)
9
9
  multi_json (~> 1.0)
10
- bson (1.4.0)
11
- builder (3.0.0)
10
+ bson (1.7.0)
11
+ builder (3.0.4)
12
12
  diff-lcs (1.1.3)
13
13
  git (1.2.5)
14
- i18n (0.6.0)
15
- jeweler (1.6.4)
14
+ i18n (0.6.1)
15
+ jeweler (1.8.4)
16
16
  bundler (~> 1.0)
17
17
  git (>= 1.2.5)
18
18
  rake
19
- json (1.6.5)
20
- mongo (1.4.0)
21
- bson (= 1.4.0)
22
- mongoid (2.3.3)
19
+ rdoc
20
+ json (1.7.5)
21
+ mongo (1.7.0)
22
+ bson (~> 1.7.0)
23
+ mongoid (2.5.1)
23
24
  activemodel (~> 3.1)
24
- mongo (~> 1.3)
25
+ mongo (~> 1.7)
25
26
  tzinfo (~> 0.3.22)
26
- multi_json (1.0.3)
27
- rake (0.9.2.2)
27
+ multi_json (1.3.7)
28
+ rake (10.0.0)
28
29
  rdoc (3.12)
29
30
  json (~> 1.4)
30
- rspec (2.7.0)
31
- rspec-core (~> 2.7.0)
32
- rspec-expectations (~> 2.7.0)
33
- rspec-mocks (~> 2.7.0)
34
- rspec-core (2.7.1)
35
- rspec-expectations (2.7.0)
36
- diff-lcs (~> 1.1.2)
37
- rspec-mocks (2.7.0)
38
- tzinfo (0.3.31)
31
+ rspec (2.11.0)
32
+ rspec-core (~> 2.11.0)
33
+ rspec-expectations (~> 2.11.0)
34
+ rspec-mocks (~> 2.11.0)
35
+ rspec-core (2.11.1)
36
+ rspec-expectations (2.11.3)
37
+ diff-lcs (~> 1.1.3)
38
+ rspec-mocks (2.11.3)
39
+ tzinfo (0.3.35)
39
40
 
40
41
  PLATFORMS
41
42
  ruby
@@ -43,6 +44,6 @@ PLATFORMS
43
44
  DEPENDENCIES
44
45
  bundler
45
46
  jeweler
46
- mongoid
47
+ mongoid (< 3.0.0)
47
48
  rdoc
48
49
  rspec
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.2
1
+ 0.3.0
@@ -8,13 +8,13 @@ class Saasable::Middleware
8
8
  Rails::Mongoid.load_models(Rails.application) if defined?(Rails::Mongoid)
9
9
 
10
10
  env[:saasable] = {:current_saas => saas_for_host(env["SERVER_NAME"])}
11
- env[:saasable][:current_saas].activate!
11
+ env[:saasable][:current_saas].activate! if env[:saasable][:current_saas]
12
12
 
13
13
  @app.call env
14
14
  end
15
15
 
16
16
  private
17
17
  def saas_for_host hostname
18
- Saasable::Mongoid::SaasDocument.saas_document.find_by_host!(hostname)
18
+ Saasable::Mongoid::SaasDocument.saas_document.find_by_host!(hostname) rescue nil
19
19
  end
20
20
  end
@@ -17,6 +17,9 @@ module Saasable::Mongoid::SaasDocument
17
17
  # Validations
18
18
  validates_uniqueness_of :hosts
19
19
  end
20
+
21
+ klass.instance_variable_set("@_after_activate_chain", [])
22
+ klass.instance_variable_set("@_after_deactivate_chain", [])
20
23
  end
21
24
 
22
25
  def self.saas_document
@@ -33,10 +36,27 @@ module Saasable::Mongoid::SaasDocument
33
36
  klass.default_scoping[:where][:saas_id] = self._id
34
37
  klass.class_eval "field :saas_id, :type => BSON::ObjectId, :default => BSON::ObjectId(\"#{self._id}\")"
35
38
  end
39
+
40
+ self.class.instance_variable_get("@_after_activate_chain").each { |method_name| send(method_name) }
41
+ end
42
+
43
+ def deactivate!
44
+ self.class.deactivate_all!
36
45
  end
37
46
  end
38
47
 
39
48
  module ClassMethods
49
+ def deactivate_all!
50
+ Saasable::Mongoid::ScopedDocument.scoped_documents.each do |klass|
51
+ klass.default_scoping[:where].delete(:saas_id) if klass.default_scoping && klass.default_scoping[:where]
52
+
53
+ klass.fields["saas_id"].default_val = nil
54
+ klass.fields["saas_id"].options.delete(:default)
55
+ end
56
+
57
+ @_after_deactivate_chain.each { |method_name| send(method_name) }
58
+ end
59
+
40
60
  def find_by_host! a_host
41
61
  if Saasable::Mongoid::SaasDocument.saas_document.nil?
42
62
  if Rails.env.production?
@@ -55,5 +75,13 @@ module Saasable::Mongoid::SaasDocument
55
75
  return possible_saas.first
56
76
  end
57
77
  end
78
+
79
+ def after_activate method_name
80
+ @_after_activate_chain << method_name
81
+ end
82
+
83
+ def after_deactivate method_name
84
+ @_after_deactivate_chain << method_name
85
+ end
58
86
  end
59
87
  end
@@ -7,6 +7,9 @@ module Saasable::Mongoid::ScopedDocument
7
7
  klass.extend ClassMethods
8
8
  klass.class_eval do
9
9
  field :saas_id, :type => BSON::ObjectId
10
+
11
+ index :saas_id
12
+ index [[:saad_id, 1], [:_id, 1]]
10
13
  end
11
14
  end
12
15
 
@@ -1,9 +1,36 @@
1
1
  module Saasable::Railties
2
2
  module Helpers
3
3
  def self.included klass
4
+ klass.extend ClassMethods
4
5
  klass.send(:include, InstanceMethods)
5
6
  klass.class_eval do
6
7
  helper_method :current_saas
8
+
9
+ before_filter :_redirect_if_saas_not_found
10
+ saas_not_found_redirect_to "/404.html"
11
+
12
+ private
13
+ def _skip_saasable
14
+ current_saas.deactivate! if current_saas
15
+ end
16
+ end
17
+ end
18
+
19
+ module ClassMethods
20
+ def saas_not_found_redirect_to path_or_url
21
+ self.class_eval <<-METHOD, __FILE__, __LINE__ + 1
22
+ private
23
+ def _redirect_if_saas_not_found
24
+ unless current_saas
25
+ redirect_to "#{path_or_url}"
26
+ end
27
+ end
28
+ METHOD
29
+ end
30
+
31
+ def skip_saasable options
32
+ skip_before_filter :_redirect_if_saas_not_found, options
33
+ before_filter :_skip_saasable, options
7
34
  end
8
35
  end
9
36
 
data/saasable.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "saasable"
8
- s.version = "0.2.2"
8
+ s.version = "0.3.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Educa2", "Rafael Gaspar"]
12
- s.date = "2012-04-24"
12
+ s.date = "2012-11-12"
13
13
  s.description = "A gem for making a Multi-Tenant SaaS using Mongoid"
14
14
  s.email = "suporte@educa2.com.br"
15
15
  s.extra_rdoc_files = [
@@ -41,27 +41,27 @@ Gem::Specification.new do |s|
41
41
  s.homepage = "http://github.com/educa2/saasable"
42
42
  s.licenses = ["MIT"]
43
43
  s.require_paths = ["lib"]
44
- s.rubygems_version = "1.8.10"
44
+ s.rubygems_version = "1.8.24"
45
45
  s.summary = "A gem for making a Multi-Tenant SaaS using Mongoid"
46
46
 
47
47
  if s.respond_to? :specification_version then
48
48
  s.specification_version = 3
49
49
 
50
50
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
51
- s.add_runtime_dependency(%q<mongoid>, [">= 0"])
51
+ s.add_runtime_dependency(%q<mongoid>, ["< 3.0.0"])
52
52
  s.add_development_dependency(%q<rspec>, [">= 0"])
53
53
  s.add_development_dependency(%q<bundler>, [">= 0"])
54
54
  s.add_development_dependency(%q<jeweler>, [">= 0"])
55
55
  s.add_development_dependency(%q<rdoc>, [">= 0"])
56
56
  else
57
- s.add_dependency(%q<mongoid>, [">= 0"])
57
+ s.add_dependency(%q<mongoid>, ["< 3.0.0"])
58
58
  s.add_dependency(%q<rspec>, [">= 0"])
59
59
  s.add_dependency(%q<bundler>, [">= 0"])
60
60
  s.add_dependency(%q<jeweler>, [">= 0"])
61
61
  s.add_dependency(%q<rdoc>, [">= 0"])
62
62
  end
63
63
  else
64
- s.add_dependency(%q<mongoid>, [">= 0"])
64
+ s.add_dependency(%q<mongoid>, ["< 3.0.0"])
65
65
  s.add_dependency(%q<rspec>, [">= 0"])
66
66
  s.add_dependency(%q<bundler>, [">= 0"])
67
67
  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.2.2
4
+ version: 0.3.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,22 +10,27 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-04-24 00:00:00.000000000 Z
13
+ date: 2012-11-12 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: mongoid
17
- requirement: &70206917131020 !ruby/object:Gem::Requirement
17
+ requirement: !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
- - - ! '>='
20
+ - - <
21
21
  - !ruby/object:Gem::Version
22
- version: '0'
22
+ version: 3.0.0
23
23
  type: :runtime
24
24
  prerelease: false
25
- version_requirements: *70206917131020
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - <
29
+ - !ruby/object:Gem::Version
30
+ version: 3.0.0
26
31
  - !ruby/object:Gem::Dependency
27
32
  name: rspec
28
- requirement: &70206917130500 !ruby/object:Gem::Requirement
33
+ requirement: !ruby/object:Gem::Requirement
29
34
  none: false
30
35
  requirements:
31
36
  - - ! '>='
@@ -33,10 +38,15 @@ dependencies:
33
38
  version: '0'
34
39
  type: :development
35
40
  prerelease: false
36
- version_requirements: *70206917130500
41
+ version_requirements: !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ! '>='
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
37
47
  - !ruby/object:Gem::Dependency
38
48
  name: bundler
39
- requirement: &70206917129860 !ruby/object:Gem::Requirement
49
+ requirement: !ruby/object:Gem::Requirement
40
50
  none: false
41
51
  requirements:
42
52
  - - ! '>='
@@ -44,10 +54,15 @@ dependencies:
44
54
  version: '0'
45
55
  type: :development
46
56
  prerelease: false
47
- version_requirements: *70206917129860
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ! '>='
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
48
63
  - !ruby/object:Gem::Dependency
49
64
  name: jeweler
50
- requirement: &70206917129120 !ruby/object:Gem::Requirement
65
+ requirement: !ruby/object:Gem::Requirement
51
66
  none: false
52
67
  requirements:
53
68
  - - ! '>='
@@ -55,10 +70,15 @@ dependencies:
55
70
  version: '0'
56
71
  type: :development
57
72
  prerelease: false
58
- version_requirements: *70206917129120
73
+ version_requirements: !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ! '>='
77
+ - !ruby/object:Gem::Version
78
+ version: '0'
59
79
  - !ruby/object:Gem::Dependency
60
80
  name: rdoc
61
- requirement: &70206917162640 !ruby/object:Gem::Requirement
81
+ requirement: !ruby/object:Gem::Requirement
62
82
  none: false
63
83
  requirements:
64
84
  - - ! '>='
@@ -66,7 +86,12 @@ dependencies:
66
86
  version: '0'
67
87
  type: :development
68
88
  prerelease: false
69
- version_requirements: *70206917162640
89
+ version_requirements: !ruby/object:Gem::Requirement
90
+ none: false
91
+ requirements:
92
+ - - ! '>='
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
70
95
  description: A gem for making a Multi-Tenant SaaS using Mongoid
71
96
  email: suporte@educa2.com.br
72
97
  executables: []
@@ -110,7 +135,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
110
135
  version: '0'
111
136
  segments:
112
137
  - 0
113
- hash: 685054745294099642
138
+ hash: 758273759438966357
114
139
  required_rubygems_version: !ruby/object:Gem::Requirement
115
140
  none: false
116
141
  requirements:
@@ -119,7 +144,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
119
144
  version: '0'
120
145
  requirements: []
121
146
  rubyforge_project:
122
- rubygems_version: 1.8.10
147
+ rubygems_version: 1.8.24
123
148
  signing_key:
124
149
  specification_version: 3
125
150
  summary: A gem for making a Multi-Tenant SaaS using Mongoid