mongo_db 0.1.4 → 0.1.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_db/driver/core/collection.rb +27 -4
- data/lib/mongo_db/driver/core/hash_helper.rb +41 -8
- data/lib/mongo_db/driver/more/collection.rb +4 -0
- data/lib/mongo_db/driver/more.rb +1 -7
- data/{spec/driver/more → lib/old}/advanced_finders.rb +0 -0
- data/lib/old/query.rb +91 -0
- data/lib/old/query_spec.rb +77 -0
- data/readme.md +16 -3
- data/spec/driver/core/hash_helper_spec.rb +19 -0
- data/spec/driver/more/querying_spec.rb +59 -0
- data/spec/driver/spec_helper.rb +7 -0
- data/spec/driver_example_spec.rb +14 -1
- metadata +8 -5
- data/spec/driver/more/simple_finders_spec.rb +0 -51
@@ -11,6 +11,9 @@ module Mongo::Ext::Collection
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def update_with_ext selector, document, opts = {}
|
14
|
+
selector = convert_underscore_to_dollar_in_selector selector
|
15
|
+
document = convert_underscore_to_dollar_in_update document
|
16
|
+
|
14
17
|
# because :multi works only with $ operators, we need to check it
|
15
18
|
opts = if document.keys.any?{|k| k =~ /^\$/}
|
16
19
|
reverse_merge_defaults(opts, :safe, :multi)
|
@@ -22,6 +25,7 @@ module Mongo::Ext::Collection
|
|
22
25
|
end
|
23
26
|
|
24
27
|
def remove_with_ext selector = {}, opts = {}
|
28
|
+
selector = convert_underscore_to_dollar_in_selector selector
|
25
29
|
remove_without_ext selector, reverse_merge_defaults(opts, :safe, :multi)
|
26
30
|
end
|
27
31
|
|
@@ -32,9 +36,12 @@ module Mongo::Ext::Collection
|
|
32
36
|
#
|
33
37
|
# Querying
|
34
38
|
#
|
35
|
-
def first
|
36
|
-
|
37
|
-
|
39
|
+
def first spec_or_object_id = nil, opts = {}
|
40
|
+
spec_or_object_id = convert_underscore_to_dollar_in_selector spec_or_object_id if spec_or_object_id.is_a? Hash
|
41
|
+
|
42
|
+
o = find_one spec_or_object_id, opts
|
43
|
+
o = ::Mongo::Ext::HashHelper.symbolize o if Mongo.defaults[:symbolize]
|
44
|
+
o
|
38
45
|
end
|
39
46
|
|
40
47
|
def all *args, &block
|
@@ -48,11 +55,13 @@ module Mongo::Ext::Collection
|
|
48
55
|
end
|
49
56
|
|
50
57
|
def each selector = {}, opts = {}, &block
|
58
|
+
selector = convert_underscore_to_dollar_in_selector selector
|
59
|
+
|
51
60
|
cursor = nil
|
52
61
|
begin
|
53
62
|
cursor = find selector, reverse_merge_defaults(opts, :batch_size)
|
54
63
|
cursor.each do |o|
|
55
|
-
o = ::Mongo::Ext::HashHelper.
|
64
|
+
o = ::Mongo::Ext::HashHelper.symbolize o if Mongo.defaults[:symbolize]
|
56
65
|
block.call o
|
57
66
|
end
|
58
67
|
nil
|
@@ -62,6 +71,20 @@ module Mongo::Ext::Collection
|
|
62
71
|
end
|
63
72
|
|
64
73
|
protected
|
74
|
+
def convert_underscore_to_dollar_in_selector selector
|
75
|
+
if Mongo.defaults[:convert_underscore_to_dollar]
|
76
|
+
selector = ::Mongo::Ext::HashHelper.convert_underscore_to_dollar_in_selector selector
|
77
|
+
end
|
78
|
+
selector
|
79
|
+
end
|
80
|
+
|
81
|
+
def convert_underscore_to_dollar_in_update update
|
82
|
+
if Mongo.defaults[:convert_underscore_to_dollar]
|
83
|
+
update = ::Mongo::Ext::HashHelper.convert_underscore_to_dollar_in_selector update
|
84
|
+
end
|
85
|
+
update
|
86
|
+
end
|
87
|
+
|
65
88
|
def reverse_merge_defaults opts, *keys
|
66
89
|
h = opts.clone
|
67
90
|
keys.each do |k|
|
@@ -11,21 +11,54 @@ class Mongo::Ext::HashHelper
|
|
11
11
|
# Date, DateTime,
|
12
12
|
# BSON::ObjectId
|
13
13
|
# ].to_set
|
14
|
+
|
15
|
+
QUERY_KEYWORDS = [
|
16
|
+
:_lt, :_lte, :_gt, :_gte,
|
17
|
+
:_all, :_exists, :_mod, :_ne, :_in, :_nin,
|
18
|
+
:_nor, :_or, :_and,
|
19
|
+
:_size, :_type
|
20
|
+
].to_set
|
21
|
+
|
22
|
+
UPDATE_KEYWORDS = [
|
23
|
+
:_inc, :_set, :_unset, :_push, :_pushAll, :_addToSet, :_pop, :_pull, :_pullAll, :_rename, :_bit
|
24
|
+
].to_set
|
14
25
|
|
15
26
|
class << self
|
16
27
|
# symbolizing hashes
|
17
|
-
def
|
18
|
-
|
19
|
-
|
28
|
+
def symbolize o
|
29
|
+
convert o do |k, v, result|
|
30
|
+
k = k.to_sym if k.is_a? String
|
31
|
+
result[k] = v
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
# replaces :_lt to :$lt in query
|
36
|
+
def convert_underscore_to_dollar_in_selector selector
|
37
|
+
convert selector do |k, v, result|
|
38
|
+
k = "$#{k.to_s[1..-1]}".to_sym if QUERY_KEYWORDS.include?(k)
|
39
|
+
result[k] = v
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
# replaces :_set to :$set in query
|
44
|
+
def convert_underscore_to_dollar_in_update update
|
45
|
+
convert update do |k, v, result|
|
46
|
+
k = "$#{k.to_s[1..-1]}".to_sym if UPDATE_KEYWORDS.include?(k)
|
47
|
+
result[k] = v
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
# converts hashes (also works with nested & arrays)
|
52
|
+
def convert o, &block
|
20
53
|
if o.is_a? Hash
|
21
|
-
|
54
|
+
result = {}
|
22
55
|
o.each do |k, v|
|
23
|
-
|
24
|
-
|
56
|
+
v = convert v, &block
|
57
|
+
block.call k, v, result
|
25
58
|
end
|
26
|
-
|
59
|
+
result
|
27
60
|
elsif o.is_a? Array
|
28
|
-
o.collect{|v|
|
61
|
+
o.collect{|v| convert v, &block}
|
29
62
|
else
|
30
63
|
o
|
31
64
|
end
|
data/lib/mongo_db/driver/more.rb
CHANGED
File without changes
|
data/lib/old/query.rb
ADDED
@@ -0,0 +1,91 @@
|
|
1
|
+
class Mongo::Ext::Query
|
2
|
+
class Dsl < BasicObject
|
3
|
+
class Statement < ::Array
|
4
|
+
def add_to hash
|
5
|
+
operator, value = self[-2, -1]
|
6
|
+
path = self[0..-3]
|
7
|
+
|
8
|
+
current = hash
|
9
|
+
path.each_with_index do |key, index|
|
10
|
+
if index == path.size - 1
|
11
|
+
raise "dupliate key :#{key}!" if current.include? key
|
12
|
+
current[key] = value
|
13
|
+
else
|
14
|
+
raise "dupliate key :#{key}!" if current.include?(key) and !current[key].is_a?(Hash)
|
15
|
+
current[key] ||= {}
|
16
|
+
current = current[key]
|
17
|
+
end
|
18
|
+
end
|
19
|
+
nil
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def initialize &block
|
24
|
+
@statements = [Statement.new]
|
25
|
+
block.call self
|
26
|
+
statements.pop if statements.last.empty?
|
27
|
+
end
|
28
|
+
|
29
|
+
{
|
30
|
+
:== => :==,
|
31
|
+
:!= => :$ne,
|
32
|
+
:< => :$lt,
|
33
|
+
:<= => :$lte,
|
34
|
+
:> => :$gt,
|
35
|
+
:>= => :$gte,
|
36
|
+
}.each do |ruby, mongo|
|
37
|
+
define_method ruby do |arg|
|
38
|
+
emit mongo
|
39
|
+
emit arg, true
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def to_hash
|
44
|
+
h = {}
|
45
|
+
statements.each{|s| h.add_to h}
|
46
|
+
h
|
47
|
+
end
|
48
|
+
|
49
|
+
protected
|
50
|
+
attr_reader :statements
|
51
|
+
|
52
|
+
def emit statement = nil, terminate = false
|
53
|
+
statements.last << statement if statement
|
54
|
+
statements << Statement.new if terminate
|
55
|
+
nil
|
56
|
+
end
|
57
|
+
|
58
|
+
def method_missing m, *args, &block
|
59
|
+
raise "invalid usage, there can be only one argument (#{args})!" if args.size > 1
|
60
|
+
|
61
|
+
if args.empty?
|
62
|
+
emit m
|
63
|
+
self
|
64
|
+
else
|
65
|
+
emit m
|
66
|
+
emit args.first, true
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def p *args
|
71
|
+
::Kernel.p *args
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def initialize collection, &block
|
76
|
+
@collection = collection
|
77
|
+
@hash_query = Dsl.new(&block).to_hash
|
78
|
+
end
|
79
|
+
|
80
|
+
def first
|
81
|
+
collection.first to_hash
|
82
|
+
end
|
83
|
+
|
84
|
+
def all &block
|
85
|
+
collection.first to_hash, &block
|
86
|
+
end
|
87
|
+
alias_method :each, :all
|
88
|
+
|
89
|
+
protected
|
90
|
+
attr_reader :collection, :hash_query
|
91
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require 'driver/spec_helper'
|
2
|
+
|
3
|
+
describe "Query" do
|
4
|
+
dsl_class = Mongo::Ext::Query::Dsl
|
5
|
+
dsl_class.class_eval do
|
6
|
+
public :statements
|
7
|
+
end
|
8
|
+
|
9
|
+
it "operators" do
|
10
|
+
value = :value
|
11
|
+
dsl_class.new do |o|
|
12
|
+
o.key == value
|
13
|
+
o.key != value
|
14
|
+
o.key < value
|
15
|
+
o.key <= value
|
16
|
+
o.key > value
|
17
|
+
o.key >= value
|
18
|
+
o.key.all value
|
19
|
+
o.key.exists true
|
20
|
+
o.key.mod value
|
21
|
+
o.key.in value
|
22
|
+
o.key.nin value
|
23
|
+
o.key.size value
|
24
|
+
o.key.type value
|
25
|
+
end.statements.should == [
|
26
|
+
[:key, :==, :value],
|
27
|
+
[:key, :$ne, :value],
|
28
|
+
[:key, :$lt, :value],
|
29
|
+
[:key, :$lte, :value],
|
30
|
+
[:key, :$gt, :value],
|
31
|
+
[:key, :$gte, :value],
|
32
|
+
[:key, :all, :value],
|
33
|
+
[:key, :exists, true],
|
34
|
+
[:key, :mod, :value],
|
35
|
+
[:key, :in, :value],
|
36
|
+
[:key, :nin, :value],
|
37
|
+
[:key, :size, :value],
|
38
|
+
[:key, :type, :value]
|
39
|
+
]
|
40
|
+
end
|
41
|
+
|
42
|
+
it ":nor, :or, :and"
|
43
|
+
|
44
|
+
describe "statement" do
|
45
|
+
def process_statement *args
|
46
|
+
s = Mongo::Ext::Query::Dsl::Statement.new
|
47
|
+
s.push *args
|
48
|
+
result = {}
|
49
|
+
s.add_to result
|
50
|
+
result
|
51
|
+
end
|
52
|
+
|
53
|
+
it "basics", focus: true do
|
54
|
+
p process_statement(:age, :$gt, 34)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
# it "to_hash" do
|
59
|
+
# dsl.new do |o|
|
60
|
+
# # o.name == 'Jim'
|
61
|
+
# o.age > 34
|
62
|
+
# end.to_hash.should == {
|
63
|
+
# # name: 'Jim',
|
64
|
+
# :$gt => {age: 34}
|
65
|
+
# }
|
66
|
+
# end
|
67
|
+
#
|
68
|
+
# it do
|
69
|
+
# dsl.new do |unit|
|
70
|
+
# unit.name == 'Zeratul'
|
71
|
+
# unit.stats.life > 100
|
72
|
+
# unit.stats.attack != 0
|
73
|
+
# end.statement.should == {
|
74
|
+
# name: 1
|
75
|
+
# }
|
76
|
+
# end
|
77
|
+
end
|
data/readme.md
CHANGED
@@ -14,6 +14,9 @@ Note: By default it also adds a little magic and alters some default values of s
|
|
14
14
|
``` ruby
|
15
15
|
require 'mongo_db/driver'
|
16
16
|
|
17
|
+
# changing some defaults
|
18
|
+
Mongo.defaults.merge! symbolize: true, multi: true, safe: true
|
19
|
+
|
17
20
|
# connection & db
|
18
21
|
connection = Mongo::Connection.new
|
19
22
|
db = connection.db 'default_test'
|
@@ -41,9 +44,19 @@ Optionall stuff:
|
|
41
44
|
|
42
45
|
``` ruby
|
43
46
|
# simple finders (bang versions also availiable)
|
44
|
-
db.units.by_name 'Zeratul'
|
45
|
-
db.units.first_by_name 'Zeratul'
|
46
|
-
db.units.all_by_name 'Zeratul'
|
47
|
+
db.units.by_name 'Zeratul' # => zeratul
|
48
|
+
db.units.first_by_name 'Zeratul' # => zeratul
|
49
|
+
db.units.all_by_name 'Zeratul' # => [zeratul]
|
50
|
+
|
51
|
+
# query sugar, use {life: {_lt: 100}} instead of {life: {:$lt => 100}}
|
52
|
+
# it will affect olny small set of keywords (:_lt, :_inc),
|
53
|
+
# other underscored keys will be intact.
|
54
|
+
Mongo.defaults.merge! convert_underscore_to_dollar: true
|
55
|
+
db.units.all life: {_lt: 100} # => [tassadar]
|
56
|
+
|
57
|
+
# it's also trivial to add support for {:life.lt => 100} notion, but
|
58
|
+
# it uses ugly '=>' hash notation instead of ':' and it differs from
|
59
|
+
# how it looks in native MongoDB JSON query.
|
47
60
|
```
|
48
61
|
|
49
62
|
More docs - there's no need for more docs, the whole point of this extension is to be small, intuitive, 100% compatible with official driver (at least should be), and require no extra knowledge.
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'driver/spec_helper'
|
2
|
+
|
3
|
+
describe "HashHelper" do
|
4
|
+
it "symbolize" do
|
5
|
+
Mongo::Ext::HashHelper.symbolize({
|
6
|
+
'a' => 1,
|
7
|
+
'b' => {
|
8
|
+
'c' => 2,
|
9
|
+
'd' => [{'e' => 3}]
|
10
|
+
}
|
11
|
+
}).should == {
|
12
|
+
a: 1,
|
13
|
+
b: {
|
14
|
+
c: 2,
|
15
|
+
d: [{e: 3}]
|
16
|
+
}
|
17
|
+
}
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'driver/spec_helper'
|
2
|
+
|
3
|
+
describe "Querying" do
|
4
|
+
with_mongo
|
5
|
+
|
6
|
+
before do
|
7
|
+
@jim = {name: 'Jim', age: 34}
|
8
|
+
@units = db.units
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "dynamic finders" do
|
12
|
+
it "find, first, by" do
|
13
|
+
@units.first_by_name('Jim').should be_nil
|
14
|
+
-> {@units.first_by_name!('Jim')}.should raise_error(Mongo::NotFound)
|
15
|
+
@units.by_name('Jim').should be_nil
|
16
|
+
-> {@units.by_name!('Jim')}.should raise_error(Mongo::NotFound)
|
17
|
+
@units.first_by_name('Jim').should be_nil
|
18
|
+
-> {@units.first_by_name!('Jim')}.should raise_error(Mongo::NotFound)
|
19
|
+
|
20
|
+
@units.save @jim
|
21
|
+
|
22
|
+
@units.first_by_name('Jim').should == @jim
|
23
|
+
@units.first_by_name!('Jim').should == @jim
|
24
|
+
@units.by_name('Jim').should == @jim
|
25
|
+
@units.by_name!('Jim').should == @jim
|
26
|
+
@units.first_by_name('Jim').should == @jim
|
27
|
+
@units.first_by_name!('Jim').should == @jim
|
28
|
+
end
|
29
|
+
|
30
|
+
it "all" do
|
31
|
+
@units.all_by_name('Jim').should == []
|
32
|
+
@units.save @jim
|
33
|
+
@units.all_by_name('Jim').should == [@jim]
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should allow to use bang version only with :first" do
|
37
|
+
-> {@units.all_by_name!('Jim')}.should raise_error(/can't use bang/)
|
38
|
+
end
|
39
|
+
|
40
|
+
it "by_id (special case)" do
|
41
|
+
@units.method(:by_id).should == @units.method(:first_by_id)
|
42
|
+
@units.method(:by_id!).should == @units.method(:first_by_id!)
|
43
|
+
|
44
|
+
@units.by_id('4de81858cf26bde569000009').should be_nil
|
45
|
+
-> {@units.by_id!('4de81858cf26bde569000009')}.should raise_error(Mongo::NotFound)
|
46
|
+
|
47
|
+
@units.save @jim
|
48
|
+
|
49
|
+
@units.by_id(@jim[:_id]).should == @jim
|
50
|
+
@units.by_id!(@jim[:_id]).should == @jim
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
it "underscore to dollar" do
|
55
|
+
@units.save @jim
|
56
|
+
@units.save name: 'Zeratul', age: 600
|
57
|
+
@units.all(age: {_lt: 100}).should == [@jim]
|
58
|
+
end
|
59
|
+
end
|
data/spec/driver/spec_helper.rb
CHANGED
data/spec/driver_example_spec.rb
CHANGED
@@ -10,6 +10,9 @@ describe "Example" do
|
|
10
10
|
it "core" do
|
11
11
|
require 'mongo_db/driver'
|
12
12
|
|
13
|
+
# changing some defaults
|
14
|
+
Mongo.defaults.merge! symbolize: true, multi: true, safe: true
|
15
|
+
|
13
16
|
# connection & db
|
14
17
|
connection = Mongo::Connection.new
|
15
18
|
db = connection.db 'default_test'
|
@@ -36,10 +39,20 @@ describe "Example" do
|
|
36
39
|
end
|
37
40
|
end
|
38
41
|
|
39
|
-
it "optional" do
|
42
|
+
it "optional" do
|
40
43
|
# simple finders (bang versions also availiable)
|
41
44
|
db.units.by_name 'Zeratul' # => zeratul
|
42
45
|
db.units.first_by_name 'Zeratul' # => zeratul
|
43
46
|
db.units.all_by_name 'Zeratul' # => [zeratul]
|
47
|
+
|
48
|
+
# query sugar, use {life: {_lt: 100}} instead of {life: {:$lt => 100}}
|
49
|
+
# it will affect olny small set of keywords (:_lt, :_inc),
|
50
|
+
# other underscored keys will be intact.
|
51
|
+
Mongo.defaults.merge! convert_underscore_to_dollar: true
|
52
|
+
db.units.all life: {_lt: 100} # => [tassadar]
|
53
|
+
|
54
|
+
# it's also trivial to add support for {:life.lt => 100} notion, but
|
55
|
+
# it uses ugly '=>' hash notation instead of ':' and it differs from
|
56
|
+
# how it looks in native MongoDB JSON query.
|
44
57
|
end
|
45
58
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mongo_db
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ date: 2011-08-13 00:00:00.000000000Z
|
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: mongo
|
16
|
-
requirement: &
|
16
|
+
requirement: &366240 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,7 +21,7 @@ dependencies:
|
|
21
21
|
version: '1.3'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *366240
|
25
25
|
description:
|
26
26
|
email:
|
27
27
|
executables: []
|
@@ -41,11 +41,14 @@ files:
|
|
41
41
|
- lib/mongo_db/gems.rb
|
42
42
|
- lib/mongo_db/model.rb
|
43
43
|
- lib/mongo_db/support.rb
|
44
|
+
- lib/old/advanced_finders.rb
|
45
|
+
- lib/old/query.rb
|
46
|
+
- lib/old/query_spec.rb
|
44
47
|
- spec/driver/core/collection_spec.rb
|
45
48
|
- spec/driver/core/crud_spec.rb
|
46
49
|
- spec/driver/core/database_spec.rb
|
47
|
-
- spec/driver/
|
48
|
-
- spec/driver/more/
|
50
|
+
- spec/driver/core/hash_helper_spec.rb
|
51
|
+
- spec/driver/more/querying_spec.rb
|
49
52
|
- spec/driver/spec_helper.rb
|
50
53
|
- spec/driver_example_spec.rb
|
51
54
|
- spec/migration/migration_spec.rb
|
@@ -1,51 +0,0 @@
|
|
1
|
-
require 'driver/spec_helper'
|
2
|
-
|
3
|
-
describe "Querying" do
|
4
|
-
with_mongo
|
5
|
-
|
6
|
-
before do
|
7
|
-
@jim = {name: 'Jim'}
|
8
|
-
@units = db.units
|
9
|
-
end
|
10
|
-
|
11
|
-
it "find, first, by" do
|
12
|
-
@units.first_by_name('Jim').should be_nil
|
13
|
-
-> {@units.first_by_name!('Jim')}.should raise_error(Mongo::NotFound)
|
14
|
-
@units.by_name('Jim').should be_nil
|
15
|
-
-> {@units.by_name!('Jim')}.should raise_error(Mongo::NotFound)
|
16
|
-
@units.first_by_name('Jim').should be_nil
|
17
|
-
-> {@units.first_by_name!('Jim')}.should raise_error(Mongo::NotFound)
|
18
|
-
|
19
|
-
@units.save @jim
|
20
|
-
|
21
|
-
@units.first_by_name('Jim').should == @jim
|
22
|
-
@units.first_by_name!('Jim').should == @jim
|
23
|
-
@units.by_name('Jim').should == @jim
|
24
|
-
@units.by_name!('Jim').should == @jim
|
25
|
-
@units.first_by_name('Jim').should == @jim
|
26
|
-
@units.first_by_name!('Jim').should == @jim
|
27
|
-
end
|
28
|
-
|
29
|
-
it "all" do
|
30
|
-
@units.all_by_name('Jim').should == []
|
31
|
-
@units.save @jim
|
32
|
-
@units.all_by_name('Jim').should == [@jim]
|
33
|
-
end
|
34
|
-
|
35
|
-
it "should allow to use bang version only with :first" do
|
36
|
-
-> {@units.all_by_name!('Jim')}.should raise_error(/can't use bang/)
|
37
|
-
end
|
38
|
-
|
39
|
-
it "by_id (special case)" do
|
40
|
-
@units.method(:by_id).should == @units.method(:first_by_id)
|
41
|
-
@units.method(:by_id!).should == @units.method(:first_by_id!)
|
42
|
-
|
43
|
-
@units.by_id('4de81858cf26bde569000009').should be_nil
|
44
|
-
-> {@units.by_id!('4de81858cf26bde569000009')}.should raise_error(Mongo::NotFound)
|
45
|
-
|
46
|
-
@units.save @jim
|
47
|
-
|
48
|
-
@units.by_id(@jim[:_id]).should == @jim
|
49
|
-
@units.by_id!(@jim[:_id]).should == @jim
|
50
|
-
end
|
51
|
-
end
|