saasable 0.3.5 → 4.0.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 984b4b0314088a951aa9f67135535f91b717a4ec
4
- data.tar.gz: a744a30e81e45da7844b5fea24970c75a842f538
3
+ metadata.gz: 96efcc9b26a6dfa1ac4461fc8bbefddcf8c9794d
4
+ data.tar.gz: cbea1ffd6c0b5f188d6eb948410dd639584f3da3
5
5
  SHA512:
6
- metadata.gz: 170690059cb62f526e384137e1fca12643a59bec6d83757cbb3327137cc8c87768a742e4f3f1acd7af6c762af49e4b4cf44ba99690699b70109b9cc981505879
7
- data.tar.gz: 893f923f73e4f7867b8e89b6c8f3236a0d6982a7d9300a986a2e813c163cdc7bdb3296cca565028f2db07cdfbe73536d20c9cc029c10a9d54a0539ba0a67bdd0
6
+ metadata.gz: 9aec30de71488cfeafd46ef598b094e1b10103e339da448955f9dbc7293e962b2fe402f76124f2f8dbbeb70ef1038162f4a823fecd71bec6092c7cd88153aed1
7
+ data.tar.gz: f032f197e8adb948c6048a1fc50127ae7d8f33285a9436fda2865da14095b6760c0a592fe1d01e8c2892edff6c8729fbd5c1089d8166a3720e74b7790b3206eb
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- ruby-2.0.0
1
+ ruby-2.1
data/Gemfile CHANGED
@@ -1,6 +1,6 @@
1
1
  source "http://rubygems.org"
2
2
 
3
- gem "mongoid", "~> 2.5.0"
3
+ gem "mongoid", "~> 4.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,72 +1,90 @@
1
1
  GEM
2
2
  remote: http://rubygems.org/
3
3
  specs:
4
- activemodel (3.2.15)
5
- activesupport (= 3.2.15)
6
- builder (~> 3.0.0)
7
- activesupport (3.2.15)
8
- i18n (~> 0.6, >= 0.6.4)
9
- multi_json (~> 1.0)
10
- addressable (2.3.5)
11
- bson (1.9.2)
12
- builder (3.0.4)
4
+ activemodel (4.1.4)
5
+ activesupport (= 4.1.4)
6
+ builder (~> 3.1)
7
+ activesupport (4.1.4)
8
+ i18n (~> 0.6, >= 0.6.9)
9
+ json (~> 1.7, >= 1.7.7)
10
+ minitest (~> 5.1)
11
+ thread_safe (~> 0.1)
12
+ tzinfo (~> 1.1)
13
+ addressable (2.3.6)
14
+ bson (2.3.0)
15
+ builder (3.2.2)
16
+ connection_pool (2.0.0)
17
+ descendants_tracker (0.0.4)
18
+ thread_safe (~> 0.3, >= 0.3.1)
13
19
  diff-lcs (1.2.5)
14
- faraday (0.8.8)
15
- multipart-post (~> 1.2.0)
16
- git (1.2.6)
17
- github_api (0.10.1)
18
- addressable
19
- faraday (~> 0.8.1)
20
+ faraday (0.9.0)
21
+ multipart-post (>= 1.2, < 3)
22
+ git (1.2.7)
23
+ github_api (0.11.3)
24
+ addressable (~> 2.3)
25
+ descendants_tracker (~> 0.0.1)
26
+ faraday (~> 0.8, < 0.10)
20
27
  hashie (>= 1.2)
21
- multi_json (~> 1.4)
22
- nokogiri (~> 1.5.2)
28
+ multi_json (>= 1.7.5, < 2.0)
29
+ nokogiri (~> 1.6.0)
23
30
  oauth2
24
- hashie (2.0.5)
25
- highline (1.6.20)
26
- httpauth (0.2.0)
27
- i18n (0.6.5)
28
- jeweler (1.8.8)
31
+ hashie (3.2.0)
32
+ highline (1.6.21)
33
+ i18n (0.6.11)
34
+ jeweler (2.0.1)
29
35
  builder
30
- bundler (~> 1.0)
36
+ bundler (>= 1.0)
31
37
  git (>= 1.2.5)
32
- github_api (= 0.10.1)
38
+ github_api
33
39
  highline (>= 1.6.15)
34
- nokogiri (= 1.5.10)
40
+ nokogiri (>= 1.5.10)
35
41
  rake
36
42
  rdoc
37
43
  json (1.8.1)
38
- jwt (0.1.8)
39
- multi_json (>= 1.5)
40
- mongo (1.9.2)
41
- bson (~> 1.9.2)
42
- mongoid (2.5.2)
43
- activemodel (~> 3.1)
44
- mongo (~> 1.7)
45
- tzinfo (~> 0.3.22)
46
- multi_json (1.8.2)
44
+ jwt (1.0.0)
45
+ mini_portile (0.6.0)
46
+ minitest (5.4.0)
47
+ mongoid (4.0.0)
48
+ activemodel (~> 4.0)
49
+ moped (~> 2.0.0)
50
+ origin (~> 2.1)
51
+ tzinfo (>= 0.3.37)
52
+ moped (2.0.0)
53
+ bson (~> 2.2)
54
+ connection_pool (~> 2.0)
55
+ optionable (~> 0.2.0)
56
+ multi_json (1.10.1)
47
57
  multi_xml (0.5.5)
48
- multipart-post (1.2.0)
49
- nokogiri (1.5.10)
50
- oauth2 (0.9.2)
51
- faraday (~> 0.8)
52
- httpauth (~> 0.2)
53
- jwt (~> 0.1.4)
54
- multi_json (~> 1.0)
58
+ multipart-post (2.0.0)
59
+ nokogiri (1.6.2.1)
60
+ mini_portile (= 0.6.0)
61
+ oauth2 (1.0.0)
62
+ faraday (>= 0.8, < 0.10)
63
+ jwt (~> 1.0)
64
+ multi_json (~> 1.3)
55
65
  multi_xml (~> 0.5)
56
66
  rack (~> 1.2)
67
+ optionable (0.2.0)
68
+ origin (2.1.1)
57
69
  rack (1.5.2)
58
- rake (10.1.0)
59
- rdoc (4.0.1)
70
+ rake (10.3.2)
71
+ rdoc (4.1.1)
60
72
  json (~> 1.4)
61
- rspec (2.14.1)
62
- rspec-core (~> 2.14.0)
63
- rspec-expectations (~> 2.14.0)
64
- rspec-mocks (~> 2.14.0)
65
- rspec-core (2.14.7)
66
- rspec-expectations (2.14.4)
67
- diff-lcs (>= 1.1.3, < 2.0)
68
- rspec-mocks (2.14.4)
69
- tzinfo (0.3.38)
73
+ rspec (3.0.0)
74
+ rspec-core (~> 3.0.0)
75
+ rspec-expectations (~> 3.0.0)
76
+ rspec-mocks (~> 3.0.0)
77
+ rspec-core (3.0.2)
78
+ rspec-support (~> 3.0.0)
79
+ rspec-expectations (3.0.2)
80
+ diff-lcs (>= 1.2.0, < 2.0)
81
+ rspec-support (~> 3.0.0)
82
+ rspec-mocks (3.0.2)
83
+ rspec-support (~> 3.0.0)
84
+ rspec-support (3.0.2)
85
+ thread_safe (0.3.4)
86
+ tzinfo (1.2.1)
87
+ thread_safe (~> 0.1)
70
88
 
71
89
  PLATFORMS
72
90
  ruby
@@ -74,6 +92,6 @@ PLATFORMS
74
92
  DEPENDENCIES
75
93
  bundler
76
94
  jeweler
77
- mongoid (~> 2.5.0)
95
+ mongoid (~> 4.0.0)
78
96
  rdoc
79
97
  rspec
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.5
1
+ 4.0.0
@@ -7,7 +7,9 @@ class Saasable::Middleware
7
7
  end
8
8
 
9
9
  def call env
10
- env[:saasable] = {:current_saas => saas_for_host(env["SERVER_NAME"])}
10
+ return @app.call(env) if env['PATH_INFO'].start_with?('/assets')
11
+
12
+ env[:saasable] = {:current_saas => saas_for_host(env['SERVER_NAME'])}
11
13
  env[:saasable][:current_saas].activate! if env[:saasable][:current_saas]
12
14
 
13
15
  @app.call(env).tap do
@@ -16,9 +18,9 @@ class Saasable::Middleware
16
18
  end
17
19
 
18
20
  private
19
- def saas_for_host hostname
20
- Saasable::Mongoid::SaasDocument.saas_document.find_by_host!(hostname)
21
- rescue Saasable::Errors::SaasNotFound
22
- nil # Saas not found is treated by the Rails Helper
23
- end
24
- end
21
+ def saas_for_host hostname
22
+ Saasable::Mongoid::SaasDocument.saas_document.find_by_host!(hostname)
23
+ rescue Saasable::Errors::SaasNotFound
24
+ nil # Saas not found is treated by the Rails Helper
25
+ end
26
+ end
@@ -1,68 +1,68 @@
1
1
  module Saasable::Mongoid::SaasDocument
2
2
  @saas_document = nil
3
-
3
+
4
4
  def self.included klass
5
5
  if @saas_document and @saas_document.name != klass.name
6
6
  raise Saasable::Errors::MultipleSaasDocuments, "you can only have one Saasable::SaasDocument"
7
7
  else
8
8
  @saas_document = klass
9
9
  end
10
-
10
+
11
11
  klass.extend ClassMethods
12
12
  klass.send(:include, InstanceMethods)
13
13
  klass.class_eval do
14
14
  # Fields
15
15
  field :hosts, :type => Array
16
-
16
+
17
17
  # Validations
18
18
  validates_uniqueness_of :hosts
19
-
19
+
20
20
  # Indexes
21
- index :hosts
21
+ index({hosts: 1})
22
22
  end
23
-
23
+
24
24
  klass.instance_variable_set("@_active_saas", nil)
25
25
  klass.instance_variable_set("@_after_activate_chain", [])
26
26
  klass.instance_variable_set("@_after_deactivate_chain", [])
27
27
  end
28
-
28
+
29
29
  def self.saas_document
30
30
  @saas_document
31
31
  end
32
-
32
+
33
33
  module InstanceMethods
34
34
  def activate!
35
35
  Saasable::Mongoid::ScopedDocument.scoped_documents.each do |klass|
36
- # Create a default scope without messing with the ones already in place.
37
- klass.default_scoping ||= {}
38
- klass.default_scoping[:where] ||= {:saas_id => nil}
39
-
40
- klass.default_scoping[:where][:saas_id] = self._id
41
- klass.class_eval "field :saas_id, :type => BSON::ObjectId, :default => BSON::ObjectId(\"#{self._id}\")"
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
42
41
  end
43
-
42
+
44
43
  self.class.instance_variable_set("@_active_saas", self)
45
44
  self.class.instance_variable_get("@_after_activate_chain").each { |method_name| send(method_name) }
46
45
  end
47
-
46
+
48
47
  def deactivate!
49
48
  self.class.deactivate_all!
50
49
  end
51
50
  end
52
-
51
+
53
52
  module ClassMethods
54
53
  def deactivate_all!
55
54
  Saasable::Mongoid::ScopedDocument.scoped_documents.each do |klass|
56
- klass.default_scoping[:where].delete(:saas_id) if klass.default_scoping && klass.default_scoping[:where]
57
-
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
58
  klass.fields["saas_id"].default_val = nil
59
59
  klass.fields["saas_id"].options.delete(:default)
60
60
  end
61
-
61
+
62
62
  last_active_saas, @_active_saas = active_saas, nil
63
63
  @_after_deactivate_chain.each { |method_name| last_active_saas.send(method_name) }
64
- end
65
-
64
+ end
65
+
66
66
  def find_by_host! a_host
67
67
  if Saasable::Mongoid::SaasDocument.saas_document.nil?
68
68
  if Rails.env.production?
@@ -71,8 +71,8 @@ module Saasable::Mongoid::SaasDocument
71
71
  return nil
72
72
  end
73
73
  end
74
-
75
- possible_saas = Saasable::Mongoid::SaasDocument.saas_document.where(:hosts => a_host)
74
+
75
+ possible_saas = Saasable::Mongoid::SaasDocument.saas_document.where(:hosts => a_host).to_a
76
76
  if possible_saas.empty?
77
77
  raise Saasable::Errors::SaasNotFound, "no #{Saasable::Mongoid::SaasDocument.saas_document.name} found for the host: \"#{a_host}\""
78
78
  elsif possible_saas.count > 1
@@ -81,25 +81,25 @@ module Saasable::Mongoid::SaasDocument
81
81
  return possible_saas.first
82
82
  end
83
83
  end
84
-
84
+
85
85
  def active_saas
86
86
  @_active_saas
87
87
  end
88
-
88
+
89
89
  def after_activate *method_names
90
90
  @_after_activate_chain += method_names
91
91
  end
92
-
92
+
93
93
  def after_deactivate *method_names
94
94
  @_after_deactivate_chain += method_names
95
95
  end
96
-
96
+
97
97
  def remove_after_activate *method_names
98
98
  @_after_activate_chain -= method_names
99
99
  end
100
-
100
+
101
101
  def remove_after_deactivate *method_names
102
102
  @_after_deactivate_chain -= method_names
103
103
  end
104
104
  end
105
- end
105
+ end
@@ -8,10 +8,14 @@ module Saasable::Mongoid::ScopedDocument
8
8
  klass.class_eval do
9
9
  # Fields
10
10
  field :saas_id, :type => BSON::ObjectId
11
-
11
+
12
12
  # Indexes
13
- index :saas_id
14
- index [[:saad_id, 1], [:_id, 1]]
13
+ index({saas_id: 1})
14
+ index({saad_id: 1, _id: 1})
15
+
16
+ class << self
17
+ alias_method_chain :index, :saasable
18
+ end
15
19
  end
16
20
  end
17
21
 
@@ -33,7 +37,12 @@ module Saasable::Mongoid::ScopedDocument
33
37
  attributes[:scope] ||= []
34
38
  attributes[:scope] << :saas_id unless attributes[:scope].include?(:saas_id)
35
39
 
36
- validates_with(Mongoid::Validations::UniquenessValidator, attributes)
40
+ validates_with(Mongoid::Validatable::UniquenessValidator, attributes)
41
+ end
42
+
43
+ def index_with_saasable(spec, options = nil)
44
+ index_without_saasable(spec, options.except(:unique)) # Never create this one with unique since it's only unique in the saas scope.
45
+ index_without_saasable({saas_id: 1}.merge(spec), options) unless spec.include?(:saas_id)
37
46
  end
38
47
  end
39
48
  end
@@ -6,16 +6,16 @@ module Saasable::Railties
6
6
  klass.class_eval do
7
7
  helper_method :current_saas
8
8
 
9
- before_filter :_redirect_if_saas_not_found
9
+ before_filter :_redirect_if_saas_not_found unless Rails.env.development?
10
10
  saas_not_found_redirect_to "/404.html"
11
-
11
+
12
12
  private
13
- def _skip_saasable
14
- current_saas.deactivate! if current_saas
15
- end
13
+ def _skip_saasable
14
+ current_saas.deactivate! if current_saas
15
+ end
16
16
  end
17
17
  end
18
-
18
+
19
19
  module ClassMethods
20
20
  def saas_not_found_redirect_to path_or_url
21
21
  self.class_eval <<-METHOD, __FILE__, __LINE__ + 1
@@ -27,17 +27,17 @@ module Saasable::Railties
27
27
  end
28
28
  METHOD
29
29
  end
30
-
30
+
31
31
  def skip_saasable options
32
32
  skip_before_filter :_redirect_if_saas_not_found, options
33
33
  before_filter :_skip_saasable, options
34
34
  end
35
35
  end
36
-
36
+
37
37
  module InstanceMethods
38
38
  def current_saas
39
39
  @current_saas ||= request.env[:saasable][:current_saas]
40
40
  end
41
41
  end
42
42
  end
43
- end
43
+ end
data/saasable.gemspec CHANGED
@@ -2,15 +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 0.3.5 ruby lib
5
+ # stub: saasable 4.0.0 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "saasable"
9
- s.version = "0.3.5"
9
+ s.version = "4.0.0"
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
12
+ s.require_paths = ["lib"]
12
13
  s.authors = ["Educa2", "Rafael Gaspar"]
13
- s.date = "2013-11-22"
14
+ s.date = "2014-07-17"
14
15
  s.description = "A gem for making a Multi-Tenant SaaS using Mongoid"
15
16
  s.email = "suporte@educa2.com.br"
16
17
  s.extra_rdoc_files = [
@@ -43,28 +44,27 @@ Gem::Specification.new do |s|
43
44
  ]
44
45
  s.homepage = "http://github.com/educa2/saasable"
45
46
  s.licenses = ["MIT"]
46
- s.require_paths = ["lib"]
47
- s.rubygems_version = "2.1.11"
47
+ s.rubygems_version = "2.2.2"
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>, ["~> 2.5.0"])
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>, ["~> 2.5.0"])
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>, ["~> 2.5.0"])
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"])
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.3.5
4
+ version: 4.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Educa2
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-11-22 00:00:00.000000000 Z
12
+ date: 2014-07-17 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: mongoid
@@ -17,14 +17,14 @@ dependencies:
17
17
  requirements:
18
18
  - - ~>
19
19
  - !ruby/object:Gem::Version
20
- version: 2.5.0
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
- version: 2.5.0
27
+ version: 4.0.0
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: rspec
30
30
  requirement: !ruby/object:Gem::Requirement
@@ -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.1.11
134
+ rubygems_version: 2.2.2
135
135
  signing_key:
136
136
  specification_version: 4
137
137
  summary: A gem for making a Multi-Tenant SaaS using Mongoid