mongo_mapper 0.8.2 → 0.8.3

Sign up to get free protection for your applications and to get access to all the features.
data/examples/keys.rb CHANGED
@@ -13,6 +13,7 @@ class User
13
13
  key :age, Integer
14
14
  key :skills, Array
15
15
  key :friend_ids, Array, :typecast => 'ObjectId'
16
+ key :links, Hash
16
17
  timestamps!
17
18
  end
18
19
  User.collection.remove # empties collection
@@ -22,6 +23,7 @@ john = User.create({
22
23
  :last_name => 'Nunemaker',
23
24
  :age => 28,
24
25
  :skills => ['ruby', 'mongo', 'javascript'],
26
+ :links => {"Google" => "http://www.google.com"}
25
27
  })
26
28
 
27
29
  steve = User.create({
@@ -32,6 +34,7 @@ steve = User.create({
32
34
  })
33
35
 
34
36
  john.friend_ids << steve.id.to_s # will get typecast to ObjectId
37
+ john.links["Ruby on Rails"] = "http://www.rubyonrails.com"
35
38
  john.save
36
39
 
37
40
  pp john
@@ -0,0 +1,25 @@
1
+ $LOAD_PATH.unshift(File.expand_path('../../../lib', __FILE__))
2
+ require 'mongo_mapper'
3
+ require 'pp'
4
+
5
+ MongoMapper.database = 'testing'
6
+
7
+ class User
8
+ include MongoMapper::Document
9
+
10
+ key :name, String
11
+ key :tags, Array
12
+ end
13
+ User.collection.remove # empties collection
14
+
15
+ john = User.create(:name => 'John', :tags => %w[ruby mongo], :age => 28)
16
+ bill = User.create(:name => 'Bill', :tags => %w[ruby mongo], :age => 30)
17
+
18
+ User.set({:name => 'John'}, :tags => %[ruby])
19
+ pp john.reload
20
+
21
+ User.set(john.id, :tags => %w[ruby mongo])
22
+ pp john.reload
23
+
24
+ john.set(:tags => %w[something different])
25
+ pp john.reload
data/lib/mongo_mapper.rb CHANGED
@@ -8,7 +8,6 @@ module MongoMapper
8
8
  autoload :Connection, 'mongo_mapper/connection'
9
9
 
10
10
  autoload :Error, 'mongo_mapper/exceptions'
11
- autoload :KeyNotFound, 'mongo_mapper/exceptions'
12
11
  autoload :DocumentNotFound, 'mongo_mapper/exceptions'
13
12
  autoload :InvalidScheme, 'mongo_mapper/exceptions'
14
13
  autoload :DocumentNotValid, 'mongo_mapper/exceptions'
@@ -3,9 +3,6 @@ module MongoMapper
3
3
  # generic MM error
4
4
  class Error < StandardError; end
5
5
 
6
- # raised when key expected to exist but not found
7
- class KeyNotFound < Error; end
8
-
9
6
  # raised when document expected but not found
10
7
  class DocumentNotFound < Error; end
11
8
 
@@ -12,6 +12,11 @@ module MongoMapper
12
12
  end
13
13
  end
14
14
 
15
+ def include?(*args)
16
+ load_target
17
+ target.include?(*args)
18
+ end
19
+
15
20
  def reset
16
21
  super
17
22
  target = []
@@ -44,6 +44,11 @@ module MongoMapper
44
44
  object_id_keys.include?(name.to_sym)
45
45
  end
46
46
 
47
+ # API Private
48
+ def can_default_id?
49
+ keys['_id'].can_default_id?
50
+ end
51
+
47
52
  def to_mongo(instance)
48
53
  return nil if instance.nil?
49
54
  instance.to_mongo
@@ -268,8 +273,8 @@ module MongoMapper
268
273
 
269
274
  def default_id_value(attrs)
270
275
  unless attrs.nil?
271
- provided_keys = attrs.keys.map { |k| k.to_s }
272
- unless provided_keys.include?('_id') || provided_keys.include?('id')
276
+ id_provided = attrs.keys.map { |k| k.to_s }.detect { |k| k == 'id' || k == '_id' }
277
+ if !id_provided && self.class.can_default_id?
273
278
  write_key :_id, BSON::ObjectID.new
274
279
  end
275
280
  end
@@ -290,8 +295,6 @@ module MongoMapper
290
295
  value = key.get(instance_variable_get(:"@#{key_name}"))
291
296
  set_parent_document(key, value)
292
297
  instance_variable_set(:"@#{key_name}", value)
293
- else
294
- raise KeyNotFound, "Could not find key: #{key_name.inspect}"
295
298
  end
296
299
  end
297
300
 
@@ -21,6 +21,10 @@ module MongoMapper
21
21
  type.embeddable?
22
22
  end
23
23
 
24
+ def can_default_id?
25
+ type && [ObjectId, BSON::ObjectID, String].include?(type)
26
+ end
27
+
24
28
  def number?
25
29
  [Integer, Float].include?(type)
26
30
  end
@@ -1,4 +1,4 @@
1
1
  # encoding: UTF-8
2
2
  module MongoMapper
3
- Version = '0.8.2'
3
+ Version = '0.8.3'
4
4
  end
@@ -307,6 +307,16 @@ class ManyDocumentsProxyTest < Test::Unit::TestCase
307
307
  @project2.save
308
308
  end
309
309
 
310
+ context "include?" do
311
+ should "return true if in association" do
312
+ @project1.statuses.should include(@brand_new)
313
+ end
314
+
315
+ should "return false if not in association" do
316
+ @project1.statuses.should_not include(@in_progress)
317
+ end
318
+ end
319
+
310
320
  context "dynamic finders" do
311
321
  should "work with single key" do
312
322
  @project1.statuses.find_by_name('New').should == @brand_new
data/test/test_helper.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  require 'rubygems'
2
2
  gem 'activesupport', ENV['ACTIVE_SUPPORT_VERSION']
3
- gem 'json', '~> 1.2.3'
3
+ gem 'json'
4
4
  gem 'jnunemaker-matchy', '~> 0.4.0'
5
5
  gem 'shoulda', '~> 2.10.2'
6
6
  gem 'timecop', '~> 0.3.1'
@@ -10,10 +10,10 @@ $:.unshift File.expand_path(File.dirname(__FILE__) + '/../lib')
10
10
  require 'mongo_mapper'
11
11
  require 'fileutils'
12
12
  require 'ostruct'
13
- require 'pp'
14
13
 
15
14
  require 'active_support/version'
16
15
  require 'json'
16
+ require 'log_buddy'
17
17
  require 'matchy'
18
18
  require 'shoulda'
19
19
  require 'timecop'
@@ -97,6 +97,7 @@ log_dir = File.expand_path('../../log', __FILE__)
97
97
  FileUtils.mkdir_p(log_dir) unless File.exist?(log_dir)
98
98
  logger = Logger.new(log_dir + '/test.log')
99
99
 
100
+ LogBuddy.init(:logger => logger)
100
101
  MongoMapper.connection = Mongo::Connection.new('127.0.0.1', 27017, :logger => logger)
101
102
  MongoMapper.database = "mm-test-#{RUBY_VERSION.gsub('.', '-')}"
102
103
  MongoMapper.database.collections.each { |c| c.drop_indexes }
@@ -387,9 +387,9 @@ class EmbeddedDocumentTest < Test::Unit::TestCase
387
387
  doc[:name].should == 'string'
388
388
  end
389
389
 
390
- should "raise exception when key not found" do
390
+ should "return nil when not found" do
391
391
  doc = @document.new(:name => 'string')
392
- assert_raises(MongoMapper::KeyNotFound) { doc[:not_here] }
392
+ doc[:not_here].should be_nil
393
393
  end
394
394
  end
395
395
 
@@ -4,6 +4,40 @@ require 'models'
4
4
  class KeyTest < Test::Unit::TestCase
5
5
  include MongoMapper::Plugins::Keys
6
6
 
7
+ context ".new with no id and _id of type integer" do
8
+ should "not error" do
9
+ lambda {
10
+ klass = Doc() do
11
+ key :_id, Integer
12
+ end
13
+ # No sensible default id for integer, people better pass them in if they user this
14
+ klass.new.id.should be_nil
15
+ }.should_not raise_error
16
+ end
17
+ end
18
+
19
+ context ".new with no id and _id of type string" do
20
+ should "not error" do
21
+ lambda {
22
+ klass = Doc() do
23
+ key :_id, String
24
+ end
25
+ klass.new.id.should_not be_nil
26
+ }.should_not raise_error
27
+ end
28
+ end
29
+
30
+ context ".new with no id and _id of type object id" do
31
+ should "not error" do
32
+ lambda {
33
+ klass = Doc() do
34
+ key :_id, ObjectId
35
+ end
36
+ klass.new.should_not be_nil
37
+ }.should_not raise_error
38
+ end
39
+ end
40
+
7
41
  context ".key?(:symbol)" do
8
42
  should "be true if document has key" do
9
43
  Address.key?(:city).should be_true
metadata CHANGED
@@ -1,12 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mongo_mapper
3
3
  version: !ruby/object:Gem::Version
4
+ hash: 57
4
5
  prerelease: false
5
6
  segments:
6
7
  - 0
7
8
  - 8
8
- - 2
9
- version: 0.8.2
9
+ - 3
10
+ version: 0.8.3
10
11
  platform: ruby
11
12
  authors:
12
13
  - John Nunemaker
@@ -14,16 +15,18 @@ autorequire:
14
15
  bindir: bin
15
16
  cert_chain: []
16
17
 
17
- date: 2010-06-18 00:00:00 -04:00
18
+ date: 2010-08-09 00:00:00 -04:00
18
19
  default_executable: mmconsole
19
20
  dependencies:
20
21
  - !ruby/object:Gem::Dependency
21
22
  name: activesupport
22
23
  prerelease: false
23
24
  requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
24
26
  requirements:
25
27
  - - ">="
26
28
  - !ruby/object:Gem::Version
29
+ hash: 11
27
30
  segments:
28
31
  - 2
29
32
  - 3
@@ -35,9 +38,11 @@ dependencies:
35
38
  name: jnunemaker-validatable
36
39
  prerelease: false
37
40
  requirement: &id002 !ruby/object:Gem::Requirement
41
+ none: false
38
42
  requirements:
39
43
  - - ~>
40
44
  - !ruby/object:Gem::Version
45
+ hash: 63
41
46
  segments:
42
47
  - 1
43
48
  - 8
@@ -49,86 +54,110 @@ dependencies:
49
54
  name: plucky
50
55
  prerelease: false
51
56
  requirement: &id003 !ruby/object:Gem::Requirement
57
+ none: false
52
58
  requirements:
53
59
  - - ~>
54
60
  - !ruby/object:Gem::Version
61
+ hash: 21
55
62
  segments:
56
63
  - 0
57
64
  - 3
58
- - 1
59
- version: 0.3.1
65
+ - 3
66
+ version: 0.3.3
60
67
  type: :runtime
61
68
  version_requirements: *id003
62
69
  - !ruby/object:Gem::Dependency
63
70
  name: json
64
71
  prerelease: false
65
72
  requirement: &id004 !ruby/object:Gem::Requirement
73
+ none: false
66
74
  requirements:
67
- - - ~>
75
+ - - ">="
68
76
  - !ruby/object:Gem::Version
77
+ hash: 3
69
78
  segments:
70
- - 1
71
- - 2
72
- - 3
73
- version: 1.2.3
79
+ - 0
80
+ version: "0"
74
81
  type: :development
75
82
  version_requirements: *id004
76
83
  - !ruby/object:Gem::Dependency
77
- name: jnunemaker-matchy
84
+ name: log_buddy
78
85
  prerelease: false
79
86
  requirement: &id005 !ruby/object:Gem::Requirement
87
+ none: false
88
+ requirements:
89
+ - - ">="
90
+ - !ruby/object:Gem::Version
91
+ hash: 3
92
+ segments:
93
+ - 0
94
+ version: "0"
95
+ type: :development
96
+ version_requirements: *id005
97
+ - !ruby/object:Gem::Dependency
98
+ name: jnunemaker-matchy
99
+ prerelease: false
100
+ requirement: &id006 !ruby/object:Gem::Requirement
101
+ none: false
80
102
  requirements:
81
103
  - - ~>
82
104
  - !ruby/object:Gem::Version
105
+ hash: 15
83
106
  segments:
84
107
  - 0
85
108
  - 4
86
109
  - 0
87
110
  version: 0.4.0
88
111
  type: :development
89
- version_requirements: *id005
112
+ version_requirements: *id006
90
113
  - !ruby/object:Gem::Dependency
91
114
  name: shoulda
92
115
  prerelease: false
93
- requirement: &id006 !ruby/object:Gem::Requirement
116
+ requirement: &id007 !ruby/object:Gem::Requirement
117
+ none: false
94
118
  requirements:
95
119
  - - ~>
96
120
  - !ruby/object:Gem::Version
121
+ hash: 35
97
122
  segments:
98
123
  - 2
99
124
  - 10
100
125
  - 2
101
126
  version: 2.10.2
102
127
  type: :development
103
- version_requirements: *id006
128
+ version_requirements: *id007
104
129
  - !ruby/object:Gem::Dependency
105
130
  name: timecop
106
131
  prerelease: false
107
- requirement: &id007 !ruby/object:Gem::Requirement
132
+ requirement: &id008 !ruby/object:Gem::Requirement
133
+ none: false
108
134
  requirements:
109
135
  - - ~>
110
136
  - !ruby/object:Gem::Version
137
+ hash: 17
111
138
  segments:
112
139
  - 0
113
140
  - 3
114
141
  - 1
115
142
  version: 0.3.1
116
143
  type: :development
117
- version_requirements: *id007
144
+ version_requirements: *id008
118
145
  - !ruby/object:Gem::Dependency
119
146
  name: mocha
120
147
  prerelease: false
121
- requirement: &id008 !ruby/object:Gem::Requirement
148
+ requirement: &id009 !ruby/object:Gem::Requirement
149
+ none: false
122
150
  requirements:
123
151
  - - ~>
124
152
  - !ruby/object:Gem::Version
153
+ hash: 43
125
154
  segments:
126
155
  - 0
127
156
  - 9
128
157
  - 8
129
158
  version: 0.9.8
130
159
  type: :development
131
- version_requirements: *id008
160
+ version_requirements: *id009
132
161
  description:
133
162
  email:
134
163
  - nunemaker@gmail.com
@@ -141,6 +170,7 @@ extra_rdoc_files: []
141
170
  files:
142
171
  - bin/mmconsole
143
172
  - examples/keys.rb
173
+ - examples/modifiers/set.rb
144
174
  - examples/plugins.rb
145
175
  - examples/querying.rb
146
176
  - examples/scopes.rb
@@ -281,23 +311,27 @@ rdoc_options: []
281
311
  require_paths:
282
312
  - lib
283
313
  required_ruby_version: !ruby/object:Gem::Requirement
314
+ none: false
284
315
  requirements:
285
316
  - - ">="
286
317
  - !ruby/object:Gem::Version
318
+ hash: 3
287
319
  segments:
288
320
  - 0
289
321
  version: "0"
290
322
  required_rubygems_version: !ruby/object:Gem::Requirement
323
+ none: false
291
324
  requirements:
292
325
  - - ">="
293
326
  - !ruby/object:Gem::Version
327
+ hash: 3
294
328
  segments:
295
329
  - 0
296
330
  version: "0"
297
331
  requirements: []
298
332
 
299
333
  rubyforge_project:
300
- rubygems_version: 1.3.6
334
+ rubygems_version: 1.3.7
301
335
  signing_key:
302
336
  specification_version: 3
303
337
  summary: A Ruby Object Mapper for Mongo