ghost_dm-core 1.3.0.beta

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.
Files changed (254) hide show
  1. data/.autotest +29 -0
  2. data/.document +5 -0
  3. data/.gitignore +35 -0
  4. data/.yardopts +1 -0
  5. data/Gemfile +65 -0
  6. data/LICENSE +20 -0
  7. data/README.md +269 -0
  8. data/Rakefile +4 -0
  9. data/dm-core.gemspec +24 -0
  10. data/lib/dm-core.rb +292 -0
  11. data/lib/dm-core/adapters.rb +222 -0
  12. data/lib/dm-core/adapters/abstract_adapter.rb +237 -0
  13. data/lib/dm-core/adapters/in_memory_adapter.rb +113 -0
  14. data/lib/dm-core/associations/many_to_many.rb +499 -0
  15. data/lib/dm-core/associations/many_to_one.rb +290 -0
  16. data/lib/dm-core/associations/one_to_many.rb +348 -0
  17. data/lib/dm-core/associations/one_to_one.rb +86 -0
  18. data/lib/dm-core/associations/relationship.rb +663 -0
  19. data/lib/dm-core/backwards.rb +13 -0
  20. data/lib/dm-core/collection.rb +1515 -0
  21. data/lib/dm-core/core_ext/kernel.rb +23 -0
  22. data/lib/dm-core/core_ext/pathname.rb +6 -0
  23. data/lib/dm-core/core_ext/symbol.rb +10 -0
  24. data/lib/dm-core/identity_map.rb +7 -0
  25. data/lib/dm-core/model.rb +874 -0
  26. data/lib/dm-core/model/hook.rb +103 -0
  27. data/lib/dm-core/model/is.rb +32 -0
  28. data/lib/dm-core/model/property.rb +249 -0
  29. data/lib/dm-core/model/relationship.rb +378 -0
  30. data/lib/dm-core/model/scope.rb +89 -0
  31. data/lib/dm-core/property.rb +866 -0
  32. data/lib/dm-core/property/binary.rb +21 -0
  33. data/lib/dm-core/property/boolean.rb +20 -0
  34. data/lib/dm-core/property/class.rb +17 -0
  35. data/lib/dm-core/property/date.rb +10 -0
  36. data/lib/dm-core/property/date_time.rb +10 -0
  37. data/lib/dm-core/property/decimal.rb +36 -0
  38. data/lib/dm-core/property/discriminator.rb +44 -0
  39. data/lib/dm-core/property/float.rb +16 -0
  40. data/lib/dm-core/property/integer.rb +22 -0
  41. data/lib/dm-core/property/invalid_value_error.rb +22 -0
  42. data/lib/dm-core/property/lookup.rb +27 -0
  43. data/lib/dm-core/property/numeric.rb +38 -0
  44. data/lib/dm-core/property/object.rb +34 -0
  45. data/lib/dm-core/property/serial.rb +14 -0
  46. data/lib/dm-core/property/string.rb +38 -0
  47. data/lib/dm-core/property/text.rb +9 -0
  48. data/lib/dm-core/property/time.rb +10 -0
  49. data/lib/dm-core/property_set.rb +177 -0
  50. data/lib/dm-core/query.rb +1366 -0
  51. data/lib/dm-core/query/conditions/comparison.rb +911 -0
  52. data/lib/dm-core/query/conditions/operation.rb +721 -0
  53. data/lib/dm-core/query/direction.rb +36 -0
  54. data/lib/dm-core/query/operator.rb +35 -0
  55. data/lib/dm-core/query/path.rb +114 -0
  56. data/lib/dm-core/query/sort.rb +39 -0
  57. data/lib/dm-core/relationship_set.rb +72 -0
  58. data/lib/dm-core/repository.rb +226 -0
  59. data/lib/dm-core/resource.rb +1214 -0
  60. data/lib/dm-core/resource/persistence_state.rb +75 -0
  61. data/lib/dm-core/resource/persistence_state/clean.rb +40 -0
  62. data/lib/dm-core/resource/persistence_state/deleted.rb +30 -0
  63. data/lib/dm-core/resource/persistence_state/dirty.rb +96 -0
  64. data/lib/dm-core/resource/persistence_state/immutable.rb +34 -0
  65. data/lib/dm-core/resource/persistence_state/persisted.rb +29 -0
  66. data/lib/dm-core/resource/persistence_state/transient.rb +80 -0
  67. data/lib/dm-core/spec/lib/adapter_helpers.rb +64 -0
  68. data/lib/dm-core/spec/lib/collection_helpers.rb +21 -0
  69. data/lib/dm-core/spec/lib/counter_adapter.rb +38 -0
  70. data/lib/dm-core/spec/lib/pending_helpers.rb +50 -0
  71. data/lib/dm-core/spec/lib/spec_helper.rb +74 -0
  72. data/lib/dm-core/spec/setup.rb +174 -0
  73. data/lib/dm-core/spec/shared/adapter_spec.rb +341 -0
  74. data/lib/dm-core/spec/shared/public/property_spec.rb +229 -0
  75. data/lib/dm-core/spec/shared/resource_spec.rb +1232 -0
  76. data/lib/dm-core/spec/shared/sel_spec.rb +111 -0
  77. data/lib/dm-core/spec/shared/semipublic/property_spec.rb +176 -0
  78. data/lib/dm-core/spec/shared/semipublic/query/conditions/abstract_comparison_spec.rb +261 -0
  79. data/lib/dm-core/support/assertions.rb +8 -0
  80. data/lib/dm-core/support/chainable.rb +18 -0
  81. data/lib/dm-core/support/deprecate.rb +12 -0
  82. data/lib/dm-core/support/descendant_set.rb +89 -0
  83. data/lib/dm-core/support/equalizer.rb +48 -0
  84. data/lib/dm-core/support/ext/array.rb +22 -0
  85. data/lib/dm-core/support/ext/blank.rb +25 -0
  86. data/lib/dm-core/support/ext/hash.rb +67 -0
  87. data/lib/dm-core/support/ext/module.rb +47 -0
  88. data/lib/dm-core/support/ext/object.rb +57 -0
  89. data/lib/dm-core/support/ext/string.rb +24 -0
  90. data/lib/dm-core/support/ext/try_dup.rb +12 -0
  91. data/lib/dm-core/support/hook.rb +405 -0
  92. data/lib/dm-core/support/inflections.rb +60 -0
  93. data/lib/dm-core/support/inflector/inflections.rb +211 -0
  94. data/lib/dm-core/support/inflector/methods.rb +151 -0
  95. data/lib/dm-core/support/lazy_array.rb +451 -0
  96. data/lib/dm-core/support/local_object_space.rb +13 -0
  97. data/lib/dm-core/support/logger.rb +201 -0
  98. data/lib/dm-core/support/mash.rb +176 -0
  99. data/lib/dm-core/support/naming_conventions.rb +90 -0
  100. data/lib/dm-core/support/ordered_set.rb +380 -0
  101. data/lib/dm-core/support/subject.rb +33 -0
  102. data/lib/dm-core/support/subject_set.rb +250 -0
  103. data/lib/dm-core/version.rb +3 -0
  104. data/script/performance.rb +275 -0
  105. data/script/profile.rb +218 -0
  106. data/spec/lib/rspec_immediate_feedback_formatter.rb +54 -0
  107. data/spec/public/associations/many_to_many/read_multiple_join_spec.rb +68 -0
  108. data/spec/public/associations/many_to_many_spec.rb +197 -0
  109. data/spec/public/associations/many_to_one_spec.rb +83 -0
  110. data/spec/public/associations/many_to_one_with_boolean_cpk_spec.rb +40 -0
  111. data/spec/public/associations/many_to_one_with_custom_fk_spec.rb +49 -0
  112. data/spec/public/associations/one_to_many_spec.rb +81 -0
  113. data/spec/public/associations/one_to_one_spec.rb +176 -0
  114. data/spec/public/associations/one_to_one_with_boolean_cpk_spec.rb +46 -0
  115. data/spec/public/collection_spec.rb +69 -0
  116. data/spec/public/finalize_spec.rb +76 -0
  117. data/spec/public/model/hook_spec.rb +246 -0
  118. data/spec/public/model/property_spec.rb +88 -0
  119. data/spec/public/model/relationship_spec.rb +1040 -0
  120. data/spec/public/model_spec.rb +462 -0
  121. data/spec/public/property/binary_spec.rb +41 -0
  122. data/spec/public/property/boolean_spec.rb +22 -0
  123. data/spec/public/property/class_spec.rb +28 -0
  124. data/spec/public/property/date_spec.rb +22 -0
  125. data/spec/public/property/date_time_spec.rb +22 -0
  126. data/spec/public/property/decimal_spec.rb +23 -0
  127. data/spec/public/property/discriminator_spec.rb +135 -0
  128. data/spec/public/property/float_spec.rb +22 -0
  129. data/spec/public/property/integer_spec.rb +22 -0
  130. data/spec/public/property/object_spec.rb +107 -0
  131. data/spec/public/property/serial_spec.rb +22 -0
  132. data/spec/public/property/string_spec.rb +22 -0
  133. data/spec/public/property/text_spec.rb +63 -0
  134. data/spec/public/property/time_spec.rb +22 -0
  135. data/spec/public/property_spec.rb +341 -0
  136. data/spec/public/resource_spec.rb +288 -0
  137. data/spec/public/sel_spec.rb +53 -0
  138. data/spec/public/setup_spec.rb +145 -0
  139. data/spec/public/shared/association_collection_shared_spec.rb +309 -0
  140. data/spec/public/shared/collection_finder_shared_spec.rb +267 -0
  141. data/spec/public/shared/collection_shared_spec.rb +1667 -0
  142. data/spec/public/shared/finder_shared_spec.rb +1629 -0
  143. data/spec/rcov.opts +6 -0
  144. data/spec/semipublic/adapters/abstract_adapter_spec.rb +30 -0
  145. data/spec/semipublic/adapters/in_memory_adapter_spec.rb +13 -0
  146. data/spec/semipublic/associations/many_to_many_spec.rb +94 -0
  147. data/spec/semipublic/associations/many_to_one_spec.rb +63 -0
  148. data/spec/semipublic/associations/one_to_many_spec.rb +55 -0
  149. data/spec/semipublic/associations/one_to_one_spec.rb +53 -0
  150. data/spec/semipublic/associations/relationship_spec.rb +200 -0
  151. data/spec/semipublic/associations_spec.rb +177 -0
  152. data/spec/semipublic/collection_spec.rb +110 -0
  153. data/spec/semipublic/model_spec.rb +96 -0
  154. data/spec/semipublic/property/binary_spec.rb +13 -0
  155. data/spec/semipublic/property/boolean_spec.rb +47 -0
  156. data/spec/semipublic/property/class_spec.rb +33 -0
  157. data/spec/semipublic/property/date_spec.rb +43 -0
  158. data/spec/semipublic/property/date_time_spec.rb +46 -0
  159. data/spec/semipublic/property/decimal_spec.rb +83 -0
  160. data/spec/semipublic/property/discriminator_spec.rb +19 -0
  161. data/spec/semipublic/property/float_spec.rb +82 -0
  162. data/spec/semipublic/property/integer_spec.rb +82 -0
  163. data/spec/semipublic/property/lookup_spec.rb +29 -0
  164. data/spec/semipublic/property/serial_spec.rb +13 -0
  165. data/spec/semipublic/property/string_spec.rb +13 -0
  166. data/spec/semipublic/property/text_spec.rb +31 -0
  167. data/spec/semipublic/property/time_spec.rb +50 -0
  168. data/spec/semipublic/property_spec.rb +114 -0
  169. data/spec/semipublic/query/conditions/comparison_spec.rb +1501 -0
  170. data/spec/semipublic/query/conditions/operation_spec.rb +1294 -0
  171. data/spec/semipublic/query/path_spec.rb +471 -0
  172. data/spec/semipublic/query_spec.rb +3682 -0
  173. data/spec/semipublic/resource/state/clean_spec.rb +88 -0
  174. data/spec/semipublic/resource/state/deleted_spec.rb +78 -0
  175. data/spec/semipublic/resource/state/dirty_spec.rb +162 -0
  176. data/spec/semipublic/resource/state/immutable_spec.rb +105 -0
  177. data/spec/semipublic/resource/state/transient_spec.rb +162 -0
  178. data/spec/semipublic/resource/state_spec.rb +230 -0
  179. data/spec/semipublic/resource_spec.rb +23 -0
  180. data/spec/semipublic/shared/condition_shared_spec.rb +9 -0
  181. data/spec/semipublic/shared/resource_shared_spec.rb +199 -0
  182. data/spec/semipublic/shared/resource_state_shared_spec.rb +79 -0
  183. data/spec/semipublic/shared/subject_shared_spec.rb +79 -0
  184. data/spec/spec.opts +5 -0
  185. data/spec/spec_helper.rb +38 -0
  186. data/spec/support/core_ext/hash.rb +10 -0
  187. data/spec/support/core_ext/inheritable_attributes.rb +46 -0
  188. data/spec/support/properties/huge_integer.rb +17 -0
  189. data/spec/unit/array_spec.rb +23 -0
  190. data/spec/unit/blank_spec.rb +73 -0
  191. data/spec/unit/data_mapper/ordered_set/append_spec.rb +26 -0
  192. data/spec/unit/data_mapper/ordered_set/clear_spec.rb +24 -0
  193. data/spec/unit/data_mapper/ordered_set/delete_spec.rb +28 -0
  194. data/spec/unit/data_mapper/ordered_set/each_spec.rb +19 -0
  195. data/spec/unit/data_mapper/ordered_set/empty_spec.rb +20 -0
  196. data/spec/unit/data_mapper/ordered_set/entries_spec.rb +22 -0
  197. data/spec/unit/data_mapper/ordered_set/eql_spec.rb +51 -0
  198. data/spec/unit/data_mapper/ordered_set/equal_value_spec.rb +84 -0
  199. data/spec/unit/data_mapper/ordered_set/hash_spec.rb +12 -0
  200. data/spec/unit/data_mapper/ordered_set/include_spec.rb +23 -0
  201. data/spec/unit/data_mapper/ordered_set/index_spec.rb +28 -0
  202. data/spec/unit/data_mapper/ordered_set/initialize_spec.rb +32 -0
  203. data/spec/unit/data_mapper/ordered_set/merge_spec.rb +36 -0
  204. data/spec/unit/data_mapper/ordered_set/shared/append_spec.rb +24 -0
  205. data/spec/unit/data_mapper/ordered_set/shared/clear_spec.rb +9 -0
  206. data/spec/unit/data_mapper/ordered_set/shared/delete_spec.rb +25 -0
  207. data/spec/unit/data_mapper/ordered_set/shared/each_spec.rb +17 -0
  208. data/spec/unit/data_mapper/ordered_set/shared/empty_spec.rb +9 -0
  209. data/spec/unit/data_mapper/ordered_set/shared/entries_spec.rb +9 -0
  210. data/spec/unit/data_mapper/ordered_set/shared/include_spec.rb +9 -0
  211. data/spec/unit/data_mapper/ordered_set/shared/index_spec.rb +13 -0
  212. data/spec/unit/data_mapper/ordered_set/shared/initialize_spec.rb +28 -0
  213. data/spec/unit/data_mapper/ordered_set/shared/merge_spec.rb +28 -0
  214. data/spec/unit/data_mapper/ordered_set/shared/size_spec.rb +13 -0
  215. data/spec/unit/data_mapper/ordered_set/shared/to_ary_spec.rb +11 -0
  216. data/spec/unit/data_mapper/ordered_set/size_spec.rb +27 -0
  217. data/spec/unit/data_mapper/ordered_set/to_ary_spec.rb +23 -0
  218. data/spec/unit/data_mapper/subject_set/append_spec.rb +47 -0
  219. data/spec/unit/data_mapper/subject_set/clear_spec.rb +34 -0
  220. data/spec/unit/data_mapper/subject_set/delete_spec.rb +40 -0
  221. data/spec/unit/data_mapper/subject_set/each_spec.rb +30 -0
  222. data/spec/unit/data_mapper/subject_set/empty_spec.rb +31 -0
  223. data/spec/unit/data_mapper/subject_set/entries_spec.rb +31 -0
  224. data/spec/unit/data_mapper/subject_set/get_spec.rb +34 -0
  225. data/spec/unit/data_mapper/subject_set/include_spec.rb +32 -0
  226. data/spec/unit/data_mapper/subject_set/named_spec.rb +33 -0
  227. data/spec/unit/data_mapper/subject_set/shared/append_spec.rb +18 -0
  228. data/spec/unit/data_mapper/subject_set/shared/clear_spec.rb +9 -0
  229. data/spec/unit/data_mapper/subject_set/shared/delete_spec.rb +9 -0
  230. data/spec/unit/data_mapper/subject_set/shared/each_spec.rb +9 -0
  231. data/spec/unit/data_mapper/subject_set/shared/empty_spec.rb +9 -0
  232. data/spec/unit/data_mapper/subject_set/shared/entries_spec.rb +9 -0
  233. data/spec/unit/data_mapper/subject_set/shared/get_spec.rb +9 -0
  234. data/spec/unit/data_mapper/subject_set/shared/include_spec.rb +9 -0
  235. data/spec/unit/data_mapper/subject_set/shared/named_spec.rb +9 -0
  236. data/spec/unit/data_mapper/subject_set/shared/size_spec.rb +13 -0
  237. data/spec/unit/data_mapper/subject_set/shared/to_ary_spec.rb +9 -0
  238. data/spec/unit/data_mapper/subject_set/shared/values_at_spec.rb +44 -0
  239. data/spec/unit/data_mapper/subject_set/size_spec.rb +42 -0
  240. data/spec/unit/data_mapper/subject_set/to_ary_spec.rb +34 -0
  241. data/spec/unit/data_mapper/subject_set/values_at_spec.rb +57 -0
  242. data/spec/unit/hash_spec.rb +28 -0
  243. data/spec/unit/hook_spec.rb +1235 -0
  244. data/spec/unit/inflections_spec.rb +16 -0
  245. data/spec/unit/lazy_array_spec.rb +1949 -0
  246. data/spec/unit/mash_spec.rb +312 -0
  247. data/spec/unit/module_spec.rb +71 -0
  248. data/spec/unit/object_spec.rb +38 -0
  249. data/spec/unit/try_dup_spec.rb +46 -0
  250. data/tasks/ci.rake +1 -0
  251. data/tasks/spec.rake +38 -0
  252. data/tasks/yard.rake +9 -0
  253. data/tasks/yardstick.rake +19 -0
  254. metadata +365 -0
@@ -0,0 +1,230 @@
1
+ require 'spec_helper'
2
+
3
+ describe DataMapper::Resource::PersistenceState do
4
+ before :all do
5
+ class ::Author
6
+ include DataMapper::Resource
7
+
8
+ property :id, Serial
9
+ property :name, String
10
+ property :private, Boolean, :accessor => :private
11
+
12
+ belongs_to :parent, self, :required => false
13
+ end
14
+
15
+ DataMapper.finalize
16
+
17
+ @model = Author
18
+ end
19
+
20
+ before do
21
+ @resource = @model.new(:name => 'Dan Kubb')
22
+
23
+ @state = DataMapper::Resource::PersistenceState.new(@resource)
24
+ end
25
+
26
+ describe '.new' do
27
+ subject { DataMapper::Resource::PersistenceState.new(@resource) }
28
+
29
+ it { should be_kind_of(DataMapper::Resource::PersistenceState) }
30
+ end
31
+
32
+ describe '#==' do
33
+ subject { @state == @other }
34
+
35
+ supported_by :all do
36
+ describe 'with the same class and resource' do
37
+ before do
38
+ @other = DataMapper::Resource::PersistenceState.new(@resource)
39
+ end
40
+
41
+ it { should be(true) }
42
+
43
+ it 'should be symmetric' do
44
+ should == (@other == @state)
45
+ end
46
+ end
47
+
48
+ describe 'with the same class and different resource' do
49
+ before do
50
+ @other = DataMapper::Resource::PersistenceState.new(@model.new)
51
+ end
52
+
53
+ it { should be(false) }
54
+
55
+ it 'should be symmetric' do
56
+ should == (@other == @state)
57
+ end
58
+ end
59
+
60
+ describe 'with a different class and the same resource' do
61
+ before do
62
+ @other = DataMapper::Resource::PersistenceState::Clean.new(@resource)
63
+ end
64
+
65
+ it 'should be true for a subclass' do
66
+ should be(true)
67
+ end
68
+
69
+ it 'should be symmetric' do
70
+ should == (@other == @state)
71
+ end
72
+ end
73
+
74
+ describe 'with a different class and different resource' do
75
+ before do
76
+ @other = DataMapper::Resource::PersistenceState::Clean.new(@model.new)
77
+ end
78
+
79
+ it { should be(false) }
80
+
81
+ it 'should be symmetric' do
82
+ should == (@other == @state)
83
+ end
84
+ end
85
+ end
86
+ end
87
+
88
+ [ :commit, :delete, :rollback ].each do |method|
89
+ describe "##{method}" do
90
+ subject { @state.send(method) }
91
+
92
+ it 'should raise an exception' do
93
+ method(:subject).should raise_error(NotImplementedError, "DataMapper::Resource::PersistenceState##{method} should be implemented")
94
+ end
95
+ end
96
+ end
97
+
98
+ describe '#eql?' do
99
+ subject { @state.eql?(@other) }
100
+
101
+ supported_by :all do
102
+ describe 'with the same class and resource' do
103
+ before do
104
+ @other = DataMapper::Resource::PersistenceState.new(@resource)
105
+ end
106
+
107
+ it { should be(true) }
108
+
109
+ it 'should be symmetric' do
110
+ should == @other.eql?(@state)
111
+ end
112
+ end
113
+
114
+ describe 'with the same class and different resource' do
115
+ before do
116
+ @other = DataMapper::Resource::PersistenceState.new(@model.new)
117
+ end
118
+
119
+ it { should be(false) }
120
+
121
+ it 'should be symmetric' do
122
+ should == @other.eql?(@state)
123
+ end
124
+ end
125
+
126
+ describe 'with a different class and the same resource' do
127
+ before do
128
+ @other = DataMapper::Resource::PersistenceState::Clean.new(@resource)
129
+ end
130
+
131
+ it { should be(false) }
132
+
133
+ it 'should be symmetric' do
134
+ should == @other.eql?(@state)
135
+ end
136
+ end
137
+
138
+ describe 'with a different class and different resource' do
139
+ before do
140
+ @other = DataMapper::Resource::PersistenceState::Clean.new(@model.new)
141
+ end
142
+
143
+ it { should be(false) }
144
+
145
+ it 'should be symmetric' do
146
+ should == @other.eql?(@state)
147
+ end
148
+ end
149
+ end
150
+ end
151
+
152
+ describe '#get' do
153
+ subject { @state.get(@key) }
154
+
155
+ describe 'with a Property subject' do
156
+ before do
157
+ @key = @model.properties[:name]
158
+ end
159
+
160
+ it 'should return the value' do
161
+ should == 'Dan Kubb'
162
+ end
163
+ end
164
+
165
+ describe 'with a Relationship subject' do
166
+ supported_by :all do
167
+ before do
168
+ # set the association
169
+ @resource.parent = @resource
170
+
171
+ @key = @model.relationships[:parent]
172
+ end
173
+
174
+ it 'should return the association' do
175
+ should == @resource
176
+ end
177
+ end
178
+ end
179
+ end
180
+
181
+ describe '#hash' do
182
+ subject { @state.hash }
183
+
184
+ it { should == @state.class.hash ^ @resource.hash }
185
+ end
186
+
187
+ describe '#resource' do
188
+ subject { @state.resource }
189
+
190
+ it 'should return the resource' do
191
+ should equal(@resource)
192
+ end
193
+ end
194
+
195
+ describe '#set' do
196
+ subject { @state.set(@key, @value) }
197
+
198
+ describe 'with a Property subject' do
199
+ before do
200
+ @key = @model.properties[:name]
201
+ @value = 'John Doe'
202
+ end
203
+
204
+ it 'should return a state object' do
205
+ should be_kind_of(DataMapper::Resource::PersistenceState)
206
+ end
207
+
208
+ it 'should change the object attributes' do
209
+ method(:subject).should change(@resource, :attributes).from(:name => 'Dan Kubb').to(:name => 'John Doe')
210
+ end
211
+ end
212
+
213
+ describe 'with a Relationship subject' do
214
+ supported_by :all do
215
+ before do
216
+ @key = @model.relationships[:parent]
217
+ @value = @resource
218
+ end
219
+
220
+ it 'should return a state object' do
221
+ should be_kind_of(DataMapper::Resource::PersistenceState)
222
+ end
223
+
224
+ it 'should change the object relationship' do
225
+ method(:subject).should change(@resource, :parent).from(nil).to(@resource)
226
+ end
227
+ end
228
+ end
229
+ end
230
+ end
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+
3
+ describe DataMapper::Resource 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
+ end
12
+
13
+ @user_model = User
14
+ end
15
+
16
+ supported_by :all do
17
+ before :all do
18
+ @user = @user_model.create(:name => 'dbussink', :age => 25, :description => "Test")
19
+ end
20
+
21
+ it_should_behave_like 'A semipublic Resource'
22
+ end
23
+ end
@@ -0,0 +1,9 @@
1
+ share_examples_for 'A valid query condition' do
2
+ before :all do
3
+ raise "+@comp+ should be defined in before block" unless instance_variable_get(:@comp)
4
+ end
5
+
6
+ it 'should be valid' do
7
+ @comp.should be_valid
8
+ end
9
+ end
@@ -0,0 +1,199 @@
1
+ share_examples_for 'A semipublic Resource' do
2
+ before :all do
3
+ %w[ @user_model @user ].each do |ivar|
4
+ raise "+#{ivar}+ should be defined in before block" unless instance_variable_get(ivar)
5
+ end
6
+ end
7
+
8
+ it { @user.should respond_to(:attribute_dirty?) }
9
+
10
+ describe '#attribute_dirty?' do
11
+ describe 'on a non-dirty record' do
12
+ it { @user.attribute_dirty?(:age).should be(false) }
13
+ end
14
+
15
+ describe 'on a dirty record' do
16
+ before { @user.age = 100 }
17
+
18
+ it { @user.attribute_dirty?(:age).should be(true) }
19
+ end
20
+
21
+ describe 'on a new record' do
22
+ before { @user = @user_model.new }
23
+
24
+ it { @user.attribute_dirty?(:age).should be(false) }
25
+ end
26
+ end
27
+
28
+ it { @user.should respond_to(:dirty_attributes) }
29
+
30
+ describe '#dirty_attributes' do
31
+ describe 'on a saved/clean record' do
32
+ it { @user.dirty_attributes.should be_empty }
33
+ end
34
+
35
+ describe 'on a saved/dirty record' do
36
+ before { @user.age = 100 }
37
+
38
+ it { @user.dirty_attributes.should == { @user_model.properties[:age] => 100 } }
39
+ end
40
+
41
+ describe 'on an saved/set/unset record' do
42
+ before do
43
+ @user.age = 100
44
+ @user.age = 25
45
+ end
46
+
47
+ it { @user.dirty_attributes.should be_empty }
48
+ end
49
+
50
+ describe 'on an saved/unchanged record' do
51
+ before do
52
+ @user.age = 25
53
+ end
54
+
55
+ it { @user.dirty_attributes.should be_empty }
56
+ end
57
+
58
+ describe 'on a new/clean record' do
59
+ before { @user = @user_model.new }
60
+
61
+ it { @user.dirty_attributes.should be_empty }
62
+ end
63
+
64
+ describe 'on a new/dirty record' do
65
+ before { @user = @user_model.new(:age => 100) }
66
+
67
+ it { @user.original_attributes.should == { @user_model.properties[:age] => nil } }
68
+ end
69
+
70
+ describe 'on an new/set/unset record' do
71
+ before do
72
+ @user = @user_model.new(:age => 100)
73
+ @user.age = nil
74
+ end
75
+
76
+ it { @user.dirty_attributes.should == { @user_model.properties[:age] => nil } }
77
+ end
78
+
79
+ describe 'on an new/unchanged record' do
80
+ before do
81
+ @user = @user_model.new(:age => nil)
82
+ end
83
+
84
+ it { @user.dirty_attributes.should == { @user_model.properties[:age] => nil } }
85
+ end
86
+ end
87
+
88
+ it { @user.should respond_to(:original_attributes) }
89
+
90
+ describe '#original_attributes' do
91
+ describe 'on a saved/clean record' do
92
+ it { @user.original_attributes.should be_empty }
93
+ end
94
+
95
+ describe 'on a saved/dirty record' do
96
+ before { @user.age = 100 }
97
+
98
+ it { @user.original_attributes.should == { @user_model.properties[:age] => 25 } }
99
+ end
100
+
101
+ describe 'on an saved/set/unset record' do
102
+ before do
103
+ @user.age = 100
104
+ @user.age = 25
105
+ end
106
+
107
+ it { @user.original_attributes.should be_empty }
108
+ end
109
+
110
+ describe 'on an saved/unchanged record' do
111
+ before do
112
+ @user.age = 25
113
+ end
114
+
115
+ it { @user.original_attributes.should be_empty }
116
+ end
117
+
118
+ describe 'on a new/clean record' do
119
+ before { @user = @user_model.new }
120
+
121
+ it { @user.original_attributes.should be_empty }
122
+ end
123
+
124
+ describe 'on a new/dirty record' do
125
+ before { @user = @user_model.new(:age => 100) }
126
+
127
+ it { @user.original_attributes.should == { @user_model.properties[:age] => nil } }
128
+ end
129
+
130
+ describe 'on an new/set/unset record' do
131
+ before do
132
+ @user = @user_model.new(:age => 100)
133
+ @user.age = nil
134
+ end
135
+
136
+ it { @user.original_attributes.should == { @user_model.properties[:age] => nil } }
137
+ end
138
+
139
+ describe 'on an new/unchanged record' do
140
+ before do
141
+ @user = @user_model.new(:age => nil)
142
+ end
143
+
144
+ it { @user.original_attributes.should == { @user_model.properties[:age] => nil } }
145
+ end
146
+ end
147
+
148
+ it { @user.should respond_to(:repository) }
149
+
150
+ describe '#repository' do
151
+ before :all do
152
+ class ::Statistic
153
+ include DataMapper::Resource
154
+
155
+ def self.default_repository_name
156
+ :alternate
157
+ end
158
+
159
+ property :id, Serial
160
+ property :name, String
161
+ property :value, Integer
162
+ end
163
+ end
164
+
165
+ with_alternate_adapter do
166
+ before :all do
167
+ if @user_model.respond_to?(:auto_migrate!)
168
+ # force the user model to be available in the alternate repository
169
+ @user_model.auto_migrate!(@adapter.name)
170
+ end
171
+ end
172
+
173
+ it 'should return the default repository when nothing is specified' do
174
+ default_repository = DataMapper.repository(:default)
175
+ @user_model.create(:name => 'carl').repository.should == default_repository
176
+ @user_model.new.repository.should == default_repository
177
+ @user_model.get('carl').repository.should == default_repository
178
+ end
179
+
180
+ it 'should return the default repository for the model' do
181
+ statistic = Statistic.create(:name => 'visits', :value => 2)
182
+ statistic.repository.should == @repository
183
+ Statistic.new.repository.should == @repository
184
+ Statistic.get(statistic.id).repository.should == @repository
185
+ end
186
+
187
+ it 'should return the repository defined by the current context' do
188
+ @repository.scope do
189
+ @user_model.new.repository.should == @repository
190
+ @user_model.create(:name => 'carl').repository.should == @repository
191
+ @user_model.get('carl').repository.should == @repository
192
+ end
193
+
194
+ @repository.scope { @user_model.get('carl') }.repository.should == @repository
195
+ end
196
+ end
197
+
198
+ end
199
+ end