mongo_mapper 0.5.0 → 0.5.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/.gitignore +2 -1
- data/VERSION +1 -1
- data/lib/mongo_mapper.rb +4 -1
- data/lib/mongo_mapper/document.rb +26 -35
- data/lib/mongo_mapper/support.rb +14 -0
- data/mongo_mapper.gemspec +4 -1
- data/specs.watchr +32 -0
- data/test/functional/associations/test_many_documents_as_proxy.rb +1 -1
- data/test/functional/associations/test_many_proxy.rb +2 -2
- data/test/functional/test_associations.rb +1 -5
- data/test/functional/test_document.rb +10 -2
- data/test/functional/test_logger.rb +20 -0
- data/test/test_helper.rb +2 -1
- metadata +4 -1
data/.gitignore
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.5.
|
1
|
+
0.5.1
|
data/lib/mongo_mapper.rb
CHANGED
@@ -10,7 +10,6 @@ require 'validatable'
|
|
10
10
|
|
11
11
|
module MongoMapper
|
12
12
|
DocumentNotFound = Class.new(StandardError)
|
13
|
-
|
14
13
|
DocumentNotValid = Class.new(StandardError) do
|
15
14
|
def initialize(document)
|
16
15
|
@document = document
|
@@ -25,6 +24,10 @@ module MongoMapper
|
|
25
24
|
def self.connection=(new_connection)
|
26
25
|
@@connection = new_connection
|
27
26
|
end
|
27
|
+
|
28
|
+
def self.logger
|
29
|
+
connection.logger
|
30
|
+
end
|
28
31
|
|
29
32
|
def self.database=(name)
|
30
33
|
@@database = nil
|
@@ -29,12 +29,20 @@ module MongoMapper
|
|
29
29
|
module ClassMethods
|
30
30
|
def find(*args)
|
31
31
|
options = args.extract_options!
|
32
|
-
|
33
32
|
case args.first
|
34
|
-
when :first then
|
35
|
-
when :last then
|
33
|
+
when :first then first(options)
|
34
|
+
when :last then last(options)
|
36
35
|
when :all then find_every(options)
|
37
|
-
|
36
|
+
when Array then find_some(args, options)
|
37
|
+
else
|
38
|
+
case args.size
|
39
|
+
when 0
|
40
|
+
raise DocumentNotFound, "Couldn't find without an ID"
|
41
|
+
when 1
|
42
|
+
find_one(args[0], options)
|
43
|
+
else
|
44
|
+
find_some(args, options)
|
45
|
+
end
|
38
46
|
end
|
39
47
|
end
|
40
48
|
|
@@ -44,7 +52,7 @@ module MongoMapper
|
|
44
52
|
total_entries = count(options[:conditions] || {})
|
45
53
|
collection = Pagination::PaginationProxy.new(total_entries, page, per_page)
|
46
54
|
|
47
|
-
options[:limit]
|
55
|
+
options[:limit] = collection.limit
|
48
56
|
options[:skip] = collection.skip
|
49
57
|
|
50
58
|
collection.subject = find_every(options)
|
@@ -52,11 +60,18 @@ module MongoMapper
|
|
52
60
|
end
|
53
61
|
|
54
62
|
def first(options={})
|
55
|
-
|
63
|
+
options.merge!(:limit => 1)
|
64
|
+
find_every(options)[0]
|
56
65
|
end
|
57
66
|
|
58
67
|
def last(options={})
|
59
|
-
|
68
|
+
if options[:order].blank?
|
69
|
+
raise ':order option must be provided when using last'
|
70
|
+
end
|
71
|
+
|
72
|
+
options.merge!(:limit => 1)
|
73
|
+
options[:order] = invert_order_clause(options[:order])
|
74
|
+
find_every(options)[0]
|
60
75
|
end
|
61
76
|
|
62
77
|
def all(options={})
|
@@ -176,21 +191,8 @@ module MongoMapper
|
|
176
191
|
collection.find(criteria, options).to_a.map { |doc| new(doc) }
|
177
192
|
end
|
178
193
|
|
179
|
-
def
|
180
|
-
|
181
|
-
options[:order] ||= '$natural'
|
182
|
-
find_every(options)[0]
|
183
|
-
end
|
184
|
-
|
185
|
-
def find_last(options)
|
186
|
-
options.merge!(:limit => 1)
|
187
|
-
options[:order] = invert_order_clause(options)
|
188
|
-
find_every(options)[0]
|
189
|
-
end
|
190
|
-
|
191
|
-
def invert_order_clause(options)
|
192
|
-
return '$natural desc' unless options[:order]
|
193
|
-
options[:order].split(',').map do |order_segment|
|
194
|
+
def invert_order_clause(order)
|
195
|
+
order.split(',').map do |order_segment|
|
194
196
|
if order_segment =~ /\sasc/i
|
195
197
|
order_segment.sub /\sasc/i, ' desc'
|
196
198
|
elsif order_segment =~ /\sdesc/i
|
@@ -202,7 +204,9 @@ module MongoMapper
|
|
202
204
|
end
|
203
205
|
|
204
206
|
def find_some(ids, options={})
|
207
|
+
ids = ids.flatten.compact.uniq
|
205
208
|
documents = find_every(options.deep_merge(:conditions => {'_id' => ids}))
|
209
|
+
|
206
210
|
if ids.size == documents.size
|
207
211
|
documents
|
208
212
|
else
|
@@ -218,19 +222,6 @@ module MongoMapper
|
|
218
222
|
end
|
219
223
|
end
|
220
224
|
|
221
|
-
def find_from_ids(ids, options={})
|
222
|
-
ids = ids.flatten.compact.uniq
|
223
|
-
|
224
|
-
case ids.size
|
225
|
-
when 0
|
226
|
-
raise(DocumentNotFound, "Couldn't find without an ID")
|
227
|
-
when 1
|
228
|
-
find_one(ids[0], options)
|
229
|
-
else
|
230
|
-
find_some(ids, options)
|
231
|
-
end
|
232
|
-
end
|
233
|
-
|
234
225
|
def update_single(id, attrs)
|
235
226
|
if id.blank? || attrs.blank? || !attrs.is_a?(Hash)
|
236
227
|
raise ArgumentError, "Updating a single document requires an id and a hash of attributes"
|
data/lib/mongo_mapper/support.rb
CHANGED
@@ -154,4 +154,18 @@ class Time
|
|
154
154
|
Time.parse(value.to_s)
|
155
155
|
end
|
156
156
|
end
|
157
|
+
end
|
158
|
+
|
159
|
+
# duck punch to get access to internal mongo
|
160
|
+
# logger instance until my patch goes thorugh
|
161
|
+
module Mongo
|
162
|
+
class Connection
|
163
|
+
def logger
|
164
|
+
@options[:logger]
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
class DB
|
169
|
+
attr_reader :logger
|
170
|
+
end
|
157
171
|
end
|
data/mongo_mapper.gemspec
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{mongo_mapper}
|
8
|
-
s.version = "0.5.
|
8
|
+
s.version = "0.5.1"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["John Nunemaker"]
|
@@ -52,6 +52,7 @@ Gem::Specification.new do |s|
|
|
52
52
|
"lib/mongo_mapper/support.rb",
|
53
53
|
"lib/mongo_mapper/validations.rb",
|
54
54
|
"mongo_mapper.gemspec",
|
55
|
+
"specs.watchr",
|
55
56
|
"test/NOTE_ON_TESTING",
|
56
57
|
"test/custom_matchers.rb",
|
57
58
|
"test/functional/associations/test_belongs_to_polymorphic_proxy.rb",
|
@@ -66,6 +67,7 @@ Gem::Specification.new do |s|
|
|
66
67
|
"test/functional/test_callbacks.rb",
|
67
68
|
"test/functional/test_document.rb",
|
68
69
|
"test/functional/test_embedded_document.rb",
|
70
|
+
"test/functional/test_logger.rb",
|
69
71
|
"test/functional/test_pagination.rb",
|
70
72
|
"test/functional/test_rails_compatibility.rb",
|
71
73
|
"test/functional/test_validations.rb",
|
@@ -107,6 +109,7 @@ Gem::Specification.new do |s|
|
|
107
109
|
"test/functional/test_callbacks.rb",
|
108
110
|
"test/functional/test_document.rb",
|
109
111
|
"test/functional/test_embedded_document.rb",
|
112
|
+
"test/functional/test_logger.rb",
|
110
113
|
"test/functional/test_pagination.rb",
|
111
114
|
"test/functional/test_rails_compatibility.rb",
|
112
115
|
"test/functional/test_validations.rb",
|
data/specs.watchr
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
def run(cmd)
|
2
|
+
puts(cmd)
|
3
|
+
system(cmd)
|
4
|
+
end
|
5
|
+
|
6
|
+
def run_test_file(file)
|
7
|
+
run "ruby -Itest #{file}"
|
8
|
+
end
|
9
|
+
|
10
|
+
def run_all_tests
|
11
|
+
run "rake test"
|
12
|
+
end
|
13
|
+
|
14
|
+
def related_test_files(path)
|
15
|
+
Dir['test/**/*.rb'].select { |file| file =~ /#{File.basename(path)}/ }
|
16
|
+
end
|
17
|
+
|
18
|
+
watch('test/test_helper\.rb') { run_all_tests }
|
19
|
+
watch('test/.*/test_.*\.rb') { |m| run_test_file(m[0]) }
|
20
|
+
watch('lib/.*') do |m|
|
21
|
+
related_test_files(m[0]).each { |file| run_test_file(file) }
|
22
|
+
end
|
23
|
+
|
24
|
+
# Ctrl-\
|
25
|
+
Signal.trap('QUIT') do
|
26
|
+
puts " --- Running all tests ---\n\n"
|
27
|
+
run_all_tests
|
28
|
+
end
|
29
|
+
|
30
|
+
# Ctrl-C
|
31
|
+
Signal.trap('INT') { abort("\n") }
|
32
|
+
|
@@ -158,7 +158,7 @@ class ManyDocumentsAsProxyTest < Test::Unit::TestCase
|
|
158
158
|
end
|
159
159
|
|
160
160
|
should "work with order" do
|
161
|
-
comments = @post.comments.all(:order => '
|
161
|
+
comments = @post.comments.all(:order => 'body desc')
|
162
162
|
comments.should == [@comment2, @comment1]
|
163
163
|
end
|
164
164
|
end
|
@@ -269,7 +269,7 @@ class ManyProxyTest < Test::Unit::TestCase
|
|
269
269
|
end
|
270
270
|
|
271
271
|
should "work with conditions" do
|
272
|
-
status = @project1.statuses.find(:last, :conditions => {:name => 'New'})
|
272
|
+
status = @project1.statuses.find(:last, :order => 'position', :conditions => {:name => 'New'})
|
273
273
|
status.should == @brand_new
|
274
274
|
end
|
275
275
|
end
|
@@ -280,7 +280,7 @@ class ManyProxyTest < Test::Unit::TestCase
|
|
280
280
|
end
|
281
281
|
|
282
282
|
should "work with conditions" do
|
283
|
-
status = @project1.statuses.last(:conditions => {:name => 'New'})
|
283
|
+
status = @project1.statuses.last(:order => 'position', :conditions => {:name => 'New'})
|
284
284
|
status.should == @brand_new
|
285
285
|
end
|
286
286
|
end
|
@@ -1,11 +1,7 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
require 'models'
|
3
3
|
|
4
|
-
class AssociationsTest < Test::Unit::TestCase
|
5
|
-
def setup
|
6
|
-
clear_all_collections
|
7
|
-
end
|
8
|
-
|
4
|
+
class AssociationsTest < Test::Unit::TestCase
|
9
5
|
should "allow changing class names" do
|
10
6
|
class AwesomeUser
|
11
7
|
include MongoMapper::Document
|
@@ -289,6 +289,10 @@ class DocumentTest < Test::Unit::TestCase
|
|
289
289
|
should "work as array" do
|
290
290
|
@document.find([@doc1.id, @doc2.id]).should == [@doc1, @doc2]
|
291
291
|
end
|
292
|
+
|
293
|
+
should "return array if array only has one element" do
|
294
|
+
@document.find([@doc1.id]).should == [@doc1]
|
295
|
+
end
|
292
296
|
end
|
293
297
|
|
294
298
|
context "with :all" do
|
@@ -330,9 +334,13 @@ class DocumentTest < Test::Unit::TestCase
|
|
330
334
|
context "with #last" do
|
331
335
|
should "find last document based on criteria" do
|
332
336
|
@document.last(:order => 'age').should == @doc2
|
333
|
-
@document.last(:conditions => {:age => 28}).should == @doc2
|
337
|
+
@document.last(:order => 'age', :conditions => {:age => 28}).should == @doc2
|
334
338
|
end
|
335
|
-
|
339
|
+
|
340
|
+
should "raise error if no order provided" do
|
341
|
+
lambda { @document.last() }.should raise_error
|
342
|
+
end
|
343
|
+
end
|
336
344
|
|
337
345
|
context "with :find_by" do
|
338
346
|
should "find document based on argument" do
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class LoggerTest < Test::Unit::TestCase
|
4
|
+
context "with connection that has logger" do
|
5
|
+
setup do
|
6
|
+
@output = StringIO.new
|
7
|
+
@logger = Logger.new(@output)
|
8
|
+
MongoMapper.connection = Mongo::Connection.new('127.0.0.1', 27017, :logger => @logger)
|
9
|
+
end
|
10
|
+
|
11
|
+
should "be able to get access to that logger" do
|
12
|
+
MongoMapper.logger.should == @logger
|
13
|
+
end
|
14
|
+
|
15
|
+
should "be able to log messages" do
|
16
|
+
MongoMapper.logger.debug 'testing'
|
17
|
+
@output.string.include?('testing').should be_true
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/test/test_helper.rb
CHANGED
@@ -25,5 +25,6 @@ end
|
|
25
25
|
DefaultDatabase = 'test' unless defined?(DefaultDatabase)
|
26
26
|
AlternateDatabase = 'test2' unless defined?(AlternateDatabase)
|
27
27
|
|
28
|
-
|
28
|
+
logger = Logger.new(File.expand_path(File.dirname(__FILE__) + '/../tmp/test.log'))
|
29
|
+
MongoMapper.connection = Mongo::Connection.new('127.0.0.1', 27017, :logger => logger)
|
29
30
|
MongoMapper.database = DefaultDatabase
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mongo_mapper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- John Nunemaker
|
@@ -106,6 +106,7 @@ files:
|
|
106
106
|
- lib/mongo_mapper/support.rb
|
107
107
|
- lib/mongo_mapper/validations.rb
|
108
108
|
- mongo_mapper.gemspec
|
109
|
+
- specs.watchr
|
109
110
|
- test/NOTE_ON_TESTING
|
110
111
|
- test/custom_matchers.rb
|
111
112
|
- test/functional/associations/test_belongs_to_polymorphic_proxy.rb
|
@@ -120,6 +121,7 @@ files:
|
|
120
121
|
- test/functional/test_callbacks.rb
|
121
122
|
- test/functional/test_document.rb
|
122
123
|
- test/functional/test_embedded_document.rb
|
124
|
+
- test/functional/test_logger.rb
|
123
125
|
- test/functional/test_pagination.rb
|
124
126
|
- test/functional/test_rails_compatibility.rb
|
125
127
|
- test/functional/test_validations.rb
|
@@ -182,6 +184,7 @@ test_files:
|
|
182
184
|
- test/functional/test_callbacks.rb
|
183
185
|
- test/functional/test_document.rb
|
184
186
|
- test/functional/test_embedded_document.rb
|
187
|
+
- test/functional/test_logger.rb
|
185
188
|
- test/functional/test_pagination.rb
|
186
189
|
- test/functional/test_rails_compatibility.rb
|
187
190
|
- test/functional/test_validations.rb
|