mongoo 0.2.4 → 0.3.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.
data/CHANGELOG CHANGED
@@ -1,12 +1,16 @@
1
1
  == Changelog
2
2
 
3
- === 0.2.2
3
+ === 0.3.0
4
+
5
+ * refactored a bunch of connection and async related stuff. see README
6
+
7
+ === 0.2.4
4
8
 
5
9
  * async mode works again, but now you have to manually require:
6
10
 
7
11
  require "mongoo/async"
8
- Mongoo.conn = Mongo::Connection.new("localhost", 27017, :pool_size => 5, :timeout => 5)
9
- Mongoo.db_name = "mongoo-test"
12
+ Mongoo.conn_opts = ["localhost", 27017, :pool_size => 5, :timeout => 5]
13
+ Mongoo.db_name = "mongoo-test"
10
14
 
11
15
  see test_async.rb for an example.
12
16
 
@@ -21,10 +25,10 @@
21
25
 
22
26
  * Can no longer set Mongoo.config = {...}
23
27
 
24
- Set Mongoo.conn and Mongoo.db_name instead (more flexibility):
28
+ Set Mongoo.conn_opts and Mongoo.db_name instead (more flexibility):
25
29
 
26
- Mongoo.conn = Mongo::Connection.new("localhost", 27017, :pool_size => 5, :timeout => 5)
27
- Mongoo.db_name = "mongoo-test"
30
+ Mongoo.conn_opts = ["localhost", 27017, :pool_size => 5, :timeout => 5]
31
+ Mongoo.db_name = "mongoo-test"
28
32
 
29
33
  You can set these on a model level as well:
30
34
 
data/Gemfile CHANGED
@@ -6,15 +6,15 @@ gem "i18n", ">= 0.4.1"
6
6
  gem "activesupport", ">= 3.0.3"
7
7
  gem "activemodel", ">= 3.0.3"
8
8
 
9
- gem "mongo", ">= 1.3.1"
10
-
11
- gem "em-synchrony", ">= 0.2.0"
9
+ gem "mongo", "~> 1.3.1"
10
+ gem "em-synchrony", "~> 0.2.0", :require => false
12
11
 
13
12
  # Add dependencies to develop your gem here.
14
13
  # Include everything needed to run rake, tests, features, etc.
15
14
  group :development do
15
+ gem "ruby-debug19", :require => 'ruby-debug'
16
16
  gem "shoulda", ">= 0"
17
17
  gem "bundler", "~> 1.0.0"
18
18
  gem "jeweler", "~> 1.5.1"
19
19
  gem "rcov", ">= 0"
20
- end
20
+ end
data/README.rdoc CHANGED
@@ -1,60 +1,17 @@
1
1
  = mongoo
2
2
 
3
- == Changelog
4
-
5
- === 0.2.2
6
-
7
- * async mode works again, but now you have to manually require:
8
-
9
- require "mongoo/async"
10
- Mongoo.conn = Mongo::Connection.new("localhost", 27017, :pool_size => 5, :timeout => 5)
11
- Mongoo.db_name = "mongoo-test"
12
-
13
- see test_async.rb for an example.
14
-
15
- === 0.2.1
16
-
17
- * Identity Map now also stores results from find.to_a, find.each and find.next
18
-
19
- === 0.2.0
20
-
21
- * Depends on mongo gem >= 1.3.1
22
-
23
-
24
- * Can no longer set Mongoo.config = {...}
25
-
26
- Set Mongoo.conn and Mongoo.db_name instead (more flexibility):
27
-
28
- Mongoo.conn = Mongo::Connection.new("localhost", 27017, :pool_size => 5, :timeout => 5)
29
- Mongoo.db_name = "mongoo-test"
30
-
31
- You can set these on a model level as well:
32
-
33
- Person.conn = Mongo::Connection.new("localhost", 30000, :pool_size => 5, :timeout => 5)
34
- Person.db_name = "mongoo-test"
35
-
36
-
37
- * You can optionally set the collection name on a model now:
38
-
39
- class Person < Mongoo::Base
40
- collection_name "spacemen"
41
- end
42
-
43
-
44
- * There is a new Identity Map feature available. It will only work when using find_one to
45
- find a specific id. You need to manually turn it on:
46
-
47
- Mongoo::IdentityMap.on!
48
-
49
- If using it in a web application like Rails be sure to flush the map after each request:
50
-
51
- Mongoo::IdentityMap.flush!
52
-
53
- The map is scoped to the current thread or fiber. You can also turn the map back off:
54
-
55
- Mongoo::IdentityMap.off!
56
-
57
- Inspired by: http://railstips.org/blog/archives/2010/02/21/mongomapper-07-identity-map/
3
+ == Latest Version: 0.3.0
4
+
5
+ Usage (normal):
6
+ require 'mongoo'
7
+ Mongoo.conn = lambda { Mongo::Connection.new("localhost", 27017, :pool_size => 5, :timeout => 5) }
8
+ Mongoo.db = "mongoo-test"
9
+
10
+ Usage (async/em-synchrony):
11
+ require 'mongoo'
12
+ require 'mongoo/async'
13
+ Mongoo.conn = lambda { Mongo::Connection.new("localhost", 27017, :pool_size => 5, :timeout => 5) }
14
+ Mongoo.db = "mongoo-test"
58
15
 
59
16
  == Contributing to mongoo
60
17
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.4
1
+ 0.3.0
data/lib/mongoo.rb CHANGED
@@ -1,38 +1,46 @@
1
+ unless defined?(Mongo)
2
+ require "mongo"
3
+ end
4
+
5
+ # Mongoo.conn = lambda { Mongo::Connection.new("localhost", 27017, :pool_size => 5, :timeout => 5) }
6
+ # Mongoo.db = "mydb"
7
+ # Mongoo.conn => #<Mongo::Connection:0x00000100db8ac0>
8
+
1
9
  module Mongoo
2
10
  INDEX_META = {}
3
11
  ATTRIBUTE_META = {}
4
12
 
5
13
  class << self
6
- attr_accessor :conn_opts, :db_name, :verbose_debug
14
+ attr_accessor :verbose_debug
7
15
 
8
- def conn
9
- Thread.current[:mongoo] ||= {}
10
- Thread.current[:mongoo][:conn] ||= Mongo::Connection.new(*conn_opts)
16
+ def conn=(conn_lambda)
17
+ @conn_lambda = conn_lambda
18
+ @_conn = nil
19
+ @_db = nil
20
+ @conn_lambda
11
21
  end
12
22
 
13
- def db
14
- Thread.current[:mongoo] ||= {}
15
- Thread.current[:mongoo][:db] ||= conn.db(db_name)
23
+ def db=(db_name)
24
+ @db_name = db_name
25
+ @_db = nil
26
+ @db_name
16
27
  end
17
28
 
18
- def reset_connection!
19
- if Thread.current[:mongoo]
20
- Thread.current[:mongoo][:db] = nil
21
- if Thread.current[:mongoo][:conn]
22
- Thread.current[:mongoo][:conn].close
23
- Thread.current[:mongoo][:conn] = nil
24
- end
25
- end; true
29
+ def conn
30
+ @_conn ||= (@conn_lambda && @conn_lambda.call)
31
+ end
32
+
33
+ def db
34
+ @_db ||= (conn && conn.db(@db_name))
26
35
  end
27
36
 
28
- def mode
29
- :sync
37
+ def async?
38
+ Mongo.async?
30
39
  end
31
40
  end
32
41
  end
33
42
 
34
43
  require "forwardable"
35
- require "mongo"
36
44
 
37
45
  require "active_support/core_ext"
38
46
  require "active_model"
data/lib/mongoo/async.rb CHANGED
@@ -1,71 +1,151 @@
1
- require "em-synchrony"
2
- require "em-synchrony/tcpsocket"
3
-
4
- module Mongoo
5
- def self.suppress_warnings
6
- original_verbosity = $VERBOSE
7
- $VERBOSE = nil
8
- result = yield
9
- $VERBOSE = original_verbosity
10
- return result
1
+ unless defined?(Mongo)
2
+ raise "!! mongoo/async must be loaded AFTER mongo !!"
3
+ end
4
+
5
+ original_verbosity = $VERBOSE
6
+ $VERBOSE = nil
7
+
8
+ require 'em-synchrony'
9
+ require 'em-synchrony/tcpsocket'
10
+ require 'em-synchrony/thread'
11
+
12
+ module Mongo
13
+
14
+ class Connection
15
+ TCPSocket = ::EventMachine::Synchrony::TCPSocket
16
+ Mutex = ::EventMachine::Synchrony::Thread::Mutex
17
+ ConditionVariable = ::EventMachine::Synchrony::Thread::ConditionVariable
18
+ end
19
+
20
+ def self.async?
21
+ true
11
22
  end
23
+
12
24
  end
13
25
 
14
- module Mongoo
15
- class FakeMutex
16
- def initialize
17
- end
18
26
 
19
- def synchronize
20
- yield
21
- end
27
+ module Mongo
28
+ class EMPool
29
+ TCPSocket = ::EventMachine::Synchrony::TCPSocket
22
30
 
23
- def lock
24
- true
31
+ attr_accessor :host, :port, :size, :timeout, :safe, :checked_out
32
+
33
+ # Create a new pool of connections.
34
+ #
35
+ def initialize(connection, host, port, opts={})
36
+ @connection = connection
37
+
38
+ @host, @port = host, port
39
+
40
+ # Pool size and timeout.
41
+ @size = opts[:size] || 1
42
+ @timeout = opts[:timeout] || 5.0
43
+
44
+ # Operations to perform on a socket
45
+ @socket_ops = Hash.new { |h, k| h[k] = [] }
46
+
47
+ @all = []
48
+ @reserved = {} # map of in-progress connections
49
+ @available = [] # pool of free connections
50
+ @pending = [] # pending reservations (FIFO)
51
+
52
+ setup_pool!(host, port)
25
53
  end
26
54
 
27
- def locked?
28
- false
55
+ def setup_pool!(host, port)
56
+ @size.times do |i|
57
+ sock = checkout_new_socket(host, port)
58
+ @all << sock
59
+ @available << sock
60
+ end
29
61
  end
30
62
 
31
- def sleep(timeout=nil)
32
- true
63
+ def close
64
+ @all.each do |sock|
65
+ begin
66
+ sock.close
67
+ rescue IOError => ex
68
+ warn "IOError when attempting to close socket connected to #{@host}:#{@port}: #{ex.inspect}"
69
+ end
70
+ end
71
+ @host = @port = nil
72
+ @all.clear
73
+ @reserved.clear
74
+ @available.clear
75
+ @pending.clear
33
76
  end
34
77
 
35
- def try_lock
78
+ # Return a socket to the pool.
79
+ def checkin(socket)
80
+ fiber = Fiber.current
81
+
82
+ @available.push(@reserved.delete(fiber.object_id))
83
+ if pending = @pending.shift
84
+ pending.resume
85
+ end
36
86
  true
37
87
  end
38
88
 
39
- def unlock
40
- true
89
+ # If a user calls DB#authenticate, and several sockets exist,
90
+ # then we need a way to apply the authentication on each socket.
91
+ # So we store the apply_authentication method, and this will be
92
+ # applied right before the next use of each socket.
93
+ def authenticate_existing
94
+ @all.each do |socket|
95
+ @socket_ops[socket] << Proc.new do
96
+ @connection.apply_saved_authentication(:socket => socket)
97
+ end
98
+ end
41
99
  end
42
- end
43
- end
44
100
 
45
- Mongoo.suppress_warnings do
46
- module Mongo
47
- class Connection
48
- Mutex = Mongoo::FakeMutex
49
- TCPSocket = TCPSocket = ::EventMachine::Synchrony::TCPSocket
101
+ # Store the logout op for each existing socket to be applied before
102
+ # the next use of each socket.
103
+ def logout_existing(db)
104
+ @all.each do |socket|
105
+ @socket_ops[socket] << Proc.new do
106
+ @connection.db(db).issue_logout(:socket => socket)
107
+ end
108
+ end
50
109
  end
51
- end
52
110
 
53
- module Mongo
54
- class Pool
55
- Mutex = Mongoo::FakeMutex
56
- TCPSocket = TCPSocket = ::EventMachine::Synchrony::TCPSocket
111
+ # Check out an existing socket or create a new socket if the maximum
112
+ # pool size has not been exceeded. Otherwise, wait for the next
113
+ # available socket.
114
+ def checkout
115
+ fiber = Fiber.current
116
+ #puts "[P: #{@pending.size}, A: #{@available.size}, ALL: #{@all.size}]"
117
+ if socket = @available.pop
118
+ @reserved[fiber.object_id] = socket
119
+ socket
120
+ else
121
+ Fiber.yield @pending.push fiber
122
+ checkout
123
+ end
57
124
  end
58
- end
59
- end
60
125
 
61
- module Mongoo
62
- def self.mode
63
- :async
64
- end
65
- end
126
+ # Adds a new socket to the pool and checks it out.
127
+ #
128
+ # This method is called exclusively from #checkout;
129
+ # therefore, it runs within a mutex.
130
+ def checkout_new_socket(host, port)
131
+ return nil if @all.size >= @size
66
132
 
67
- if ENV["MONGOO_DEBUG"] == "1"
68
- puts "* Mongoo Running in Asynchronous Mode"
69
- puts " ==> Mongo::Pool::TCPSocket: #{Mongo::Pool::TCPSocket.to_s}"
70
- puts " ==> Mongo::Connection::TCPSocket: #{Mongo::Pool::TCPSocket.to_s}"
71
- end
133
+ begin
134
+ socket = TCPSocket.new(host, port)
135
+ socket.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1)
136
+ rescue => ex
137
+ raise ConnectionFailure, "Failed to connect to host #{@host} and port #{@port}: #{ex}"
138
+ end
139
+
140
+ # If any saved authentications exist, we want to apply those
141
+ # when creating new sockets.
142
+ @connection.apply_saved_authentication(:socket => socket)
143
+
144
+ socket
145
+ end; protected :checkout_new_socket
146
+ end # EMPool
147
+ end # Mongo
148
+
149
+ Mongo::Pool = Mongo::EMPool
150
+
151
+ $VERBOSE = original_verbosity
@@ -25,20 +25,37 @@ module Mongoo
25
25
  end
26
26
  end
27
27
 
28
- def collection
29
- db.collection(collection_name)
28
+ def conn=(conn_lambda)
29
+ @conn_lambda = conn_lambda
30
+ @_conn = nil
31
+ @_db = nil
32
+ @collection = nil
33
+ @conn_lambda
34
+ end
35
+
36
+ def db=(db_name)
37
+ @db_name = db_name
38
+ @_db = nil
39
+ @collection = nil
40
+ @db_name
30
41
  end
31
42
 
32
43
  def conn
33
- Mongoo.conn
44
+ @_conn ||= ((@conn_lambda && @conn_lambda.call) || Mongoo.conn)
34
45
  end
35
46
 
36
47
  def db
37
- Mongoo.db
48
+ @_db ||= begin
49
+ if db_name = (@db_name || (@conn_lambda && Mongoo.db.name))
50
+ conn.db(db_name)
51
+ else
52
+ Mongoo.db
53
+ end
54
+ end
38
55
  end
39
56
 
40
- def db_name
41
- Mongoo.db_name
57
+ def collection
58
+ @collection ||= db.collection(collection_name)
42
59
  end
43
60
 
44
61
  def find(query={}, opts={})
data/mongoo.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{mongoo}
8
- s.version = "0.2.4"
8
+ s.version = "0.3.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Ben Myles"]
12
- s.date = %q{2011-05-11}
12
+ s.date = %q{2011-05-13}
13
13
  s.description = %q{Simple object mapper for MongoDB}
14
14
  s.email = %q{ben.myles@gmail.com}
15
15
  s.extra_rdoc_files = [
@@ -48,7 +48,7 @@ Gem::Specification.new do |s|
48
48
  s.homepage = %q{http://github.com/benmyles/mongoo}
49
49
  s.licenses = ["MIT"]
50
50
  s.require_paths = ["lib"]
51
- s.rubygems_version = %q{1.6.2}
51
+ s.rubygems_version = %q{1.6.1}
52
52
  s.summary = %q{Object mapper for MongoDB}
53
53
  s.test_files = [
54
54
  "test/helper.rb",
@@ -66,8 +66,9 @@ Gem::Specification.new do |s|
66
66
  s.add_runtime_dependency(%q<i18n>, [">= 0.4.1"])
67
67
  s.add_runtime_dependency(%q<activesupport>, [">= 3.0.3"])
68
68
  s.add_runtime_dependency(%q<activemodel>, [">= 3.0.3"])
69
- s.add_runtime_dependency(%q<mongo>, [">= 1.3.1"])
70
- s.add_runtime_dependency(%q<em-synchrony>, [">= 0.2.0"])
69
+ s.add_runtime_dependency(%q<mongo>, ["~> 1.3.1"])
70
+ s.add_runtime_dependency(%q<em-synchrony>, ["~> 0.2.0"])
71
+ s.add_development_dependency(%q<ruby-debug19>, [">= 0"])
71
72
  s.add_development_dependency(%q<shoulda>, [">= 0"])
72
73
  s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
73
74
  s.add_development_dependency(%q<jeweler>, ["~> 1.5.1"])
@@ -76,8 +77,9 @@ Gem::Specification.new do |s|
76
77
  s.add_dependency(%q<i18n>, [">= 0.4.1"])
77
78
  s.add_dependency(%q<activesupport>, [">= 3.0.3"])
78
79
  s.add_dependency(%q<activemodel>, [">= 3.0.3"])
79
- s.add_dependency(%q<mongo>, [">= 1.3.1"])
80
- s.add_dependency(%q<em-synchrony>, [">= 0.2.0"])
80
+ s.add_dependency(%q<mongo>, ["~> 1.3.1"])
81
+ s.add_dependency(%q<em-synchrony>, ["~> 0.2.0"])
82
+ s.add_dependency(%q<ruby-debug19>, [">= 0"])
81
83
  s.add_dependency(%q<shoulda>, [">= 0"])
82
84
  s.add_dependency(%q<bundler>, ["~> 1.0.0"])
83
85
  s.add_dependency(%q<jeweler>, ["~> 1.5.1"])
@@ -87,8 +89,9 @@ Gem::Specification.new do |s|
87
89
  s.add_dependency(%q<i18n>, [">= 0.4.1"])
88
90
  s.add_dependency(%q<activesupport>, [">= 3.0.3"])
89
91
  s.add_dependency(%q<activemodel>, [">= 3.0.3"])
90
- s.add_dependency(%q<mongo>, [">= 1.3.1"])
91
- s.add_dependency(%q<em-synchrony>, [">= 0.2.0"])
92
+ s.add_dependency(%q<mongo>, ["~> 1.3.1"])
93
+ s.add_dependency(%q<em-synchrony>, ["~> 0.2.0"])
94
+ s.add_dependency(%q<ruby-debug19>, [">= 0"])
92
95
  s.add_dependency(%q<shoulda>, [">= 0"])
93
96
  s.add_dependency(%q<bundler>, ["~> 1.0.0"])
94
97
  s.add_dependency(%q<jeweler>, ["~> 1.5.1"])
data/test/helper.rb CHANGED
@@ -2,12 +2,6 @@ require 'rubygems'
2
2
  require 'bundler'
3
3
  begin
4
4
  groups = [:default, :development]
5
-
6
- if ENV["MONGOO_ASYNC"]
7
- groups << :async
8
- else
9
- groups << :sync
10
- end
11
5
  Bundler.setup(groups)
12
6
  rescue Bundler::BundlerError => e
13
7
  $stderr.puts e.message
@@ -16,13 +10,14 @@ rescue Bundler::BundlerError => e
16
10
  end
17
11
  require 'test/unit'
18
12
  require 'shoulda'
13
+ require 'ruby-debug'
19
14
 
20
15
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
21
16
  $LOAD_PATH.unshift(File.dirname(__FILE__))
22
17
  require 'mongoo'
23
18
 
24
- Mongoo.conn_opts = ["localhost", 27017, :pool_size => 5, :timeout => 5]
25
- Mongoo.db_name = "mongoo-test"
19
+ Mongoo.conn = lambda { Mongo::Connection.new("localhost", 27017, :pool_size => 5, :timeout => 5) }
20
+ Mongoo.db = "mongoo-test"
26
21
 
27
22
  class SearchIndex < Mongoo::Base
28
23
  attribute "terms", :type => :array
data/test/test_mongoo.rb CHANGED
@@ -9,6 +9,46 @@ class TestMongoo < Test::Unit::TestCase
9
9
  end
10
10
  end
11
11
 
12
+ should "be able to use a different db for each model" do
13
+ assert_equal "mongoo-test", Mongoo.db.name
14
+ assert_equal "mongoo-test", Person.db.name
15
+
16
+ Person.new(name: "mongoo-test").insert!
17
+ assert_equal 1, Person.count
18
+ assert_equal "mongoo-test", Person.find.next.name
19
+
20
+ Person.db = "mongoo-test-people"
21
+ assert_equal "mongoo-test-people", Person.db.name
22
+
23
+ assert_equal 0, Person.count
24
+ assert_equal 1, Mongoo.db.collection("people").count
25
+
26
+ Person.new(name: "mongoo-test-people").insert!
27
+ assert_equal 1, Person.count
28
+ assert_equal "mongoo-test-people", Person.find.next.name
29
+
30
+ Person.collection.drop
31
+ Person.db = nil
32
+ Person.conn = nil
33
+
34
+ assert_equal 1, Person.count
35
+ assert_equal "mongoo-test", Person.find.next.name
36
+ end
37
+
38
+ should "be able to use a different connection for each model" do
39
+ assert_equal Person.conn.object_id, Mongoo.conn.object_id
40
+ assert_equal Person.collection.db.connection.object_id, Mongoo.conn.object_id
41
+ Person.conn = lambda { Mongo::Connection.new("localhost", 27017, :pool_size => 5, :timeout => 5) }
42
+ assert_not_equal Person.conn.object_id, Mongoo.conn.object_id
43
+
44
+ assert_not_equal Person.collection.db.connection.object_id, Mongoo.conn.object_id
45
+
46
+ assert_equal Person.collection.db.connection.object_id, Person.conn.object_id
47
+ Person.conn = nil
48
+ assert_equal Person.conn.object_id, Mongoo.conn.object_id
49
+ assert_equal Person.collection.db.connection.object_id, Mongoo.conn.object_id
50
+ end
51
+
12
52
  should "set and get attributes" do
13
53
  p = Person.new("name" => "Ben")
14
54
  assert_equal "Ben", p.g(:name)
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: mongoo
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.2.4
5
+ version: 0.3.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - Ben Myles
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-05-11 00:00:00 -07:00
13
+ date: 2011-05-13 00:00:00 -07:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -51,7 +51,7 @@ dependencies:
51
51
  requirement: &id004 !ruby/object:Gem::Requirement
52
52
  none: false
53
53
  requirements:
54
- - - ">="
54
+ - - ~>
55
55
  - !ruby/object:Gem::Version
56
56
  version: 1.3.1
57
57
  type: :runtime
@@ -62,14 +62,14 @@ dependencies:
62
62
  requirement: &id005 !ruby/object:Gem::Requirement
63
63
  none: false
64
64
  requirements:
65
- - - ">="
65
+ - - ~>
66
66
  - !ruby/object:Gem::Version
67
67
  version: 0.2.0
68
68
  type: :runtime
69
69
  prerelease: false
70
70
  version_requirements: *id005
71
71
  - !ruby/object:Gem::Dependency
72
- name: shoulda
72
+ name: ruby-debug19
73
73
  requirement: &id006 !ruby/object:Gem::Requirement
74
74
  none: false
75
75
  requirements:
@@ -80,8 +80,19 @@ dependencies:
80
80
  prerelease: false
81
81
  version_requirements: *id006
82
82
  - !ruby/object:Gem::Dependency
83
- name: bundler
83
+ name: shoulda
84
84
  requirement: &id007 !ruby/object:Gem::Requirement
85
+ none: false
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: "0"
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: *id007
93
+ - !ruby/object:Gem::Dependency
94
+ name: bundler
95
+ requirement: &id008 !ruby/object:Gem::Requirement
85
96
  none: false
86
97
  requirements:
87
98
  - - ~>
@@ -89,10 +100,10 @@ dependencies:
89
100
  version: 1.0.0
90
101
  type: :development
91
102
  prerelease: false
92
- version_requirements: *id007
103
+ version_requirements: *id008
93
104
  - !ruby/object:Gem::Dependency
94
105
  name: jeweler
95
- requirement: &id008 !ruby/object:Gem::Requirement
106
+ requirement: &id009 !ruby/object:Gem::Requirement
96
107
  none: false
97
108
  requirements:
98
109
  - - ~>
@@ -100,10 +111,10 @@ dependencies:
100
111
  version: 1.5.1
101
112
  type: :development
102
113
  prerelease: false
103
- version_requirements: *id008
114
+ version_requirements: *id009
104
115
  - !ruby/object:Gem::Dependency
105
116
  name: rcov
106
- requirement: &id009 !ruby/object:Gem::Requirement
117
+ requirement: &id010 !ruby/object:Gem::Requirement
107
118
  none: false
108
119
  requirements:
109
120
  - - ">="
@@ -111,7 +122,7 @@ dependencies:
111
122
  version: "0"
112
123
  type: :development
113
124
  prerelease: false
114
- version_requirements: *id009
125
+ version_requirements: *id010
115
126
  description: Simple object mapper for MongoDB
116
127
  email: ben.myles@gmail.com
117
128
  executables: []
@@ -163,7 +174,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
163
174
  requirements:
164
175
  - - ">="
165
176
  - !ruby/object:Gem::Version
166
- hash: -1209992361420793263
177
+ hash: -3196476684317221338
167
178
  segments:
168
179
  - 0
169
180
  version: "0"
@@ -176,7 +187,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
176
187
  requirements: []
177
188
 
178
189
  rubyforge_project:
179
- rubygems_version: 1.6.2
190
+ rubygems_version: 1.6.1
180
191
  signing_key:
181
192
  specification_version: 3
182
193
  summary: Object mapper for MongoDB