dm-core 0.10.2 → 1.0.0.rc1
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/.gitignore +10 -1
- data/Gemfile +143 -0
- data/Rakefile +9 -5
- data/VERSION +1 -1
- data/dm-core.gemspec +160 -57
- data/lib/dm-core.rb +131 -56
- data/lib/dm-core/adapters.rb +98 -14
- data/lib/dm-core/adapters/abstract_adapter.rb +24 -4
- data/lib/dm-core/adapters/in_memory_adapter.rb +7 -2
- data/lib/dm-core/associations/many_to_many.rb +19 -30
- data/lib/dm-core/associations/many_to_one.rb +58 -42
- data/lib/dm-core/associations/one_to_many.rb +33 -23
- data/lib/dm-core/associations/one_to_one.rb +27 -11
- data/lib/dm-core/associations/relationship.rb +4 -4
- data/lib/dm-core/collection.rb +23 -16
- data/lib/dm-core/core_ext/array.rb +36 -0
- data/lib/dm-core/core_ext/hash.rb +30 -0
- data/lib/dm-core/core_ext/module.rb +46 -0
- data/lib/dm-core/core_ext/object.rb +31 -0
- data/lib/dm-core/core_ext/pathname.rb +20 -0
- data/lib/dm-core/core_ext/string.rb +22 -0
- data/lib/dm-core/core_ext/try_dup.rb +44 -0
- data/lib/dm-core/model.rb +88 -27
- data/lib/dm-core/model/hook.rb +75 -18
- data/lib/dm-core/model/property.rb +50 -9
- data/lib/dm-core/model/relationship.rb +31 -31
- data/lib/dm-core/model/scope.rb +3 -3
- data/lib/dm-core/property.rb +196 -516
- data/lib/dm-core/property/binary.rb +7 -0
- data/lib/dm-core/property/boolean.rb +35 -0
- data/lib/dm-core/property/class.rb +24 -0
- data/lib/dm-core/property/date.rb +47 -0
- data/lib/dm-core/property/date_time.rb +48 -0
- data/lib/dm-core/property/decimal.rb +43 -0
- data/lib/dm-core/property/discriminator.rb +48 -0
- data/lib/dm-core/property/float.rb +24 -0
- data/lib/dm-core/property/integer.rb +32 -0
- data/lib/dm-core/property/numeric.rb +43 -0
- data/lib/dm-core/property/object.rb +32 -0
- data/lib/dm-core/property/serial.rb +8 -0
- data/lib/dm-core/property/string.rb +49 -0
- data/lib/dm-core/property/text.rb +12 -0
- data/lib/dm-core/property/time.rb +48 -0
- data/lib/dm-core/property/typecast/numeric.rb +32 -0
- data/lib/dm-core/property/typecast/time.rb +28 -0
- data/lib/dm-core/property_set.rb +10 -4
- data/lib/dm-core/query.rb +14 -37
- data/lib/dm-core/query/conditions/comparison.rb +8 -6
- data/lib/dm-core/query/conditions/operation.rb +33 -2
- data/lib/dm-core/query/operator.rb +2 -5
- data/lib/dm-core/query/path.rb +4 -6
- data/lib/dm-core/repository.rb +21 -6
- data/lib/dm-core/resource.rb +316 -133
- data/lib/dm-core/resource/state.rb +79 -0
- data/lib/dm-core/resource/state/clean.rb +40 -0
- data/lib/dm-core/resource/state/deleted.rb +30 -0
- data/lib/dm-core/resource/state/dirty.rb +86 -0
- data/lib/dm-core/resource/state/immutable.rb +34 -0
- data/lib/dm-core/resource/state/persisted.rb +29 -0
- data/lib/dm-core/resource/state/transient.rb +70 -0
- data/lib/dm-core/spec/lib/adapter_helpers.rb +52 -0
- data/lib/dm-core/spec/lib/collection_helpers.rb +20 -0
- data/{spec → lib/dm-core/spec}/lib/counter_adapter.rb +5 -1
- data/lib/dm-core/spec/lib/pending_helpers.rb +50 -0
- data/lib/dm-core/spec/lib/spec_helper.rb +68 -0
- data/lib/dm-core/spec/setup.rb +165 -0
- data/lib/dm-core/spec/{adapter_shared_spec.rb → shared/adapter_spec.rb} +21 -7
- data/{spec/public/shared/resource_shared_spec.rb → lib/dm-core/spec/shared/resource_spec.rb} +120 -83
- data/{spec/public/shared/sel_shared_spec.rb → lib/dm-core/spec/shared/sel_spec.rb} +5 -6
- data/lib/dm-core/support/assertions.rb +8 -0
- data/lib/dm-core/support/equalizer.rb +1 -0
- data/lib/dm-core/support/hook.rb +420 -0
- data/lib/dm-core/support/lazy_array.rb +453 -0
- data/lib/dm-core/support/local_object_space.rb +12 -0
- data/lib/dm-core/support/logger.rb +193 -6
- data/lib/dm-core/support/naming_conventions.rb +8 -8
- data/lib/dm-core/support/subject.rb +33 -0
- data/lib/dm-core/type.rb +4 -0
- data/lib/dm-core/types/boolean.rb +2 -0
- data/lib/dm-core/types/decimal.rb +9 -0
- data/lib/dm-core/types/discriminator.rb +2 -0
- data/lib/dm-core/types/object.rb +3 -0
- data/lib/dm-core/types/serial.rb +2 -0
- data/lib/dm-core/types/text.rb +2 -0
- data/lib/dm-core/version.rb +1 -1
- data/spec/public/associations/many_to_many/read_multiple_join_spec.rb +67 -0
- data/spec/public/model/hook_spec.rb +209 -0
- data/spec/public/model/property_spec.rb +35 -0
- data/spec/public/model/relationship_spec.rb +33 -20
- data/spec/public/model_spec.rb +142 -10
- data/spec/public/property/binary_spec.rb +14 -0
- data/spec/public/property/boolean_spec.rb +14 -0
- data/spec/public/property/class_spec.rb +20 -0
- data/spec/public/property/date_spec.rb +14 -0
- data/spec/public/property/date_time_spec.rb +14 -0
- data/spec/public/property/decimal_spec.rb +14 -0
- data/spec/public/{types → property}/discriminator_spec.rb +2 -12
- data/spec/public/property/float_spec.rb +14 -0
- data/spec/public/property/integer_spec.rb +14 -0
- data/spec/public/property/object_spec.rb +9 -17
- data/spec/public/property/serial_spec.rb +14 -0
- data/spec/public/property/string_spec.rb +14 -0
- data/spec/public/property/text_spec.rb +52 -0
- data/spec/public/property/time_spec.rb +14 -0
- data/spec/public/property_spec.rb +28 -87
- data/spec/public/resource_spec.rb +101 -0
- data/spec/public/sel_spec.rb +5 -15
- data/spec/public/shared/collection_shared_spec.rb +16 -30
- data/spec/public/shared/finder_shared_spec.rb +2 -4
- data/spec/public/shared/property_shared_spec.rb +176 -0
- data/spec/semipublic/adapters/abstract_adapter_spec.rb +1 -1
- data/spec/semipublic/adapters/in_memory_adapter_spec.rb +2 -2
- data/spec/semipublic/associations/many_to_many_spec.rb +89 -0
- data/spec/semipublic/associations/many_to_one_spec.rb +24 -1
- data/spec/semipublic/associations/one_to_many_spec.rb +51 -0
- data/spec/semipublic/associations/one_to_one_spec.rb +49 -0
- data/spec/semipublic/associations/relationship_spec.rb +3 -3
- data/spec/semipublic/associations_spec.rb +1 -1
- data/spec/semipublic/property/binary_spec.rb +13 -0
- data/spec/semipublic/property/boolean_spec.rb +65 -0
- data/spec/semipublic/property/class_spec.rb +33 -0
- data/spec/semipublic/property/date_spec.rb +43 -0
- data/spec/semipublic/property/date_time_spec.rb +46 -0
- data/spec/semipublic/property/decimal_spec.rb +82 -0
- data/spec/semipublic/property/discriminator_spec.rb +19 -0
- data/spec/semipublic/property/float_spec.rb +82 -0
- data/spec/semipublic/property/integer_spec.rb +82 -0
- data/spec/semipublic/property/serial_spec.rb +13 -0
- data/spec/semipublic/property/string_spec.rb +13 -0
- data/spec/semipublic/property/text_spec.rb +31 -0
- data/spec/semipublic/property/time_spec.rb +50 -0
- data/spec/semipublic/property_spec.rb +2 -532
- data/spec/semipublic/query/conditions/comparison_spec.rb +171 -169
- data/spec/semipublic/query/conditions/operation_spec.rb +53 -51
- data/spec/semipublic/query/path_spec.rb +17 -17
- data/spec/semipublic/query_spec.rb +47 -78
- data/spec/semipublic/resource/state/clean_spec.rb +88 -0
- data/spec/semipublic/resource/state/deleted_spec.rb +78 -0
- data/spec/semipublic/resource/state/dirty_spec.rb +133 -0
- data/spec/semipublic/resource/state/immutable_spec.rb +99 -0
- data/spec/semipublic/resource/state/transient_spec.rb +128 -0
- data/spec/semipublic/resource/state_spec.rb +226 -0
- data/spec/semipublic/shared/property_shared_spec.rb +143 -0
- data/spec/semipublic/shared/resource_shared_spec.rb +16 -15
- data/spec/semipublic/shared/resource_state_shared_spec.rb +78 -0
- data/spec/semipublic/shared/subject_shared_spec.rb +79 -0
- data/spec/spec_helper.rb +21 -97
- data/spec/support/types/huge_integer.rb +17 -0
- data/spec/unit/array_spec.rb +48 -0
- data/spec/unit/hash_spec.rb +35 -0
- data/spec/unit/hook_spec.rb +1234 -0
- data/spec/unit/lazy_array_spec.rb +1959 -0
- data/spec/unit/module_spec.rb +70 -0
- data/spec/unit/object_spec.rb +37 -0
- data/spec/unit/try_dup_spec.rb +45 -0
- data/tasks/local_gemfile.rake +18 -0
- data/tasks/spec.rake +0 -3
- metadata +197 -71
- data/deps.rip +0 -2
- data/lib/dm-core/adapters/data_objects_adapter.rb +0 -712
- data/lib/dm-core/adapters/mysql_adapter.rb +0 -42
- data/lib/dm-core/adapters/oracle_adapter.rb +0 -229
- data/lib/dm-core/adapters/postgres_adapter.rb +0 -22
- data/lib/dm-core/adapters/sqlite3_adapter.rb +0 -17
- data/lib/dm-core/adapters/sqlserver_adapter.rb +0 -114
- data/lib/dm-core/adapters/yaml_adapter.rb +0 -111
- data/lib/dm-core/core_ext/enumerable.rb +0 -28
- data/lib/dm-core/migrations.rb +0 -1427
- data/lib/dm-core/spec/data_objects_adapter_shared_spec.rb +0 -366
- data/lib/dm-core/transaction.rb +0 -508
- data/lib/dm-core/types/paranoid_boolean.rb +0 -42
- data/lib/dm-core/types/paranoid_datetime.rb +0 -41
- data/spec/lib/adapter_helpers.rb +0 -105
- data/spec/lib/collection_helpers.rb +0 -18
- data/spec/lib/pending_helpers.rb +0 -46
- data/spec/public/migrations_spec.rb +0 -503
- data/spec/public/transaction_spec.rb +0 -153
- data/spec/semipublic/adapters/mysql_adapter_spec.rb +0 -17
- data/spec/semipublic/adapters/oracle_adapter_spec.rb +0 -194
- data/spec/semipublic/adapters/postgres_adapter_spec.rb +0 -17
- data/spec/semipublic/adapters/sqlite3_adapter_spec.rb +0 -17
- data/spec/semipublic/adapters/sqlserver_adapter_spec.rb +0 -17
- data/spec/semipublic/adapters/yaml_adapter_spec.rb +0 -12
@@ -76,5 +76,106 @@ describe DataMapper::Resource do
|
|
76
76
|
|
77
77
|
it_should_behave_like 'A public Resource'
|
78
78
|
it_should_behave_like 'A Resource supporting Strategic Eager Loading'
|
79
|
+
|
80
|
+
it 'A resource should respond to raise_on_save_failure' do
|
81
|
+
@user.should respond_to(:raise_on_save_failure)
|
82
|
+
end
|
83
|
+
|
84
|
+
describe '#raise_on_save_failure' do
|
85
|
+
after do
|
86
|
+
# reset to the default value
|
87
|
+
reset_raise_on_save_failure(@user_model)
|
88
|
+
reset_raise_on_save_failure(@user)
|
89
|
+
end
|
90
|
+
|
91
|
+
subject { @user.raise_on_save_failure }
|
92
|
+
|
93
|
+
describe 'when model.raise_on_save_failure has not been set' do
|
94
|
+
it { should be(false) }
|
95
|
+
end
|
96
|
+
|
97
|
+
describe 'when model.raise_on_save_failure has been set to true' do
|
98
|
+
before do
|
99
|
+
@user_model.raise_on_save_failure = true
|
100
|
+
end
|
101
|
+
|
102
|
+
it { should be(true) }
|
103
|
+
end
|
104
|
+
|
105
|
+
describe 'when resource.raise_on_save_failure has been set to true' do
|
106
|
+
before do
|
107
|
+
@user.raise_on_save_failure = true
|
108
|
+
end
|
109
|
+
|
110
|
+
it { should be(true) }
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
it 'A model should respond to raise_on_save_failure=' do
|
115
|
+
@user_model.should respond_to(:raise_on_save_failure=)
|
116
|
+
end
|
117
|
+
|
118
|
+
describe '#raise_on_save_failure=' do
|
119
|
+
after do
|
120
|
+
# reset to the default value
|
121
|
+
@user_model.raise_on_save_failure = false
|
122
|
+
end
|
123
|
+
|
124
|
+
subject { @user_model.raise_on_save_failure = @value }
|
125
|
+
|
126
|
+
describe 'with a true value' do
|
127
|
+
before do
|
128
|
+
@value = true
|
129
|
+
end
|
130
|
+
|
131
|
+
it { should be(true) }
|
132
|
+
|
133
|
+
it 'should set raise_on_save_failure' do
|
134
|
+
method(:subject).should change {
|
135
|
+
@user_model.raise_on_save_failure
|
136
|
+
}.from(false).to(true)
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
describe 'with a false value' do
|
141
|
+
before do
|
142
|
+
@value = false
|
143
|
+
end
|
144
|
+
|
145
|
+
it { should be(false) }
|
146
|
+
|
147
|
+
it 'should set raise_on_save_failure' do
|
148
|
+
method(:subject).should_not change {
|
149
|
+
@user_model.raise_on_save_failure
|
150
|
+
}
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
[ :save, :save! ].each do |method|
|
156
|
+
describe "##{method}" do
|
157
|
+
subject { @user.__send__(method) }
|
158
|
+
|
159
|
+
describe 'when raise_on_save_failure is true' do
|
160
|
+
before do
|
161
|
+
@user.raise_on_save_failure = true
|
162
|
+
end
|
163
|
+
|
164
|
+
describe 'and it is a savable resource' do
|
165
|
+
it { should be(true) }
|
166
|
+
end
|
167
|
+
|
168
|
+
describe 'and it is an invalid resource' do
|
169
|
+
before do
|
170
|
+
@user.name = nil # name is required
|
171
|
+
end
|
172
|
+
|
173
|
+
it 'should raise an exception' do
|
174
|
+
method(:subject).should raise_error(DataMapper::SaveFailureError, "Blog::User##{method} returned false, Blog::User was not saved")
|
175
|
+
end
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
79
180
|
end
|
80
181
|
end
|
data/spec/public/sel_spec.rb
CHANGED
@@ -34,22 +34,12 @@ describe 'SEL', 'with STI subclasses' do
|
|
34
34
|
|
35
35
|
supported_by :all do
|
36
36
|
before :all do
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
before :all do
|
41
|
-
rescue_if 'TODO: fix YAML serialization/deserialization', @skip do
|
42
|
-
author1 = @author_model.create(:name => 'Dan Kubb')
|
43
|
-
author2 = @author_model.create(:name => 'Sindre Aarsaether')
|
44
|
-
|
45
|
-
@article_model.create(:title => 'SEL', :author => author1)
|
46
|
-
@article_model.create(:title => 'STI', :author => author1)
|
47
|
-
@comment_model.create(:title => 'SEL and STI error', :author => author2)
|
48
|
-
end
|
49
|
-
end
|
37
|
+
author1 = @author_model.create(:name => 'Dan Kubb')
|
38
|
+
author2 = @author_model.create(:name => 'Sindre Aarsaether')
|
50
39
|
|
51
|
-
|
52
|
-
|
40
|
+
@article_model.create(:title => 'SEL', :author => author1)
|
41
|
+
@article_model.create(:title => 'STI', :author => author1)
|
42
|
+
@comment_model.create(:title => 'SEL and STI error', :author => author2)
|
53
43
|
end
|
54
44
|
|
55
45
|
it 'should allow STI loading of mixed relationships' do
|
@@ -51,13 +51,13 @@ share_examples_for 'A public Collection' do
|
|
51
51
|
describe '#blank?' do
|
52
52
|
describe 'when the collection is empty' do
|
53
53
|
it 'should be true' do
|
54
|
-
@articles.clear.blank?.should
|
54
|
+
@articles.clear.blank?.should be(true)
|
55
55
|
end
|
56
56
|
end
|
57
57
|
|
58
58
|
describe 'when the collection is not empty' do
|
59
59
|
it 'should be false' do
|
60
|
-
@articles.blank?.should
|
60
|
+
@articles.blank?.should be(false)
|
61
61
|
end
|
62
62
|
end
|
63
63
|
end
|
@@ -67,7 +67,7 @@ share_examples_for 'A public Collection' do
|
|
67
67
|
describe '#clean?' do
|
68
68
|
describe 'with all clean resources in the collection' do
|
69
69
|
it 'should return true' do
|
70
|
-
@articles.clean?.should
|
70
|
+
@articles.clean?.should be(true)
|
71
71
|
end
|
72
72
|
end
|
73
73
|
|
@@ -77,7 +77,7 @@ share_examples_for 'A public Collection' do
|
|
77
77
|
end
|
78
78
|
|
79
79
|
it 'should return true' do
|
80
|
-
@articles.clean?.should
|
80
|
+
@articles.clean?.should be(false)
|
81
81
|
end
|
82
82
|
end
|
83
83
|
end
|
@@ -422,7 +422,7 @@ share_examples_for 'A public Collection' do
|
|
422
422
|
end
|
423
423
|
|
424
424
|
it 'should return true' do
|
425
|
-
@return.should
|
425
|
+
@return.should be(true)
|
426
426
|
end
|
427
427
|
|
428
428
|
it 'should remove the Resources from the datasource' do
|
@@ -443,7 +443,7 @@ share_examples_for 'A public Collection' do
|
|
443
443
|
end
|
444
444
|
|
445
445
|
it 'should return true' do
|
446
|
-
@return.should
|
446
|
+
@return.should be(true)
|
447
447
|
end
|
448
448
|
|
449
449
|
it 'should remove the Resources from the datasource' do
|
@@ -466,7 +466,7 @@ share_examples_for 'A public Collection' do
|
|
466
466
|
describe '#dirty?' do
|
467
467
|
describe 'with all clean resources in the collection' do
|
468
468
|
it 'should return false' do
|
469
|
-
@articles.dirty?.should
|
469
|
+
@articles.dirty?.should be(false)
|
470
470
|
end
|
471
471
|
end
|
472
472
|
|
@@ -476,7 +476,7 @@ share_examples_for 'A public Collection' do
|
|
476
476
|
end
|
477
477
|
|
478
478
|
it 'should return true' do
|
479
|
-
@articles.dirty?.should
|
479
|
+
@articles.dirty?.should be(true)
|
480
480
|
end
|
481
481
|
end
|
482
482
|
end
|
@@ -874,7 +874,7 @@ share_examples_for 'A public Collection' do
|
|
874
874
|
|
875
875
|
[ :id, :content, :title ].each do |attribute|
|
876
876
|
it "should have query field #{attribute.inspect} loaded" do
|
877
|
-
@collection.each { |resource| resource.attribute_loaded?(attribute).should
|
877
|
+
@collection.each { |resource| resource.attribute_loaded?(attribute).should be(true) }
|
878
878
|
end
|
879
879
|
end
|
880
880
|
end
|
@@ -906,7 +906,7 @@ share_examples_for 'A public Collection' do
|
|
906
906
|
|
907
907
|
[ :id, :content, :title ].each do |attribute|
|
908
908
|
it "should have query field #{attribute.inspect} loaded" do
|
909
|
-
@collection.each { |resource| resource.attribute_loaded?(attribute).should
|
909
|
+
@collection.each { |resource| resource.attribute_loaded?(attribute).should be(true) }
|
910
910
|
end
|
911
911
|
end
|
912
912
|
end
|
@@ -1004,7 +1004,7 @@ share_examples_for 'A public Collection' do
|
|
1004
1004
|
end
|
1005
1005
|
|
1006
1006
|
it 'should return true' do
|
1007
|
-
@return.should
|
1007
|
+
@return.should be(true)
|
1008
1008
|
end
|
1009
1009
|
|
1010
1010
|
it 'should save each Resource' do
|
@@ -1021,7 +1021,7 @@ share_examples_for 'A public Collection' do
|
|
1021
1021
|
end
|
1022
1022
|
|
1023
1023
|
it 'should return true' do
|
1024
|
-
@return.should
|
1024
|
+
@return.should be(true)
|
1025
1025
|
end
|
1026
1026
|
end
|
1027
1027
|
end
|
@@ -1572,20 +1572,6 @@ share_examples_for 'A public Collection' do
|
|
1572
1572
|
it { should respond_to(method) }
|
1573
1573
|
|
1574
1574
|
describe "##{method}" do
|
1575
|
-
describe 'with no arguments' do
|
1576
|
-
before :all do
|
1577
|
-
@return = @articles.send(method)
|
1578
|
-
end
|
1579
|
-
|
1580
|
-
if method == :update!
|
1581
|
-
should_not_be_a_kicker
|
1582
|
-
end
|
1583
|
-
|
1584
|
-
it 'should return true' do
|
1585
|
-
@return.should be_true
|
1586
|
-
end
|
1587
|
-
end
|
1588
|
-
|
1589
1575
|
describe 'with attributes' do
|
1590
1576
|
before :all do
|
1591
1577
|
@attributes = { :title => 'Updated Title' }
|
@@ -1598,7 +1584,7 @@ share_examples_for 'A public Collection' do
|
|
1598
1584
|
end
|
1599
1585
|
|
1600
1586
|
it 'should return true' do
|
1601
|
-
@return.should
|
1587
|
+
@return.should be(true)
|
1602
1588
|
end
|
1603
1589
|
|
1604
1590
|
it 'should update attributes of all Resources' do
|
@@ -1623,7 +1609,7 @@ share_examples_for 'A public Collection' do
|
|
1623
1609
|
end
|
1624
1610
|
|
1625
1611
|
it 'should return true' do
|
1626
|
-
@return.should
|
1612
|
+
@return.should be(true)
|
1627
1613
|
end
|
1628
1614
|
|
1629
1615
|
it 'should update attributes of all Resources' do
|
@@ -1646,7 +1632,7 @@ share_examples_for 'A public Collection' do
|
|
1646
1632
|
end
|
1647
1633
|
|
1648
1634
|
it 'should return false' do
|
1649
|
-
@return.should
|
1635
|
+
@return.should be(false)
|
1650
1636
|
end
|
1651
1637
|
end
|
1652
1638
|
|
@@ -1664,7 +1650,7 @@ share_examples_for 'A public Collection' do
|
|
1664
1650
|
end
|
1665
1651
|
|
1666
1652
|
it 'should return true' do
|
1667
|
-
@return.should
|
1653
|
+
@return.should be(true)
|
1668
1654
|
end
|
1669
1655
|
|
1670
1656
|
it 'should bypass validation' do
|
@@ -1325,8 +1325,7 @@ share_examples_for 'Finder Interface' do
|
|
1325
1325
|
@article.previous = @new
|
1326
1326
|
@new.previous = @other
|
1327
1327
|
|
1328
|
-
@article.save
|
1329
|
-
@new.save
|
1328
|
+
@article.save.should be(true)
|
1330
1329
|
end
|
1331
1330
|
|
1332
1331
|
describe 'with no arguments' do
|
@@ -1388,8 +1387,7 @@ share_examples_for 'Finder Interface' do
|
|
1388
1387
|
@article.revisions << @new
|
1389
1388
|
@new.revisions << @other
|
1390
1389
|
|
1391
|
-
@article.save
|
1392
|
-
@new.save
|
1390
|
+
@article.save.should be(true)
|
1393
1391
|
end
|
1394
1392
|
|
1395
1393
|
describe 'with no arguments' do
|
@@ -0,0 +1,176 @@
|
|
1
|
+
share_examples_for 'A public Property' do
|
2
|
+
before :all do
|
3
|
+
%w[ @type @primitive @name @value @other_value ].each do |ivar|
|
4
|
+
raise "+#{ivar}+ should be defined in before block" unless instance_variable_defined?(ivar)
|
5
|
+
end
|
6
|
+
|
7
|
+
module ::Blog
|
8
|
+
class Article
|
9
|
+
include DataMapper::Resource
|
10
|
+
property :id, Serial
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
@model = Blog::Article
|
15
|
+
end
|
16
|
+
|
17
|
+
describe "with a sub-type" do
|
18
|
+
before :all do
|
19
|
+
class ::SubType < @type; end
|
20
|
+
@subtype = ::SubType
|
21
|
+
@type.accept_options :foo, :bar
|
22
|
+
end
|
23
|
+
|
24
|
+
after :all do
|
25
|
+
Object.send(:remove_const, :SubType)
|
26
|
+
end
|
27
|
+
|
28
|
+
describe ".accept_options" do
|
29
|
+
describe "when provided :foo, :bar" do
|
30
|
+
it "should add new options" do
|
31
|
+
[@type, @subtype].each do |type|
|
32
|
+
type.accepted_options.include?(:foo).should be(true)
|
33
|
+
type.accepted_options.include?(:bar).should be(true)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should create predefined option setters" do
|
38
|
+
[@type, @subtype].each do |type|
|
39
|
+
type.should respond_to(:foo)
|
40
|
+
type.should respond_to(:bar)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe "auto-generated option setters" do
|
45
|
+
before :all do
|
46
|
+
[@type, @subtype].each do |type|
|
47
|
+
type.foo true
|
48
|
+
type.bar 1
|
49
|
+
@property = type.new(@model, @name)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should set the pre-defined option values" do
|
54
|
+
@property.options[:foo].should == true
|
55
|
+
@property.options[:bar].should == 1
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
describe ".descendants" do
|
62
|
+
it "should include the sub-type" do
|
63
|
+
@type.descendants.include?(SubType).should be(true)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
describe ".primitive" do
|
68
|
+
it "should return the primitive class" do
|
69
|
+
[@type, @subtype].each do |type|
|
70
|
+
type.primitive.should be(@primitive)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
it "should change the primitive class" do
|
75
|
+
@subtype.primitive Object
|
76
|
+
@subtype.primitive.should be(Object)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
[:allow_blank, :allow_nil].each do |opt|
|
82
|
+
describe "##{method = "#{opt}?"}" do
|
83
|
+
[true, false].each do |value|
|
84
|
+
describe "when created with :#{opt} => #{value}" do
|
85
|
+
before :all do
|
86
|
+
@property = @type.new(@model, @name, opt => value)
|
87
|
+
end
|
88
|
+
|
89
|
+
it "should return #{value}" do
|
90
|
+
@property.send(method).should be(value)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
describe "when created with :#{opt} => true and :required => true" do
|
96
|
+
it "should fail with ArgumentError" do
|
97
|
+
lambda {
|
98
|
+
@property = @type.new(@model, @name, opt => true, :required => true)
|
99
|
+
}.should raise_error(ArgumentError,
|
100
|
+
"options[:required] cannot be mixed with :allow_nil or :allow_blank")
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
[:key?, :required?, :index, :unique_index, :unique?].each do |method|
|
107
|
+
describe "##{method}" do
|
108
|
+
[true, false].each do |value|
|
109
|
+
describe "when created with :#{method} => #{value}" do
|
110
|
+
before :all do
|
111
|
+
opt = method.to_s.sub('?', '').to_sym
|
112
|
+
@property = @type.new(@model, @name, opt => value)
|
113
|
+
end
|
114
|
+
|
115
|
+
it "should return #{value}" do
|
116
|
+
@property.send(method).should be(value)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
describe "#lazy?" do
|
124
|
+
describe "when created with :lazy => true, :key => false" do
|
125
|
+
before :all do
|
126
|
+
@property = @type.new(@model, @name, :lazy => true, :key => false)
|
127
|
+
end
|
128
|
+
|
129
|
+
it "should return true" do
|
130
|
+
@property.lazy?.should be(true)
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
describe "when created with :lazy => true, :key => true" do
|
135
|
+
before :all do
|
136
|
+
@property = @type.new(@model, @name, :lazy => true, :key => true)
|
137
|
+
end
|
138
|
+
|
139
|
+
it "should return false" do
|
140
|
+
@property.lazy?.should be(false)
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
describe "#custom?" do
|
146
|
+
describe "when DM::Type is not provided" do
|
147
|
+
before :all do
|
148
|
+
@property = @type.new(@model, @name)
|
149
|
+
end
|
150
|
+
|
151
|
+
it "should be false" do
|
152
|
+
@property.custom?.should be(false)
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
[:instance_of?, :kind_of?].each do |method|
|
158
|
+
describe "##{method}" do
|
159
|
+
before :all do
|
160
|
+
@property = @type.new(@model, @name)
|
161
|
+
end
|
162
|
+
|
163
|
+
describe "when provided Property" do
|
164
|
+
it "should return true" do
|
165
|
+
@property.send(method, DataMapper::Property).should be(true)
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
describe "when provided property class" do
|
170
|
+
it "should return true" do
|
171
|
+
@property.send(method, @type).should be(true)
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|