mongo_doc 0.6.5 → 0.6.6

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  h1. MongoDoc
2
2
 
3
- Version: Hurricane (0.6.5) 2010/07/07
3
+ Version: Hurricane (0.6.6) 2010/07/09
4
4
 
5
5
  h2. Notes
6
6
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.6.5
1
+ 0.6.6
@@ -0,0 +1,18 @@
1
+ Feature: References
2
+
3
+ Background:
4
+ Given an empty Person document collection
5
+ And a Person document named 'Fry' :
6
+ | Name |
7
+ | Philip J. Fry |
8
+ And an empty Address document collection
9
+ And an Address document named 'office' :
10
+ | City |
11
+ | New New York City |
12
+
13
+ Scenario: Automatically dereferenced
14
+ When I save the document 'office'
15
+ And 'Fry' references 'office' as 'address'
16
+ And I save the document 'Fry'
17
+ And the document 'Fry' is reloaded
18
+ Then 'Fry' refers to 'office' as 'address'
@@ -43,6 +43,7 @@ class Person
43
43
  include MongoDoc::Document
44
44
 
45
45
  attr_accessor :name
46
+ references :address
46
47
 
47
48
  timestamps!
48
49
  end
@@ -2,3 +2,15 @@ Then /^the field (\w+) of the document '(\w+)' is not nil$/ do |field, name|
2
2
  doc = instance_variable_get("@#{name}")
3
3
  doc.send(field).should_not be_nil
4
4
  end
5
+
6
+ When /^'(\w+)' references '(\w+)' as '(\w+)'$/ do |parent, child, field|
7
+ parent_doc = instance_variable_get("@#{parent}")
8
+ child_doc = instance_variable_get("@#{child}")
9
+ parent_doc.send("#{field}=", child_doc)
10
+ end
11
+
12
+ Then /^'(\w+)' refers to '(\w+)' as '(\w+)'$/ do |name, other, field|
13
+ doc = instance_variable_get("@#{name}")
14
+ other_doc = instance_variable_get("@#{other}")
15
+ doc.send("#{field}").should == other_doc
16
+ end
File without changes
@@ -7,6 +7,7 @@ require 'mongo_doc/finders'
7
7
  require 'mongo_doc/index'
8
8
  require 'mongo_doc/scope'
9
9
  require 'mongo_doc/timestamps'
10
+ require 'mongo_doc/references'
10
11
  require 'active_model/naming'
11
12
  require 'active_model/translation'
12
13
  require 'active_model/deprecated_error_methods'
@@ -33,6 +34,7 @@ module MongoDoc
33
34
  extend Index
34
35
  extend Scope
35
36
  extend Timestamps
37
+ extend References
36
38
  include ::ActiveModel::Validations
37
39
  extend ::ActiveModel::Naming
38
40
  extend Validations
@@ -3,5 +3,9 @@ module BSON
3
3
  def to_bson(*args)
4
4
  self
5
5
  end
6
+
7
+ def self.cast_from_string(string)
8
+ ObjectID.from_string(string) unless string.blank?
9
+ end
6
10
  end
7
11
  end
@@ -0,0 +1,36 @@
1
+ module MongoDoc
2
+ module References
3
+ # Declare a reference to another +Document+.
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(classname, options = {})
8
+ klass = classname.to_s.camelize
9
+ attr_name = options[:as] || klass.to_s.demodulize.downcase
10
+
11
+ attr_accessor "#{attr_name}_id".to_sym, :type => ::BSON::ObjectID
12
+
13
+ module_eval(<<-RUBY, __FILE__, __LINE__)
14
+ def #{attr_name}_id_with_reference=(value) # def address_id_with_reference=(value)
15
+ @#{attr_name} = nil # @address = nil
16
+ self.#{attr_name}_id_without_reference = value # self.address_id_without_reference = value
17
+ end # end
18
+
19
+ def #{attr_name}
20
+ @#{attr_name} ||= if #{attr_name}_id.nil? # @address ||= if address_name_id.nil?
21
+ nil # nil
22
+ else # else
23
+ #{klass}.find_one(#{attr_name}_id) # Address.find_one(address_name_id)
24
+ end # end
25
+ end
26
+
27
+ def #{attr_name}=(value) # def address=(value)
28
+ @#{attr_name} = value # @address = value
29
+ self.#{attr_name}_id = value.nil? ? nil : value._id # self.address_id = value.nil? ? nil : value._id
30
+ end # end
31
+ RUBY
32
+
33
+ alias_method_chain "#{attr_name}_id=", :reference
34
+ end
35
+ end
36
+ end
data/lib/mongo_doc.rb CHANGED
@@ -3,7 +3,7 @@ require 'active_support'
3
3
  require 'active_support/core_ext'
4
4
 
5
5
  module MongoDoc
6
- VERSION = '0.6.5'
6
+ VERSION = '0.6.6'
7
7
  end
8
8
 
9
9
  require 'mongo_doc/connection'
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.5"
8
+ s.version = "0.6.6"
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-07}
12
+ s.date = %q{2010-07-09}
13
13
  s.description = %q{ODM for MongoDB}
14
14
  s.email = %q{leshill@gmail.com}
15
15
  s.extra_rdoc_files = [
@@ -40,6 +40,7 @@ Gem::Specification.new do |s|
40
40
  "features/mongodoc_base.feature",
41
41
  "features/new_record.feature",
42
42
  "features/partial_updates.feature",
43
+ "features/references.feature",
43
44
  "features/removing_documents.feature",
44
45
  "features/saving_an_object.feature",
45
46
  "features/scopes.feature",
@@ -55,6 +56,7 @@ Gem::Specification.new do |s|
55
56
  "features/step_definitions/objects.rb",
56
57
  "features/step_definitions/partial_update_steps.rb",
57
58
  "features/step_definitions/query_steps.rb",
59
+ "features/step_definitions/reference_steps.rb",
58
60
  "features/step_definitions/removing_documents_steps.rb",
59
61
  "features/step_definitions/scope_steps.rb",
60
62
  "features/step_definitions/string_casting_steps.rb",
@@ -103,6 +105,7 @@ Gem::Specification.new do |s|
103
105
  "lib/mongo_doc/railtie.rb",
104
106
  "lib/mongo_doc/railties/config.rb",
105
107
  "lib/mongo_doc/railties/db_prepare.task",
108
+ "lib/mongo_doc/references.rb",
106
109
  "lib/mongo_doc/root.rb",
107
110
  "lib/mongo_doc/scope.rb",
108
111
  "lib/mongo_doc/timestamps.rb",
@@ -163,6 +166,7 @@ Gem::Specification.new do |s|
163
166
  "spec/mongodb.yml",
164
167
  "spec/mongodb_pairs.yml",
165
168
  "spec/new_record_spec.rb",
169
+ "spec/references_spec.rb",
166
170
  "spec/root_spec.rb",
167
171
  "spec/scope_spec.rb",
168
172
  "spec/spec_helper.rb",
@@ -203,6 +207,7 @@ Gem::Specification.new do |s|
203
207
  "spec/index_spec.rb",
204
208
  "spec/matchers_spec.rb",
205
209
  "spec/new_record_spec.rb",
210
+ "spec/references_spec.rb",
206
211
  "spec/root_spec.rb",
207
212
  "spec/scope_spec.rb",
208
213
  "spec/spec_helper.rb",
data/spec/ext_spec.rb CHANGED
@@ -75,6 +75,17 @@ describe "Ruby Object Extensions" do
75
75
  end
76
76
  end
77
77
 
78
+ context "ObjectID" do
79
+ it "returns nil for a blank string" do
80
+ BSON::ObjectID.cast_from_string('').should be_nil
81
+ end
82
+
83
+ it "converts from a string to an ObjectID" do
84
+ obj = BSON::ObjectID.new
85
+ BSON::ObjectID.cast_from_string(obj.to_s).should == obj
86
+ end
87
+ end
88
+
78
89
  context "Time" do
79
90
  it "returns nil for a blank string" do
80
91
  Time.cast_from_string('').should be_nil
@@ -0,0 +1,82 @@
1
+ require 'spec_helper'
2
+
3
+ describe MongoDoc::References 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 :address
15
+ end
16
+
17
+ subject { Person.new }
18
+
19
+ context "Object accessor" do
20
+ it { should respond_to(:address) }
21
+ it { should respond_to(:address=) }
22
+
23
+ it "is not part of the persistent key set" do
24
+ Person._keys.should_not include(:address)
25
+ end
26
+ end
27
+
28
+ context "Object Id accessor" do
29
+ it { should respond_to(:address_id) }
30
+ it { should respond_to(:address_id=) }
31
+
32
+ it "is part of the persistent key set" do
33
+ Person._keys.should include(:address_id)
34
+ end
35
+ end
36
+ end
37
+
38
+ context "Named Reference" do
39
+ class Person
40
+ include MongoDoc::Document
41
+
42
+ references :address, :as => :work_address
43
+ end
44
+
45
+ subject { Person.new }
46
+
47
+ context "Object accessor" do
48
+ it { should respond_to(:work_address) }
49
+ it { should respond_to(:work_address=) }
50
+
51
+ it "is not part of the persistent key set" do
52
+ Person._keys.should_not include(:work_address)
53
+ end
54
+ end
55
+
56
+ context "Object Id accessor" do
57
+ it { should respond_to(:work_address_id) }
58
+ it { should respond_to(:work_address_id=) }
59
+
60
+ it "is part of the persistent key set" do
61
+ Person._keys.should include(:work_address_id)
62
+ end
63
+ end
64
+ end
65
+
66
+ describe "setting the id" do
67
+ class Person
68
+ include MongoDoc::Document
69
+
70
+ references :address
71
+ end
72
+
73
+ let(:address) { Address.new(:_id => BSON::ObjectID.new) }
74
+ let(:person) { Person.new }
75
+
76
+ it "resets the object to nil" do
77
+ person.address = address
78
+ person.address_id = nil
79
+ person.address.should be_nil
80
+ end
81
+ end
82
+ 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: 13
4
+ hash: 11
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 6
9
- - 5
10
- version: 0.6.5
9
+ - 6
10
+ version: 0.6.6
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-07 00:00:00 -04:00
18
+ date: 2010-07-09 00:00:00 -04:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -169,6 +169,7 @@ files:
169
169
  - features/mongodoc_base.feature
170
170
  - features/new_record.feature
171
171
  - features/partial_updates.feature
172
+ - features/references.feature
172
173
  - features/removing_documents.feature
173
174
  - features/saving_an_object.feature
174
175
  - features/scopes.feature
@@ -184,6 +185,7 @@ files:
184
185
  - features/step_definitions/objects.rb
185
186
  - features/step_definitions/partial_update_steps.rb
186
187
  - features/step_definitions/query_steps.rb
188
+ - features/step_definitions/reference_steps.rb
187
189
  - features/step_definitions/removing_documents_steps.rb
188
190
  - features/step_definitions/scope_steps.rb
189
191
  - features/step_definitions/string_casting_steps.rb
@@ -232,6 +234,7 @@ files:
232
234
  - lib/mongo_doc/railtie.rb
233
235
  - lib/mongo_doc/railties/config.rb
234
236
  - lib/mongo_doc/railties/db_prepare.task
237
+ - lib/mongo_doc/references.rb
235
238
  - lib/mongo_doc/root.rb
236
239
  - lib/mongo_doc/scope.rb
237
240
  - lib/mongo_doc/timestamps.rb
@@ -292,6 +295,7 @@ files:
292
295
  - spec/mongodb.yml
293
296
  - spec/mongodb_pairs.yml
294
297
  - spec/new_record_spec.rb
298
+ - spec/references_spec.rb
295
299
  - spec/root_spec.rb
296
300
  - spec/scope_spec.rb
297
301
  - spec/spec_helper.rb
@@ -360,6 +364,7 @@ test_files:
360
364
  - spec/index_spec.rb
361
365
  - spec/matchers_spec.rb
362
366
  - spec/new_record_spec.rb
367
+ - spec/references_spec.rb
363
368
  - spec/root_spec.rb
364
369
  - spec/scope_spec.rb
365
370
  - spec/spec_helper.rb