saasable 0.2.2 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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