mongoo 0.1.5 → 0.2.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.
@@ -0,0 +1,39 @@
1
+ = 0.2.0
2
+
3
+ * Depends on mongo gem >= 1.3.1
4
+
5
+
6
+ * Can no longer set Mongoo.config = {...}
7
+
8
+ Set Mongoo.conn and Mongoo.db_name instead (more flexibility):
9
+
10
+ Mongoo.conn = Mongo::Connection.new("localhost", 27017, :pool_size => 5, :timeout => 5)
11
+ Mongoo.db_name = "mongoo-test"
12
+
13
+ You can set these on a model level as well:
14
+
15
+ Person.conn = Mongo::Connection.new("localhost", 30000, :pool_size => 5, :timeout => 5)
16
+ Person.db_name = "mongoo-test"
17
+
18
+
19
+ * You can optionally set the collection name on a model now:
20
+
21
+ class Person < Mongoo::Base
22
+ collection_name "spacemen"
23
+ end
24
+
25
+
26
+ * There is a new Identity Map feature available. It will only work when using find_one to
27
+ find a specific id. You need to manually turn it on:
28
+
29
+ Mongoo::IdentityMap.on!
30
+
31
+ If using it in a web application like Rails be sure to flush the map after each request:
32
+
33
+ Mongoo::IdentityMap.flush!
34
+
35
+ The map is scoped to the current thread or fiber. You can also turn the map back off:
36
+
37
+ Mongoo::IdentityMap.off!
38
+
39
+ Inspired by: http://railstips.org/blog/archives/2010/02/21/mongomapper-07-identity-map/
data/Gemfile CHANGED
@@ -5,8 +5,8 @@ source "http://rubygems.org"
5
5
  gem "i18n", ">= 0.4.1"
6
6
  gem "activesupport", ">= 3.0.3"
7
7
  gem "activemodel", ">= 3.0.3"
8
- #gem "bson_ext", ">= 1.2.4"
9
- gem "mongo", ">= 1.2.4"
8
+
9
+ gem "mongo", ">= 1.3.1"
10
10
 
11
11
  gem "em-synchrony", ">= 0.2.0"
12
12
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.5
1
+ 0.2.0
@@ -1,32 +1,9 @@
1
1
  module Mongoo
2
2
  INDEX_META = {}
3
3
  ATTRIBUTE_META = {}
4
-
5
- def self.config
6
- { host: "127.0.0.1",
7
- port: 27017,
8
- db: "test",
9
- opts: {}}.merge(@config || {})
10
- end
11
-
12
- def self.config=(cfg)
13
- @config = cfg
14
- end
15
-
16
- def self.conn
17
- @conn ||= Mongo::Connection.new(config[:host], config[:port], config[:opts])
18
- end
19
-
20
- def self.db
21
- @db ||= conn.db(config[:db])
22
- end
23
-
24
- def self.verbose_debug
25
- @verbose_debug
26
- end
27
-
28
- def self.verbose_debug=(val)
29
- @verbose_debug = val
4
+
5
+ class << self
6
+ attr_accessor :conn, :db_name, :verbose_debug
30
7
  end
31
8
  end
32
9
 
@@ -47,3 +24,4 @@ require "mongoo/persistence"
47
24
  require "mongoo/modifiers"
48
25
  require "mongoo/base"
49
26
  require "mongoo/mongohash"
27
+ require "mongoo/identity_map"
@@ -0,0 +1,65 @@
1
+ module Mongoo
2
+ class IdentityMap
3
+
4
+ class << self
5
+
6
+ def on!
7
+ @on = true
8
+ end
9
+
10
+ def on?
11
+ @on == true
12
+ end
13
+
14
+ def off!
15
+ @on = false
16
+ if Thread.current[:mongoo]
17
+ Thread.current[:mongoo][:identity_map] = nil
18
+ end; true
19
+ end
20
+
21
+ def off?
22
+ @on == false
23
+ end
24
+
25
+ def store
26
+ return nil unless on?
27
+ Thread.current[:mongoo] ||= {}
28
+ Thread.current[:mongoo][:identity_map] ||= {}
29
+ Thread.current[:mongoo][:identity_map][:store] ||= {}
30
+ end
31
+
32
+ def simple_query?(query, opts)
33
+ return false unless opts.blank?
34
+ return true if query.is_a?(BSON::ObjectId)
35
+ return true if [[:_id], ["_id"]].include?(query.keys)
36
+ false
37
+ end
38
+
39
+ def read(id)
40
+ if store
41
+ if id.is_a?(BSON::ObjectId)
42
+ store[id.to_s]
43
+ elsif id.is_a?(Hash)
44
+ store[(id[:_id] || id["_id"]).to_s]
45
+ end
46
+ end
47
+ end
48
+
49
+ def write(doc)
50
+ if store
51
+ store[doc.id.to_s] = doc
52
+ end
53
+ end
54
+
55
+ def flush!
56
+ if store
57
+ Thread.current[:mongoo][:identity_map][:store] = {}
58
+ true
59
+ end
60
+ end
61
+
62
+ end
63
+
64
+ end
65
+ end
@@ -6,95 +6,116 @@ module Mongoo
6
6
  class UpdateError < Exception; end
7
7
  class RemoveError < Exception; end
8
8
  class NotValidError < Exception; end
9
-
9
+
10
+ class DbNameNotSet < Exception; end
11
+ class ConnNotSet < Exception; end
12
+
10
13
  module Persistence
11
-
14
+
12
15
  def self.included(base)
13
16
  base.extend(ClassMethods)
14
17
  end
15
-
16
- module ClassMethods
17
- def collection_name
18
- @collection_name ||= self.model_name.tableize
18
+
19
+ module ClassMethods
20
+ def collection_name(val=nil)
21
+ if val
22
+ @collection_name = val
23
+ @collection = nil
24
+ @collection_name
25
+ else
26
+ @collection_name ||= self.model_name.tableize
27
+ end
19
28
  end
20
-
29
+
21
30
  def collection
22
31
  @collection ||= db.collection(collection_name)
23
32
  end
24
-
33
+
25
34
  def conn
26
35
  @conn ||= begin
27
- if Mongoo.config == config
28
- Mongoo.conn
29
- else
30
- Mongo::Connection.new(config[:host], config[:port], config[:opts])
31
- end
36
+ Mongoo.conn || raise(Mongoo::ConnNotSet)
32
37
  end
33
38
  end
34
-
35
- def db
36
- @db ||= begin
37
- if Mongoo.config == config
38
- Mongoo.db
39
- else
40
- conn.db(config[:db])
41
- end
42
- end
39
+
40
+ def conn=(conn)
41
+ @conn = conn
42
+ @db = nil
43
+ @collection = nil
44
+ @conn
43
45
  end
44
-
45
- def config=(cfg)
46
- @config = cfg
46
+
47
+ def db
48
+ @db ||= conn.db(db_name)
47
49
  end
48
-
49
- def config
50
- @config || Mongoo.config
50
+
51
+ def db_name
52
+ @db_name ||= begin
53
+ Mongoo.db_name || raise(Mongoo::DbNameNotSet)
54
+ end
51
55
  end
52
-
53
- def db=(db)
54
- @db = db
56
+
57
+ def db_name=(db_name)
58
+ @db_name = db_name
59
+ @db = nil
60
+ @collection = nil
61
+ @db_name
55
62
  end
56
-
63
+
57
64
  def find(query={}, opts={})
58
65
  Mongoo::Cursor.new(self, collection.find(query, opts))
59
66
  end
60
-
67
+
61
68
  def find_one(query={}, opts={})
62
- return nil unless doc = collection.find_one(query, opts)
63
- new(doc, true)
69
+ id_map_on = Mongoo::IdentityMap.on?
70
+ is_simple_query = Mongoo::IdentityMap.simple_query?(query, opts)
71
+
72
+ if id_map_on && is_simple_query
73
+ if doc = Mongoo::IdentityMap.read(query)
74
+ return doc
75
+ end
76
+ end
77
+
78
+ if doc = collection.find_one(query, opts)
79
+ doc = new(doc, true)
80
+ Mongoo::IdentityMap.write(doc) if id_map_on && is_simple_query
81
+ doc
82
+ else
83
+ nil
84
+ end
64
85
  end
65
-
86
+
66
87
  def all
67
88
  find
68
89
  end
69
-
90
+
70
91
  def each
71
92
  find.each { |found| yield(found) }
72
93
  end
73
-
94
+
74
95
  def first
75
96
  find.limit(1).next_document
76
97
  end
77
-
98
+
78
99
  def empty?
79
100
  count == 0
80
101
  end
81
-
102
+
82
103
  def count
83
104
  collection.count
84
105
  end
85
-
106
+
86
107
  def drop
87
108
  collection.drop
88
109
  end
89
-
110
+
90
111
  def index_meta
91
112
  Mongoo::INDEX_META[self.collection_name] ||= {}
92
113
  end
93
-
114
+
94
115
  def index(spec, opts={})
95
116
  self.index_meta[spec] = opts
96
117
  end
97
-
118
+
98
119
  def create_indexes
99
120
  self.index_meta.each do |spec, opts|
100
121
  opts[:background] = true if !opts.has_key?(:background)
@@ -102,30 +123,30 @@ module Mongoo
102
123
  end; true
103
124
  end
104
125
  end # ClassMethods
105
-
126
+
106
127
  def to_param
107
128
  persisted? ? get("_id").to_s : nil
108
129
  end
109
-
130
+
110
131
  def to_key
111
132
  get("_id")
112
133
  end
113
-
134
+
114
135
  def to_model
115
136
  self
116
137
  end
117
-
138
+
118
139
  def persisted?
119
140
  @persisted == true
120
141
  #!get("_id").nil?
121
142
  end
122
-
143
+
123
144
  def collection
124
145
  self.class.collection
125
146
  end
126
-
147
+
127
148
  def insert(opts={})
128
- _run_insert_callbacks do
149
+ ret = _run_insert_callbacks do
129
150
  if persisted?
130
151
  raise AlreadyInsertedError, "document has already been inserted"
131
152
  end
@@ -145,12 +166,14 @@ module Mongoo
145
166
  set_persisted_mongohash(mongohash.deep_clone)
146
167
  ret
147
168
  end
169
+ Mongoo::IdentityMap.write(self) if Mongoo::IdentityMap.on?
170
+ ret
148
171
  end
149
-
172
+
150
173
  def insert!(opts={})
151
174
  insert(opts.merge(:safe => true))
152
175
  end
153
-
176
+
154
177
  def update(opts={})
155
178
  _run_update_callbacks do
156
179
  unless persisted?
@@ -185,19 +208,19 @@ module Mongoo
185
208
  end
186
209
  end
187
210
  end
188
-
211
+
189
212
  def update!(opts={})
190
213
  update(opts.merge(:safe => true))
191
214
  end
192
-
215
+
193
216
  def destroyed?
194
217
  @destroyed != nil
195
218
  end
196
-
219
+
197
220
  def new_record?
198
221
  !persisted?
199
222
  end
200
-
223
+
201
224
  def remove(opts={})
202
225
  _run_remove_callbacks do
203
226
  unless persisted?
@@ -213,18 +236,18 @@ module Mongoo
213
236
  end
214
237
  end
215
238
  end
216
-
239
+
217
240
  def remove!(opts={})
218
241
  remove(opts.merge(:safe => true))
219
242
  end
220
-
243
+
221
244
  def reload
222
245
  init_from_hash(collection.find_one(get("_id")))
223
246
  @persisted = true
224
247
  set_persisted_mongohash(mongohash.deep_clone)
225
248
  true
226
249
  end
227
-
250
+
228
251
  def build_update_hash(changelog)
229
252
  update_hash = {}
230
253
  changelog.each do |op, k, v|
@@ -234,7 +257,7 @@ module Mongoo
234
257
  update_hash
235
258
  end
236
259
  protected :build_update_hash
237
-
260
+
238
261
  def build_update_query_hash(persisted_mongohash_kv, changelog)
239
262
  update_query_hash = {}
240
263
  changelog.each do |op, k, v|
@@ -251,6 +274,6 @@ module Mongoo
251
274
  update_query_hash
252
275
  end
253
276
  protected :build_update_query_hash
254
-
277
+
255
278
  end
256
279
  end
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{mongoo}
8
- s.version = "0.1.3"
8
+ s.version = "0.2.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-03-28}
12
+ s.date = %q{2011-05-11}
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 = [
@@ -19,6 +19,7 @@ Gem::Specification.new do |s|
19
19
  s.files = [
20
20
  ".document",
21
21
  ".rvmrc",
22
+ "CHANGELOG",
22
23
  "Gemfile",
23
24
  "LICENSE.txt",
24
25
  "README.rdoc",
@@ -32,23 +33,26 @@ Gem::Specification.new do |s|
32
33
  "lib/mongoo/changelog.rb",
33
34
  "lib/mongoo/cursor.rb",
34
35
  "lib/mongoo/hash_ext.rb",
36
+ "lib/mongoo/identity_map.rb",
35
37
  "lib/mongoo/modifiers.rb",
36
38
  "lib/mongoo/mongohash.rb",
37
39
  "lib/mongoo/persistence.rb",
38
40
  "mongoo.gemspec",
39
41
  "test/helper.rb",
40
42
  "test/test_activemodel.rb",
43
+ "test/test_identity_map.rb",
41
44
  "test/test_mongohash.rb",
42
45
  "test/test_mongoo.rb"
43
46
  ]
44
47
  s.homepage = %q{http://github.com/benmyles/mongoo}
45
48
  s.licenses = ["MIT"]
46
49
  s.require_paths = ["lib"]
47
- s.rubygems_version = %q{1.6.2}
50
+ s.rubygems_version = %q{1.6.1}
48
51
  s.summary = %q{Object mapper for MongoDB}
49
52
  s.test_files = [
50
53
  "test/helper.rb",
51
54
  "test/test_activemodel.rb",
55
+ "test/test_identity_map.rb",
52
56
  "test/test_mongohash.rb",
53
57
  "test/test_mongoo.rb"
54
58
  ]
@@ -60,7 +64,7 @@ Gem::Specification.new do |s|
60
64
  s.add_runtime_dependency(%q<i18n>, [">= 0.4.1"])
61
65
  s.add_runtime_dependency(%q<activesupport>, [">= 3.0.3"])
62
66
  s.add_runtime_dependency(%q<activemodel>, [">= 3.0.3"])
63
- s.add_runtime_dependency(%q<mongo>, [">= 1.2.4"])
67
+ s.add_runtime_dependency(%q<mongo>, [">= 1.3.1"])
64
68
  s.add_runtime_dependency(%q<em-synchrony>, [">= 0.2.0"])
65
69
  s.add_development_dependency(%q<shoulda>, [">= 0"])
66
70
  s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
@@ -70,7 +74,7 @@ Gem::Specification.new do |s|
70
74
  s.add_dependency(%q<i18n>, [">= 0.4.1"])
71
75
  s.add_dependency(%q<activesupport>, [">= 3.0.3"])
72
76
  s.add_dependency(%q<activemodel>, [">= 3.0.3"])
73
- s.add_dependency(%q<mongo>, [">= 1.2.4"])
77
+ s.add_dependency(%q<mongo>, [">= 1.3.1"])
74
78
  s.add_dependency(%q<em-synchrony>, [">= 0.2.0"])
75
79
  s.add_dependency(%q<shoulda>, [">= 0"])
76
80
  s.add_dependency(%q<bundler>, ["~> 1.0.0"])
@@ -81,7 +85,7 @@ Gem::Specification.new do |s|
81
85
  s.add_dependency(%q<i18n>, [">= 0.4.1"])
82
86
  s.add_dependency(%q<activesupport>, [">= 3.0.3"])
83
87
  s.add_dependency(%q<activemodel>, [">= 3.0.3"])
84
- s.add_dependency(%q<mongo>, [">= 1.2.4"])
88
+ s.add_dependency(%q<mongo>, [">= 1.3.1"])
85
89
  s.add_dependency(%q<em-synchrony>, [">= 0.2.0"])
86
90
  s.add_dependency(%q<shoulda>, [">= 0"])
87
91
  s.add_dependency(%q<bundler>, ["~> 1.0.0"])
@@ -20,7 +20,9 @@ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
20
20
  $LOAD_PATH.unshift(File.dirname(__FILE__))
21
21
  require 'mongoo'
22
22
 
23
- Mongoo.config = {host: "127.0.0.1", port: 27017, db: 'mongoo-test'}
23
+ #Mongoo.config = {host: "127.0.0.1", port: 27017, db: 'mongoo-test'}
24
+ Mongoo.conn = Mongo::Connection.new("localhost", 27017, :pool_size => 5, :timeout => 5)
25
+ Mongoo.db_name = "mongoo-test"
24
26
 
25
27
  class SearchIndex < Mongoo::Base
26
28
  attribute "terms", :type => :array
@@ -39,20 +41,24 @@ class Person < Mongoo::Base
39
41
  attribute "location.demographics.crime_rate", :type => :symbol
40
42
  attribute "location.demographics.education_quality", :type => :symbol
41
43
  attribute "misc", :type => :hash
42
-
44
+
43
45
  index "name"
44
46
  index "location.city"
45
47
  end
46
48
 
49
+ class SpacePerson < Mongoo::Base
50
+ collection_name "spacemen"
51
+ end
52
+
47
53
  class TvShow < Mongoo::Base
48
54
  attribute "name", :type => :string
49
55
  attribute "cast.director", :type => :string
50
56
  attribute "cast.lead", :type => :string
51
57
  attribute "rating", :type => :float
52
58
  attribute "comments", :type => :array
53
-
59
+
54
60
  index "name"
55
-
61
+
56
62
  validates_presence_of "name"
57
63
  validates_presence_of "cast.director"
58
64
  validates_presence_of "rating"
@@ -0,0 +1,76 @@
1
+ require 'helper'
2
+
3
+ class TestIdentityMap < Test::Unit::TestCase
4
+
5
+ def setup
6
+ [Person, TvShow, SearchIndex].each do |obj|
7
+ obj.drop
8
+ obj.create_indexes
9
+ end
10
+ end
11
+
12
+ should "set and get attributes" do
13
+ p = Person.new("name" => "Ben")
14
+ p.insert!
15
+
16
+ p2 = Person.find_one(p.id)
17
+ assert_equal p, p2
18
+ assert_not_equal p.object_id, p2.object_id
19
+
20
+ Mongoo::IdentityMap.on!
21
+
22
+ p3 = Person.find_one(p.id)
23
+ p4 = Person.find_one(p.id)
24
+ assert_equal p3, p4
25
+ assert_equal p3.object_id, p4.object_id
26
+
27
+ p4.name = "Ben Myles"
28
+ assert_equal "Ben Myles", p3.name
29
+ p4.update!
30
+ assert_equal "Ben Myles", p3.name
31
+
32
+ Mongoo::IdentityMap.flush!
33
+
34
+ p50 = Person.find_one(p4.id)
35
+
36
+ p5 = Person.find_one(p4.id)
37
+ assert_not_equal p4.object_id, p5.object_id
38
+ assert_equal Person.find_one(p5.id).object_id, p5.object_id
39
+
40
+ t = Thread.new do
41
+ assert_not_equal Person.find_one(p5.id).object_id, p5.object_id
42
+ end; t.join
43
+
44
+ assert_equal "Ben Myles", p5.name
45
+ Person.collection.update({"_id" => p5.id}, { "name" => "Captain Awesome" })
46
+ assert_equal "Ben Myles", Person.find_one(p5.id).name
47
+ p5.name = "should error"
48
+ assert_raise(Mongoo::StaleUpdateError) { p5.update! }
49
+ p5.reload
50
+ p5.name = "will work now"
51
+ p5.update!
52
+
53
+ assert_equal "will work now", p5.name
54
+ assert_equal "will work now", p50.name
55
+
56
+ Mongoo::IdentityMap.off!
57
+ end
58
+
59
+ should "use id map for simple queries only" do
60
+ Mongoo::IdentityMap.on!
61
+
62
+ p = Person.new("name" => "Ben")
63
+ p.insert!
64
+ p.name = "Not Ben"
65
+
66
+ assert_equal "Not Ben", Person.find_one(p.id).name
67
+ assert_equal "Not Ben", Person.find_one({"_id" => p.id}).name
68
+ assert_equal "Not Ben", Person.find_one({:_id => p.id}).name
69
+
70
+ assert_equal "Ben", Person.find_one(p.id, {sort: [["_id",-1]]}).name
71
+ assert_equal "Ben", Person.find({"_id" => p.id}).next.name
72
+
73
+ Mongoo::IdentityMap.off!
74
+ end
75
+
76
+ end
@@ -50,7 +50,7 @@ class TestMongoo < Test::Unit::TestCase
50
50
  p = Person.new("name" => "Ben")
51
51
  p.jobs.internships.high_school = ["Sun Microsystems"]
52
52
  p.insert
53
-
53
+
54
54
  p = Person.find_one(p.id)
55
55
  p.update
56
56
  p.location.city = "San Francisco"
@@ -59,30 +59,30 @@ class TestMongoo < Test::Unit::TestCase
59
59
  p.location.city = "San Diego"
60
60
  assert_not_equal p.persisted_mongohash.raw_hash, p.mongohash.raw_hash
61
61
  p.update
62
-
62
+
63
63
  p2 = Person.find_one(p.id)
64
64
  assert_equal "Ben Myles", p2.name
65
65
  assert_equal "San Diego", p2.location.city
66
-
66
+
67
67
  p.location.city = "Los Angeles"
68
68
  p.update!
69
-
69
+
70
70
  p2.location.city = "San Jose"
71
71
  assert_raise(Mongoo::StaleUpdateError) { p2.update! }
72
72
  p2.location.city = "San Diego"
73
73
  p2.name = "Benjamin"
74
74
  p2.update!
75
-
75
+
76
76
  assert p2.reload
77
-
77
+
78
78
  assert_equal "Los Angeles", p2.location.city
79
79
  assert_equal "Benjamin", p2.name
80
-
80
+
81
81
  assert p2.persisted_mongohash.raw_hash["location"].has_key?("city")
82
82
  p2.unset "location.city"
83
83
  p2.update
84
84
  assert !p2.persisted_mongohash.raw_hash["location"].has_key?("city")
85
-
85
+
86
86
  p2.location.demographics.crime_rate = :high
87
87
  p2.location.city = "San Bruno"
88
88
  p2.update
@@ -92,7 +92,7 @@ class TestMongoo < Test::Unit::TestCase
92
92
  p2.update
93
93
  p2 = Person.find_one(p2.id)
94
94
  assert !p2.persisted_mongohash.raw_hash.has_key?("location")
95
-
95
+
96
96
  p2.location.city = "Brisbane"
97
97
  p2.location.demographics.crime_rate = :low
98
98
  p2.update
@@ -104,7 +104,7 @@ class TestMongoo < Test::Unit::TestCase
104
104
  assert !p2.persisted_mongohash.raw_hash.has_key?("location")
105
105
  p2 = Person.find_one(p2.id)
106
106
  assert !p2.persisted_mongohash.raw_hash.has_key?("location")
107
-
107
+
108
108
  p2.location.city = "Brisbane"
109
109
  p2.location.demographics.crime_rate = :low
110
110
  p2.update
@@ -140,7 +140,7 @@ class TestMongoo < Test::Unit::TestCase
140
140
  assert_equal 15, p.jobs.total
141
141
  p = Person.find_one(p.id)
142
142
  assert_equal 15, p.jobs.total
143
-
143
+
144
144
  assert_equal nil, p.interests
145
145
  p.mod! { |mod| mod.push("interests", "skydiving") }
146
146
  assert_equal ["skydiving"], p.interests
@@ -150,25 +150,25 @@ class TestMongoo < Test::Unit::TestCase
150
150
  assert_equal ["skydiving", "snowboarding"], p.interests
151
151
  p = Person.find_one(p.id)
152
152
  assert_equal ["skydiving", "snowboarding"], p.interests
153
-
153
+
154
154
  p.mod! { |mod| mod.push_all("interests", ["reading","travelling"]) }
155
155
  assert_equal ["skydiving", "snowboarding", "reading", "travelling"], p.interests
156
156
  p = Person.find_one(p.id)
157
157
  assert_equal ["skydiving", "snowboarding", "reading", "travelling"], p.interests
158
-
158
+
159
159
  p.mod! { |mod| mod.add_to_set("interests", "skydiving") }
160
160
  assert_equal ["skydiving", "snowboarding", "reading", "travelling"], p.interests
161
161
  p.mod! { |mod| mod.add_to_set("interests", "swimming") }
162
162
  assert_equal ["skydiving", "snowboarding", "reading", "travelling", "swimming"], p.interests
163
163
  p.mod! { |mod| mod.add_to_set("interests", "swimming") }
164
164
  assert_equal ["skydiving", "snowboarding", "reading", "travelling", "swimming"], p.interests
165
-
165
+
166
166
  p.mod! { |mod| mod.pop("interests") }
167
167
  assert_equal ["skydiving", "snowboarding", "reading", "travelling"], p.interests
168
-
168
+
169
169
  p.mod! { |mod| mod.pop("interests") }
170
170
  assert_equal ["skydiving", "snowboarding", "reading"], p.interests
171
-
171
+
172
172
  p.mod! { |mod| mod.push("interests", "reading") }
173
173
  assert_equal ["skydiving", "snowboarding", "reading", "reading"], p.interests
174
174
  p = Person.find_one(p.id)
@@ -182,7 +182,7 @@ class TestMongoo < Test::Unit::TestCase
182
182
  assert_equal ["skydiving", "snowboarding", "reading", "travelling"], p.interests
183
183
  p = Person.find_one(p.id)
184
184
  assert_equal ["skydiving", "snowboarding", "reading", "travelling"], p.interests
185
-
185
+
186
186
  p.mod! { |mod| mod.pull_all("interests", ["reading", "skydiving"]) }
187
187
  assert_equal ["snowboarding", "travelling"], p.interests
188
188
  p = Person.find_one(p.id)
@@ -272,5 +272,30 @@ class TestMongoo < Test::Unit::TestCase
272
272
  i.terms << "foo"
273
273
  i.update!
274
274
  end
275
+
276
+ should "work when forked" do
277
+ Person.new(:name => "Ben").insert!
278
+ fork { assert_equal "Ben", Person.find_one({name: "Ben"}).name }
279
+ Process.wait
280
+ end
281
+
282
+ should "work when threaded" do
283
+ 1.upto(10) do |i|
284
+ Person.new(:name => "Ben#{i}").insert!
285
+ end
286
+
287
+ threads = []
288
+ 100.times do |count|
289
+ threads << Thread.new do
290
+ (1..10).to_a.shuffle { |i| assert_equal "Ben#{i}", Person.find_one({name: "Ben#{i}"}).name }
291
+ end
292
+ end
293
+ threads.each { |th| th.join }
294
+ end
295
+
296
+ should "be able to set the collection name manually" do
297
+ assert_equal "people", Person.collection.name
298
+ assert_equal "spacemen", SpacePerson.collection.name
299
+ end
275
300
  end
276
301
 
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: mongoo
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.1.5
5
+ version: 0.2.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-04-18 00:00:00 -07:00
13
+ date: 2011-05-11 00:00:00 -07:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -53,7 +53,7 @@ dependencies:
53
53
  requirements:
54
54
  - - ">="
55
55
  - !ruby/object:Gem::Version
56
- version: 1.2.4
56
+ version: 1.3.1
57
57
  type: :runtime
58
58
  prerelease: false
59
59
  version_requirements: *id004
@@ -124,6 +124,7 @@ extra_rdoc_files:
124
124
  files:
125
125
  - .document
126
126
  - .rvmrc
127
+ - CHANGELOG
127
128
  - Gemfile
128
129
  - LICENSE.txt
129
130
  - README.rdoc
@@ -137,12 +138,14 @@ files:
137
138
  - lib/mongoo/changelog.rb
138
139
  - lib/mongoo/cursor.rb
139
140
  - lib/mongoo/hash_ext.rb
141
+ - lib/mongoo/identity_map.rb
140
142
  - lib/mongoo/modifiers.rb
141
143
  - lib/mongoo/mongohash.rb
142
144
  - lib/mongoo/persistence.rb
143
145
  - mongoo.gemspec
144
146
  - test/helper.rb
145
147
  - test/test_activemodel.rb
148
+ - test/test_identity_map.rb
146
149
  - test/test_mongohash.rb
147
150
  - test/test_mongoo.rb
148
151
  has_rdoc: true
@@ -159,7 +162,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
159
162
  requirements:
160
163
  - - ">="
161
164
  - !ruby/object:Gem::Version
162
- hash: -2470863017219301012
165
+ hash: -1099798970353591123
163
166
  segments:
164
167
  - 0
165
168
  version: "0"
@@ -172,12 +175,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
172
175
  requirements: []
173
176
 
174
177
  rubyforge_project:
175
- rubygems_version: 1.6.2
178
+ rubygems_version: 1.6.1
176
179
  signing_key:
177
180
  specification_version: 3
178
181
  summary: Object mapper for MongoDB
179
182
  test_files:
180
183
  - test/helper.rb
181
184
  - test/test_activemodel.rb
185
+ - test/test_identity_map.rb
182
186
  - test/test_mongohash.rb
183
187
  - test/test_mongoo.rb