saasable 0.1.6 → 0.2.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,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