datamapper-dm-core 0.9.11 → 0.10.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/.autotest +17 -14
- data/.gitignore +3 -1
- data/FAQ +6 -5
- data/History.txt +5 -39
- data/Manifest.txt +67 -76
- data/QUICKLINKS +1 -1
- data/README.txt +21 -15
- data/Rakefile +16 -15
- data/SPECS +2 -29
- data/TODO +1 -1
- data/dm-core.gemspec +11 -15
- data/lib/dm-core/adapters/abstract_adapter.rb +182 -185
- data/lib/dm-core/adapters/data_objects_adapter.rb +482 -534
- data/lib/dm-core/adapters/in_memory_adapter.rb +90 -69
- data/lib/dm-core/adapters/mysql_adapter.rb +22 -115
- data/lib/dm-core/adapters/oracle_adapter.rb +249 -0
- data/lib/dm-core/adapters/postgres_adapter.rb +7 -173
- data/lib/dm-core/adapters/sqlite3_adapter.rb +4 -97
- data/lib/dm-core/adapters/yaml_adapter.rb +116 -0
- data/lib/dm-core/adapters.rb +135 -16
- data/lib/dm-core/associations/many_to_many.rb +372 -90
- data/lib/dm-core/associations/many_to_one.rb +220 -73
- data/lib/dm-core/associations/one_to_many.rb +319 -255
- data/lib/dm-core/associations/one_to_one.rb +66 -53
- data/lib/dm-core/associations/relationship.rb +560 -158
- data/lib/dm-core/collection.rb +1104 -381
- data/lib/dm-core/core_ext/kernel.rb +12 -0
- data/lib/dm-core/core_ext/symbol.rb +10 -0
- data/lib/dm-core/identity_map.rb +4 -34
- data/lib/dm-core/migrations.rb +1283 -0
- data/lib/dm-core/model/descendant_set.rb +81 -0
- data/lib/dm-core/model/hook.rb +45 -0
- data/lib/dm-core/model/is.rb +32 -0
- data/lib/dm-core/model/property.rb +248 -0
- data/lib/dm-core/model/relationship.rb +335 -0
- data/lib/dm-core/model/scope.rb +90 -0
- data/lib/dm-core/model.rb +570 -369
- data/lib/dm-core/property.rb +753 -280
- data/lib/dm-core/property_set.rb +141 -98
- data/lib/dm-core/query/conditions/comparison.rb +814 -0
- data/lib/dm-core/query/conditions/operation.rb +247 -0
- data/lib/dm-core/query/direction.rb +43 -0
- data/lib/dm-core/query/operator.rb +42 -0
- data/lib/dm-core/query/path.rb +102 -0
- data/lib/dm-core/query/sort.rb +45 -0
- data/lib/dm-core/query.rb +974 -492
- data/lib/dm-core/repository.rb +147 -107
- data/lib/dm-core/resource.rb +644 -429
- data/lib/dm-core/spec/adapter_shared_spec.rb +294 -0
- data/lib/dm-core/spec/data_objects_adapter_shared_spec.rb +106 -0
- data/lib/dm-core/support/chainable.rb +20 -0
- data/lib/dm-core/support/deprecate.rb +12 -0
- data/lib/dm-core/support/equalizer.rb +23 -0
- data/lib/dm-core/support/logger.rb +13 -0
- data/lib/dm-core/{naming_conventions.rb → support/naming_conventions.rb} +6 -6
- data/lib/dm-core/transaction.rb +333 -92
- data/lib/dm-core/type.rb +98 -60
- data/lib/dm-core/types/boolean.rb +1 -1
- data/lib/dm-core/types/discriminator.rb +34 -20
- data/lib/dm-core/types/object.rb +7 -4
- data/lib/dm-core/types/paranoid_boolean.rb +11 -9
- data/lib/dm-core/types/paranoid_datetime.rb +11 -9
- data/lib/dm-core/types/serial.rb +3 -3
- data/lib/dm-core/types/text.rb +3 -4
- data/lib/dm-core/version.rb +1 -1
- data/lib/dm-core.rb +106 -110
- data/script/performance.rb +102 -109
- data/script/profile.rb +169 -38
- data/spec/lib/adapter_helpers.rb +105 -0
- data/spec/lib/collection_helpers.rb +18 -0
- data/spec/lib/counter_adapter.rb +34 -0
- data/spec/lib/pending_helpers.rb +27 -0
- data/spec/lib/rspec_immediate_feedback_formatter.rb +53 -0
- data/spec/public/associations/many_to_many_spec.rb +193 -0
- data/spec/public/associations/many_to_one_spec.rb +73 -0
- data/spec/public/associations/one_to_many_spec.rb +77 -0
- data/spec/public/associations/one_to_one_spec.rb +156 -0
- data/spec/public/collection_spec.rb +65 -0
- data/spec/public/model/relationship_spec.rb +924 -0
- data/spec/public/model_spec.rb +159 -0
- data/spec/public/property_spec.rb +829 -0
- data/spec/public/resource_spec.rb +71 -0
- data/spec/public/sel_spec.rb +44 -0
- data/spec/public/setup_spec.rb +145 -0
- data/spec/public/shared/association_collection_shared_spec.rb +317 -0
- data/spec/public/shared/collection_shared_spec.rb +1723 -0
- data/spec/public/shared/finder_shared_spec.rb +1619 -0
- data/spec/public/shared/resource_shared_spec.rb +924 -0
- data/spec/public/shared/sel_shared_spec.rb +112 -0
- data/spec/public/transaction_spec.rb +129 -0
- data/spec/public/types/discriminator_spec.rb +130 -0
- data/spec/semipublic/adapters/abstract_adapter_spec.rb +30 -0
- data/spec/semipublic/adapters/in_memory_adapter_spec.rb +12 -0
- data/spec/semipublic/adapters/mysql_adapter_spec.rb +17 -0
- data/spec/semipublic/adapters/oracle_adapter_spec.rb +194 -0
- data/spec/semipublic/adapters/postgres_adapter_spec.rb +17 -0
- data/spec/semipublic/adapters/sqlite3_adapter_spec.rb +17 -0
- data/spec/semipublic/adapters/yaml_adapter_spec.rb +12 -0
- data/spec/semipublic/associations/many_to_one_spec.rb +53 -0
- data/spec/semipublic/associations/relationship_spec.rb +194 -0
- data/spec/semipublic/associations_spec.rb +177 -0
- data/spec/semipublic/collection_spec.rb +142 -0
- data/spec/semipublic/property_spec.rb +61 -0
- data/spec/semipublic/query/conditions_spec.rb +528 -0
- data/spec/semipublic/query/path_spec.rb +443 -0
- data/spec/semipublic/query_spec.rb +2626 -0
- data/spec/semipublic/resource_spec.rb +47 -0
- data/spec/semipublic/shared/resource_shared_spec.rb +126 -0
- data/spec/spec.opts +3 -1
- data/spec/spec_helper.rb +80 -57
- data/tasks/ci.rb +19 -31
- data/tasks/dm.rb +43 -48
- data/tasks/doc.rb +8 -11
- data/tasks/gemspec.rb +5 -5
- data/tasks/hoe.rb +15 -16
- data/tasks/install.rb +8 -10
- metadata +72 -93
- data/lib/dm-core/associations/relationship_chain.rb +0 -81
- data/lib/dm-core/associations.rb +0 -207
- data/lib/dm-core/auto_migrations.rb +0 -105
- data/lib/dm-core/dependency_queue.rb +0 -32
- data/lib/dm-core/hook.rb +0 -11
- data/lib/dm-core/is.rb +0 -16
- data/lib/dm-core/logger.rb +0 -232
- data/lib/dm-core/migrations/destructive_migrations.rb +0 -17
- data/lib/dm-core/migrator.rb +0 -29
- data/lib/dm-core/scope.rb +0 -58
- data/lib/dm-core/support/array.rb +0 -13
- data/lib/dm-core/support/assertions.rb +0 -8
- data/lib/dm-core/support/errors.rb +0 -23
- data/lib/dm-core/support/kernel.rb +0 -11
- data/lib/dm-core/support/symbol.rb +0 -41
- data/lib/dm-core/support.rb +0 -7
- data/lib/dm-core/type_map.rb +0 -80
- data/lib/dm-core/types.rb +0 -19
- data/script/all +0 -4
- data/spec/integration/association_spec.rb +0 -1382
- data/spec/integration/association_through_spec.rb +0 -203
- data/spec/integration/associations/many_to_many_spec.rb +0 -449
- data/spec/integration/associations/many_to_one_spec.rb +0 -163
- data/spec/integration/associations/one_to_many_spec.rb +0 -188
- data/spec/integration/auto_migrations_spec.rb +0 -413
- data/spec/integration/collection_spec.rb +0 -1073
- data/spec/integration/data_objects_adapter_spec.rb +0 -32
- data/spec/integration/dependency_queue_spec.rb +0 -46
- data/spec/integration/model_spec.rb +0 -197
- data/spec/integration/mysql_adapter_spec.rb +0 -85
- data/spec/integration/postgres_adapter_spec.rb +0 -731
- data/spec/integration/property_spec.rb +0 -253
- data/spec/integration/query_spec.rb +0 -514
- data/spec/integration/repository_spec.rb +0 -61
- data/spec/integration/resource_spec.rb +0 -513
- data/spec/integration/sqlite3_adapter_spec.rb +0 -352
- data/spec/integration/sti_spec.rb +0 -273
- data/spec/integration/strategic_eager_loading_spec.rb +0 -156
- data/spec/integration/transaction_spec.rb +0 -75
- data/spec/integration/type_spec.rb +0 -275
- data/spec/lib/logging_helper.rb +0 -18
- data/spec/lib/mock_adapter.rb +0 -27
- data/spec/lib/model_loader.rb +0 -100
- data/spec/lib/publicize_methods.rb +0 -28
- data/spec/models/content.rb +0 -16
- data/spec/models/vehicles.rb +0 -34
- data/spec/models/zoo.rb +0 -48
- data/spec/unit/adapters/abstract_adapter_spec.rb +0 -133
- data/spec/unit/adapters/adapter_shared_spec.rb +0 -15
- data/spec/unit/adapters/data_objects_adapter_spec.rb +0 -632
- data/spec/unit/adapters/in_memory_adapter_spec.rb +0 -98
- data/spec/unit/adapters/postgres_adapter_spec.rb +0 -133
- data/spec/unit/associations/many_to_many_spec.rb +0 -32
- data/spec/unit/associations/many_to_one_spec.rb +0 -159
- data/spec/unit/associations/one_to_many_spec.rb +0 -393
- data/spec/unit/associations/one_to_one_spec.rb +0 -7
- data/spec/unit/associations/relationship_spec.rb +0 -71
- data/spec/unit/associations_spec.rb +0 -242
- data/spec/unit/auto_migrations_spec.rb +0 -111
- data/spec/unit/collection_spec.rb +0 -182
- data/spec/unit/data_mapper_spec.rb +0 -35
- data/spec/unit/identity_map_spec.rb +0 -126
- data/spec/unit/is_spec.rb +0 -80
- data/spec/unit/migrator_spec.rb +0 -33
- data/spec/unit/model_spec.rb +0 -321
- data/spec/unit/naming_conventions_spec.rb +0 -36
- data/spec/unit/property_set_spec.rb +0 -90
- data/spec/unit/property_spec.rb +0 -753
- data/spec/unit/query_spec.rb +0 -571
- data/spec/unit/repository_spec.rb +0 -93
- data/spec/unit/resource_spec.rb +0 -649
- data/spec/unit/scope_spec.rb +0 -142
- data/spec/unit/transaction_spec.rb +0 -493
- data/spec/unit/type_map_spec.rb +0 -114
- data/spec/unit/type_spec.rb +0 -119
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'spec_helper'))
|
|
2
|
+
|
|
3
|
+
describe 'Many to One Associations' do
|
|
4
|
+
before :all do
|
|
5
|
+
class ::User
|
|
6
|
+
include DataMapper::Resource
|
|
7
|
+
|
|
8
|
+
property :name, String, :key => true
|
|
9
|
+
property :age, Integer
|
|
10
|
+
property :description, Text
|
|
11
|
+
|
|
12
|
+
has n, :comments
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# This is a special class that needs to be an exact copy of User
|
|
16
|
+
class ::Clone
|
|
17
|
+
include DataMapper::Resource
|
|
18
|
+
|
|
19
|
+
property :name, String, :key => true
|
|
20
|
+
property :age, Integer
|
|
21
|
+
property :description, Text
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
class ::Comment
|
|
25
|
+
include DataMapper::Resource
|
|
26
|
+
|
|
27
|
+
property :id, Serial
|
|
28
|
+
property :body, Text
|
|
29
|
+
|
|
30
|
+
belongs_to :user
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
class ::Default
|
|
34
|
+
include DataMapper::Resource
|
|
35
|
+
|
|
36
|
+
property :name, String, :key => true, :default => 'a default value'
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
@user_model = User
|
|
40
|
+
@comment_model = Comment
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
supported_by :all do
|
|
44
|
+
before :all do
|
|
45
|
+
comment = @comment_model.create(:body => 'Cool spec', :user => User.create(:name => 'dbussink', :age => 25, :description => 'Test'))
|
|
46
|
+
|
|
47
|
+
comment = @comment_model.get(*comment.key)
|
|
48
|
+
@user = comment.user
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
it_should_behave_like 'A semipublic Resource'
|
|
52
|
+
end
|
|
53
|
+
end
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'spec_helper'))
|
|
2
|
+
|
|
3
|
+
describe DataMapper::Associations::Relationship do
|
|
4
|
+
before :all do
|
|
5
|
+
module ::Blog
|
|
6
|
+
class Article
|
|
7
|
+
include DataMapper::Resource
|
|
8
|
+
|
|
9
|
+
property :title, String, :key => true
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
class Comment
|
|
13
|
+
include DataMapper::Resource
|
|
14
|
+
|
|
15
|
+
property :id, Serial
|
|
16
|
+
property :body, Text
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
@article_model = Blog::Article
|
|
21
|
+
@comment_model = Blog::Comment
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def n
|
|
25
|
+
1.0/0
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
describe '#inverse' do
|
|
29
|
+
describe 'with matching relationships' do
|
|
30
|
+
before :all do
|
|
31
|
+
@comments_relationship = @article_model.has(n, :comments)
|
|
32
|
+
@article_relationship = @comment_model.belongs_to(:article)
|
|
33
|
+
|
|
34
|
+
# TODO: move this to spec/public/model/relationship_spec.rb
|
|
35
|
+
@comments_relationship.child_repository_name.should be_nil
|
|
36
|
+
@comments_relationship.parent_repository_name.should == :default
|
|
37
|
+
|
|
38
|
+
# TODO: move this to spec/public/model/relationship_spec.rb
|
|
39
|
+
@article_relationship.child_repository_name.should == :default
|
|
40
|
+
@article_relationship.parent_repository_name.should be_nil
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
it 'should return the inverted relationships' do
|
|
44
|
+
@comments_relationship.inverse.should equal(@article_relationship)
|
|
45
|
+
@article_relationship.inverse.should equal(@comments_relationship)
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
describe 'with matching relationships where the child repository is not nil' do
|
|
50
|
+
before :all do
|
|
51
|
+
@comments_relationship = @article_model.has(n, :comments, :repository => :default)
|
|
52
|
+
@article_relationship = @comment_model.belongs_to(:article)
|
|
53
|
+
|
|
54
|
+
# TODO: move this to spec/public/model/relationship_spec.rb
|
|
55
|
+
@comments_relationship.child_repository_name.should == :default
|
|
56
|
+
@comments_relationship.parent_repository_name.should == :default
|
|
57
|
+
|
|
58
|
+
# TODO: move this to spec/public/model/relationship_spec.rb
|
|
59
|
+
@article_relationship.child_repository_name.should == :default
|
|
60
|
+
@article_relationship.parent_repository_name.should be_nil
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
it 'should return the inverted relationships' do
|
|
64
|
+
@comments_relationship.inverse.should equal(@article_relationship)
|
|
65
|
+
@article_relationship.inverse.should equal(@comments_relationship)
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
describe 'with matching relationships where the parent repository is not nil' do
|
|
70
|
+
before :all do
|
|
71
|
+
@comments_relationship = @article_model.has(n, :comments)
|
|
72
|
+
@article_relationship = @comment_model.belongs_to(:article, :repository => :default)
|
|
73
|
+
|
|
74
|
+
# TODO: move this to spec/public/model/relationship_spec.rb
|
|
75
|
+
@comments_relationship.child_repository_name.should be_nil
|
|
76
|
+
@comments_relationship.parent_repository_name.should == :default
|
|
77
|
+
|
|
78
|
+
# TODO: move this to spec/public/model/relationship_spec.rb
|
|
79
|
+
@article_relationship.child_repository_name.should == :default
|
|
80
|
+
@article_relationship.parent_repository_name.should == :default
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
it 'should return the inverted relationships' do
|
|
84
|
+
@comments_relationship.inverse.should equal(@article_relationship)
|
|
85
|
+
@article_relationship.inverse.should equal(@comments_relationship)
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
describe 'with no matching relationship', 'from the parent side' do
|
|
90
|
+
before :all do
|
|
91
|
+
# added to force OneToMany::Relationship#inverse to consider the
|
|
92
|
+
# child_key differences
|
|
93
|
+
@comment_model.belongs_to(:other_article, @article_model, :child_key => [ :other_article_id ])
|
|
94
|
+
|
|
95
|
+
@relationship = @article_model.has(n, :comments)
|
|
96
|
+
|
|
97
|
+
@inverse = @relationship.inverse
|
|
98
|
+
|
|
99
|
+
# after Relationship#inverse to ensure no match
|
|
100
|
+
@expected = @comment_model.belongs_to(:article)
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
it 'should return a Relationship' do
|
|
104
|
+
@inverse.should be_kind_of(DataMapper::Associations::Relationship)
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
it 'should return an inverted relationship' do
|
|
108
|
+
@inverse.should == @expected
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
it 'should be an anonymous relationship' do
|
|
112
|
+
@inverse.should_not equal(@expected)
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
it 'should have a source repository equal to the target repository of the relationship' do
|
|
116
|
+
@inverse.source_repository_name.should == @relationship.target_repository_name
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
it "should be have the relationship as it's inverse" do
|
|
120
|
+
@inverse.inverse.should equal(@relationship)
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
describe 'with no matching relationship', 'from the child side' do
|
|
125
|
+
before :all do
|
|
126
|
+
@relationship = @comment_model.belongs_to(:article)
|
|
127
|
+
|
|
128
|
+
@inverse = @relationship.inverse
|
|
129
|
+
|
|
130
|
+
# after Relationship#inverse to ensure no match
|
|
131
|
+
@expected = @article_model.has(n, :comments)
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
it 'should return a Relationship' do
|
|
135
|
+
@inverse.should be_kind_of(DataMapper::Associations::Relationship)
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
it 'should return an inverted relationship' do
|
|
139
|
+
@inverse.should == @expected
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
it 'should be an anonymous relationship' do
|
|
143
|
+
@inverse.should_not equal(@expected)
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
it 'should have a source repository equal to the target repository of the relationship' do
|
|
147
|
+
@inverse.source_repository_name.should == @relationship.target_repository_name
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
it "should be have the relationship as it's inverse" do
|
|
151
|
+
@inverse.inverse.should equal(@relationship)
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
describe '#valid?' do
|
|
157
|
+
before :all do
|
|
158
|
+
@relationship = @article_model.has(n, :comments)
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
supported_by :all do
|
|
162
|
+
describe 'with valid resource' do
|
|
163
|
+
before :all do
|
|
164
|
+
@article = @article_model.create(:title => 'Relationships in DataMapper')
|
|
165
|
+
@resource = @article.comments.create
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
it 'should return true' do
|
|
169
|
+
@relationship.valid?(@resource).should be_true
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
describe 'with a resource of the wrong class' do
|
|
174
|
+
before :all do
|
|
175
|
+
@resource = @article_model.new
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
it 'should return false' do
|
|
179
|
+
@relationship.valid?(@resource).should be_false
|
|
180
|
+
end
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
describe 'with a resource without a valid parent' do
|
|
184
|
+
before :all do
|
|
185
|
+
@resource = @comment_model.new
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
it 'should return false' do
|
|
189
|
+
@relationship.valid?(@resource).should be_false
|
|
190
|
+
end
|
|
191
|
+
end
|
|
192
|
+
end
|
|
193
|
+
end
|
|
194
|
+
end
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
|
|
2
|
+
|
|
3
|
+
describe DataMapper::Associations do
|
|
4
|
+
before :all do
|
|
5
|
+
class ::Car
|
|
6
|
+
include DataMapper::Resource
|
|
7
|
+
|
|
8
|
+
property :id, Serial
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
class ::Engine
|
|
12
|
+
include DataMapper::Resource
|
|
13
|
+
|
|
14
|
+
property :id, Serial
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
class ::Door
|
|
18
|
+
include DataMapper::Resource
|
|
19
|
+
|
|
20
|
+
property :id, Serial
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
class ::Window
|
|
24
|
+
include DataMapper::Resource
|
|
25
|
+
|
|
26
|
+
property :id, Serial
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def n
|
|
31
|
+
1.0/0
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
describe '#has' do
|
|
35
|
+
describe '1' do
|
|
36
|
+
before :all do
|
|
37
|
+
@relationship = Car.has(1, :engine)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
it 'should return a Relationship' do
|
|
41
|
+
@relationship.should be_a_kind_of(DataMapper::Associations::OneToOne::Relationship)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
it 'should return a Relationship with the child model' do
|
|
45
|
+
@relationship.child_model.should == Engine
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
it 'should return a Relationship with a min of 1' do
|
|
49
|
+
@relationship.min.should == 1
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
it 'should return a Relationship with a max of 1' do
|
|
53
|
+
@relationship.max.should == 1
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
describe 'n..n' do
|
|
58
|
+
before :all do
|
|
59
|
+
@relationship = Car.has(1..4, :doors)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
it 'should return a Relationship' do
|
|
63
|
+
@relationship.should be_a_kind_of(DataMapper::Associations::OneToMany::Relationship)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
it 'should return a Relationship with the child model' do
|
|
67
|
+
@relationship.child_model.should == Door
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
it 'should return a Relationship with a min of 1' do
|
|
71
|
+
@relationship.min.should == 1
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
it 'should return a Relationship with a max of 4' do
|
|
75
|
+
@relationship.max.should == 4
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
describe 'n..n through' do
|
|
80
|
+
before :all do
|
|
81
|
+
Door.has(1, :window)
|
|
82
|
+
Car.has(1..4, :doors)
|
|
83
|
+
|
|
84
|
+
@relationship = Car.has(1..4, :windows, :through => :doors)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
it 'should return a Relationship' do
|
|
88
|
+
@relationship.should be_a_kind_of(DataMapper::Associations::ManyToMany::Relationship)
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
it 'should return a Relationship with the child model' do
|
|
92
|
+
@relationship.child_model.should == Window
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
it 'should return a Relationship with a min of 1' do
|
|
96
|
+
@relationship.min.should == 1
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
it 'should return a Relationship with a max of 4' do
|
|
100
|
+
@relationship.max.should == 4
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
describe 'n' do
|
|
105
|
+
before :all do
|
|
106
|
+
@relationship = Car.has(n, :doors)
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
it 'should return a Relationship' do
|
|
110
|
+
@relationship.should be_a_kind_of(DataMapper::Associations::OneToMany::Relationship)
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
it 'should return a Relationship with the child model' do
|
|
114
|
+
@relationship.child_model.should == Door
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
it 'should return a Relationship with a min of 0' do
|
|
118
|
+
@relationship.min.should == 0
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
it 'should return a Relationship with a max of n' do
|
|
122
|
+
@relationship.max.should == n
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
describe 'n through' do
|
|
127
|
+
before :all do
|
|
128
|
+
Door.has(1, :windows)
|
|
129
|
+
Car.has(1..4, :doors)
|
|
130
|
+
|
|
131
|
+
@relationship = Car.has(n, :windows, :through => :doors)
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
it 'should return a Relationship' do
|
|
135
|
+
@relationship.should be_a_kind_of(DataMapper::Associations::ManyToMany::Relationship)
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
it 'should return a Relationship with the child model' do
|
|
139
|
+
@relationship.child_model.should == Window
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
it 'should return a Relationship with a min of 0' do
|
|
143
|
+
@relationship.min.should == 0
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
it 'should return a Relationship with a max of n' do
|
|
147
|
+
@relationship.max.should == n
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
describe '#belongs_to' do
|
|
153
|
+
before :all do
|
|
154
|
+
@relationship = Engine.belongs_to(:car)
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
it 'should return a Relationship' do
|
|
158
|
+
@relationship.should be_a_kind_of(DataMapper::Associations::ManyToOne::Relationship)
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
it 'should return a Relationship with the parent model' do
|
|
162
|
+
@relationship.parent_model.should == Car
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
it 'should return a Relationship with a min of 1' do
|
|
166
|
+
@relationship.min.should == 1
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
it 'should return a Relationship with a max of 1' do
|
|
170
|
+
@relationship.max.should == 1
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
it 'should return a Relationship that is not nullable' do
|
|
174
|
+
@relationship.nullable?.should be_false
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
end
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
|
|
2
|
+
|
|
3
|
+
# run the specs once with a loaded collection and once not
|
|
4
|
+
[ false, true ].each do |loaded|
|
|
5
|
+
describe DataMapper::Collection do
|
|
6
|
+
extend DataMapper::Spec::CollectionHelpers::GroupMethods
|
|
7
|
+
|
|
8
|
+
self.loaded = loaded
|
|
9
|
+
|
|
10
|
+
before :all do
|
|
11
|
+
module ::Blog
|
|
12
|
+
class Article
|
|
13
|
+
include DataMapper::Resource
|
|
14
|
+
|
|
15
|
+
property :id, Serial
|
|
16
|
+
property :title, String
|
|
17
|
+
property :content, Text
|
|
18
|
+
property :subtitle, String
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
@article_model = Blog::Article
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
supported_by :all do
|
|
26
|
+
before :all do
|
|
27
|
+
@article_repository = @repository
|
|
28
|
+
@articles_query = DataMapper::Query.new(@article_repository, @article_model, :title => 'Sample Article')
|
|
29
|
+
|
|
30
|
+
@article = @article_model.create(:title => 'Sample Article', :content => 'Sample')
|
|
31
|
+
|
|
32
|
+
@articles = @article_model.all(@articles_query)
|
|
33
|
+
|
|
34
|
+
@articles.entries if loaded
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
it { DataMapper::Collection.should respond_to(:new) }
|
|
38
|
+
|
|
39
|
+
describe '.new' do
|
|
40
|
+
describe 'with resources' do
|
|
41
|
+
before :all do
|
|
42
|
+
@return = @collection = DataMapper::Collection.new(@articles_query, [ @article ])
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
it 'should return a Collection' do
|
|
46
|
+
@return.should be_kind_of(DataMapper::Collection)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
it 'should be loaded' do
|
|
50
|
+
@return.should be_loaded
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
it 'should contain the article' do
|
|
54
|
+
@collection.should == [ @article ]
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
describe 'with no resources' do
|
|
59
|
+
before :all do
|
|
60
|
+
@return = @collection = DataMapper::Collection.new(@articles_query)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
it 'should return a Collection' do
|
|
64
|
+
@return.should be_kind_of(DataMapper::Collection)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
it 'should not be loaded' do
|
|
68
|
+
@return.should_not be_loaded
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
it 'should contain the article' do
|
|
72
|
+
@collection.should == [ @article ]
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
it { @articles.should respond_to(:properties) }
|
|
78
|
+
|
|
79
|
+
describe '#properties' do
|
|
80
|
+
before :all do
|
|
81
|
+
@return = @properties = @articles.properties
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
it 'should return a PropertySet' do
|
|
85
|
+
@return.should be_kind_of(DataMapper::PropertySet)
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
it 'should be expected properties' do
|
|
89
|
+
@properties.to_a.should == @articles_query.fields
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
it { @articles.should respond_to(:query) }
|
|
94
|
+
|
|
95
|
+
describe '#query' do
|
|
96
|
+
before :all do
|
|
97
|
+
@return = @articles.query
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
it 'should return a Query' do
|
|
101
|
+
@return.should be_kind_of(DataMapper::Query)
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
it 'should return expected Query' do
|
|
105
|
+
@return.should eql(@articles_query)
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
it { @articles.should respond_to(:relationships) }
|
|
110
|
+
|
|
111
|
+
describe '#relationships' do
|
|
112
|
+
before :all do
|
|
113
|
+
@return = @relationships = @articles.relationships
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
it 'should return a Hash' do
|
|
117
|
+
@return.should be_kind_of(Hash)
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
it 'should return expected Hash' do
|
|
121
|
+
@return.should equal(@article_model.relationships(@article_repository.name))
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
it { @articles.should respond_to(:repository) }
|
|
126
|
+
|
|
127
|
+
describe '#repository' do
|
|
128
|
+
before :all do
|
|
129
|
+
@return = @repository = @articles.repository
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
it 'should return a Repository' do
|
|
133
|
+
@return.should be_kind_of(DataMapper::Repository)
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
it 'should be expected Repository' do
|
|
137
|
+
@repository.should == @article_repository
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
end
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
|
|
2
|
+
|
|
3
|
+
describe DataMapper::Property do
|
|
4
|
+
before :all do
|
|
5
|
+
module ::Blog
|
|
6
|
+
class Author
|
|
7
|
+
include DataMapper::Resource
|
|
8
|
+
|
|
9
|
+
property :name, String, :key => true
|
|
10
|
+
property :alias, String
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
describe '#valid?' do
|
|
16
|
+
describe 'when provided a valid value' do
|
|
17
|
+
it 'should return true' do
|
|
18
|
+
Blog::Author.properties[:name].valid?('Dan Kubb').should be_true
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
describe 'when provide an invalid value' do
|
|
23
|
+
it 'should return false' do
|
|
24
|
+
Blog::Author.properties[:name].valid?(1).should be_false
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
describe 'when provide a nil value when not nullable' do
|
|
29
|
+
it 'should return false' do
|
|
30
|
+
Blog::Author.properties[:name].valid?(nil).should be_false
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
describe 'when provide a nil value when nullable' do
|
|
35
|
+
it 'should return false' do
|
|
36
|
+
Blog::Author.properties[:alias].valid?(nil).should be_true
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
describe 'override property definition in other repository' do
|
|
42
|
+
before(:all) do
|
|
43
|
+
module ::Blog
|
|
44
|
+
class Author
|
|
45
|
+
repository(:other) do
|
|
46
|
+
property :name, String, :key => true, :field => 'other_name'
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
it 'should return property options in other repository' do
|
|
53
|
+
::Blog::Author.properties(:other)[:name].options[:field].should == 'other_name'
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
it 'should return property options in default repository' do
|
|
57
|
+
::Blog::Author.properties[:name].options[:field].should be_nil
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
end
|