saasable 0.1.6 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -1,5 +1,7 @@
1
1
  source "http://rubygems.org"
2
2
 
3
+ gem "mongoid"
4
+
3
5
  # Add dependencies to develop your gem here.
4
6
  # Include everything needed to run rake, tests, features, etc.
5
7
  group :development do
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
- rake (0.9.2)
11
- rspec (2.6.0)
12
- rspec-core (~> 2.6.0)
13
- rspec-expectations (~> 2.6.0)
14
- rspec-mocks (~> 2.6.0)
15
- rspec-core (2.6.4)
16
- rspec-expectations (2.6.0)
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.6.0)
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
@@ -1,6 +1,6 @@
1
1
  = saasable
2
2
 
3
- A gem for making a Multi-Tenant SaaS using MongoId
3
+ A gem for making a Multi-Tenant SaaS using Mongoid
4
4
 
5
5
  == How to use it
6
6
 
data/Rakefile CHANGED
@@ -33,7 +33,7 @@ end
33
33
 
34
34
  task :default => :spec
35
35
 
36
- require 'rake/rdoctask'
36
+ require 'rdoc/task'
37
37
  Rake::RDocTask.new do |rdoc|
38
38
  version = File.exist?('VERSION') ? File.read('VERSION') : ""
39
39
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.6
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
@@ -1,4 +1,4 @@
1
- module Saasable::ScopedDocument
1
+ module Saasable::Mongoid::ScopedDocument
2
2
  @scoped_documents = []
3
3
 
4
4
  def self.included klass
@@ -0,0 +1,5 @@
1
+ module Saasable::Mongoid
2
+ # Documents
3
+ autoload :SaasDocument, "saasable/mongoid/saas_document"
4
+ autoload :ScopedDocument, "saasable/mongoid/scoped_document"
5
+ end
@@ -0,0 +1,9 @@
1
+ require "saasable/railties"
2
+
3
+ class Saasable::Railtie < Rails::Railtie
4
+ config.app_middleware.use Saasable::Middleware
5
+
6
+ initializer "include helpers" do
7
+ ActionController::Base.send :include, Saasable::Railties::Helpers
8
+ end
9
+ 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
@@ -0,0 +1,4 @@
1
+ module Saasable::Railties
2
+ # Railties
3
+ autoload :Helpers, "saasable/railties/helpers"
4
+ end
data/lib/saasable.rb CHANGED
@@ -2,10 +2,12 @@ module Saasable
2
2
  # Errors
3
3
  autoload :Errors, "saasable/errors"
4
4
 
5
- # Documents
6
- autoload :SaasDocument, "saasable/saas_document"
7
- autoload :ScopedDocument, "saasable/scoped_document"
5
+ # Middleware
6
+ autoload :Middleware, "saasable/middleware"
8
7
 
9
- # Controllers
10
- autoload :ScopedController, "saasable/scoped_controller"
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 = %q{saasable}
8
- s.version = "0.1.6"
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 = [%q{Educa2}, %q{Rafael Gaspar}]
12
- s.date = %q{2011-10-03}
13
- s.description = %q{A gem for making a Multi-Tenant SaaS using Mongoid}
14
- s.email = %q{suporte@educa2.com.br}
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/saas_document.rb",
31
- "lib/saasable/scoped_controller.rb",
32
- "lib/saasable/scoped_document.rb",
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 = %q{http://github.com/educa2/saasable}
38
- s.licenses = [%q{MIT}]
39
- s.require_paths = [%q{lib}]
40
- s.rubygems_version = %q{1.8.5}
41
- s.summary = %q{A gem for making a Multi-Tenant SaaS using Mongoid}
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
- hash: 23
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
- date: 2011-10-03 00:00:00 Z
20
- dependencies:
21
- - !ruby/object:Gem::Dependency
22
- name: rspec
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
- requirement: &id001 !ruby/object:Gem::Requirement
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
- hash: 3
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
- requirement: &id002 !ruby/object:Gem::Requirement
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
- hash: 3
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
- requirement: &id003 !ruby/object:Gem::Requirement
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
- hash: 3
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/saas_document.rb
84
- - lib/saasable/scoped_controller.rb
85
- - lib/saasable/scoped_document.rb
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
- hash: 3
103
- segments:
96
+ requirements:
97
+ - - ! '>='
98
+ - !ruby/object:Gem::Version
99
+ version: '0'
100
+ segments:
104
101
  - 0
105
- version: "0"
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
- hash: 3
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.5
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