mongomatic 0.1.1 → 0.1.2
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/README.rdoc +26 -3
- data/lib/mongomatic/base.rb +16 -2
- data/test/helper.rb +4 -0
- data/test/test_mongomatic.rb +42 -13
- metadata +3 -12
data/README.rdoc
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
Mongomatic allows you to map your Ruby objects to Mongo documents. It is designed to be fast and simple.
|
4
4
|
|
5
|
-
== Usage
|
5
|
+
== Basic Usage
|
6
6
|
|
7
7
|
require 'mongomatic'
|
8
8
|
|
@@ -10,7 +10,7 @@ Mongomatic allows you to map your Ruby objects to Mongo documents. It is designe
|
|
10
10
|
validates_presence_of :name, :email
|
11
11
|
end
|
12
12
|
|
13
|
-
# set the db
|
13
|
+
# set the db for all models:
|
14
14
|
Mongomatic.db = Mongo::Connection.new.db("mongomatic_test")
|
15
15
|
# or you can set it for a specific model:
|
16
16
|
User.db = Mongo::Connection.new.db("mongomatic_test_user")
|
@@ -46,7 +46,30 @@ Mongomatic allows you to map your Ruby objects to Mongo documents. It is designe
|
|
46
46
|
cursor.count
|
47
47
|
=> 0
|
48
48
|
cursor.next
|
49
|
-
=> nil
|
49
|
+
=> nil
|
50
|
+
|
51
|
+
found = User.find_one({"name" => "Ben Myles"})
|
52
|
+
=> #<User:0x00000100ccd408 @doc={"_id"=>BSON::ObjectID('4c32c3720218236526000001'), "name"=>"Ben Myles", "email"=>"me@somewhere.com"}, @removed=false>
|
53
|
+
found = User.find_one(BSON::ObjectID('4c32c3720218236526000001'))
|
54
|
+
=> #<User:0x00000100ccd408 @doc={"_id"=>BSON::ObjectID('4c32c3720218236526000001'), "name"=>"Ben Myles", "email"=>"me@somewhere.com"}, @removed=false>
|
55
|
+
|
56
|
+
== Indexes
|
57
|
+
|
58
|
+
Mongomatic doesn't do anything special to support indexes, but here's the suggested convention:
|
59
|
+
|
60
|
+
class Person < Mongomatic::Base
|
61
|
+
validates_presence_of :name, :email
|
62
|
+
|
63
|
+
class << self
|
64
|
+
def create_indexes
|
65
|
+
collection.create_index("email", :unique => true)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
You can run Person.create_indexes whenever you add new indexes, it won't throw an error if they already exist.
|
71
|
+
|
72
|
+
If you have defined a unique index and want Mongomatic to raise an exception on a duplicate insert you need to use insert_safe or update_safe. The error thrown will be Mongo::OperationFailure. See the test suite for examples.
|
50
73
|
|
51
74
|
== Note on Patches/Pull Requests
|
52
75
|
|
data/lib/mongomatic/base.rb
CHANGED
@@ -26,8 +26,7 @@ module Mongomatic
|
|
26
26
|
Mongomatic::Cursor.new(self, collection.find(query, opts))
|
27
27
|
end
|
28
28
|
|
29
|
-
def find_one(query
|
30
|
-
query = BSON::ObjectID(query) if query.is_a? String
|
29
|
+
def find_one(query={}, opts={})
|
31
30
|
return nil unless doc = self.collection.find_one(query, opts)
|
32
31
|
self.new(doc)
|
33
32
|
end
|
@@ -98,6 +97,11 @@ module Mongomatic
|
|
98
97
|
ret
|
99
98
|
end
|
100
99
|
|
100
|
+
def insert_safe(opts={})
|
101
|
+
opts.merge!(:safe => true)
|
102
|
+
insert(opts)
|
103
|
+
end
|
104
|
+
|
101
105
|
def update(opts={},update_doc=@doc)
|
102
106
|
return false if new? || removed? || !valid?
|
103
107
|
self.send(:before_update) if self.respond_to?(:before_update)
|
@@ -108,6 +112,11 @@ module Mongomatic
|
|
108
112
|
ret
|
109
113
|
end
|
110
114
|
|
115
|
+
def update_safe(opts={},update_doc=@doc)
|
116
|
+
opts.merge!(:safe => true)
|
117
|
+
update(opts,update_doc)
|
118
|
+
end
|
119
|
+
|
111
120
|
def remove(opts={})
|
112
121
|
return false if new?
|
113
122
|
self.send(:before_remove) if self.respond_to?(:before_remove)
|
@@ -118,6 +127,11 @@ module Mongomatic
|
|
118
127
|
ret
|
119
128
|
end
|
120
129
|
|
130
|
+
def remove_safe(opts={})
|
131
|
+
opts.merge!(:safe => true)
|
132
|
+
remove(opts)
|
133
|
+
end
|
134
|
+
|
121
135
|
def to_hash
|
122
136
|
@doc || {}
|
123
137
|
end
|
data/test/helper.rb
CHANGED
@@ -13,6 +13,10 @@ class Person < Mongomatic::Base
|
|
13
13
|
validates_presence_of :name
|
14
14
|
attr_accessor :callback_tests
|
15
15
|
|
16
|
+
def self.create_indexes
|
17
|
+
collection.create_index("name", :unique => true)
|
18
|
+
end
|
19
|
+
|
16
20
|
def before_validate
|
17
21
|
self.callback_tests ||= []
|
18
22
|
self.callback_tests << :before_validate
|
data/test/test_mongomatic.rb
CHANGED
@@ -2,35 +2,50 @@ require 'helper'
|
|
2
2
|
|
3
3
|
class TestMongomatic < Test::Unit::TestCase
|
4
4
|
should "find one with a query" do
|
5
|
-
Person.collection.
|
5
|
+
Person.collection.drop
|
6
6
|
p1 = Person.new(:name => "Jordan")
|
7
7
|
p1.insert
|
8
8
|
|
9
9
|
assert_equal p1, Person.find_one(:name => "Jordan")
|
10
10
|
end
|
11
|
+
|
11
12
|
should "find one with an instance of BSON::ObjectID" do
|
12
|
-
Person.collection.
|
13
|
+
Person.collection.drop
|
13
14
|
p1 = Person.new(:name => "Jordan")
|
14
15
|
p1.insert
|
15
16
|
|
16
17
|
assert_equal p1, Person.find_one(p1['_id'])
|
17
18
|
end
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
19
|
+
|
20
|
+
should "find one with ObjectID or hash only" do
|
21
|
+
Person.collection.drop
|
22
|
+
Person.create_indexes
|
23
|
+
|
24
|
+
p = Person.new(:name => "Ben1", :birth_year => 1984, :created_at => Time.now.utc, :admin => true)
|
25
|
+
assert p.insert_safe.is_a?(BSON::ObjectID)
|
26
|
+
assert_equal 1, Person.count
|
27
|
+
|
28
|
+
found = Person.find({"_id" => BSON::ObjectID(p["_id"].to_s)}).next
|
29
|
+
assert_equal found, p
|
30
|
+
|
31
|
+
assert_raise(TypeError) { Person.find_one(p["_id"].to_s) }
|
32
|
+
|
33
|
+
found = Person.find_one({"_id" => p["_id"].to_s})
|
34
|
+
assert_equal found, nil
|
22
35
|
|
23
|
-
|
36
|
+
found = Person.find_one({"_id" => BSON::ObjectID(p["_id"].to_s)})
|
37
|
+
assert_equal found, p
|
24
38
|
end
|
39
|
+
|
25
40
|
should "return an instance of class when finding one" do
|
26
|
-
Person.collection.
|
41
|
+
Person.collection.drop
|
27
42
|
p1 = Person.new(:name => "Jordan")
|
28
43
|
p1.insert
|
29
44
|
|
30
45
|
assert_equal Person, Person.find_one(:name => "Jordan").class
|
31
46
|
end
|
32
47
|
should "work with enumerable methods" do
|
33
|
-
Person.collection.
|
48
|
+
Person.collection.drop
|
34
49
|
p1 = Person.new(:name => "Ben1", :birth_year => 1984, :created_at => Time.now.utc, :admin => true)
|
35
50
|
p2 = Person.new(:name => "Ben2", :birth_year => 1986, :created_at => Time.now.utc, :admin => true)
|
36
51
|
assert p1.insert.is_a?(BSON::ObjectID)
|
@@ -41,7 +56,7 @@ class TestMongomatic < Test::Unit::TestCase
|
|
41
56
|
end
|
42
57
|
|
43
58
|
should "be able to insert, update, remove documents" do
|
44
|
-
Person.collection.
|
59
|
+
Person.collection.drop
|
45
60
|
|
46
61
|
p = Person.new
|
47
62
|
|
@@ -80,7 +95,7 @@ class TestMongomatic < Test::Unit::TestCase
|
|
80
95
|
end
|
81
96
|
|
82
97
|
should "be able to limit and sort" do
|
83
|
-
Person.collection.
|
98
|
+
Person.collection.drop
|
84
99
|
p = Person.new(:name => "Ben", :birth_year => 1984, :created_at => Time.now.utc, :admin => true)
|
85
100
|
assert p.insert.is_a?(BSON::ObjectID)
|
86
101
|
assert_equal 1, Person.collection.count
|
@@ -112,7 +127,7 @@ class TestMongomatic < Test::Unit::TestCase
|
|
112
127
|
end
|
113
128
|
|
114
129
|
should "cursor implements enumerable" do
|
115
|
-
Person.collection.
|
130
|
+
Person.collection.drop
|
116
131
|
1000.upto(2000) do |i|
|
117
132
|
p = Person.new(:name => "Ben#{i}", :birth_year => 1984, :created_at => Time.now.utc, :admin => true)
|
118
133
|
assert p.insert.is_a?(BSON::ObjectID)
|
@@ -128,7 +143,7 @@ class TestMongomatic < Test::Unit::TestCase
|
|
128
143
|
end
|
129
144
|
|
130
145
|
should "be able to merge hashes" do
|
131
|
-
Person.collection.
|
146
|
+
Person.collection.drop
|
132
147
|
p = Person.new(:name => "Ben", :birth_year => 1984, :created_at => Time.now.utc, :admin => true)
|
133
148
|
assert p.insert.is_a?(BSON::ObjectID)
|
134
149
|
assert_equal 1, Person.collection.count
|
@@ -154,4 +169,18 @@ class TestMongomatic < Test::Unit::TestCase
|
|
154
169
|
p.remove
|
155
170
|
assert_equal [:before_remove, :after_remove], p.callback_tests
|
156
171
|
end
|
172
|
+
|
173
|
+
should "raise an error on unique index dup insert" do
|
174
|
+
Person.collection.drop
|
175
|
+
Person.create_indexes
|
176
|
+
|
177
|
+
p = Person.new(:name => "Ben1", :birth_year => 1984, :created_at => Time.now.utc, :admin => true)
|
178
|
+
assert p.insert_safe.is_a?(BSON::ObjectID)
|
179
|
+
assert_equal 1, Person.count
|
180
|
+
|
181
|
+
p = Person.new(:name => "Ben1", :birth_year => 1984, :created_at => Time.now.utc, :admin => true)
|
182
|
+
assert_raise(Mongo::OperationFailure) { p.insert_safe }
|
183
|
+
|
184
|
+
assert_equal 1, Person.count
|
185
|
+
end
|
157
186
|
end
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 1
|
8
|
-
-
|
9
|
-
version: 0.1.
|
8
|
+
- 2
|
9
|
+
version: 0.1.2
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Ben Myles
|
@@ -21,7 +21,6 @@ dependencies:
|
|
21
21
|
name: shoulda
|
22
22
|
prerelease: false
|
23
23
|
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
-
none: false
|
25
24
|
requirements:
|
26
25
|
- - ">="
|
27
26
|
- !ruby/object:Gem::Version
|
@@ -36,7 +35,6 @@ dependencies:
|
|
36
35
|
name: bson
|
37
36
|
prerelease: false
|
38
37
|
requirement: &id002 !ruby/object:Gem::Requirement
|
39
|
-
none: false
|
40
38
|
requirements:
|
41
39
|
- - ">="
|
42
40
|
- !ruby/object:Gem::Version
|
@@ -51,7 +49,6 @@ dependencies:
|
|
51
49
|
name: bson_ext
|
52
50
|
prerelease: false
|
53
51
|
requirement: &id003 !ruby/object:Gem::Requirement
|
54
|
-
none: false
|
55
52
|
requirements:
|
56
53
|
- - ">="
|
57
54
|
- !ruby/object:Gem::Version
|
@@ -66,7 +63,6 @@ dependencies:
|
|
66
63
|
name: mongo
|
67
64
|
prerelease: false
|
68
65
|
requirement: &id004 !ruby/object:Gem::Requirement
|
69
|
-
none: false
|
70
66
|
requirements:
|
71
67
|
- - ">="
|
72
68
|
- !ruby/object:Gem::Version
|
@@ -81,7 +77,6 @@ dependencies:
|
|
81
77
|
name: activesupport
|
82
78
|
prerelease: false
|
83
79
|
requirement: &id005 !ruby/object:Gem::Requirement
|
84
|
-
none: false
|
85
80
|
requirements:
|
86
81
|
- - ">="
|
87
82
|
- !ruby/object:Gem::Version
|
@@ -130,8 +125,6 @@ files:
|
|
130
125
|
- lib/mongomatic/validatable/validations/validation_base.rb
|
131
126
|
- LICENSE
|
132
127
|
- README.rdoc
|
133
|
-
- test/helper.rb
|
134
|
-
- test/test_mongomatic.rb
|
135
128
|
has_rdoc: true
|
136
129
|
homepage: http://github.com/benmyles/mongomatic
|
137
130
|
licenses: []
|
@@ -142,7 +135,6 @@ rdoc_options:
|
|
142
135
|
require_paths:
|
143
136
|
- lib
|
144
137
|
required_ruby_version: !ruby/object:Gem::Requirement
|
145
|
-
none: false
|
146
138
|
requirements:
|
147
139
|
- - ">="
|
148
140
|
- !ruby/object:Gem::Version
|
@@ -150,7 +142,6 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
150
142
|
- 0
|
151
143
|
version: "0"
|
152
144
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
153
|
-
none: false
|
154
145
|
requirements:
|
155
146
|
- - ">="
|
156
147
|
- !ruby/object:Gem::Version
|
@@ -160,7 +151,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
160
151
|
requirements: []
|
161
152
|
|
162
153
|
rubyforge_project:
|
163
|
-
rubygems_version: 1.3.
|
154
|
+
rubygems_version: 1.3.6
|
164
155
|
signing_key:
|
165
156
|
specification_version: 3
|
166
157
|
summary: Mongomatic is a simple Ruby object mapper for Mongo
|