dm-mongo-adapter 0.2.0.pre3 → 0.6.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.
- data/Gemfile +27 -0
- data/README.rdoc +16 -35
- data/Rakefile +6 -16
- data/VERSION.yml +2 -2
- data/dm-mongo-adapter.gemspec +100 -121
- data/lib/mongo_adapter.rb +19 -62
- data/lib/mongo_adapter/adapter.rb +49 -36
- data/lib/mongo_adapter/conditions.rb +0 -5
- data/lib/mongo_adapter/migrations.rb +17 -23
- data/lib/mongo_adapter/model.rb +3 -74
- data/lib/mongo_adapter/modifier.rb +1 -1
- data/lib/mongo_adapter/property/array.rb +10 -0
- data/lib/mongo_adapter/property/db_ref.rb +17 -0
- data/lib/mongo_adapter/property/hash.rb +27 -0
- data/lib/mongo_adapter/property/object_id.rb +47 -0
- data/lib/mongo_adapter/query.rb +42 -45
- data/lib/mongo_adapter/rails/storage.rb +15 -0
- data/lib/mongo_adapter/resource.rb +0 -130
- data/lib/mongo_adapter/support/class.rb +11 -0
- data/lib/mongo_adapter/support/date.rb +11 -0
- data/lib/mongo_adapter/support/date_time.rb +12 -0
- data/lib/mongo_adapter/support/object.rb +9 -0
- data/spec/legacy/adapter_spec.rb +9 -6
- data/spec/legacy/associations_spec.rb +37 -29
- data/spec/legacy/property_spec.rb +4 -3
- data/spec/legacy/sti_spec.rb +1 -2
- data/spec/lib/cleanup_models.rb +0 -1
- data/spec/public/aggregates_spec.rb +171 -0
- data/spec/public/model_spec.rb +8 -22
- data/spec/public/modifier_spec.rb +109 -0
- data/spec/public/properties/db_ref_spec.rb +17 -0
- data/spec/public/properties/object_id_spec.rb +15 -0
- data/spec/public/resource_spec.rb +2 -383
- data/spec/public/shared/object_id_shared_spec.rb +16 -39
- data/spec/spec_helper.rb +0 -4
- metadata +87 -117
- data/.gitignore +0 -9
- data/lib/mongo_adapter/embedded_model.rb +0 -187
- data/lib/mongo_adapter/embedded_resource.rb +0 -134
- data/lib/mongo_adapter/embedments/one_to_many.rb +0 -144
- data/lib/mongo_adapter/embedments/one_to_one.rb +0 -57
- data/lib/mongo_adapter/embedments/relationship.rb +0 -258
- data/lib/mongo_adapter/model/embedment.rb +0 -215
- data/lib/mongo_adapter/types/date.rb +0 -24
- data/lib/mongo_adapter/types/date_time.rb +0 -28
- data/lib/mongo_adapter/types/db_ref.rb +0 -65
- data/lib/mongo_adapter/types/discriminator.rb +0 -32
- data/lib/mongo_adapter/types/object_id.rb +0 -72
- data/lib/mongo_adapter/types/objects.rb +0 -31
- data/spec/legacy/embedded_resource_spec.rb +0 -157
- data/spec/legacy/embedments_spec.rb +0 -177
- data/spec/legacy/modifier_spec.rb +0 -81
- data/spec/public/embedded_collection_spec.rb +0 -61
- data/spec/public/embedded_resource_spec.rb +0 -220
- data/spec/public/model/embedment_spec.rb +0 -186
- data/spec/public/shared/model_embedments_spec.rb +0 -338
- data/spec/public/types/df_ref_spec.rb +0 -6
- data/spec/public/types/discriminator_spec.rb +0 -118
- data/spec/public/types/embedded_array_spec.rb +0 -55
- data/spec/public/types/embedded_hash_spec.rb +0 -83
- data/spec/public/types/object_id_spec.rb +0 -6
- data/spec/semipublic/embedded_model_spec.rb +0 -43
- data/spec/semipublic/model/embedment_spec.rb +0 -42
- data/spec/semipublic/resource_spec.rb +0 -70
@@ -1,118 +0,0 @@
|
|
1
|
-
require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'spec_helper'))
|
2
|
-
|
3
|
-
describe DataMapper::Mongo::Types::Discriminator do
|
4
|
-
before :all do
|
5
|
-
class Article
|
6
|
-
include DataMapper::Mongo::Resource
|
7
|
-
|
8
|
-
property :id, ObjectID
|
9
|
-
property :title, String, :required => true
|
10
|
-
property :type, Discriminator
|
11
|
-
end
|
12
|
-
|
13
|
-
class Announcement < Article; end
|
14
|
-
class Release < Announcement; end
|
15
|
-
|
16
|
-
Article.all.destroy!
|
17
|
-
|
18
|
-
@article_model = Article
|
19
|
-
@announcement_model = Announcement
|
20
|
-
@release_model = Release
|
21
|
-
end
|
22
|
-
|
23
|
-
it 'should typecast to a Model' do
|
24
|
-
@article_model.properties[:type].typecast('Release').should equal(@release_model)
|
25
|
-
end
|
26
|
-
|
27
|
-
describe 'Model#new' do
|
28
|
-
describe 'when provided a String discriminator in the attributes' do
|
29
|
-
before :all do
|
30
|
-
@resource = @article_model.new(:type => 'Release')
|
31
|
-
end
|
32
|
-
|
33
|
-
it 'should return a Resource' do
|
34
|
-
@resource.should be_kind_of(DataMapper::Resource)
|
35
|
-
end
|
36
|
-
|
37
|
-
it 'should be an descendant instance' do
|
38
|
-
@resource.should be_instance_of(Release)
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
describe 'when provided a Class discriminator in the attributes' do
|
43
|
-
before :all do
|
44
|
-
@resource = @article_model.new(:type => Release)
|
45
|
-
end
|
46
|
-
|
47
|
-
it 'should return a Resource' do
|
48
|
-
@resource.should be_kind_of(DataMapper::Resource)
|
49
|
-
end
|
50
|
-
|
51
|
-
it 'should be an descendant instance' do
|
52
|
-
@resource.should be_instance_of(Release)
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
describe 'when not provided a discriminator in the attributes' do
|
57
|
-
before :all do
|
58
|
-
@resource = @article_model.new
|
59
|
-
end
|
60
|
-
|
61
|
-
it 'should return a Resource' do
|
62
|
-
@resource.should be_kind_of(DataMapper::Resource)
|
63
|
-
end
|
64
|
-
|
65
|
-
it 'should be a base model instance' do
|
66
|
-
@resource.should be_instance_of(@article_model)
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
describe 'Model#descendants' do
|
72
|
-
it 'should set the descendants for the grandparent model' do
|
73
|
-
@article_model.descendants.to_a.should == [ @article_model, @announcement_model, @release_model ]
|
74
|
-
end
|
75
|
-
|
76
|
-
it 'should set the descendants for the parent model' do
|
77
|
-
@announcement_model.descendants.to_a.should == [ @announcement_model, @release_model ]
|
78
|
-
end
|
79
|
-
|
80
|
-
it 'should set the descendants for the child model' do
|
81
|
-
@release_model.descendants.to_a.should == [ @release_model ]
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
describe 'Model#default_scope' do
|
86
|
-
it 'should set the default scope for the grandparent model' do
|
87
|
-
@article_model.default_scope[:type].should equal(@article_model.descendants)
|
88
|
-
end
|
89
|
-
|
90
|
-
it 'should set the default scope for the parent model' do
|
91
|
-
@announcement_model.default_scope[:type].should equal(@announcement_model.descendants)
|
92
|
-
end
|
93
|
-
|
94
|
-
it 'should set the default scope for the child model' do
|
95
|
-
@release_model.default_scope[:type].should equal(@release_model.descendants)
|
96
|
-
end
|
97
|
-
end
|
98
|
-
|
99
|
-
before :all do
|
100
|
-
@announcement = @announcement_model.create(:title => 'Announcement')
|
101
|
-
end
|
102
|
-
|
103
|
-
it 'should persist the type' do
|
104
|
-
@announcement.model.get(*@announcement.key).type.should equal(@announcement_model)
|
105
|
-
end
|
106
|
-
|
107
|
-
it 'should be retrieved as an instance of the correct class' do
|
108
|
-
@announcement.model.get(*@announcement.key).should be_instance_of(@announcement_model)
|
109
|
-
end
|
110
|
-
|
111
|
-
it 'should include descendants in finders' do
|
112
|
-
@article_model.first.should eql(@announcement)
|
113
|
-
end
|
114
|
-
|
115
|
-
it 'should not include ancestors' do
|
116
|
-
@release_model.first.should be_nil
|
117
|
-
end
|
118
|
-
end
|
@@ -1,55 +0,0 @@
|
|
1
|
-
require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'spec_helper'))
|
2
|
-
|
3
|
-
describe DataMapper::Mongo::Types::EmbeddedArray do
|
4
|
-
describe '.load' do
|
5
|
-
it 'should return nil when given nil' do
|
6
|
-
DataMapper::Mongo::Types::EmbeddedArray.load(nil, nil).should be_nil
|
7
|
-
end
|
8
|
-
|
9
|
-
it 'should return the argument when given an Array' do
|
10
|
-
loaded = DataMapper::Mongo::Types::EmbeddedArray.load([1, 2], nil)
|
11
|
-
loaded.should == [1, 2]
|
12
|
-
end
|
13
|
-
|
14
|
-
it 'should raise an error when given anything else' do
|
15
|
-
pending "EmbeddedArray should not be able to load arbitrary objects" do
|
16
|
-
[ 0, 1, Object.new, true, false, {} ].each do |value|
|
17
|
-
lambda {
|
18
|
-
DataMapper::Mongo::Types::EmbeddedArray.load(value, nil)
|
19
|
-
}.should raise_error(ArgumentError)
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
describe '.dump' do
|
26
|
-
it 'should return nil when given nil' do
|
27
|
-
DataMapper::Mongo::Types::EmbeddedArray.dump(nil, nil).should == nil
|
28
|
-
end
|
29
|
-
|
30
|
-
it 'should return the argument when given an Array' do
|
31
|
-
dumped = DataMapper::Mongo::Types::EmbeddedArray.dump([1, 2], nil)
|
32
|
-
dumped.should == [1, 2]
|
33
|
-
end
|
34
|
-
|
35
|
-
it 'should return an Array when given a Set' do
|
36
|
-
pending do
|
37
|
-
dumped = DataMapper::Mongo::Types::EmbeddedArray.dump(Set.new(1, 2), nil)
|
38
|
-
dumped.should be_kind_of(Array)
|
39
|
-
dumped.should == [1, 2]
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
it 'should raise an error when given anything else' do
|
44
|
-
pending "EmbeddedArray should not be able to dump objects which " \
|
45
|
-
"can't later be loaded" do
|
46
|
-
[ 0, 1, Object.new, true, false, {} ].each do |value|
|
47
|
-
lambda {
|
48
|
-
DataMapper::Mongo::Types::EmbeddedArray.dump(value, nil)
|
49
|
-
}.should raise_error(ArgumentError)
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
end
|
@@ -1,83 +0,0 @@
|
|
1
|
-
require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'spec_helper'))
|
2
|
-
|
3
|
-
describe DataMapper::Mongo::Types::EmbeddedHash do
|
4
|
-
EHash = DataMapper::Mongo::Types::EmbeddedHash
|
5
|
-
|
6
|
-
describe '.load' do
|
7
|
-
it 'should return nil when given nil' do
|
8
|
-
EHash.load(nil, nil).should be_nil
|
9
|
-
end
|
10
|
-
|
11
|
-
it 'should return an empty Hash when given an empty Hash' do
|
12
|
-
loaded = EHash.load({}, nil)
|
13
|
-
loaded.should == {}
|
14
|
-
end
|
15
|
-
|
16
|
-
it 'should return a Hash with values when given a Hash with values' do
|
17
|
-
loaded = EHash.load({ :hello => 'World' }, nil)
|
18
|
-
loaded.should == { :hello => 'World' }
|
19
|
-
end
|
20
|
-
|
21
|
-
it 'should return a Hash with symbolized keys' do
|
22
|
-
loaded = EHash.load({ 'hello' => 'World' }, nil)
|
23
|
-
loaded.should == { :hello => 'World' }
|
24
|
-
end
|
25
|
-
|
26
|
-
it 'should return an empty Hash when given an Array with no values' do
|
27
|
-
loaded = EHash.load([], nil)
|
28
|
-
loaded.should == {}
|
29
|
-
end
|
30
|
-
|
31
|
-
it 'should return an empty Hash with values when given an Array with values' do
|
32
|
-
loaded = EHash.load([:hello, 'World'], nil)
|
33
|
-
loaded.should == { :hello => 'World' }
|
34
|
-
end
|
35
|
-
|
36
|
-
it 'should raise an error when given anything else' do
|
37
|
-
pending "EmbeddedHash should not be able to load arbitrary objects" do
|
38
|
-
lambda { EHash.load(0, nil) }.should raise_error(ArgumentError)
|
39
|
-
lambda { EHash.load(1, nil) }.should raise_error(ArgumentError)
|
40
|
-
lambda { EHash.load(Object.new, nil) }.should raise_error(ArgumentError)
|
41
|
-
lambda { EHash.load(true, nil) }.should raise_error(ArgumentError)
|
42
|
-
lambda { EHash.load(false, nil) }.should raise_error(ArgumentError)
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
describe '.dump' do
|
48
|
-
it 'should return nil when given nil' do
|
49
|
-
EHash.dump(nil, nil).should be_nil
|
50
|
-
end
|
51
|
-
|
52
|
-
it 'should return an empty Hash when given an empty Hash' do
|
53
|
-
EHash.dump({}, nil).should == {}
|
54
|
-
end
|
55
|
-
|
56
|
-
it 'should return a Hash with values when given a Hash with values' do
|
57
|
-
EHash.dump({ :hello => 'World' }, nil).should == { :hello => 'World' }
|
58
|
-
end
|
59
|
-
|
60
|
-
it 'should return an empty Hash when given an empty Mash' do
|
61
|
-
EHash.dump(Mash.new, nil).should == {}
|
62
|
-
end
|
63
|
-
|
64
|
-
it 'should return a Hash with values when given a Mash with values' do
|
65
|
-
dumped = EHash.dump(Mash.new('hello' => 'World'), nil)
|
66
|
-
dumped.should == { 'hello' => 'World' }
|
67
|
-
end
|
68
|
-
|
69
|
-
it 'should raise an error when given anything else' do
|
70
|
-
pending "EmbeddedHash should not be able to dump objects which " \
|
71
|
-
"can't later be loaded" do
|
72
|
-
lambda { EHash.dump(0, nil) }.should raise_error(ArgumentError)
|
73
|
-
lambda { EHash.dump(1, nil) }.should raise_error(ArgumentError)
|
74
|
-
lambda { EHash.dump(Object.new, nil) }.should raise_error(ArgumentError)
|
75
|
-
lambda { EHash.dump(true, nil) }.should raise_error(ArgumentError)
|
76
|
-
lambda { EHash.dump(false, nil) }.should raise_error(ArgumentError)
|
77
|
-
lambda { EHash.dump([], nil) }.should raise_error(ArgumentError)
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
end
|
82
|
-
|
83
|
-
end
|
@@ -1,43 +0,0 @@
|
|
1
|
-
require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
|
2
|
-
|
3
|
-
describe DataMapper::Mongo::Resource do
|
4
|
-
|
5
|
-
before(:all) do
|
6
|
-
class ::CarType
|
7
|
-
include DataMapper::Mongo::EmbeddedResource
|
8
|
-
property :name, String
|
9
|
-
end
|
10
|
-
|
11
|
-
class ::Car
|
12
|
-
include DataMapper::Mongo::Resource
|
13
|
-
property :model, String
|
14
|
-
end
|
15
|
-
|
16
|
-
class ::DMCar
|
17
|
-
include DataMapper::Resource
|
18
|
-
property :type, String
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
#
|
23
|
-
# descendants
|
24
|
-
#
|
25
|
-
|
26
|
-
describe '#descendants' do
|
27
|
-
before(:all) do
|
28
|
-
@descendants = DataMapper::Mongo::EmbeddedModel.descendants
|
29
|
-
end
|
30
|
-
|
31
|
-
it 'should include Mongo embedment models' do
|
32
|
-
@descendants.should include(CarType)
|
33
|
-
end
|
34
|
-
|
35
|
-
it 'should not include Mongo models' do
|
36
|
-
@descendants.should_not include(Car)
|
37
|
-
end
|
38
|
-
|
39
|
-
it 'should not include DataMapper models' do
|
40
|
-
@descendants.should_not include(DMCar)
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
@@ -1,42 +0,0 @@
|
|
1
|
-
require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'spec_helper'))
|
2
|
-
|
3
|
-
describe DataMapper::Mongo::Model::Embedment do
|
4
|
-
|
5
|
-
before(:all) do
|
6
|
-
class ::Address
|
7
|
-
include DataMapper::Mongo::EmbeddedResource
|
8
|
-
property :street, String
|
9
|
-
property :city, String, :field => 'conurbation'
|
10
|
-
end
|
11
|
-
|
12
|
-
class ::User
|
13
|
-
include DataMapper::Mongo::Resource
|
14
|
-
property :id, ObjectID
|
15
|
-
embeds 1, :address
|
16
|
-
embeds n, :locations, Address
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
describe '#embedments' do
|
21
|
-
before(:all) do
|
22
|
-
@embedments = User.embedments
|
23
|
-
end
|
24
|
-
|
25
|
-
it 'should return a hash' do
|
26
|
-
@embedments.should be_kind_of(Hash)
|
27
|
-
end
|
28
|
-
|
29
|
-
it 'should include OneToOne embedments' do
|
30
|
-
@embedments.should have_key(:address)
|
31
|
-
@embedments[:address].should \
|
32
|
-
be_kind_of(DataMapper::Mongo::Embedments::OneToOne::Relationship)
|
33
|
-
end
|
34
|
-
|
35
|
-
it 'should include OneToMany embedments' do
|
36
|
-
@embedments.should have_key(:locations)
|
37
|
-
@embedments[:locations].should \
|
38
|
-
be_kind_of(DataMapper::Mongo::Embedments::OneToMany::Relationship)
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
end
|
@@ -1,70 +0,0 @@
|
|
1
|
-
require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
|
2
|
-
|
3
|
-
describe DataMapper::Mongo::Resource do
|
4
|
-
|
5
|
-
before(:all) do
|
6
|
-
class ::Address
|
7
|
-
include DataMapper::Mongo::EmbeddedResource
|
8
|
-
property :city, String
|
9
|
-
end
|
10
|
-
|
11
|
-
class ::User
|
12
|
-
include DataMapper::Mongo::Resource
|
13
|
-
property :id, ObjectID
|
14
|
-
property :name, String
|
15
|
-
property :tags, Array
|
16
|
-
property :metadata, Hash
|
17
|
-
embeds 1, :address, :model => Address
|
18
|
-
embeds n, :locations, :model => Address
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
#
|
23
|
-
# dirty_attributes
|
24
|
-
#
|
25
|
-
|
26
|
-
describe '#dirty_attributes' do
|
27
|
-
describe 'when the resource has a change' do
|
28
|
-
it 'should return true' do
|
29
|
-
dirty = User.new(:name => 'Mongo').dirty_attributes
|
30
|
-
dirty.should == { User.properties[:name] => 'Mongo' }
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
describe 'when the resource has no changes' do
|
35
|
-
it 'should return true if a one-to-one embedment has a change' do
|
36
|
-
user = User.new(:address => Address.new(:city => 'Rock Ridge'))
|
37
|
-
user.dirty_attributes.should == {
|
38
|
-
User.embedments[:address] => {
|
39
|
-
Address.properties[:city] => 'Rock Ridge'
|
40
|
-
}
|
41
|
-
}
|
42
|
-
end
|
43
|
-
|
44
|
-
it 'should return false having just been saved' do
|
45
|
-
user = User.new(:address => Address.new(:city => 'Rock Ridge'))
|
46
|
-
user.save
|
47
|
-
user.dirty_attributes.should == {}
|
48
|
-
user.dirty_attributes.should be_empty
|
49
|
-
end
|
50
|
-
|
51
|
-
it 'should return true if a one-to-many embedment has a change' do
|
52
|
-
user = User.new
|
53
|
-
user.locations << Address.new(:city => 'Rock Ridge')
|
54
|
-
user.dirty_attributes.should == {
|
55
|
-
User.embedments[:locations] => [{
|
56
|
-
Address.properties[:city] => 'Rock Ridge'
|
57
|
-
}]
|
58
|
-
}
|
59
|
-
end
|
60
|
-
|
61
|
-
it 'should return false if no embedments have changes' do
|
62
|
-
user = User.new(:address => Address.new(:city => 'Rock Ridge'))
|
63
|
-
user.locations << Address.new(:city => 'Rock Ridge')
|
64
|
-
user.save
|
65
|
-
user.dirty_attributes.should be_empty
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end # dirty_attributes
|
69
|
-
|
70
|
-
end
|