mongo_doc 0.6.9 → 0.6.10
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/README.textile +1 -1
- data/VERSION +1 -1
- data/features/references.feature +11 -1
- data/features/step_definitions/documents.rb +1 -0
- data/features/step_definitions/field_steps.rb +12 -0
- data/lib/mongo_doc/document.rb +2 -0
- data/lib/mongo_doc/references_many.rb +46 -0
- data/lib/mongo_doc.rb +1 -1
- data/mongo_doc.gemspec +5 -3
- data/spec/references_many_spec.rb +108 -0
- metadata +7 -5
- data/features/step_definitions/reference_steps.rb +0 -0
data/README.textile
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.6.
|
1
|
+
0.6.10
|
data/features/references.feature
CHANGED
@@ -9,10 +9,20 @@ Feature: References
|
|
9
9
|
And an Address document named 'office' :
|
10
10
|
| City |
|
11
11
|
| New New York City |
|
12
|
+
And an Address document named 'old_office' :
|
13
|
+
| City |
|
14
|
+
| New York City |
|
12
15
|
|
13
|
-
Scenario: Automatically
|
16
|
+
Scenario: Automatically dereferences in references association
|
14
17
|
When I save the document 'office'
|
15
18
|
And 'Fry' references 'office' as 'address'
|
16
19
|
And I save the document 'Fry'
|
17
20
|
And the document 'Fry' is reloaded
|
18
21
|
Then 'Fry' refers to 'office' as 'address'
|
22
|
+
|
23
|
+
Scenario: Automatically dereferences in references_many association
|
24
|
+
When I save the document 'old_office'
|
25
|
+
And 'Fry' references 'old_office' through 'previous_addresses'
|
26
|
+
And I save the document 'Fry'
|
27
|
+
And the document 'Fry' is reloaded
|
28
|
+
Then 'Fry' has 'previous_addresses' that include 'old_office'
|
@@ -9,8 +9,20 @@ When /^'(\w+)' references '(\w+)' as '(\w+)'$/ do |parent, child, field|
|
|
9
9
|
parent_doc.send("#{field}=", child_doc)
|
10
10
|
end
|
11
11
|
|
12
|
+
When /^'(\w+)' references '(\w+)' through '(\w+)'$/ do |parent, child, field|
|
13
|
+
parent_doc = instance_variable_get("@#{parent}")
|
14
|
+
child_doc = instance_variable_get("@#{child}")
|
15
|
+
parent_doc.send("#{field.singularize}_ids") << child_doc._id
|
16
|
+
end
|
17
|
+
|
12
18
|
Then /^'(\w+)' refers to '(\w+)' as '(\w+)'$/ do |name, other, field|
|
13
19
|
doc = instance_variable_get("@#{name}")
|
14
20
|
other_doc = instance_variable_get("@#{other}")
|
15
21
|
doc.send("#{field}").should == other_doc
|
16
22
|
end
|
23
|
+
|
24
|
+
Then /^'(\w+)' has '(\w+)' that include '(\w+)'$/ do |name, field, included|
|
25
|
+
doc = instance_variable_get("@#{name}")
|
26
|
+
included_doc = instance_variable_get("@#{included}")
|
27
|
+
doc.send("#{field}").should include(included_doc)
|
28
|
+
end
|
data/lib/mongo_doc/document.rb
CHANGED
@@ -8,6 +8,7 @@ require 'mongo_doc/index'
|
|
8
8
|
require 'mongo_doc/scope'
|
9
9
|
require 'mongo_doc/timestamps'
|
10
10
|
require 'mongo_doc/references'
|
11
|
+
require 'mongo_doc/references_many'
|
11
12
|
require 'active_model/naming'
|
12
13
|
require 'active_model/translation'
|
13
14
|
require 'active_model/deprecated_error_methods'
|
@@ -35,6 +36,7 @@ module MongoDoc
|
|
35
36
|
extend Scope
|
36
37
|
extend Timestamps
|
37
38
|
extend References
|
39
|
+
extend ReferencesMany
|
38
40
|
include ::ActiveModel::Validations
|
39
41
|
extend ::ActiveModel::Naming
|
40
42
|
extend Validations
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module MongoDoc
|
2
|
+
module ReferencesMany
|
3
|
+
# Declare an array of references to other +Document+s.
|
4
|
+
#
|
5
|
+
# * classname:: name of +Document+ type as an +underscore+ symbol or string
|
6
|
+
# * options:: +:as+ specifies the name of the attribute
|
7
|
+
def references_many(classname, options = {})
|
8
|
+
klass = classname.to_s.camelize.singularize
|
9
|
+
objects_name = (options[:as] || klass.demodulize.downcase.pluralize).to_s
|
10
|
+
ids_name = "#{objects_name.singularize}_ids"
|
11
|
+
|
12
|
+
_keys << ids_name unless _keys.include?(ids_name)
|
13
|
+
|
14
|
+
module_eval(<<-RUBY, __FILE__, __LINE__)
|
15
|
+
def #{objects_name}=(array) # def addresses=(array)
|
16
|
+
@#{objects_name} = array # @addresses = array
|
17
|
+
self.#{ids_name} = array.map(&:_id) # self.address_ids = array.map(&:_id)
|
18
|
+
end # end
|
19
|
+
|
20
|
+
def #{objects_name} # def addresses
|
21
|
+
@#{objects_name} ||= if #{ids_name}.empty? # @addresses ||= if address_ids.empty?
|
22
|
+
[] # []
|
23
|
+
else # else
|
24
|
+
"#{klass}".constantize. # "Address".constantize.
|
25
|
+
find(*#{ids_name}).entries # find(*address_ids).entries
|
26
|
+
end # end
|
27
|
+
end
|
28
|
+
|
29
|
+
def #{ids_name}=(array) # def address_ids=(array)
|
30
|
+
@#{objects_name} = nil # @addresses = nil
|
31
|
+
@#{ids_name} = ReferencesMany.cast_array(array) # @address_ids = ReferencesMany.cast_array(array)
|
32
|
+
end # end
|
33
|
+
|
34
|
+
def #{ids_name} # def address_ids
|
35
|
+
@#{ids_name} ||= [] # @address_ids ||= []
|
36
|
+
end # end
|
37
|
+
RUBY
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.cast_array(array)
|
41
|
+
array.nil? ? [] : array.map do |item|
|
42
|
+
String === item ? ::BSON::ObjectID.cast_from_string(item) : item
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
data/lib/mongo_doc.rb
CHANGED
data/mongo_doc.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{mongo_doc}
|
8
|
-
s.version = "0.6.
|
8
|
+
s.version = "0.6.10"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Les Hill"]
|
12
|
-
s.date = %q{2010-07-
|
12
|
+
s.date = %q{2010-07-16}
|
13
13
|
s.description = %q{ODM for MongoDB}
|
14
14
|
s.email = %q{leshill@gmail.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -54,7 +54,6 @@ Gem::Specification.new do |s|
|
|
54
54
|
"features/step_definitions/objects.rb",
|
55
55
|
"features/step_definitions/partial_update_steps.rb",
|
56
56
|
"features/step_definitions/query_steps.rb",
|
57
|
-
"features/step_definitions/reference_steps.rb",
|
58
57
|
"features/step_definitions/removing_documents_steps.rb",
|
59
58
|
"features/step_definitions/scope_steps.rb",
|
60
59
|
"features/step_definitions/string_casting_steps.rb",
|
@@ -104,6 +103,7 @@ Gem::Specification.new do |s|
|
|
104
103
|
"lib/mongo_doc/railties/config.rb",
|
105
104
|
"lib/mongo_doc/railties/db_prepare.task",
|
106
105
|
"lib/mongo_doc/references.rb",
|
106
|
+
"lib/mongo_doc/references_many.rb",
|
107
107
|
"lib/mongo_doc/root.rb",
|
108
108
|
"lib/mongo_doc/scope.rb",
|
109
109
|
"lib/mongo_doc/timestamps.rb",
|
@@ -165,6 +165,7 @@ Gem::Specification.new do |s|
|
|
165
165
|
"spec/mongodb.yml",
|
166
166
|
"spec/mongodb_pairs.yml",
|
167
167
|
"spec/new_record_spec.rb",
|
168
|
+
"spec/references_many_spec.rb",
|
168
169
|
"spec/references_spec.rb",
|
169
170
|
"spec/root_spec.rb",
|
170
171
|
"spec/scope_spec.rb",
|
@@ -207,6 +208,7 @@ Gem::Specification.new do |s|
|
|
207
208
|
"spec/index_spec.rb",
|
208
209
|
"spec/matchers_spec.rb",
|
209
210
|
"spec/new_record_spec.rb",
|
211
|
+
"spec/references_many_spec.rb",
|
210
212
|
"spec/references_spec.rb",
|
211
213
|
"spec/root_spec.rb",
|
212
214
|
"spec/scope_spec.rb",
|
@@ -0,0 +1,108 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe MongoDoc::ReferencesMany do
|
4
|
+
class Address
|
5
|
+
include MongoDoc::Document
|
6
|
+
|
7
|
+
attr_accessor :state
|
8
|
+
end
|
9
|
+
|
10
|
+
context "Simple Reference" do
|
11
|
+
class Person
|
12
|
+
include MongoDoc::Document
|
13
|
+
|
14
|
+
references_many :addresses
|
15
|
+
end
|
16
|
+
|
17
|
+
subject { Person.new }
|
18
|
+
|
19
|
+
context "Object accessor" do
|
20
|
+
it { should respond_to(:addresses) }
|
21
|
+
it { should respond_to(:addresses=) }
|
22
|
+
|
23
|
+
it "is not part of the persistent key set" do
|
24
|
+
Person._keys.should_not include('addresses')
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
context "Object Id accessor" do
|
29
|
+
it { should respond_to(:address_ids) }
|
30
|
+
it { should respond_to(:address_ids=) }
|
31
|
+
|
32
|
+
it "is part of the persistent key set" do
|
33
|
+
Person._keys.should include('address_ids')
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
context "Named Reference" do
|
39
|
+
class Person
|
40
|
+
include MongoDoc::Document
|
41
|
+
|
42
|
+
references_many :addresses, :as => :known_addresses
|
43
|
+
end
|
44
|
+
|
45
|
+
subject { Person.new }
|
46
|
+
|
47
|
+
context "Object accessor" do
|
48
|
+
it { should respond_to(:known_addresses) }
|
49
|
+
it { should respond_to(:known_addresses=) }
|
50
|
+
|
51
|
+
it "is not part of the persistent key set" do
|
52
|
+
Person._keys.should_not include('known_addresses')
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
context "Object Id accessor" do
|
57
|
+
it { should respond_to(:known_address_ids) }
|
58
|
+
it { should respond_to(:known_address_ids=) }
|
59
|
+
|
60
|
+
it "is part of the persistent key set" do
|
61
|
+
Person._keys.should include('known_address_ids')
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
describe "setting the ids" do
|
67
|
+
class Person
|
68
|
+
include MongoDoc::Document
|
69
|
+
|
70
|
+
references_many :address
|
71
|
+
end
|
72
|
+
|
73
|
+
let(:address) { Address.new(:_id => BSON::ObjectID.new) }
|
74
|
+
let(:person) { Person.new }
|
75
|
+
|
76
|
+
context "to" do
|
77
|
+
before do
|
78
|
+
person.addresses = [address]
|
79
|
+
end
|
80
|
+
|
81
|
+
context "nil" do
|
82
|
+
before do
|
83
|
+
person.address_ids = nil
|
84
|
+
end
|
85
|
+
|
86
|
+
it "sets the ids to []" do
|
87
|
+
person.address_ids.should == []
|
88
|
+
end
|
89
|
+
|
90
|
+
it "resets the objects to nil" do
|
91
|
+
person.addresses.should == []
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
it "[] resets the objects to []" do
|
96
|
+
person.address_ids = []
|
97
|
+
person.addresses.should == []
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
context "to strings" do
|
102
|
+
it "converts the strings to ids" do
|
103
|
+
person.address_ids = [address._id.to_s]
|
104
|
+
person.address_ids.should == [address._id]
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mongo_doc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 19
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 6
|
9
|
-
-
|
10
|
-
version: 0.6.
|
9
|
+
- 10
|
10
|
+
version: 0.6.10
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Les Hill
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-07-
|
18
|
+
date: 2010-07-16 00:00:00 -04:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -183,7 +183,6 @@ files:
|
|
183
183
|
- features/step_definitions/objects.rb
|
184
184
|
- features/step_definitions/partial_update_steps.rb
|
185
185
|
- features/step_definitions/query_steps.rb
|
186
|
-
- features/step_definitions/reference_steps.rb
|
187
186
|
- features/step_definitions/removing_documents_steps.rb
|
188
187
|
- features/step_definitions/scope_steps.rb
|
189
188
|
- features/step_definitions/string_casting_steps.rb
|
@@ -233,6 +232,7 @@ files:
|
|
233
232
|
- lib/mongo_doc/railties/config.rb
|
234
233
|
- lib/mongo_doc/railties/db_prepare.task
|
235
234
|
- lib/mongo_doc/references.rb
|
235
|
+
- lib/mongo_doc/references_many.rb
|
236
236
|
- lib/mongo_doc/root.rb
|
237
237
|
- lib/mongo_doc/scope.rb
|
238
238
|
- lib/mongo_doc/timestamps.rb
|
@@ -294,6 +294,7 @@ files:
|
|
294
294
|
- spec/mongodb.yml
|
295
295
|
- spec/mongodb_pairs.yml
|
296
296
|
- spec/new_record_spec.rb
|
297
|
+
- spec/references_many_spec.rb
|
297
298
|
- spec/references_spec.rb
|
298
299
|
- spec/root_spec.rb
|
299
300
|
- spec/scope_spec.rb
|
@@ -364,6 +365,7 @@ test_files:
|
|
364
365
|
- spec/index_spec.rb
|
365
366
|
- spec/matchers_spec.rb
|
366
367
|
- spec/new_record_spec.rb
|
368
|
+
- spec/references_many_spec.rb
|
367
369
|
- spec/references_spec.rb
|
368
370
|
- spec/root_spec.rb
|
369
371
|
- spec/scope_spec.rb
|
File without changes
|