mongo_mapper 0.11.0 → 0.11.1
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_mapper.rb +1 -0
- data/lib/mongo_mapper/connection.rb +7 -4
- data/lib/mongo_mapper/document.rb +1 -0
- data/lib/mongo_mapper/embedded_document.rb +1 -0
- data/lib/mongo_mapper/extensions/time.rb +1 -2
- data/lib/mongo_mapper/plugins/associations/base.rb +5 -1
- data/lib/mongo_mapper/plugins/associations/belongs_to_association.rb +25 -1
- data/lib/mongo_mapper/plugins/associations/single_association.rb +1 -0
- data/lib/mongo_mapper/plugins/callbacks.rb +4 -0
- data/lib/mongo_mapper/plugins/embedded_callbacks.rb +1 -0
- data/lib/mongo_mapper/plugins/inspect.rb +1 -1
- data/lib/mongo_mapper/plugins/modifiers.rb +37 -25
- data/lib/mongo_mapper/plugins/querying.rb +4 -11
- data/lib/mongo_mapper/plugins/querying/plucky_methods.rb +9 -3
- data/lib/mongo_mapper/plugins/touch.rb +18 -0
- data/lib/mongo_mapper/version.rb +1 -1
- data/test/functional/associations/test_many_documents_proxy.rb +62 -0
- data/test/functional/test_modifiers.rb +147 -96
- data/test/functional/test_querying.rb +37 -0
- data/test/functional/test_timestamps.rb +5 -5
- data/test/functional/test_touch.rb +125 -0
- data/test/unit/associations/test_base.rb +10 -0
- data/test/unit/test_extensions.rb +4 -4
- data/test/unit/test_inspect.rb +20 -0
- data/test/unit/test_mongo_mapper.rb +10 -0
- data/test/unit/test_time_zones.rb +5 -0
- metadata +16 -16
@@ -482,6 +482,30 @@ class QueryingTesting < Test::Unit::TestCase
|
|
482
482
|
end
|
483
483
|
end
|
484
484
|
|
485
|
+
context ".size" do
|
486
|
+
should "return 0 if no documents" do
|
487
|
+
@document.count.should == 0
|
488
|
+
end
|
489
|
+
|
490
|
+
should "return the number of documents" do
|
491
|
+
@doc1 = @document.create({:first_name => 'John', :last_name => 'Nunemaker', :age => '27'})
|
492
|
+
@doc2 = @document.create({:first_name => 'Steve', :last_name => 'Smith', :age => '28'})
|
493
|
+
@doc3 = @document.create({:first_name => 'Steph', :last_name => 'Nunemaker', :age => '26'})
|
494
|
+
@document.count.should == 3
|
495
|
+
end
|
496
|
+
end
|
497
|
+
|
498
|
+
context ".empty?" do
|
499
|
+
should "be true if no documents" do
|
500
|
+
@document.empty?.should be_true
|
501
|
+
end
|
502
|
+
|
503
|
+
should "be false if documents present" do
|
504
|
+
@doc = @document.create({:first_name => 'John', :last_name => 'Nunemaker', :age => '27'})
|
505
|
+
@document.empty?.should be_false
|
506
|
+
end
|
507
|
+
end
|
508
|
+
|
485
509
|
context ".exists?" do
|
486
510
|
setup do
|
487
511
|
@doc = @document.create(:first_name => "James", :age => 27)
|
@@ -505,6 +529,19 @@ class QueryingTesting < Test::Unit::TestCase
|
|
505
529
|
end
|
506
530
|
end
|
507
531
|
|
532
|
+
context "to_a" do
|
533
|
+
should "return an array" do
|
534
|
+
@document.to_a.class.should == Array
|
535
|
+
end
|
536
|
+
|
537
|
+
should "return everything" do
|
538
|
+
@doc1 = @document.create({:first_name => 'John', :last_name => 'Nunemaker', :age => '27'})
|
539
|
+
@doc2 = @document.create({:first_name => 'Steve', :last_name => 'Smith', :age => '28'})
|
540
|
+
@doc3 = @document.create({:first_name => 'Steph', :last_name => 'Nunemaker', :age => '26'})
|
541
|
+
@document.to_a.size.should == 3
|
542
|
+
end
|
543
|
+
end
|
544
|
+
|
508
545
|
context ".where" do
|
509
546
|
setup do
|
510
547
|
@doc1 = @document.create(:first_name => 'John', :last_name => 'Nunemaker', :age => '27')
|
@@ -47,16 +47,16 @@ class TimestampsTest < Test::Unit::TestCase
|
|
47
47
|
|
48
48
|
should "set updated_at on document update but leave created_at alone" do
|
49
49
|
doc = @klass.create(:first_name => 'John', :age => 27)
|
50
|
-
old_created_at = doc.created_at
|
51
|
-
old_updated_at = doc.updated_at
|
50
|
+
old_created_at = doc.created_at.to_f
|
52
51
|
|
53
|
-
|
52
|
+
new_updated_at = Time.now + 5.seconds
|
53
|
+
Timecop.freeze(new_updated_at) do
|
54
54
|
@klass.update(doc._id, { :first_name => 'Johnny' })
|
55
55
|
end
|
56
56
|
|
57
57
|
doc = doc.reload
|
58
|
-
doc.created_at.should
|
59
|
-
doc.updated_at.
|
58
|
+
doc.created_at.to_f.should be_close(old_created_at, 0.001)
|
59
|
+
doc.updated_at.to_f.should be_close(new_updated_at.to_f, 0.001)
|
60
60
|
end
|
61
61
|
end
|
62
62
|
end
|
@@ -0,0 +1,125 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TouchTest < Test::Unit::TestCase
|
4
|
+
context "touch" do
|
5
|
+
context "document" do
|
6
|
+
setup do
|
7
|
+
@document = Doc { timestamps! }
|
8
|
+
end
|
9
|
+
|
10
|
+
should "update the updated_at timestamp" do
|
11
|
+
doc = @document.create
|
12
|
+
old_updated_at = doc.updated_at
|
13
|
+
|
14
|
+
Timecop.freeze(Time.now + 1.day) do
|
15
|
+
doc.touch
|
16
|
+
end
|
17
|
+
|
18
|
+
doc.reload
|
19
|
+
doc.updated_at.should_not == old_updated_at
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
context "embedded document" do
|
24
|
+
should "update the updated_at timestamp" do
|
25
|
+
Doc = Doc("Document") { timestamps!}
|
26
|
+
Emdoc = EDoc("EmbeddedDocument") { timestamps! }
|
27
|
+
Doc.has_many :emdocs, :class => Emdoc
|
28
|
+
|
29
|
+
doc = Doc.create
|
30
|
+
emdoc = Emdoc.new
|
31
|
+
doc.emdocs << emdoc
|
32
|
+
doc.save
|
33
|
+
|
34
|
+
old_updated_at = emdoc.updated_at
|
35
|
+
document_old_updated_at = doc.updated_at
|
36
|
+
|
37
|
+
Timecop.freeze(Time.now + 1.day) do
|
38
|
+
emdoc.touch
|
39
|
+
end
|
40
|
+
|
41
|
+
doc.reload
|
42
|
+
emdoc.updated_at.should_not == old_updated_at
|
43
|
+
doc.updated_at.should_not == document_old_updated_at
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
context "association" do
|
48
|
+
setup do
|
49
|
+
@post_class = Doc("Post") do
|
50
|
+
key :touched_at, DateTime
|
51
|
+
timestamps!
|
52
|
+
end
|
53
|
+
@comment_class = Doc("Comment") do
|
54
|
+
key :post_id, ObjectId
|
55
|
+
key :text, String
|
56
|
+
timestamps!
|
57
|
+
end
|
58
|
+
|
59
|
+
@post_class.many :comments, :class => @comment_class
|
60
|
+
end
|
61
|
+
|
62
|
+
should 'not be true by default' do
|
63
|
+
@comment_class.belongs_to :post, :class => @post_class
|
64
|
+
@comment_class.associations[:post].touch?.should_not be_true
|
65
|
+
end
|
66
|
+
|
67
|
+
context 'touch the parent when true' do
|
68
|
+
setup do
|
69
|
+
@comment_class.belongs_to :post, :class => @post_class, :touch => true
|
70
|
+
@post = @post_class.create(:title => 'Hello, world!')
|
71
|
+
@comment = @post.comments.build
|
72
|
+
end
|
73
|
+
|
74
|
+
should "when the child is created" do
|
75
|
+
orig_updated_at = @post.updated_at
|
76
|
+
Timecop.freeze(Time.now + 1.day) do
|
77
|
+
@comment.save
|
78
|
+
end
|
79
|
+
|
80
|
+
@post.reload.updated_at.should_not == orig_updated_at
|
81
|
+
end
|
82
|
+
|
83
|
+
should "when the child is updated" do
|
84
|
+
@comment.save
|
85
|
+
old_updated_at = @post.updated_at
|
86
|
+
Timecop.freeze(Time.now + 2.day) do
|
87
|
+
@comment.update_attributes(:text => "Something")
|
88
|
+
end
|
89
|
+
@post.reload.updated_at.should_not == old_updated_at
|
90
|
+
end
|
91
|
+
|
92
|
+
should "when the child is touched" do
|
93
|
+
@comment.save
|
94
|
+
old_updated_at = @post.updated_at
|
95
|
+
Timecop.freeze(Time.now + 3.day) do
|
96
|
+
@comment.touch
|
97
|
+
end
|
98
|
+
@post.reload.updated_at.should_not == old_updated_at
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
context "when set to a symbol that is a key of parent" do
|
103
|
+
should "set that key on touch events" do
|
104
|
+
@comment_class.belongs_to :post, :class => @post_class, :touch => :touched_at
|
105
|
+
post = @post_class.create(:title => 'Hello, world!')
|
106
|
+
post.touched_at.should be_nil
|
107
|
+
|
108
|
+
comment = post.comments.build
|
109
|
+
comment.save
|
110
|
+
post.reload.touched_at.should_not be_nil
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
should 'not touch the parent when false' do
|
115
|
+
post = @post_class.create(:title => 'Hello, world!')
|
116
|
+
comment = post.comments.build
|
117
|
+
Timecop.freeze(Time.now + 1.day) do
|
118
|
+
comment.save
|
119
|
+
end
|
120
|
+
|
121
|
+
post.reload.updated_at.should == post.created_at
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
@@ -133,4 +133,14 @@ class AssociationBaseTest < Test::Unit::TestCase
|
|
133
133
|
end
|
134
134
|
end
|
135
135
|
|
136
|
+
context "touch?" do
|
137
|
+
should "be true if touch" do
|
138
|
+
BelongsToAssociation.new(:car, :touch => true).touch?.should be_true
|
139
|
+
end
|
140
|
+
|
141
|
+
should "be false if not touch" do
|
142
|
+
BelongsToAssociation.new(:car).touch?.should be_false
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
136
146
|
end
|
@@ -282,7 +282,7 @@ class SupportTest < Test::Unit::TestCase
|
|
282
282
|
end
|
283
283
|
|
284
284
|
should "be time to milliseconds if string" do
|
285
|
-
Time.to_mongo('2000-01-01 01:01:01.123456').to_f.should
|
285
|
+
Time.to_mongo('2000-01-01 01:01:01.123456').to_f.should be_close(Time.local(2000, 1, 1, 1, 1, 1, 123456).utc.to_f, 0.0000001)
|
286
286
|
end
|
287
287
|
|
288
288
|
should "be time in utc if time" do
|
@@ -301,18 +301,18 @@ class SupportTest < Test::Unit::TestCase
|
|
301
301
|
context "Time.to_mongo with Time.zone" do
|
302
302
|
should "be time to milliseconds if time" do
|
303
303
|
Time.zone = 'Hawaii'
|
304
|
-
Time.to_mongo(Time.zone.local(2009, 8, 15, 14, 0, 0, 123456)).to_f.should
|
304
|
+
Time.to_mongo(Time.zone.local(2009, 8, 15, 14, 0, 0, 123456)).to_f.should be_close(Time.utc(2009, 8, 16, 0, 0, 0, 123456).to_f, 0.0000001)
|
305
305
|
Time.zone = nil
|
306
306
|
end
|
307
307
|
|
308
308
|
should "be time to milliseconds if string" do
|
309
309
|
Time.zone = 'Hawaii'
|
310
|
-
Time.to_mongo('2009-08-15 14:00:00.123456').to_f.should
|
310
|
+
Time.to_mongo('2009-08-15 14:00:00.123456').to_f.should be_close(Time.utc(2009, 8, 16, 0, 0, 0, 123456).to_f, 0.0000001)
|
311
311
|
Time.zone = nil
|
312
312
|
end
|
313
313
|
|
314
314
|
should "not round up times at the end of the month" do
|
315
|
-
Time.to_mongo(Time.now.end_of_month).
|
315
|
+
Time.to_mongo(Time.now.end_of_month).to_f.should be_close(Time.now.end_of_month.utc.to_f, 0.0000001)
|
316
316
|
end
|
317
317
|
|
318
318
|
should "be nil if blank string" do
|
data/test/unit/test_inspect.rb
CHANGED
@@ -23,5 +23,25 @@ class InspectTest < Test::Unit::TestCase
|
|
23
23
|
should "include class name" do
|
24
24
|
@doc.inspect.should =~ /^#<User/
|
25
25
|
end
|
26
|
+
|
27
|
+
should "include embedded documents" do
|
28
|
+
klass = Doc()
|
29
|
+
pets = EDoc()
|
30
|
+
|
31
|
+
klass.many :pets, :class => pets
|
32
|
+
|
33
|
+
doc = klass.new(:pets => [{:name => "Kitten"}])
|
34
|
+
doc.inspect.should =~ /_id:.*, pets: \[.*_id.*, name: "Kitten".*\]/
|
35
|
+
end
|
36
|
+
|
37
|
+
should "include embedded document" do
|
38
|
+
klass = Doc()
|
39
|
+
pet = EDoc()
|
40
|
+
|
41
|
+
klass.one :pet, :class => pet
|
42
|
+
|
43
|
+
doc = klass.new(:pet => {:name => "Kitten"})
|
44
|
+
doc.inspect.should =~ /_id:.*, pet: .*_id.*, name: "Kitten".*/
|
45
|
+
end
|
26
46
|
end
|
27
47
|
end
|
@@ -56,6 +56,16 @@ class MongoMapperTest < Test::Unit::TestCase
|
|
56
56
|
MongoMapper.connect('development')
|
57
57
|
end
|
58
58
|
|
59
|
+
should "work with sinatra environment symbol" do
|
60
|
+
MongoMapper.config = {
|
61
|
+
'development' => {'host' => '127.0.0.1', 'port' => 27017, 'database' => 'test'}
|
62
|
+
}
|
63
|
+
Mongo::Connection.expects(:new).with('127.0.0.1', 27017, {})
|
64
|
+
MongoMapper.expects(:database=).with('test')
|
65
|
+
Mongo::DB.any_instance.expects(:authenticate).never
|
66
|
+
MongoMapper.connect(:development)
|
67
|
+
end
|
68
|
+
|
59
69
|
should "work with options" do
|
60
70
|
MongoMapper.config = {
|
61
71
|
'development' => {'host' => '127.0.0.1', 'port' => 27017, 'database' => 'test'}
|
@@ -9,6 +9,11 @@ class TimeZonesTest < Test::Unit::TestCase
|
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
12
|
+
should "preserve milliseconds" do
|
13
|
+
doc = @document.new(:created_at => '2011-02-12 16:01:02.543Z')
|
14
|
+
doc.created_at.should be_close(Time.parse('2011-02-12 16:01:02.543Z'), 0.0000001)
|
15
|
+
end
|
16
|
+
|
12
17
|
should "work without Time.zone" do
|
13
18
|
Time.zone = nil
|
14
19
|
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mongo_mapper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 49
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 11
|
9
|
-
-
|
10
|
-
version: 0.11.
|
9
|
+
- 1
|
10
|
+
version: 0.11.1
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- John Nunemaker
|
@@ -15,13 +15,9 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2012-
|
19
|
-
default_executable:
|
18
|
+
date: 2012-03-30 00:00:00 Z
|
20
19
|
dependencies:
|
21
20
|
- !ruby/object:Gem::Dependency
|
22
|
-
type: :runtime
|
23
|
-
name: activemodel
|
24
|
-
prerelease: false
|
25
21
|
version_requirements: &id001 !ruby/object:Gem::Requirement
|
26
22
|
none: false
|
27
23
|
requirements:
|
@@ -32,11 +28,11 @@ dependencies:
|
|
32
28
|
- 3
|
33
29
|
- 0
|
34
30
|
version: "3.0"
|
31
|
+
prerelease: false
|
35
32
|
requirement: *id001
|
36
|
-
|
33
|
+
name: activemodel
|
37
34
|
type: :runtime
|
38
|
-
|
39
|
-
prerelease: false
|
35
|
+
- !ruby/object:Gem::Dependency
|
40
36
|
version_requirements: &id002 !ruby/object:Gem::Requirement
|
41
37
|
none: false
|
42
38
|
requirements:
|
@@ -47,11 +43,11 @@ dependencies:
|
|
47
43
|
- 3
|
48
44
|
- 0
|
49
45
|
version: "3.0"
|
46
|
+
prerelease: false
|
50
47
|
requirement: *id002
|
51
|
-
|
48
|
+
name: activesupport
|
52
49
|
type: :runtime
|
53
|
-
|
54
|
-
prerelease: false
|
50
|
+
- !ruby/object:Gem::Dependency
|
55
51
|
version_requirements: &id003 !ruby/object:Gem::Requirement
|
56
52
|
none: false
|
57
53
|
requirements:
|
@@ -63,7 +59,10 @@ dependencies:
|
|
63
59
|
- 4
|
64
60
|
- 0
|
65
61
|
version: 0.4.0
|
62
|
+
prerelease: false
|
66
63
|
requirement: *id003
|
64
|
+
name: plucky
|
65
|
+
type: :runtime
|
67
66
|
description:
|
68
67
|
email:
|
69
68
|
- nunemaker@gmail.com
|
@@ -161,6 +160,7 @@ files:
|
|
161
160
|
- lib/mongo_mapper/plugins/scopes.rb
|
162
161
|
- lib/mongo_mapper/plugins/serialization.rb
|
163
162
|
- lib/mongo_mapper/plugins/timestamps.rb
|
163
|
+
- lib/mongo_mapper/plugins/touch.rb
|
164
164
|
- lib/mongo_mapper/plugins/userstamps.rb
|
165
165
|
- lib/mongo_mapper/plugins/validations.rb
|
166
166
|
- lib/mongo_mapper/plugins.rb
|
@@ -207,6 +207,7 @@ files:
|
|
207
207
|
- test/functional/test_sci.rb
|
208
208
|
- test/functional/test_scopes.rb
|
209
209
|
- test/functional/test_timestamps.rb
|
210
|
+
- test/functional/test_touch.rb
|
210
211
|
- test/functional/test_userstamps.rb
|
211
212
|
- test/functional/test_validations.rb
|
212
213
|
- test/models.rb
|
@@ -247,7 +248,6 @@ files:
|
|
247
248
|
- LICENSE
|
248
249
|
- UPGRADES
|
249
250
|
- README.rdoc
|
250
|
-
has_rdoc: true
|
251
251
|
homepage: http://github.com/jnunemaker/mongomapper
|
252
252
|
licenses: []
|
253
253
|
|
@@ -277,7 +277,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
277
277
|
requirements: []
|
278
278
|
|
279
279
|
rubyforge_project:
|
280
|
-
rubygems_version: 1.
|
280
|
+
rubygems_version: 1.8.15
|
281
281
|
signing_key:
|
282
282
|
specification_version: 3
|
283
283
|
summary: A Ruby Object Mapper for Mongo
|