mongo_mapper 0.14.0 → 0.15.0

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.
Files changed (76) hide show
  1. checksums.yaml +5 -5
  2. data/LICENSE +1 -1
  3. data/{README.rdoc → README.md} +28 -20
  4. data/examples/keys.rb +1 -1
  5. data/examples/modifiers/set.rb +1 -1
  6. data/examples/querying.rb +1 -1
  7. data/examples/safe.rb +2 -2
  8. data/examples/scopes.rb +1 -1
  9. data/lib/mongo_mapper.rb +1 -0
  10. data/lib/mongo_mapper/connection.rb +16 -38
  11. data/lib/mongo_mapper/extensions/object_id.rb +5 -1
  12. data/lib/mongo_mapper/plugins/associations/belongs_to_association.rb +1 -1
  13. data/lib/mongo_mapper/plugins/dirty.rb +29 -37
  14. data/lib/mongo_mapper/plugins/document.rb +1 -1
  15. data/lib/mongo_mapper/plugins/dynamic_querying/dynamic_finder.rb +1 -1
  16. data/lib/mongo_mapper/plugins/embedded_callbacks.rb +1 -0
  17. data/lib/mongo_mapper/plugins/embedded_document.rb +1 -1
  18. data/lib/mongo_mapper/plugins/indexes.rb +13 -6
  19. data/lib/mongo_mapper/plugins/keys.rb +1 -2
  20. data/lib/mongo_mapper/plugins/modifiers.rb +27 -10
  21. data/lib/mongo_mapper/plugins/persistence.rb +6 -2
  22. data/lib/mongo_mapper/plugins/querying.rb +9 -3
  23. data/lib/mongo_mapper/plugins/querying/decorated_plucky_query.rb +3 -4
  24. data/lib/mongo_mapper/plugins/safe.rb +10 -4
  25. data/lib/mongo_mapper/plugins/stats.rb +1 -3
  26. data/lib/mongo_mapper/utils.rb +2 -2
  27. data/lib/mongo_mapper/version.rb +1 -1
  28. data/spec/examples.txt +1643 -0
  29. data/spec/functional/accessible_spec.rb +1 -1
  30. data/spec/functional/associations/belongs_to_polymorphic_proxy_spec.rb +2 -2
  31. data/spec/functional/associations/belongs_to_proxy_spec.rb +4 -4
  32. data/spec/functional/associations/in_array_proxy_spec.rb +14 -14
  33. data/spec/functional/associations/many_documents_as_proxy_spec.rb +6 -6
  34. data/spec/functional/associations/many_documents_proxy_spec.rb +22 -22
  35. data/spec/functional/associations/many_embedded_polymorphic_proxy_spec.rb +2 -2
  36. data/spec/functional/associations/many_polymorphic_proxy_spec.rb +4 -4
  37. data/spec/functional/associations/one_as_proxy_spec.rb +8 -8
  38. data/spec/functional/associations/one_proxy_spec.rb +8 -8
  39. data/spec/functional/associations_spec.rb +3 -3
  40. data/spec/functional/binary_spec.rb +2 -2
  41. data/spec/functional/caching_spec.rb +15 -22
  42. data/spec/functional/callbacks_spec.rb +2 -2
  43. data/spec/functional/counter_cache_spec.rb +10 -10
  44. data/spec/functional/dirty_spec.rb +27 -10
  45. data/spec/functional/document_spec.rb +5 -5
  46. data/spec/functional/dumpable_spec.rb +1 -1
  47. data/spec/functional/embedded_document_spec.rb +5 -5
  48. data/spec/functional/identity_map_spec.rb +6 -6
  49. data/spec/functional/indexes_spec.rb +19 -18
  50. data/spec/functional/keys_spec.rb +22 -22
  51. data/spec/functional/logger_spec.rb +2 -2
  52. data/spec/functional/modifiers_spec.rb +67 -19
  53. data/spec/functional/partial_updates_spec.rb +8 -8
  54. data/spec/functional/protected_spec.rb +1 -1
  55. data/spec/functional/querying_spec.rb +48 -22
  56. data/spec/functional/safe_spec.rb +23 -27
  57. data/spec/functional/sci_spec.rb +7 -7
  58. data/spec/functional/scopes_spec.rb +1 -1
  59. data/spec/functional/static_keys_spec.rb +2 -2
  60. data/spec/functional/stats_spec.rb +28 -12
  61. data/spec/functional/validations_spec.rb +8 -16
  62. data/spec/quality_spec.rb +1 -1
  63. data/spec/spec_helper.rb +32 -8
  64. data/spec/support/matchers.rb +1 -1
  65. data/spec/unit/associations/proxy_spec.rb +1 -1
  66. data/spec/unit/clone_spec.rb +1 -1
  67. data/spec/unit/document_spec.rb +3 -3
  68. data/spec/unit/embedded_document_spec.rb +4 -5
  69. data/spec/unit/extensions_spec.rb +3 -4
  70. data/spec/unit/identity_map_middleware_spec.rb +65 -96
  71. data/spec/unit/key_spec.rb +16 -17
  72. data/spec/unit/keys_spec.rb +7 -7
  73. data/spec/unit/mongo_mapper_spec.rb +41 -88
  74. data/spec/unit/rails_spec.rb +2 -2
  75. metadata +37 -24
  76. data/lib/mongo_mapper/extensions/ordered_hash.rb +0 -23
@@ -42,7 +42,7 @@ describe "Safe" do
42
42
 
43
43
  it "should not raise an error on duplicate IDs" do
44
44
  k = @klass.create
45
- expect { j = @klass.create(:_id => k.id) }.to_not raise_error
45
+ lambda { j = @klass.create(:_id => k.id) }.should_not raise_error
46
46
  end
47
47
  end
48
48
 
@@ -61,46 +61,44 @@ describe "Safe" do
61
61
 
62
62
  it "should raise an error on duplicate IDs" do
63
63
  k = @klass.create
64
- expect { j = @klass.create(:_id => k.id) }.to raise_error(Mongo::OperationFailure)
64
+ lambda { j = @klass.create(:_id => k.id) }.should raise_error(Mongo::Error::OperationFailure)
65
65
  end
66
66
 
67
67
  context "using safe setting from class" do
68
- it "should pass :w => 1 option to save" do
69
- instance = @klass.new(:email => 'john@doe.com')
70
- expect_any_instance_of(Mongo::Collection).to receive(:insert).once.with({'_id' => instance.id, 'email' => 'john@doe.com'}, {:w => 1})
71
- instance.save!
68
+ it "should pass :w => 1 option to the collection" do
69
+ @klass.collection.write_concern.options.should == { w: 1 }
72
70
  end
73
71
 
74
72
  it "should work fine when all is well" do
75
- expect {
73
+ lambda {
76
74
  @klass.new(:email => 'john@doe.com').save
77
- }.to_not raise_error
75
+ }.should_not raise_error
78
76
  end
79
77
 
80
78
  it "should raise error when operation fails" do
81
- expect {
79
+ lambda {
82
80
  2.times do
83
81
  @klass.new(:email => 'john@doe.com').save
84
82
  end
85
- }.to raise_error(Mongo::OperationFailure)
83
+ }.should raise_error(Mongo::Error::OperationFailure)
86
84
  end
87
85
  end
88
86
 
89
87
  context "overriding safe setting" do
90
88
  it "should raise error if safe is true" do
91
- expect {
89
+ lambda {
92
90
  2.times do
93
91
  @klass.new(:email => 'john@doe.com').save(:safe => true)
94
92
  end
95
- }.to raise_error(Mongo::OperationFailure)
93
+ }.should raise_error(Mongo::Error::OperationFailure)
96
94
  end
97
95
 
98
96
  it "should not raise error if safe is false" do
99
- expect {
97
+ lambda {
100
98
  2.times do
101
99
  @klass.new(:email => 'john@doe.com').save(:safe => false)
102
100
  end
103
- }.to_not raise_error
101
+ }.should_not raise_error
104
102
  end
105
103
  end
106
104
  end
@@ -120,44 +118,42 @@ describe "Safe" do
120
118
  end
121
119
 
122
120
  context "using safe setting from class" do
123
- it "should pass :safe => options_hash to save" do
124
- instance = @klass.new(:email => 'john@doe.com')
125
- expect_any_instance_of(Mongo::Collection).to receive(:insert).once.with({'_id' => instance.id, 'email' => 'john@doe.com'}, {:j => true})
126
- instance.save!
121
+ it "should pass :safe => options_hash to the collection" do
122
+ @klass.collection.write_concern.options.should == { j: true }
127
123
  end
128
124
 
129
125
  it "should work fine when all is well" do
130
- expect {
126
+ lambda {
131
127
  @klass.new(:email => 'john@doe.com').save
132
- }.to_not raise_error
128
+ }.should_not raise_error
133
129
  end
134
130
 
135
131
  it "should raise error when operation fails" do
136
- expect {
132
+ lambda {
137
133
  2.times do
138
134
  @klass.new(:email => 'john@doe.com').save
139
135
  end
140
- }.to raise_error(Mongo::OperationFailure)
136
+ }.should raise_error(Mongo::Error::OperationFailure)
141
137
  end
142
138
  end
143
139
 
144
140
  context "overriding safe setting" do
145
141
  it "should raise error if safe is true" do
146
- expect {
142
+ lambda {
147
143
  2.times do
148
144
  @klass.new(:email => 'john@doe.com').save(:safe => true)
149
145
  end
150
- }.to raise_error(Mongo::OperationFailure)
146
+ }.should raise_error(Mongo::Error::OperationFailure)
151
147
  end
152
148
 
153
149
  it "should not raise error if safe is false" do
154
- expect {
150
+ lambda {
155
151
  2.times do
156
152
  @klass.new(:email => 'john@doe.com').save(:safe => false)
157
153
  end
158
- }.to_not raise_error
154
+ }.should_not raise_error
159
155
  end
160
156
  end
161
157
  end
162
158
  end
163
- end
159
+ end
@@ -3,12 +3,12 @@ require 'spec_helper'
3
3
  describe "Single collection inheritance (document)" do
4
4
  context "without a connection", :without_connection => true do
5
5
  it "should attempt to create a connection during inheritance" do
6
- expect(Mongo::MongoClient).to_not receive(:new)
6
+ Mongo::Client.should_not_receive(:new)
7
7
  doc = Class.new
8
8
  doc.send(:include, MongoMapper::Document)
9
- expect {
9
+ lambda {
10
10
  Class.new(doc)
11
- }.to_not raise_error
11
+ }.should_not raise_error
12
12
  end
13
13
 
14
14
  it "should pick up a connection if one wasn't set" do
@@ -17,7 +17,7 @@ describe "Single collection inheritance (document)" do
17
17
  klass = Class.new(doc)
18
18
  klass.connection.should be_nil
19
19
  MongoMapper.connection
20
- klass.connection.should be_a Mongo::MongoClient
20
+ klass.connection.should be_a Mongo::Client
21
21
  end
22
22
  end
23
23
 
@@ -27,7 +27,7 @@ describe "Single collection inheritance (document)" do
27
27
  include MongoMapper::Document
28
28
  key :name, String
29
29
  end
30
- DocParent.collection.remove
30
+ DocParent.collection.drop
31
31
 
32
32
  class ::DocDaughter < ::DocParent; end
33
33
  class ::DocSon < ::DocParent; end
@@ -61,7 +61,7 @@ describe "Single collection inheritance (document)" do
61
61
  it "should use the same connection in the subclass" do
62
62
  parent_class = Class.new do
63
63
  include MongoMapper::Document
64
- connection Mongo::MongoClient.new
64
+ connection Mongo::Client.new(['127.0.0.1:27017'])
65
65
  end
66
66
 
67
67
  child_class = Class.new(parent_class) do
@@ -377,4 +377,4 @@ describe "Single collection inheritance (document)" do
377
377
  p.reload.article_parent.sci_polymorphic_posts.all.should include(p)
378
378
  end
379
379
  end
380
- end
380
+ end
@@ -170,7 +170,7 @@ describe "Scopes" do
170
170
  key :title, String
171
171
  key :published_at, Time
172
172
  end
173
- Item.collection.remove
173
+ Item.collection.drop
174
174
 
175
175
  class ::Page < ::Item; end
176
176
  class ::Blog < ::Item
@@ -92,7 +92,7 @@ describe MongoMapper::Plugins::Keys::Static do
92
92
  end
93
93
 
94
94
  it "should not blow up when loading if there is a key defined in the db that has not been defined (but it should not load it)" do
95
- @klass.collection.insert({ :foo => "bar", :valid_key => "something" })
95
+ @klass.collection.insert_one({ :foo => "bar", :valid_key => "something" })
96
96
  @obj = @klass.first
97
97
  @obj.valid_key.should == "something"
98
98
 
@@ -147,7 +147,7 @@ describe MongoMapper::Plugins::Keys::Static do
147
147
 
148
148
  lambda {
149
149
  @static_key_object['foo'] = 'bar'
150
- }.should raise_error
150
+ }.should raise_error(MongoMapper::Plugins::Keys::Static::MissingKeyError)
151
151
  end
152
152
  end
153
153
  end
@@ -13,7 +13,11 @@ describe "Stats" do
13
13
 
14
14
  context "with no documents present" do
15
15
  it "should return nil" do
16
- expect(Docs.stats).to eq(nil)
16
+ if Docs.stats == nil
17
+ Docs.stats.should == nil
18
+ else
19
+ Docs.stats['count'].should == 0
20
+ end
17
21
  end
18
22
  end
19
23
 
@@ -23,48 +27,60 @@ describe "Stats" do
23
27
  Docs.create!
24
28
  end
25
29
 
30
+ def get_stats
31
+ MongoMapper.database.command(:collstats => 'docs').documents[0]
32
+ end
33
+
26
34
  it "should have the correct count" do
27
- expect(Docs.stats.count).to eq(Docs.collection.stats['count'])
35
+ Docs.stats.count.should == get_stats['count']
28
36
  end
29
37
 
30
38
  it "should have the correct namespace" do
31
- expect(Docs.stats.ns).to eq(Docs.collection.stats['ns'])
39
+ Docs.stats.ns.should == get_stats['ns']
32
40
  end
33
41
 
34
42
  it "should have the correct size" do
35
- expect(Docs.stats.size).to eq(Docs.collection.stats['size'])
43
+ Docs.stats.size.should == get_stats['size']
36
44
  end
37
45
 
38
46
  it "should have the correct storage size" do
39
- expect(Docs.stats.storage_size).to eq(Docs.collection.stats['storageSize'])
47
+ Docs.stats.storage_size.should == get_stats['storageSize']
40
48
  end
41
49
 
42
50
  it "should have the correct average object size" do
43
- expect(Docs.stats.avg_obj_size).to eq(Docs.collection.stats['avgObjSize'])
51
+ Docs.stats.avg_obj_size.should == get_stats['avgObjSize']
44
52
  end
45
53
 
46
54
  it "should have the correct number of extents" do
47
- expect(Docs.stats.num_extents).to eq(Docs.collection.stats['numExtents'])
55
+ if get_stats['numExtents']
56
+ Docs.stats.num_extents.should == get_stats['numExtents']
57
+ end
48
58
  end
49
59
 
50
60
  it "should have the correct number of indexes" do
51
- expect(Docs.stats.nindexes).to eq(Docs.collection.stats['nindexes'])
61
+ Docs.stats.nindexes.should == get_stats['nindexes']
52
62
  end
53
63
 
54
64
  it "should have the correct last extent size" do
55
- expect(Docs.stats.last_extent_size).to eq(Docs.collection.stats['lastExtentSize'])
65
+ if get_stats['lastExtentSize']
66
+ Docs.stats.last_extent_size.should == get_stats['lastExtentSize']
67
+ end
56
68
  end
57
69
 
58
70
  it "should have the correct padding factor" do
59
- expect(Docs.stats.padding_factor).to eq(Docs.collection.stats['paddingFactor'])
71
+ if get_stats['paddingFactor']
72
+ Docs.stats.padding_factor.should == get_stats['paddingFactor']
73
+ end
60
74
  end
61
75
 
62
76
  it "should have the correct user flags" do
63
- expect(Docs.stats.user_flags).to eq(Docs.collection.stats['userFlags'])
77
+ if get_stats['userFlags']
78
+ Docs.stats.user_flags.should == get_stats['userFlags']
79
+ end
64
80
  end
65
81
 
66
82
  it "should have the correct total index size" do
67
- expect(Docs.stats.total_index_size).to eq(Docs.collection.stats['totalIndexSize'])
83
+ Docs.stats.total_index_size.should == get_stats['totalIndexSize']
68
84
  end
69
85
  end
70
86
  end
@@ -157,8 +157,7 @@ describe "Validations" do
157
157
  doc = @document.new("name" => "joe")
158
158
  doc.save.should be_truthy
159
159
 
160
- allow(@document).to \
161
- receive(:first).
160
+ @document.stub(:first).
162
161
  with(:name => 'joe').
163
162
  and_return(doc)
164
163
 
@@ -171,8 +170,7 @@ describe "Validations" do
171
170
  doc = @document.new("name" => "joe")
172
171
  doc.save.should be_truthy
173
172
 
174
- allow(@document).to \
175
- receive(:first).
173
+ @document.stub(:first).
176
174
  with(:name => 'joe').
177
175
  and_return(doc)
178
176
 
@@ -189,8 +187,7 @@ describe "Validations" do
189
187
  doc = document.new("name" => "")
190
188
  doc.save.should be_truthy
191
189
 
192
- allow(@document).to \
193
- receive(:first).
190
+ @document.stub(:first).
194
191
  with(:name => '').
195
192
  and_return(doc)
196
193
 
@@ -272,8 +269,7 @@ describe "Validations" do
272
269
  doc = @document.new("name" => "joe", "scope" => "one")
273
270
  doc.save.should be_truthy
274
271
 
275
- allow(@document).to \
276
- receive(:first).
272
+ @document.stub(:first).
277
273
  with(:name => 'joe', :scope => "one").
278
274
  and_return(doc)
279
275
 
@@ -285,8 +281,7 @@ describe "Validations" do
285
281
  doc = @document.new("name" => "joe", "scope" => "one")
286
282
  doc.save.should be_truthy
287
283
 
288
- allow(@document).to \
289
- receive(:first).
284
+ @document.stub(:first).
290
285
  with(:name => 'joe', :scope => 'two').
291
286
  and_return(nil)
292
287
 
@@ -309,8 +304,7 @@ describe "Validations" do
309
304
  doc = @document.new("name" => "joe", "first_scope" => "one", "second_scope" => "two")
310
305
  doc.save.should be_truthy
311
306
 
312
- allow(@document).to \
313
- receive(:first).
307
+ @document.stub(:first).
314
308
  with(:name => 'joe', :first_scope => 'one', :second_scope => 'two').
315
309
  and_return(doc)
316
310
 
@@ -322,8 +316,7 @@ describe "Validations" do
322
316
  doc = @document.new("name" => "joe", "first_scope" => "one", "second_scope" => "two")
323
317
  doc.save.should be_truthy
324
318
 
325
- allow(@document).to \
326
- receive(:first).
319
+ @document.stub(:first).
327
320
  with(:name => 'joe', :first_scope => 'one', :second_scope => 'one').
328
321
  and_return(nil)
329
322
 
@@ -403,8 +396,7 @@ describe "Validations" do
403
396
  # doc = @document.create(:name => 'John')
404
397
  # doc.should_not have_error_on(:name)
405
398
  #
406
- # allow(@document).to \
407
- # receive(:first).
399
+ # @document.stub(:first).
408
400
  # with(:name => 'John').
409
401
  # and_return(doc)
410
402
  #
@@ -46,6 +46,6 @@ describe "The library itself" do
46
46
  error_messages << check_for_extra_spaces(filename)
47
47
  end
48
48
  end
49
- expect(error_messages.compact).to be_well_formed
49
+ error_messages.compact.should be_well_formed
50
50
  end
51
51
  end
@@ -2,10 +2,14 @@ $:.unshift(File.expand_path('../../lib', __FILE__))
2
2
 
3
3
  require 'rubygems'
4
4
  require 'bundler/setup'
5
+ Bundler.require(:default)
5
6
  require 'fileutils'
6
7
  require 'timecop'
7
8
  require "generator_spec/test_case"
8
- # require 'ruby-debug'
9
+
10
+ if RUBY_ENGINE == "ruby" && RUBY_VERSION >= '2.3'
11
+ require 'byebug'
12
+ end
9
13
 
10
14
  if RUBY_PLATFORM != "java"
11
15
  if ENV['TRAVIS']
@@ -40,7 +44,7 @@ def Doc(name='Class', &block)
40
44
  end
41
45
 
42
46
  klass.class_eval(&block) if block_given?
43
- klass.collection.remove
47
+ klass.collection.drop
44
48
  klass
45
49
  end
46
50
 
@@ -59,21 +63,28 @@ def EDoc(name='Class', &block)
59
63
  end
60
64
 
61
65
  def drop_indexes(klass)
62
- klass.collection.drop_indexes if klass.database.collection_names.include?(klass.collection.name)
66
+ klass.collection.indexes.drop_all if klass.database.collection_names.include?(klass.collection.name)
63
67
  end
64
68
 
65
69
  log_dir = File.expand_path('../../log', __FILE__)
66
70
  FileUtils.mkdir_p(log_dir) unless File.exist?(log_dir)
67
71
  logger = Logger.new(log_dir + '/test.log')
68
72
 
69
- MongoMapper.connection = Mongo::MongoClient.new('127.0.0.1', 27017, :logger => logger)
70
- MongoMapper.database = "test"
71
- MongoMapper.database.collections.each { |c| c.drop_indexes }
73
+ Mongo::Logger.logger = logger
74
+
75
+ MongoMapper.connection = Mongo::Client.new(['127.0.0.1:27017'], :database => 'test')
76
+ MongoMapper.database.collections.each { |c| c.indexes.drop_all }
72
77
  Dir[File.dirname(__FILE__) + "/support/**/*.rb"].each {|f| require f}
73
78
 
74
79
  RSpec.configure do |config|
80
+ config.example_status_persistence_file_path = "./spec/examples.txt"
81
+
75
82
  config.expect_with :rspec do |c|
76
- c.syntax = [:should, :expect]
83
+ c.syntax = :should
84
+ end
85
+
86
+ config.mock_with :rspec do |mocks|
87
+ mocks.syntax = :should
77
88
  end
78
89
 
79
90
  config.around(:each, :without_connection) do |example|
@@ -81,5 +92,18 @@ RSpec.configure do |config|
81
92
  example.run
82
93
  MongoMapper.connection = old
83
94
  end
84
- end
85
95
 
96
+ def suppress_stderr
97
+ begin
98
+ original_stderr = $stderr.clone
99
+ $stderr.reopen(File.new('/dev/null', 'w'))
100
+ retval = yield
101
+ rescue Exception => e
102
+ $stderr.reopen(original_stderr)
103
+ raise e
104
+ ensure
105
+ $stderr.reopen(original_stderr)
106
+ end
107
+ retval
108
+ end
109
+ end
@@ -10,6 +10,6 @@ end
10
10
 
11
11
  RSpec::Matchers.define :have_index do |index_name|
12
12
  match do |model|
13
- model.collection.index_information.detect { |index| index[0] == index_name }.present?
13
+ model.collection.indexes.get(index_name).present?
14
14
  end
15
15
  end