mongodb_model 0.0.4 → 0.0.5
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/lib/mongo/model.rb +2 -1
- data/lib/mongo/model/callbacks.rb +1 -1
- data/lib/mongo/model/crud.rb +19 -19
- data/lib/mongo/model/file_model.rb +1 -1
- data/lib/mongo/model/misc.rb +15 -4
- data/lib/mongo/model/query.rb +38 -28
- data/lib/mongo/model/query_mixin.rb +45 -0
- data/lib/mongo/model/scope.rb +40 -55
- data/lib/mongo/model/spec.rb +1 -0
- data/lib/mongo/model/validation.rb +14 -2
- data/spec/assignment_spec.rb +5 -2
- data/spec/associations_spec.rb +43 -0
- data/spec/attribute_convertors_spec.rb +1 -1
- data/spec/callbacks_spec.rb +1 -1
- data/spec/db_spec.rb +1 -1
- data/spec/file_model_spec.rb +2 -0
- data/spec/misc_spec.rb +9 -0
- data/spec/query_spec.rb +23 -2
- data/spec/scope_spec.rb +20 -19
- data/spec/validation_spec.rb +14 -1
- metadata +14 -12
data/lib/mongo/model.rb
CHANGED
@@ -18,6 +18,7 @@ module Mongo::Model; end
|
|
18
18
|
validation/uniqueness_validator
|
19
19
|
crud
|
20
20
|
query
|
21
|
+
query_mixin
|
21
22
|
scope
|
22
23
|
attribute_convertors
|
23
24
|
file_model
|
@@ -33,7 +34,7 @@ module Mongo
|
|
33
34
|
Callbacks,
|
34
35
|
Validation,
|
35
36
|
Crud,
|
36
|
-
|
37
|
+
QueryMixin,
|
37
38
|
Scope,
|
38
39
|
AttributeConvertors,
|
39
40
|
Mongo::Model::FileModel,
|
@@ -2,7 +2,7 @@ module Mongo::Model::Callbacks
|
|
2
2
|
inherit RubyExt::Callbacks
|
3
3
|
|
4
4
|
module ClassMethods
|
5
|
-
[:validate, :update, :save, :destroy].each do |method_name|
|
5
|
+
[:validate, :create, :update, :save, :destroy].each do |method_name|
|
6
6
|
define_method "before_#{method_name}" do |*args, &block|
|
7
7
|
opt = args.extract_options!
|
8
8
|
if block
|
data/lib/mongo/model/crud.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module Mongo::Model::Crud
|
2
|
-
def save
|
3
|
-
with_collection
|
4
|
-
collection.save self,
|
2
|
+
def save options = {}
|
3
|
+
with_collection options do |collection, options|
|
4
|
+
collection.save self, options
|
5
5
|
end
|
6
6
|
end
|
7
7
|
|
@@ -9,9 +9,9 @@ module Mongo::Model::Crud
|
|
9
9
|
save(*args) || raise(Mongo::Error, "can't save #{self.inspect}!")
|
10
10
|
end
|
11
11
|
|
12
|
-
def destroy
|
13
|
-
with_collection
|
14
|
-
collection.destroy self,
|
12
|
+
def destroy options = {}
|
13
|
+
with_collection options do |collection, options|
|
14
|
+
collection.destroy self, options
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
@@ -20,38 +20,38 @@ module Mongo::Model::Crud
|
|
20
20
|
end
|
21
21
|
|
22
22
|
module ClassMethods
|
23
|
-
def build attributes = {},
|
24
|
-
self.new.set attributes,
|
23
|
+
def build attributes = {}, options = {}
|
24
|
+
self.new.set attributes, options
|
25
25
|
end
|
26
26
|
|
27
|
-
def create attributes = {},
|
28
|
-
o = build attributes,
|
27
|
+
def create attributes = {}, options = {}
|
28
|
+
o = build attributes, options
|
29
29
|
o.save
|
30
30
|
o
|
31
31
|
end
|
32
32
|
|
33
|
-
def create! attributes = {},
|
33
|
+
def create! attributes = {}, options = {}
|
34
34
|
o = create attributes
|
35
35
|
raise(Mongo::Error, "can't create #{attributes.inspect}!") if o.new_record?
|
36
36
|
o
|
37
37
|
end
|
38
38
|
|
39
|
-
def destroy_all selector = {},
|
39
|
+
def destroy_all selector = {}, options = {}
|
40
40
|
success = true
|
41
|
-
collection =
|
41
|
+
collection = options[:collection] || self.collection
|
42
42
|
each(selector){|o| success = false unless o.destroy}
|
43
43
|
success
|
44
44
|
end
|
45
45
|
|
46
|
-
def destroy_all! selector = {},
|
47
|
-
destroy_all(selector,
|
46
|
+
def destroy_all! selector = {}, options = {}
|
47
|
+
destroy_all(selector, options) || raise(Mongo::Error, "can't destroy #{selector.inspect}!")
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
51
51
|
protected
|
52
|
-
def with_collection
|
53
|
-
|
54
|
-
collection =
|
55
|
-
block.call collection,
|
52
|
+
def with_collection options, &block
|
53
|
+
options = options.clone
|
54
|
+
collection = options.delete(:collection) || self.class.collection
|
55
|
+
block.call collection, options
|
56
56
|
end
|
57
57
|
end
|
data/lib/mongo/model/misc.rb
CHANGED
@@ -9,10 +9,9 @@ module Mongo::Model::Misc
|
|
9
9
|
def _cache
|
10
10
|
@_cache ||= {}
|
11
11
|
end
|
12
|
-
def _clear_cache
|
13
|
-
|
14
|
-
end
|
15
|
-
|
12
|
+
# def _clear_cache
|
13
|
+
# @_cache = {}
|
14
|
+
# end
|
16
15
|
|
17
16
|
def dom_id
|
18
17
|
# new_record? ? "new_#{self.class.name.underscore}" : to_param
|
@@ -25,6 +24,18 @@ module Mongo::Model::Misc
|
|
25
24
|
|
26
25
|
delegate :t, to: I18n
|
27
26
|
|
27
|
+
def reload
|
28
|
+
obj = self.class.by_id!(_id || raise("can't reload new document (#{self})!"))
|
29
|
+
instance_variables.each{|n| remove_instance_variable n}
|
30
|
+
obj.instance_variables.each do |n|
|
31
|
+
instance_variable_set n, obj.instance_variable_get(n)
|
32
|
+
end
|
33
|
+
nil
|
34
|
+
end
|
35
|
+
|
36
|
+
def original
|
37
|
+
@_original ||= _id? ? self.class.by_id(self._id) : nil
|
38
|
+
end
|
28
39
|
|
29
40
|
module ClassMethods
|
30
41
|
delegate :t, to: I18n
|
data/lib/mongo/model/query.rb
CHANGED
@@ -1,36 +1,46 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
include Mongo::DynamicFinders
|
1
|
+
class Mongo::Model::Query < Object
|
2
|
+
attr_reader :model, :selector, :options
|
4
3
|
|
5
|
-
|
6
|
-
|
7
|
-
|
4
|
+
def initialize model, selector = {}, options = {} *args
|
5
|
+
@model, @selector, @options = model, selector, options
|
6
|
+
end
|
8
7
|
|
9
|
-
|
10
|
-
|
11
|
-
|
8
|
+
def class
|
9
|
+
::Mongo::Model::Query
|
10
|
+
end
|
12
11
|
|
13
|
-
|
14
|
-
|
15
|
-
|
12
|
+
def merge query
|
13
|
+
raise "can't merge queries with different models!" unless model == query.model
|
14
|
+
self.class.new model, selector.merge(query.selector), options.merge(query.options)
|
15
|
+
end
|
16
16
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
list = []
|
22
|
-
each(selector, opts){|doc| list << doc}
|
23
|
-
list
|
24
|
-
end
|
25
|
-
end
|
17
|
+
def inspect
|
18
|
+
"#<Mongo::Model::Query: #{model} #{@selector.inspect} #{@options.inspect}>"
|
19
|
+
end
|
20
|
+
alias_method :to_s, :inspect
|
26
21
|
|
27
|
-
|
28
|
-
|
29
|
-
|
22
|
+
def == o
|
23
|
+
self.class == o.class and ([model, selector, options] == [o.model, o.selector, o.options])
|
24
|
+
end
|
30
25
|
|
31
|
-
|
32
|
-
|
33
|
-
end
|
34
|
-
alias :exist? :exists?
|
26
|
+
def build attributes = {}, options = {}
|
27
|
+
model.build selector.merge(attributes), options
|
35
28
|
end
|
29
|
+
|
30
|
+
def create attributes = {}, options = {}
|
31
|
+
model.create selector.merge(attributes), options
|
32
|
+
end
|
33
|
+
|
34
|
+
def create! attributes = {}, options = {}
|
35
|
+
model.create! selector.merge(attributes), options
|
36
|
+
end
|
37
|
+
|
38
|
+
protected
|
39
|
+
def method_missing method, *args, &block
|
40
|
+
model.with_scope selector, options do
|
41
|
+
result = model.send method, *args, &block
|
42
|
+
result = self.merge result if result.is_a? self.class
|
43
|
+
result
|
44
|
+
end
|
45
|
+
end
|
36
46
|
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Mongo::Model::QueryMixin
|
2
|
+
module ClassMethods
|
3
|
+
include Mongo::DynamicFinders
|
4
|
+
|
5
|
+
def count selector = {}, options = {}
|
6
|
+
collection.count selector, options
|
7
|
+
end
|
8
|
+
|
9
|
+
def first selector = {}, options = {}
|
10
|
+
collection.first selector, options
|
11
|
+
end
|
12
|
+
|
13
|
+
def each selector = {}, options = {}, &block
|
14
|
+
collection.each selector, options, &block
|
15
|
+
end
|
16
|
+
|
17
|
+
def all selector = {}, options = {}, &block
|
18
|
+
if block
|
19
|
+
each selector, options, &block
|
20
|
+
else
|
21
|
+
list = []
|
22
|
+
each(selector, options){|doc| list << doc}
|
23
|
+
list
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def first! selector = {}, options = {}
|
28
|
+
first(selector, options) || raise(Mongo::NotFound, "document with selector #{selector} not found!")
|
29
|
+
end
|
30
|
+
|
31
|
+
def exists? selector = {}, options = {}
|
32
|
+
count(selector, options) > 0
|
33
|
+
end
|
34
|
+
alias :exist? :exists?
|
35
|
+
|
36
|
+
def query *args
|
37
|
+
if args.first.is_a? Mongo::Model::Query
|
38
|
+
args.first
|
39
|
+
else
|
40
|
+
selector, options = args.first.is_a?(::Array) ? args.first : args
|
41
|
+
Mongo::Model::Query.new self, (selector || {}), (options || {})
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
data/lib/mongo/model/scope.rb
CHANGED
@@ -1,82 +1,55 @@
|
|
1
1
|
module Mongo::Model::Scope
|
2
|
-
class ScopeProxy < BasicObject
|
3
|
-
def initialize model, scope
|
4
|
-
@model, @scope = model, scope
|
5
|
-
end
|
6
|
-
|
7
|
-
def class
|
8
|
-
::Mongo::Model::Scope::ScopeProxy
|
9
|
-
end
|
10
|
-
|
11
|
-
def reverse_merge! scope
|
12
|
-
@scope = scope.merge @scope
|
13
|
-
end
|
14
|
-
|
15
|
-
def inspect
|
16
|
-
"#<ScopeProxy:{#{scope.inspect}}>"
|
17
|
-
end
|
18
|
-
alias_method :to_s, :inspect
|
19
|
-
|
20
|
-
protected
|
21
|
-
attr_reader :model, :scope
|
22
|
-
|
23
|
-
def method_missing method, *args, &block
|
24
|
-
model.with_scope scope do
|
25
|
-
result = model.send method, *args, &block
|
26
|
-
result.reverse_merge! scope if result.class == ::Mongo::Model::Scope::ScopeProxy
|
27
|
-
result
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
2
|
module ClassMethods
|
33
3
|
def current_scope
|
34
4
|
scope, exclusive = Thread.current[:mongo_model_scope]
|
35
|
-
if exclusive
|
5
|
+
current = if exclusive
|
36
6
|
scope
|
37
7
|
elsif scope
|
38
|
-
default_scope.merge scope
|
8
|
+
default_scope ? default_scope.merge(scope) : scope
|
39
9
|
else
|
40
10
|
default_scope
|
41
11
|
end
|
42
12
|
end
|
43
13
|
|
44
|
-
def with_exclusive_scope
|
45
|
-
with_scope
|
14
|
+
def with_exclusive_scope *args, &block
|
15
|
+
with_scope *(args << true), &block
|
46
16
|
end
|
47
17
|
|
48
|
-
def with_scope
|
49
|
-
|
18
|
+
def with_scope *args, &block
|
19
|
+
if args.last.is_a?(TrueClass) or args.last.is_a?(FalseClass)
|
20
|
+
exclusive = args.pop
|
21
|
+
else
|
22
|
+
exclusive = false
|
23
|
+
end
|
24
|
+
|
25
|
+
scope = query *args
|
26
|
+
previous_scope, previous_exclusive = Thread.current[:mongo_model_scope]
|
50
27
|
raise "exclusive scope already applied!" if previous_exclusive
|
51
28
|
|
52
29
|
begin
|
53
|
-
|
54
|
-
Thread.current[:mongo_model_scope] = [
|
30
|
+
scope = previous_scope.merge scope if !exclusive and previous_scope
|
31
|
+
Thread.current[:mongo_model_scope] = [scope, exclusive]
|
55
32
|
return block.call
|
56
33
|
ensure
|
57
|
-
Thread.current[:mongo_model_scope] = [
|
34
|
+
Thread.current[:mongo_model_scope] = [previous_scope, false]
|
58
35
|
end
|
59
36
|
end
|
60
37
|
|
61
|
-
inheritable_accessor :_default_scope,
|
38
|
+
inheritable_accessor :_default_scope, nil
|
62
39
|
def default_scope *args, &block
|
63
40
|
if block
|
64
|
-
self._default_scope = block
|
41
|
+
self._default_scope = -> {query block.call}
|
65
42
|
elsif !args.empty?
|
66
|
-
|
67
|
-
args.first.must_be.a Hash
|
68
|
-
scope = args.first
|
69
|
-
self._default_scope = -> {args.first}
|
43
|
+
self._default_scope = -> {query *args}
|
70
44
|
else
|
71
|
-
_default_scope.call
|
45
|
+
_default_scope && _default_scope.call
|
72
46
|
end
|
73
47
|
end
|
74
48
|
|
75
|
-
def scope name,
|
49
|
+
def scope name, *args, &block
|
76
50
|
model = self
|
77
51
|
metaclass.define_method name do
|
78
|
-
|
79
|
-
ScopeProxy.new model, scope
|
52
|
+
query (block && instance_eval(&block)) || args
|
80
53
|
end
|
81
54
|
end
|
82
55
|
|
@@ -84,16 +57,28 @@ module Mongo::Model::Scope
|
|
84
57
|
#
|
85
58
|
# finders
|
86
59
|
#
|
87
|
-
def count selector = {},
|
88
|
-
|
60
|
+
def count selector = {}, options = {}
|
61
|
+
if current = current_scope
|
62
|
+
super current.selector.merge(selector), current.options.merge(options)
|
63
|
+
else
|
64
|
+
super selector, options
|
65
|
+
end
|
89
66
|
end
|
90
67
|
|
91
|
-
def first
|
92
|
-
|
68
|
+
def first selector = {}, options = {}
|
69
|
+
if current = current_scope
|
70
|
+
super current.selector.merge(selector), current.options.merge(options)
|
71
|
+
else
|
72
|
+
super selector, options
|
73
|
+
end
|
93
74
|
end
|
94
75
|
|
95
|
-
def each
|
96
|
-
|
76
|
+
def each selector = {}, options = {}, &block
|
77
|
+
if current = current_scope
|
78
|
+
super current.selector.merge(selector), current.options.merge(options), &block
|
79
|
+
else
|
80
|
+
super selector, options, &block
|
81
|
+
end
|
97
82
|
end
|
98
83
|
end
|
99
84
|
end
|
data/lib/mongo/model/spec.rb
CHANGED
@@ -4,7 +4,15 @@ module Mongo::Model::Validation
|
|
4
4
|
end
|
5
5
|
|
6
6
|
def run_validations
|
7
|
-
self.class.validations.each
|
7
|
+
self.class.validations.each do |v|
|
8
|
+
if v.respond_to?(:validate)
|
9
|
+
v.validate self
|
10
|
+
elsif v.is_a? Proc
|
11
|
+
v.call self
|
12
|
+
else
|
13
|
+
send v
|
14
|
+
end
|
15
|
+
end
|
8
16
|
true
|
9
17
|
end
|
10
18
|
|
@@ -17,12 +25,16 @@ module Mongo::Model::Validation
|
|
17
25
|
add_validations(args, Mongo::Model::UniquenessValidator)
|
18
26
|
end
|
19
27
|
|
28
|
+
def validate validation
|
29
|
+
validations << validation
|
30
|
+
end
|
31
|
+
|
20
32
|
protected
|
21
33
|
def add_validations(args, klass)
|
22
34
|
options = args.last.is_a?(Hash) ? args.pop : {}
|
23
35
|
args.each do |attribute|
|
24
36
|
new_validation = klass.new self, attribute, options
|
25
|
-
|
37
|
+
validate new_validation
|
26
38
|
end
|
27
39
|
end
|
28
40
|
end
|
data/spec/assignment_spec.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe 'Model callbacks' do
|
4
|
-
|
4
|
+
with_mongo_model
|
5
5
|
|
6
6
|
after{remove_constants :User, :Writer}
|
7
7
|
|
@@ -26,6 +26,9 @@ describe 'Model callbacks' do
|
|
26
26
|
assign do
|
27
27
|
name String, true
|
28
28
|
has_mail Boolean, true
|
29
|
+
end
|
30
|
+
|
31
|
+
assign do
|
29
32
|
age Integer, true
|
30
33
|
position true
|
31
34
|
banned Boolean
|
@@ -40,7 +43,7 @@ describe 'Model callbacks' do
|
|
40
43
|
u.set! banned: '0'
|
41
44
|
u.banned.should == false
|
42
45
|
end
|
43
|
-
|
46
|
+
|
44
47
|
it "should inherit assignment rules" do
|
45
48
|
class User
|
46
49
|
inherit Mongo::Model
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Associations' do
|
4
|
+
with_mongo_model
|
5
|
+
|
6
|
+
after{remove_constants :Post, :Comment}
|
7
|
+
|
8
|
+
it "basic" do
|
9
|
+
class Post
|
10
|
+
inherit Mongo::Model
|
11
|
+
collection :posts
|
12
|
+
|
13
|
+
attr_accessor :text
|
14
|
+
|
15
|
+
def comments
|
16
|
+
Comment.query({post_id: _id}, {sort: [[:created_at, -1]]})
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
class Comment
|
21
|
+
inherit Mongo::Model
|
22
|
+
collection :comments
|
23
|
+
|
24
|
+
attr_accessor :text, :post_id
|
25
|
+
|
26
|
+
def == o
|
27
|
+
[self.class, text, post_id] == [o.class, o.text, o.post_id]
|
28
|
+
end
|
29
|
+
|
30
|
+
timestamps!
|
31
|
+
end
|
32
|
+
|
33
|
+
post1 = Post.create! text: 'Post 1'
|
34
|
+
comment1 = post1.comments.create! text: 'Comment 1'
|
35
|
+
comment2 = post1.comments.create! text: 'Comment 2'
|
36
|
+
|
37
|
+
post2 = Post.create! text: 'Post 2'
|
38
|
+
comment3 = post2.comments.create! text: 'Comment 3'
|
39
|
+
|
40
|
+
post1.comments.count.should == 2
|
41
|
+
post1.comments.all.should == [comment2, comment1]
|
42
|
+
end
|
43
|
+
end
|
data/spec/callbacks_spec.rb
CHANGED
data/spec/db_spec.rb
CHANGED
data/spec/file_model_spec.rb
CHANGED
data/spec/misc_spec.rb
CHANGED
@@ -7,6 +7,8 @@ describe 'Model Miscellaneous' do
|
|
7
7
|
class User
|
8
8
|
inherit Mongo::Model
|
9
9
|
collection :users
|
10
|
+
|
11
|
+
attr_accessor :name
|
10
12
|
end
|
11
13
|
end
|
12
14
|
after{remove_constants :Unit3, :User}
|
@@ -55,4 +57,11 @@ describe 'Model Miscellaneous' do
|
|
55
57
|
u.save!
|
56
58
|
u.dom_id.should_not be_empty
|
57
59
|
end
|
60
|
+
|
61
|
+
it 'reload' do
|
62
|
+
u = User.create! name: 'Zeratul'
|
63
|
+
u.name = 'Jim'
|
64
|
+
u.reload
|
65
|
+
u.name.should == 'Zeratul'
|
66
|
+
end
|
58
67
|
end
|
data/spec/query_spec.rb
CHANGED
@@ -11,7 +11,7 @@ describe "Model Query" do
|
|
11
11
|
attr_accessor :name
|
12
12
|
end
|
13
13
|
end
|
14
|
-
after(:all){remove_constants :Unit}
|
14
|
+
after(:all){remove_constants :Unit, :SpecialUnit}
|
15
15
|
|
16
16
|
before{@zeratul = Unit.build name: 'Zeratul'}
|
17
17
|
|
@@ -40,7 +40,28 @@ describe "Model Query" do
|
|
40
40
|
|
41
41
|
it 'dynamic finders integration' do
|
42
42
|
Unit.first_by_name('Zeratul').should be_nil
|
43
|
-
Unit.build(name: 'Zeratul')
|
43
|
+
u = Unit.build(name: 'Zeratul')
|
44
|
+
u.save!
|
44
45
|
Unit.first_by_name('Zeratul').name.should == 'Zeratul'
|
46
|
+
Unit.by_id!(u._id).name.should == 'Zeratul'
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'build, create, create!' do
|
50
|
+
class SpecialUnit < Unit
|
51
|
+
attr_accessor :age
|
52
|
+
end
|
53
|
+
|
54
|
+
u = SpecialUnit.query(name: 'Zeratul').build age: 500
|
55
|
+
[u.name, u.age].should == ['Zeratul', 500]
|
56
|
+
|
57
|
+
SpecialUnit.destroy_all
|
58
|
+
SpecialUnit.query(name: 'Zeratul').create age: 500
|
59
|
+
u = SpecialUnit.first
|
60
|
+
[u.name, u.age].should == ['Zeratul', 500]
|
61
|
+
|
62
|
+
SpecialUnit.destroy_all
|
63
|
+
SpecialUnit.query(name: 'Zeratul').create! age: 500
|
64
|
+
u = SpecialUnit.first
|
65
|
+
[u.name, u.age].should == ['Zeratul', 500]
|
45
66
|
end
|
46
67
|
end
|
data/spec/scope_spec.rb
CHANGED
@@ -25,7 +25,7 @@ describe "Scope" do
|
|
25
25
|
Unit.first(name: 'Tassadar').should_not be_nil
|
26
26
|
Unit.first!(name: 'Tassadar').should_not be_nil
|
27
27
|
|
28
|
-
Unit.stub!(:current_scope).and_return(status: 'alive')
|
28
|
+
Unit.stub!(:current_scope).and_return(Unit.query(status: 'alive'))
|
29
29
|
|
30
30
|
Unit.count.should == 2
|
31
31
|
Unit.all.size.should == 2
|
@@ -42,61 +42,62 @@ describe "Scope" do
|
|
42
42
|
|
43
43
|
describe 'default scope' do
|
44
44
|
it "should not affect objects without default_scope" do
|
45
|
-
Unit.current_scope.should
|
45
|
+
Unit.current_scope.should be_nil
|
46
46
|
end
|
47
47
|
|
48
48
|
it "definition" do
|
49
49
|
Unit.default_scope status: 'alive'
|
50
|
-
|
50
|
+
|
51
|
+
Unit.current_scope.should == Unit.query(status: 'alive')
|
51
52
|
|
52
53
|
Unit.default_scope do
|
53
54
|
{status: 'alive'}
|
54
55
|
end
|
55
|
-
Unit.current_scope.should ==
|
56
|
+
Unit.current_scope.should == Unit.query(status: 'alive')
|
56
57
|
end
|
57
58
|
|
58
59
|
it "should be inherited" do
|
59
60
|
Unit.default_scope status: 'alive'
|
60
61
|
|
61
62
|
class Protoss < Unit; end
|
62
|
-
Protoss.current_scope.should ==
|
63
|
+
Protoss.current_scope.should == Unit.query(status: 'alive')
|
63
64
|
|
64
65
|
Protoss.default_scope status: 'dead'
|
65
|
-
Unit.current_scope.should ==
|
66
|
-
Protoss.current_scope.should ==
|
66
|
+
Unit.current_scope.should == Unit.query(status: 'alive')
|
67
|
+
Protoss.current_scope.should == Protoss.query(status: 'dead')
|
67
68
|
end
|
68
69
|
end
|
69
70
|
|
70
71
|
describe 'scope' do
|
71
72
|
it "definition" do
|
72
73
|
Unit.scope :alive, status: 'alive'
|
73
|
-
Unit.alive.current_scope.should ==
|
74
|
+
Unit.alive.current_scope.should == Unit.query(status: 'alive')
|
74
75
|
|
75
76
|
Unit.scope :alive do
|
76
77
|
{status: 'alive'}
|
77
78
|
end
|
78
|
-
Unit.alive.current_scope.should ==
|
79
|
+
Unit.alive.current_scope.should == Unit.query(status: 'alive')
|
79
80
|
end
|
80
81
|
|
81
82
|
it 'scope should affect current scope' do
|
82
83
|
Unit.scope :alive, status: 'alive'
|
83
84
|
|
84
|
-
Unit.current_scope.should
|
85
|
+
Unit.current_scope.should be_nil
|
85
86
|
|
86
|
-
Unit.alive.current_scope.should ==
|
87
|
-
Unit.alive.should ==
|
87
|
+
Unit.alive.current_scope.should == Unit.query(status: 'alive')
|
88
|
+
Unit.alive.class.should == Mongo::Model::Query
|
88
89
|
end
|
89
90
|
|
90
91
|
it 'should be merged with default scope' do
|
91
92
|
Unit.default_scope race: 'Protoss'
|
92
93
|
Unit.scope :alive, status: 'alive'
|
93
|
-
Unit.alive.current_scope.should ==
|
94
|
+
Unit.alive.current_scope.should == Unit.query(race: 'Protoss', status: 'alive')
|
94
95
|
end
|
95
96
|
|
96
97
|
it 'should allow to chain scopes' do
|
97
98
|
Unit.scope :alive, status: 'alive'
|
98
99
|
Unit.scope :protosses, race: 'Protoss'
|
99
|
-
Unit.alive.protosses.current_scope.should ==
|
100
|
+
Unit.alive.protosses.current_scope.should == Unit.query(race: 'Protoss', status: 'alive')
|
100
101
|
end
|
101
102
|
end
|
102
103
|
|
@@ -119,21 +120,21 @@ describe "Scope" do
|
|
119
120
|
Unit.default_scope status: 'alive'
|
120
121
|
|
121
122
|
Unit.with_scope race: 'Protoss' do
|
122
|
-
Unit.current_scope.should ==
|
123
|
+
Unit.current_scope.should == Unit.query(status: 'alive', race: 'Protoss')
|
123
124
|
|
124
125
|
Unit.with_exclusive_scope do
|
125
|
-
Unit.current_scope.should == {}
|
126
|
+
Unit.current_scope.should == Unit.query({})
|
126
127
|
end
|
127
128
|
|
128
129
|
Unit.with_exclusive_scope race: 'Terran' do
|
129
|
-
Unit.current_scope.should ==
|
130
|
+
Unit.current_scope.should == Unit.query(race: 'Terran')
|
130
131
|
end
|
131
132
|
end
|
132
133
|
end
|
133
134
|
|
134
135
|
it "usage" do
|
135
136
|
Unit.with_scope status: 'alive' do
|
136
|
-
Unit.current_scope.should ==
|
137
|
+
Unit.current_scope.should == Unit.query(status: 'alive')
|
137
138
|
end
|
138
139
|
end
|
139
140
|
|
@@ -141,7 +142,7 @@ describe "Scope" do
|
|
141
142
|
Unit.default_scope status: 'alive'
|
142
143
|
Unit.with_scope race: 'Protoss' do
|
143
144
|
Unit.with_scope name: 'Zeratul' do
|
144
|
-
Unit.current_scope.should ==
|
145
|
+
Unit.current_scope.should == Unit.query(name: 'Zeratul', race: 'Protoss', status: 'alive')
|
145
146
|
end
|
146
147
|
end
|
147
148
|
end
|
data/spec/validation_spec.rb
CHANGED
@@ -19,7 +19,7 @@ describe "Validations" do
|
|
19
19
|
class Unit < BaseUnit
|
20
20
|
before_validate :check_name
|
21
21
|
def check_name
|
22
|
-
errors
|
22
|
+
errors.add :name, 'invalid name'
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
@@ -41,6 +41,19 @@ describe "Validations" do
|
|
41
41
|
unit.save.should be_true
|
42
42
|
end
|
43
43
|
|
44
|
+
it "should add custom validations" do
|
45
|
+
class Unit < BaseUnit
|
46
|
+
validate :check_name
|
47
|
+
def check_name
|
48
|
+
errors.add :name, 'invalid name'
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
unit = Unit.new
|
53
|
+
unit.save.should be_false
|
54
|
+
unit.errors[:name].should == ['invalid name']
|
55
|
+
end
|
56
|
+
|
44
57
|
# it "should check :errors only and ignore valid? method" do
|
45
58
|
# unit = BaseUnit.build name: 'Zeratul'
|
46
59
|
# unit.should_not_receive(:valid?)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mongodb_model
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-
|
12
|
+
date: 2011-09-01 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: i18n
|
16
|
-
requirement: &
|
16
|
+
requirement: &2780720 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0.5'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *2780720
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: mongodb
|
27
|
-
requirement: &
|
27
|
+
requirement: &2780430 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *2780430
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: file_model
|
38
|
-
requirement: &
|
38
|
+
requirement: &2780140 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *2780140
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: validatable2
|
49
|
-
requirement: &
|
49
|
+
requirement: &2779840 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :runtime
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *2779840
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: ruby_ext
|
60
|
-
requirement: &
|
60
|
+
requirement: &2779540 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
@@ -65,7 +65,7 @@ dependencies:
|
|
65
65
|
version: '0'
|
66
66
|
type: :runtime
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *2779540
|
69
69
|
description:
|
70
70
|
email:
|
71
71
|
executables: []
|
@@ -83,6 +83,7 @@ files:
|
|
83
83
|
- lib/mongo/model/misc.rb
|
84
84
|
- lib/mongo/model/model.rb
|
85
85
|
- lib/mongo/model/query.rb
|
86
|
+
- lib/mongo/model/query_mixin.rb
|
86
87
|
- lib/mongo/model/scope.rb
|
87
88
|
- lib/mongo/model/spec.rb
|
88
89
|
- lib/mongo/model/support/types.rb
|
@@ -91,6 +92,7 @@ files:
|
|
91
92
|
- lib/mongo/model.rb
|
92
93
|
- lib/mongodb_model/gems.rb
|
93
94
|
- spec/assignment_spec.rb
|
95
|
+
- spec/associations_spec.rb
|
94
96
|
- spec/attribute_convertors_spec.rb
|
95
97
|
- spec/callbacks_spec.rb
|
96
98
|
- spec/crud_spec.rb
|