mongo_doc 0.4.2 → 0.5.5
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/HISTORY.md +8 -1
- data/README.textile +12 -24
- data/Rakefile +58 -11
- data/VERSION +1 -1
- data/features/embed_hash.feature +16 -0
- data/features/step_definitions/document_steps.rb +1 -1
- data/features/step_definitions/documents.rb +2 -0
- data/features/step_definitions/embed_hash_steps.rb +6 -0
- data/features/step_definitions/string_casting_steps.rb +2 -1
- data/features/support/support.rb +1 -0
- data/lib/mongo_doc/associations/collection_proxy.rb +29 -13
- data/lib/mongo_doc/associations/document_proxy.rb +14 -5
- data/lib/mongo_doc/associations/hash_proxy.rb +20 -16
- data/lib/mongo_doc/associations/proxy_base.rb +21 -26
- data/lib/mongo_doc/associations.rb +15 -6
- data/lib/mongo_doc/attributes.rb +2 -20
- data/lib/mongo_doc/collection.rb +1 -1
- data/lib/mongo_doc/connection.rb +1 -1
- data/lib/mongo_doc/contexts/ids.rb +3 -3
- data/lib/mongo_doc/contexts/mongo.rb +1 -1
- data/lib/mongo_doc/document.rb +30 -13
- data/lib/mongo_doc/ext/binary.rb +2 -2
- data/lib/mongo_doc/ext/dbref.rb +2 -2
- data/lib/mongo_doc/ext/min_max_keys.rb +13 -0
- data/lib/mongo_doc/ext/object.rb +4 -2
- data/lib/mongo_doc/ext/object_id.rb +2 -2
- data/lib/mongo_doc/ext.rb +1 -0
- data/lib/mongo_doc/finders.rb +2 -2
- data/lib/mongo_doc/root.rb +26 -0
- data/lib/mongo_doc/validations.rb +16 -0
- data/lib/mongo_doc.rb +2 -1
- data/lib/mongoid/criterion/optional.rb +1 -1
- data/mongo_doc.gemspec +29 -17
- data/perf/mongo_doc_object.rb +78 -0
- data/perf/mongo_document.rb +78 -0
- data/perf/ruby_driver.rb +43 -0
- data/spec/associations/collection_proxy_spec.rb +29 -6
- data/spec/associations/document_proxy_spec.rb +22 -19
- data/spec/associations/hash_proxy_spec.rb +17 -4
- data/spec/associations/proxy_base_spec.rb +92 -0
- data/spec/associations_spec.rb +4 -16
- data/spec/bson_spec.rb +1 -1
- data/spec/connection_spec.rb +2 -2
- data/spec/contexts/ids_spec.rb +2 -2
- data/spec/document_spec.rb +31 -22
- data/spec/ext_spec.rb +8 -0
- data/spec/root_spec.rb +41 -0
- data/spec/validations_spec.rb +30 -0
- metadata +46 -23
- data/lib/mongo_doc/query.rb +0 -7
- data/perf/mongo_doc_runner.rb +0 -90
- data/perf/ruby_driver_runner.rb +0 -64
- data/spec/query_spec.rb +0 -12
data/.gitignore
CHANGED
data/HISTORY.md
CHANGED
@@ -1,4 +1,11 @@
|
|
1
|
+
## 0.5.0 to 0.5.5
|
2
|
+
|
3
|
+
* update to ruby driver 0.20.1 and the new bson gems
|
4
|
+
* require MongoDB 1.4
|
5
|
+
* can be used with ActiveSupport 2 or 3
|
6
|
+
* Rails3 support with [MongoDoc-Rails](http://github.com/leshill/mongo_doc-rails) thanks to elliotcm
|
7
|
+
|
1
8
|
## 0.4.2
|
2
9
|
|
3
|
-
*
|
10
|
+
* `Document#update_attributes` uses $ positional operator when used from within an embed_many association
|
4
11
|
* Require MongoDB 1.3.4 or greater
|
data/README.textile
CHANGED
@@ -1,37 +1,17 @@
|
|
1
1
|
h1. MongoDoc
|
2
2
|
|
3
|
-
Version:
|
4
|
-
|
5
|
-
h2. What's New in Turbulence (0.4.2)
|
6
|
-
|
7
|
-
Support for the $ positional operator for in-place array updates. This requires MongoDB version 1.3.4 or higher.
|
8
|
-
|
9
|
-
h2. What's New in Turbulence (0.4.1)
|
10
|
-
|
11
|
-
API changes (@key@ and @has_*@ still supported, will be deprectated soon)
|
12
|
-
|
13
|
-
* @MongoDoc::Document.attr_accessor@ works like the old @key@ macro, and allows two parameters:
|
14
|
-
** @:default => 'some default value'@
|
15
|
-
** @:type => Date@ used when dealing with values from the web which will be coming in as @String@ values
|
16
|
-
* Association macros have been renamed
|
17
|
-
** @embed@ was @has_one@
|
18
|
-
** @embed_many@ was @has_many@
|
19
|
-
** @embed_hash@ was @has_hash@
|
20
|
-
|
21
|
-
Indexing suppport
|
22
|
-
|
23
|
-
* @MongoDoc::Document.index@
|
3
|
+
Version: Maelstrom (0.5.5) 2010/04/08
|
24
4
|
|
25
5
|
h2. Notes
|
26
6
|
|
27
|
-
* 2010-03-12 Thanks to weather in ATL, cleaned up attr_accessor and switched to embed association macros
|
7
|
+
* 2010-03-12 Thanks to weather (in ATL, cleaned up attr_accessor and switched to embed association macros
|
28
8
|
* 2010-03-10 Slides are out of date, use key instead of attr_accessor with MongoDoc::Document (implementation was way too hackish)
|
29
9
|
* 2010-02-23 API is *changing* significantly
|
30
10
|
* 2010-01-23 Tracking MongoDoc with @git@? *READ THIS NOTE*[1]
|
31
11
|
|
32
12
|
h2. Quick Start
|
33
13
|
|
34
|
-
* install MongoDB (at least 1.
|
14
|
+
* install MongoDB (at least 1.4.0)
|
35
15
|
* install the Ruby driver @gem install mongo@
|
36
16
|
* install MongoDoc @gem install mongo_doc@
|
37
17
|
* run an example from this directory @ruby -Ilib examples/simple_object.rb@
|
@@ -135,10 +115,16 @@ bc. hashrocket_address.update_attributes(:street => '320 First Street North, #71
|
|
135
115
|
|
136
116
|
h2. Installation
|
137
117
|
|
138
|
-
MongoDoc *requires* mongoDB v1.
|
118
|
+
MongoDoc *requires* mongoDB v1.4.0 or later.
|
139
119
|
|
140
120
|
bc. sudo gem install mongo_doc
|
141
121
|
|
122
|
+
h2. Rails 3
|
123
|
+
|
124
|
+
As of version 0.5.0, you can use the mongo_doc-rails gem to add Rails3 support.
|
125
|
+
|
126
|
+
bc. sudo gem install mongo_doc-rails
|
127
|
+
|
142
128
|
h2. Connecting
|
143
129
|
|
144
130
|
By default, MongoDoc will read its configuration from @./mongodb.yml@. If that file does not exist, it will attempt to connect to a standard MongoDB local server setup and use a database name of @"mongodoc"@.
|
@@ -186,6 +172,8 @@ h3. Thanks
|
|
186
172
|
|
187
173
|
Thanks to Sandro and Durran for some great conversations and some lovely code.
|
188
174
|
|
175
|
+
Thanks to Elliot for pushing me to get Rails 3 support
|
176
|
+
|
189
177
|
h2. Note on Patches/Pull Requests
|
190
178
|
|
191
179
|
* Fork the project.
|
data/Rakefile
CHANGED
@@ -10,12 +10,13 @@ begin
|
|
10
10
|
gem.homepage = "http://github.com/leshill/mongodoc"
|
11
11
|
gem.authors = ["Les Hill"]
|
12
12
|
gem.add_dependency "activesupport", ">= 2.3.4"
|
13
|
-
gem.add_dependency "mongo", "= 0.
|
14
|
-
gem.add_dependency "
|
13
|
+
gem.add_dependency "mongo", "= 0.20.1"
|
14
|
+
gem.add_dependency "bson", "= 0.20.1"
|
15
|
+
gem.add_dependency "bson_ext", "= 0.20.1"
|
15
16
|
gem.add_dependency "durran-validatable", "= 2.0.1"
|
16
17
|
gem.add_dependency "leshill-will_paginate", "= 2.3.11"
|
17
18
|
gem.add_development_dependency "rspec", "= 1.3.0"
|
18
|
-
gem.add_development_dependency "cucumber", "
|
19
|
+
gem.add_development_dependency "cucumber", ">= 0.6.2"
|
19
20
|
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
20
21
|
end
|
21
22
|
Jeweler::GemcutterTasks.new
|
@@ -106,15 +107,22 @@ namespace :bench do
|
|
106
107
|
desc 'Run benchmark for MongoDoc'
|
107
108
|
task 'mongo_doc' do
|
108
109
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), 'lib'))
|
109
|
-
require 'perf/
|
110
|
-
|
110
|
+
require 'perf/mongo_document'
|
111
|
+
benchmark("MongoDoc saving documents", MongoDocument.new)
|
112
|
+
end
|
113
|
+
|
114
|
+
desc 'Run benchmark for MongoDoc Object'
|
115
|
+
task 'mongo_object' do
|
116
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), 'lib'))
|
117
|
+
require 'perf/mongo_doc_object'
|
118
|
+
benchmark("MongoDoc saving objects", MongoDocObject.new)
|
111
119
|
end
|
112
120
|
|
113
121
|
desc 'Run profiler for driver'
|
114
122
|
task 'driver' do
|
115
123
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), 'lib'))
|
116
|
-
require 'perf/
|
117
|
-
|
124
|
+
require 'perf/ruby_driver'
|
125
|
+
benchmark("Ruby driver saving hashes", RubyDriver.new)
|
118
126
|
end
|
119
127
|
end
|
120
128
|
|
@@ -122,14 +130,53 @@ namespace :prof do
|
|
122
130
|
desc 'Run profiler for MongoDoc'
|
123
131
|
task 'mongo_doc' do
|
124
132
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), 'lib'))
|
125
|
-
require 'perf/
|
126
|
-
|
133
|
+
require 'perf/mongo_document'
|
134
|
+
profile("MongoDoc saving documents", MongoDocument.new)
|
135
|
+
end
|
136
|
+
|
137
|
+
desc 'Run profiler for MongoDoc Object'
|
138
|
+
task 'mongo_object' do
|
139
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), 'lib'))
|
140
|
+
require 'perf/mongo_doc_object'
|
141
|
+
profile("MongoDoc saving objects", MongoDocObject.new)
|
127
142
|
end
|
128
143
|
|
129
144
|
desc 'Run profiler for driver'
|
130
145
|
task 'driver' do
|
131
146
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), 'lib'))
|
132
|
-
require 'perf/
|
133
|
-
|
147
|
+
require 'perf/ruby_driver'
|
148
|
+
profile("Ruby driver saving hashes", RubyDriver.new)
|
149
|
+
end
|
150
|
+
|
151
|
+
def benchmark(what, runner)
|
152
|
+
puts "Benchmark: " + what
|
153
|
+
|
154
|
+
runner.generate(10000)
|
155
|
+
|
156
|
+
Benchmark.bm do |bm|
|
157
|
+
bm.report(what + " writes") do
|
158
|
+
runner.writes(10000)
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
Benchmark.bm do |bm|
|
163
|
+
bm.report(what + " reads") do
|
164
|
+
runner.reads(10000)
|
165
|
+
end
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
def profile(what, runner)
|
170
|
+
puts "Profiling: " + what
|
171
|
+
RubyProf.start
|
172
|
+
|
173
|
+
runner.generate(1000)
|
174
|
+
runner.writes(1000)
|
175
|
+
runner.reads(1000)
|
176
|
+
|
177
|
+
result = RubyProf.stop
|
178
|
+
printer = RubyProf::FlatPrinter.new(result)
|
179
|
+
printer.print(STDOUT, 0)
|
134
180
|
end
|
135
181
|
end
|
182
|
+
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.5.5
|
@@ -0,0 +1,16 @@
|
|
1
|
+
Feature: Embed Hash
|
2
|
+
|
3
|
+
Background:
|
4
|
+
Given a class Event
|
5
|
+
|
6
|
+
Scenario: Creating a new document
|
7
|
+
Given an Event document named 'event' :
|
8
|
+
| Name | Venue | Date |
|
9
|
+
| NoSQL Live | John Hancock Conference Center | 2010-03-11 |
|
10
|
+
And an Address document named 'address' :
|
11
|
+
| Street | City | State | Zip Code |
|
12
|
+
| 320 First Street North | Jacksonville Beach | FL | 32250 |
|
13
|
+
And I put the 'address' object on key 'office' of the 'addresses' hash of 'event'
|
14
|
+
When I save the document 'event'
|
15
|
+
Then the last return value is true
|
16
|
+
And the document 'event' roundtrips
|
@@ -42,7 +42,7 @@ end
|
|
42
42
|
|
43
43
|
Given /^I set the id on the document '(.*)' to (.*)$/ do |doc_name, value|
|
44
44
|
doc = instance_variable_get("@#{doc_name}")
|
45
|
-
doc._id =
|
45
|
+
doc._id = BSON::ObjectID.from_string("%024x" % value.to_i(16))
|
46
46
|
end
|
47
47
|
|
48
48
|
Given /^'(.+)' has one (.+?) as (.+?) \(identified by '(.+)'\):$/ do |doc_name, class_name, assoc_name, var_name, table|
|
data/features/support/support.rb
CHANGED
@@ -24,16 +24,34 @@ module MongoDoc
|
|
24
24
|
|
25
25
|
attr_reader :collection
|
26
26
|
|
27
|
-
def
|
28
|
-
|
27
|
+
def _modifier_path=(path)
|
28
|
+
super
|
29
29
|
collection.each do |item|
|
30
|
-
item.
|
30
|
+
item._modifier_path = _modifier_path + '.$' if ProxyBase.is_document?(item)
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
34
|
+
def _root=(value)
|
35
|
+
@_root = value
|
36
|
+
collection.each do |item|
|
37
|
+
item._root = value if ProxyBase.is_document?(item)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
%w(_root _selector_path).each do |setter|
|
42
|
+
class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
43
|
+
def #{setter}=(val)
|
44
|
+
super
|
45
|
+
collection.each do |item|
|
46
|
+
item.#{setter} = #{setter} if ProxyBase.is_document?(item)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
RUBY
|
50
|
+
end
|
51
|
+
|
34
52
|
def initialize(options)
|
35
|
-
super
|
36
53
|
@collection = []
|
54
|
+
super
|
37
55
|
end
|
38
56
|
|
39
57
|
alias _append <<
|
@@ -52,7 +70,7 @@ module MongoDoc
|
|
52
70
|
alias insert []=
|
53
71
|
|
54
72
|
def build(attrs)
|
55
|
-
item =
|
73
|
+
item = _assoc_class.new(attrs)
|
56
74
|
push(item)
|
57
75
|
end
|
58
76
|
|
@@ -82,7 +100,7 @@ module MongoDoc
|
|
82
100
|
|
83
101
|
def valid?
|
84
102
|
all? do |child|
|
85
|
-
if is_document?(child)
|
103
|
+
if ProxyBase.is_document?(child)
|
86
104
|
child.valid?
|
87
105
|
else
|
88
106
|
true
|
@@ -92,13 +110,11 @@ module MongoDoc
|
|
92
110
|
|
93
111
|
protected
|
94
112
|
|
95
|
-
def
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
end
|
101
|
-
annotated
|
113
|
+
def attach_document(doc)
|
114
|
+
doc._modifier_path = _modifier_path + '.$'
|
115
|
+
doc._selector_path = _selector_path
|
116
|
+
doc._root = _root
|
117
|
+
_root.send(:register_save_observer, doc)
|
102
118
|
end
|
103
119
|
end
|
104
120
|
end
|
@@ -7,9 +7,18 @@ module MongoDoc
|
|
7
7
|
|
8
8
|
delegate :to_bson, :id, :to => :document
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
10
|
+
%w(_modifier_path _selector_path).each do |setter|
|
11
|
+
class_eval(<<-RUBY, __FILE__, __LINE__)
|
12
|
+
def #{setter}=(path)
|
13
|
+
super
|
14
|
+
document.#{setter} = #{setter} if ProxyBase.is_document?(document)
|
15
|
+
end
|
16
|
+
RUBY
|
17
|
+
end
|
18
|
+
|
19
|
+
def _root=(value)
|
20
|
+
@_root = value
|
21
|
+
document._root = value if ProxyBase.is_document?(document)
|
13
22
|
end
|
14
23
|
|
15
24
|
def ==(other)
|
@@ -21,7 +30,7 @@ module MongoDoc
|
|
21
30
|
end
|
22
31
|
|
23
32
|
def build(attrs)
|
24
|
-
item =
|
33
|
+
item = _assoc_class.new(attrs)
|
25
34
|
self.document = item
|
26
35
|
end
|
27
36
|
|
@@ -31,7 +40,7 @@ module MongoDoc
|
|
31
40
|
end
|
32
41
|
|
33
42
|
def valid?
|
34
|
-
if is_document?(document)
|
43
|
+
if ProxyBase.is_document?(document)
|
35
44
|
document.valid?
|
36
45
|
else
|
37
46
|
true
|
@@ -21,28 +21,31 @@ module MongoDoc
|
|
21
21
|
|
22
22
|
attr_reader :hash
|
23
23
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
24
|
+
%w(_modifier_path _selector_path).each do |setter|
|
25
|
+
class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
26
|
+
def #{setter}=(path)
|
27
|
+
super
|
28
|
+
hash.each do |key, doc|
|
29
|
+
doc.#{setter} = #{setter} + '.' + key.to_s if ProxyBase.is_document?(doc)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
RUBY
|
29
33
|
end
|
30
34
|
|
31
35
|
def initialize(options)
|
32
|
-
super
|
33
36
|
@hash = {}
|
37
|
+
super
|
34
38
|
end
|
35
39
|
|
36
40
|
alias put []=
|
37
41
|
def []=(key, value)
|
38
42
|
raise InvalidEmbeddedHashKey.new("Key name [#{key}] must be a valid element name, see http://www.mongodb.org/display/DOCS/BSON#BSON-noteonelementname") unless valid_key?(key)
|
39
|
-
attach(value)
|
40
|
-
put(key, value)
|
43
|
+
put(key, attach(key, value))
|
41
44
|
end
|
42
45
|
alias store []=
|
43
46
|
|
44
47
|
def build(key, attrs)
|
45
|
-
item =
|
48
|
+
item = _assoc_class.new(attrs)
|
46
49
|
store(key, item)
|
47
50
|
end
|
48
51
|
|
@@ -71,7 +74,7 @@ module MongoDoc
|
|
71
74
|
|
72
75
|
def valid?
|
73
76
|
values.all? do |child|
|
74
|
-
if is_document?(child)
|
77
|
+
if ProxyBase.is_document?(child)
|
75
78
|
child.valid?
|
76
79
|
else
|
77
80
|
true
|
@@ -81,13 +84,14 @@ module MongoDoc
|
|
81
84
|
|
82
85
|
protected
|
83
86
|
|
84
|
-
def
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
87
|
+
def attach(key, value)
|
88
|
+
if ProxyBase.is_document?(value)
|
89
|
+
proxy = DocumentProxy.new(:path => _selector_path, :assoc_name => key, :root => _root, :parent => self)
|
90
|
+
proxy.document = value
|
91
|
+
proxy
|
92
|
+
else
|
93
|
+
value
|
89
94
|
end
|
90
|
-
annotated
|
91
95
|
end
|
92
96
|
|
93
97
|
def valid_key?(key)
|
@@ -3,16 +3,16 @@ module MongoDoc
|
|
3
3
|
module ProxyBase
|
4
4
|
def self.included(klass)
|
5
5
|
klass.class_eval do
|
6
|
-
attr_reader :
|
6
|
+
attr_reader :_assoc_class, :_assoc_name, :_modifier_path, :_root, :_selector_path
|
7
7
|
end
|
8
8
|
end
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
10
|
+
%w(_modifier_path _selector_path).each do |setter|
|
11
|
+
module_eval(<<-RUBY, __FILE__, __LINE__)
|
12
|
+
def #{setter}=(path)
|
13
|
+
@#{setter} = (path.blank? ? '' : path + '.') + _assoc_name.to_s
|
14
|
+
end
|
15
|
+
RUBY
|
16
16
|
end
|
17
17
|
|
18
18
|
def _root=(root)
|
@@ -20,33 +20,28 @@ module MongoDoc
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def initialize(options)
|
23
|
-
@
|
24
|
-
@
|
25
|
-
|
26
|
-
|
23
|
+
@_assoc_name = options[:assoc_name]
|
24
|
+
@_assoc_class = options[:assoc_class]
|
25
|
+
self._root = options[:root]
|
26
|
+
self._selector_path = self._modifier_path = options[:path]
|
27
27
|
end
|
28
28
|
|
29
|
-
def
|
30
|
-
|
31
|
-
item._parent = self
|
32
|
-
item._root = _root
|
33
|
-
_root.send(:register_save_observer, item)
|
34
|
-
end
|
35
|
-
item
|
29
|
+
def self.is_document?(object)
|
30
|
+
object.respond_to?(:_root)
|
36
31
|
end
|
37
32
|
|
38
33
|
protected
|
39
34
|
|
40
|
-
def
|
41
|
-
|
42
|
-
|
43
|
-
annotated["#{assoc_name}.#{key}"] = value
|
44
|
-
end
|
45
|
-
annotated
|
35
|
+
def attach(obj)
|
36
|
+
attach_document(obj) if ProxyBase.is_document?(obj)
|
37
|
+
obj
|
46
38
|
end
|
47
39
|
|
48
|
-
def
|
49
|
-
|
40
|
+
def attach_document(doc)
|
41
|
+
doc._modifier_path = _modifier_path
|
42
|
+
doc._selector_path = _selector_path
|
43
|
+
doc._root = _root
|
44
|
+
_root.send(:register_save_observer, doc)
|
50
45
|
end
|
51
46
|
end
|
52
47
|
end
|
@@ -20,7 +20,10 @@ module MongoDoc
|
|
20
20
|
define_method("#{name}=") do |value|
|
21
21
|
association = instance_variable_get("@#{name}")
|
22
22
|
unless association
|
23
|
-
association = Associations::DocumentProxy.new(:
|
23
|
+
association = Associations::DocumentProxy.new(:path => _selector_path,
|
24
|
+
:root => _root || self,
|
25
|
+
:assoc_name => name,
|
26
|
+
:assoc_class => assoc_class || self.class.class_from_name(name))
|
24
27
|
instance_variable_set("@#{name}", association)
|
25
28
|
end
|
26
29
|
association.document = value
|
@@ -29,7 +32,7 @@ module MongoDoc
|
|
29
32
|
validates_embedded name, :if => Proc.new { !send(name).nil? }
|
30
33
|
end
|
31
34
|
end
|
32
|
-
alias
|
35
|
+
alias has_one embed
|
33
36
|
|
34
37
|
def embed_many(*args)
|
35
38
|
options = args.extract_options!
|
@@ -43,7 +46,10 @@ module MongoDoc
|
|
43
46
|
define_method("#{name}") do
|
44
47
|
association = instance_variable_get("@#{name}")
|
45
48
|
unless association
|
46
|
-
association = Associations::CollectionProxy.new(:
|
49
|
+
association = Associations::CollectionProxy.new(:path => _selector_path,
|
50
|
+
:root => _root || self,
|
51
|
+
:assoc_name => name,
|
52
|
+
:assoc_class => assoc_class || self.class.class_from_name(name))
|
47
53
|
instance_variable_set("@#{name}", association)
|
48
54
|
end
|
49
55
|
association
|
@@ -60,7 +66,7 @@ module MongoDoc
|
|
60
66
|
end
|
61
67
|
end
|
62
68
|
end
|
63
|
-
alias
|
69
|
+
alias has_many embed_many
|
64
70
|
|
65
71
|
def embed_hash(*args)
|
66
72
|
options = args.extract_options!
|
@@ -74,7 +80,10 @@ module MongoDoc
|
|
74
80
|
define_method("#{name}") do
|
75
81
|
association = instance_variable_get("@#{name}")
|
76
82
|
unless association
|
77
|
-
association = Associations::HashProxy.new(:
|
83
|
+
association = Associations::HashProxy.new(:path => _selector_path,
|
84
|
+
:root => _root || self,
|
85
|
+
:assoc_name => name,
|
86
|
+
:assoc_class => assoc_class || self.class.class_from_name(name))
|
78
87
|
instance_variable_set("@#{name}", association)
|
79
88
|
end
|
80
89
|
association
|
@@ -87,7 +96,7 @@ module MongoDoc
|
|
87
96
|
end
|
88
97
|
end
|
89
98
|
end
|
90
|
-
alias
|
99
|
+
alias has_hash embed_hash
|
91
100
|
|
92
101
|
def class_from_name(name)
|
93
102
|
type_name_with_module(name.to_s.classify).constantize rescue nil
|
data/lib/mongo_doc/attributes.rb
CHANGED
@@ -7,7 +7,6 @@ module MongoDoc
|
|
7
7
|
class_inheritable_array :_associations
|
8
8
|
self._associations = []
|
9
9
|
|
10
|
-
attr_accessor :_parent
|
11
10
|
attr_accessor :_id
|
12
11
|
|
13
12
|
extend ClassMethods
|
@@ -28,28 +27,11 @@ module MongoDoc
|
|
28
27
|
end
|
29
28
|
end
|
30
29
|
|
31
|
-
def _root
|
32
|
-
@_root
|
33
|
-
end
|
34
|
-
|
35
|
-
def _root=(root)
|
36
|
-
@_root = root
|
37
|
-
_associations.each do|a|
|
38
|
-
association = send(a)
|
39
|
-
association._root = root if association
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
def _path_to_root(src, attrs, selector = false)
|
44
|
-
return attrs unless _parent
|
45
|
-
_parent._path_to_root(self, attrs, selector)
|
46
|
-
end
|
47
|
-
|
48
30
|
module ClassMethods
|
49
31
|
|
50
32
|
def self.extended(klass)
|
51
33
|
klass.class_eval do
|
52
|
-
|
34
|
+
singleton_class.alias_method_chain :attr_accessor, :mongo
|
53
35
|
end
|
54
36
|
end
|
55
37
|
|
@@ -95,7 +77,7 @@ module MongoDoc
|
|
95
77
|
end
|
96
78
|
end
|
97
79
|
end
|
98
|
-
alias
|
80
|
+
alias key attr_accessor_with_mongo
|
99
81
|
|
100
82
|
end
|
101
83
|
end
|
data/lib/mongo_doc/collection.rb
CHANGED
data/lib/mongo_doc/connection.rb
CHANGED
@@ -82,7 +82,7 @@ module MongoDoc
|
|
82
82
|
end
|
83
83
|
|
84
84
|
def verify_server_version(connection)
|
85
|
-
raise UnsupportedServerVersionError.new('MongoDoc requires at least mongoDB version 1.
|
85
|
+
raise UnsupportedServerVersionError.new('MongoDoc requires at least mongoDB version 1.4.0') unless connection.server_version >= "1.4.0"
|
86
86
|
end
|
87
87
|
end
|
88
88
|
end
|
@@ -18,7 +18,7 @@ module Mongoid
|
|
18
18
|
|
19
19
|
protected
|
20
20
|
|
21
|
-
# Convert ids from strings to +
|
21
|
+
# Convert ids from strings to +BSON::ObjectID+s
|
22
22
|
def strings_to_object_ids(ids)
|
23
23
|
if Array === ids
|
24
24
|
ids.map {|id| string_to_object_id(id) }
|
@@ -28,10 +28,10 @@ module Mongoid
|
|
28
28
|
|
29
29
|
end
|
30
30
|
|
31
|
-
# Convert ids from strings to +
|
31
|
+
# Convert ids from strings to +BSON::ObjectID+s
|
32
32
|
def string_to_object_id(id)
|
33
33
|
if String === id
|
34
|
-
::
|
34
|
+
::BSON::ObjectID.from_string(id)
|
35
35
|
else
|
36
36
|
id
|
37
37
|
end
|