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,79 @@
1
+ share_examples_for 'A method that delegates to the superclass #set' do
2
+ it 'should delegate to the superclass' do
3
+ # this is the only way I could think of to test if the
4
+ # superclass method is being called
5
+ DataMapper::Resource::PersistenceState.class_eval { alias_method :original_set, :set; undef_method(:set) }
6
+ method(:subject).should raise_error(NoMethodError)
7
+ DataMapper::Resource::PersistenceState.class_eval { alias_method :set, :original_set; undef_method(:original_set) }
8
+ end
9
+ end
10
+
11
+ share_examples_for 'A method that does not delegate to the superclass #set' do
12
+ it 'should delegate to the superclass' do
13
+ # this is the only way I could think of to test if the
14
+ # superclass method is not being called
15
+ DataMapper::Resource::PersistenceState.class_eval { alias_method :original_set, :set; undef_method(:set) }
16
+ method(:subject).should_not raise_error(NoMethodError)
17
+ DataMapper::Resource::PersistenceState.class_eval { alias_method :set, :original_set; undef_method(:original_set) }
18
+ end
19
+ end
20
+
21
+ share_examples_for 'It resets resource state' do
22
+ it 'should reset the dirty property' do
23
+ method(:subject).should change(@resource, :name).from('John Doe').to('Dan Kubb')
24
+ end
25
+
26
+ it 'should reset the dirty m:1 relationship' do
27
+ method(:subject).should change(@resource, :parent).from(@resource).to(nil)
28
+ end
29
+
30
+ it 'should reset the dirty 1:m relationship' do
31
+ method(:subject).should change(@resource, :children).from([ @resource ]).to([])
32
+ end
33
+
34
+ it 'should clear original attributes' do
35
+ method(:subject).should change { @resource.original_attributes.dup }.to({})
36
+ end
37
+ end
38
+
39
+ share_examples_for 'Resource::PersistenceState::Persisted#get' do
40
+ subject { @state.get(@key) }
41
+
42
+ supported_by :all do
43
+ describe 'with an unloaded subject' do
44
+ before do
45
+ @key = @model.relationships[:parent]
46
+
47
+ # set the parent relationship
48
+ @resource.attributes = { @key => @resource }
49
+ @resource.should be_dirty
50
+ @resource.save.should be(true)
51
+
52
+ attributes = Hash[ @model.key.zip(@resource.key) ]
53
+ @resource = @model.first(attributes.merge(:fields => @model.key))
54
+ @state = @state.class.new(@resource)
55
+
56
+ # make sure the subject is not loaded
57
+ @key.should_not be_loaded(@resource)
58
+ end
59
+
60
+ it 'should lazy load the value' do
61
+ subject.key.should == @resource.key
62
+ end
63
+ end
64
+
65
+ describe 'with a loaded subject' do
66
+ before do
67
+ @key = @model.properties[:name]
68
+ @loaded_value ||= 'Dan Kubb'
69
+
70
+ # make sure the subject is loaded
71
+ @key.should be_loaded(@resource)
72
+ end
73
+
74
+ it 'should return value' do
75
+ should == @loaded_value
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,79 @@
1
+ share_examples_for 'A semipublic Subject' do
2
+ describe '#default?' do
3
+ describe 'with a default' do
4
+ subject { @subject_with_default.default? }
5
+
6
+ it { should be(true) }
7
+ end
8
+
9
+ describe 'without a default' do
10
+ subject { @subject_without_default.default? }
11
+
12
+ it { should be(false) }
13
+ end
14
+ end
15
+
16
+ describe '#default_for' do
17
+ describe 'without a default' do
18
+ subject { @subject_without_default.default_for(@resource) }
19
+
20
+ it 'should match the default value' do
21
+ DataMapper::Ext.blank?(subject).should == true
22
+ end
23
+
24
+ it 'should be used as a default for the subject accessor' do
25
+ should == @resource.__send__(@subject_without_default.name)
26
+ end
27
+
28
+ it 'should persist the value' do
29
+ @resource.save.should be(true)
30
+ @resource = @resource.model.get!(*@resource.key)
31
+ @resource.without_default.should == subject
32
+ end
33
+ end
34
+
35
+ describe 'with a default value' do
36
+ subject { @subject_with_default.default_for(@resource) }
37
+
38
+ it 'should match the default value' do
39
+ if @default_value.kind_of?(DataMapper::Resource)
40
+ subject.key.should == @default_value.key
41
+ else
42
+ should == @default_value
43
+ end
44
+ end
45
+
46
+ it 'should be used as a default for the subject accessor' do
47
+ should == @resource.__send__(@subject_with_default.name)
48
+ end
49
+
50
+ it 'should persist the value' do
51
+ @resource.save.should be(true)
52
+ @resource = @resource.model.get!(*@resource.key)
53
+ @resource.with_default.should == subject
54
+ end
55
+ end
56
+
57
+ describe 'with a default value responding to #call' do
58
+ subject { @subject_with_default_callable.default_for(@resource) }
59
+
60
+ it 'should match the default value' do
61
+ if @default_value.kind_of?(DataMapper::Resource)
62
+ subject.key.should == @default_value_callable.key
63
+ else
64
+ should == @default_value_callable
65
+ end
66
+ end
67
+
68
+ it 'should be used as a default for the subject accessor' do
69
+ should == @resource.__send__(@subject_with_default_callable.name)
70
+ end
71
+
72
+ it 'should persist the value' do
73
+ @resource.save.should be(true)
74
+ @resource = @resource.model.get!(*@resource.key)
75
+ @resource.with_default_callable.should == subject
76
+ end
77
+ end
78
+ end
79
+ end
data/spec/spec.opts ADDED
@@ -0,0 +1,5 @@
1
+ --colour
2
+ --loadby random
3
+ --require ./spec/lib/rspec_immediate_feedback_formatter.rb
4
+ --format Spec::Runner::Formatter::ImmediateFeedbackFormatter
5
+ --backtrace
@@ -0,0 +1,38 @@
1
+ require 'pathname'
2
+ require 'rubygems'
3
+ require 'backports'
4
+ require 'spec'
5
+ require 'dm-core/spec/setup'
6
+
7
+ ENV['ADAPTER'] ||= 'in_memory'
8
+
9
+ SPEC_ROOT = Pathname(__FILE__).dirname.expand_path
10
+ LIB_ROOT = SPEC_ROOT.parent + 'lib'
11
+
12
+ Pathname.glob((LIB_ROOT + 'dm-core/spec/**/*.rb' ).to_s).each { |file| require file }
13
+ Pathname.glob((SPEC_ROOT + '{lib,support,*/shared}/**/*.rb').to_s).each { |file| require file }
14
+
15
+ Spec::Runner.configure do |config|
16
+
17
+ config.extend( DataMapper::Spec::Adapters::Helpers)
18
+ config.include(DataMapper::Spec::PendingHelpers)
19
+ config.include(DataMapper::Spec::Helpers)
20
+
21
+ config.after :all do
22
+ DataMapper::Spec.cleanup_models
23
+ end
24
+
25
+ config.after :all do
26
+ # global ivar cleanup
27
+ DataMapper::Spec.remove_ivars(self, instance_variables.reject { |ivar| ivar[0, 2] == '@_' })
28
+ end
29
+
30
+ config.after :all do
31
+ # WTF: rspec holds a reference to the last match for some reason.
32
+ # When the object ivars are explicitly removed, this causes weird
33
+ # problems when rspec uses it (!). Why rspec does this I have no
34
+ # idea because I cannot determine the intention from the code.
35
+ DataMapper::Spec.remove_ivars(Spec::Matchers.last_matcher, %w[ @expected ])
36
+ end
37
+
38
+ end
@@ -0,0 +1,10 @@
1
+ class Hash
2
+ def except(*keys)
3
+ dup.except!(*keys)
4
+ end
5
+
6
+ def except!(*keys)
7
+ keys.each { |key| delete(key) }
8
+ self
9
+ end
10
+ end
@@ -0,0 +1,46 @@
1
+ class Class
2
+ def class_inheritable_reader(*ivars)
3
+ instance_reader = ivars.pop[:reader] if ivars.last.is_a?(Hash)
4
+
5
+ ivars.each do |ivar|
6
+ self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
7
+ def self.#{ivar}
8
+ return @#{ivar} if defined?(@#{ivar})
9
+ return nil if self.object_id == #{self.object_id}
10
+ ivar = superclass.#{ivar}
11
+ return nil if ivar.nil?
12
+ @#{ivar} = DataMapper::Ext.try_dup(ivar)
13
+ end
14
+ RUBY
15
+
16
+ unless instance_reader == false
17
+ self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
18
+ def #{ivar}
19
+ self.class.#{ivar}
20
+ end
21
+ RUBY
22
+ end
23
+ end
24
+ end
25
+
26
+ def class_inheritable_writer(*ivars)
27
+ instance_writer = ivars.pop[:instance_writer] if ivars.last.is_a?(Hash)
28
+ ivars.each do |ivar|
29
+ self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
30
+ def self.#{ivar}=(obj)
31
+ @#{ivar} = obj
32
+ end
33
+ RUBY
34
+ unless instance_writer == false
35
+ self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
36
+ def #{ivar}=(obj) self.class.#{ivar} = obj end
37
+ RUBY
38
+ end
39
+ end
40
+ end
41
+
42
+ def class_inheritable_accessor(*syms)
43
+ class_inheritable_reader(*syms)
44
+ class_inheritable_writer(*syms)
45
+ end
46
+ end
@@ -0,0 +1,17 @@
1
+ module DataMapper
2
+ class Property
3
+ class HugeInteger < DataMapper::Property::String
4
+ def load(value)
5
+ value.to_i unless value.nil?
6
+ end
7
+
8
+ def dump(value)
9
+ value.to_s unless value.nil?
10
+ end
11
+
12
+ def typecast(value)
13
+ load(value)
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+ require 'dm-core/support/ext/array'
3
+ require 'dm-core/support/mash'
4
+
5
+ describe DataMapper::Ext::Array do
6
+ before :all do
7
+ @array = [ [ :a, [ 1 ] ], [ :b, [ 2 ] ], [ :c, [ 3 ] ] ].freeze
8
+ end
9
+
10
+ describe '.to_mash' do
11
+ before :all do
12
+ @return = DataMapper::Ext::Array.to_mash(@array)
13
+ end
14
+
15
+ it 'should return a Mash' do
16
+ @return.should be_kind_of(DataMapper::Mash)
17
+ end
18
+
19
+ it 'should return expected value' do
20
+ @return.should == { 'a' => [ 1 ], 'b' => [ 2 ], 'c' => [ 3 ] }
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,73 @@
1
+ require 'spec_helper'
2
+ require 'dm-core/support/ext/blank'
3
+
4
+ describe 'DataMapper::Ext.blank?', Object do
5
+ it 'should be blank if it is nil' do
6
+ object = Object.new
7
+ class << object
8
+ def nil?; true end
9
+ end
10
+ DataMapper::Ext.blank?(object).should == true
11
+ end
12
+
13
+ it 'should be blank if it is empty' do
14
+ DataMapper::Ext.blank?({}).should == true
15
+ DataMapper::Ext.blank?([]).should == true
16
+ end
17
+
18
+ it 'should not be blank if not nil or empty' do
19
+ DataMapper::Ext.blank?(Object.new).should == false
20
+ DataMapper::Ext.blank?([nil]).should == false
21
+ DataMapper::Ext.blank?({ nil => 0 }).should == false
22
+ end
23
+ end
24
+
25
+ describe 'DataMapper::Ext.blank?', Numeric do
26
+ it 'should never be blank' do
27
+ DataMapper::Ext.blank?(1).should == false
28
+ end
29
+ end
30
+
31
+ describe 'DataMapper::Ext.blank?', NilClass do
32
+ it 'should always be blank' do
33
+ DataMapper::Ext.blank?(nil).should == true
34
+ end
35
+ end
36
+
37
+ describe 'DataMapper::Ext.blank?', TrueClass do
38
+ it 'should never be blank' do
39
+ DataMapper::Ext.blank?(true).should == false
40
+ end
41
+ end
42
+
43
+ describe 'DataMapper::Ext.blank?', FalseClass do
44
+ it 'should always be blank' do
45
+ DataMapper::Ext.blank?(false).should == true
46
+ end
47
+ end
48
+
49
+ describe 'DataMapper::Ext.blank?', String do
50
+ it 'should be blank if empty' do
51
+ DataMapper::Ext.blank?('').should == true
52
+ end
53
+
54
+ it 'should be blank if it only contains whitespace' do
55
+ DataMapper::Ext.blank?(' ').should == true
56
+ DataMapper::Ext.blank?(" \r \n \t ").should == true
57
+ end
58
+
59
+ it 'should not be blank if it contains non-whitespace' do
60
+ DataMapper::Ext.blank?(' a ').should == false
61
+ end
62
+ end
63
+
64
+ describe 'DataMapper::Ext.blank?', 'object with #blank?' do
65
+ subject { DataMapper::Ext.blank?(object) }
66
+
67
+ let(:return_value) { mock('Return Value') }
68
+ let(:object) { mock('Object', :blank? => return_value) }
69
+
70
+ it 'returns the object#blank? result if supported' do
71
+ should equal(return_value)
72
+ end
73
+ end
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+ require 'dm-core/support/ordered_set'
3
+ require 'unit/data_mapper/ordered_set/shared/append_spec'
4
+
5
+ describe 'DataMapper::OrderedSet#<<' do
6
+ subject { set << entry2 }
7
+
8
+ let(:set) { DataMapper::OrderedSet.new([ entry1 ]) }
9
+ let(:entry1) { Object.new }
10
+
11
+ before do
12
+ @old_index = set.index(entry1)
13
+ end
14
+
15
+ context 'when appending a not yet included entry' do
16
+ let(:entry2) { Object.new }
17
+
18
+ it_should_behave_like 'DataMapper::OrderedSet#<< when appending a not yet included entry'
19
+ end
20
+
21
+ context 'when updating an already included entry' do
22
+ let(:entry2) { entry1 }
23
+
24
+ it_should_behave_like 'DataMapper::OrderedSet#<< when updating an already included entry'
25
+ end
26
+ end
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+ require 'dm-core/support/ordered_set'
3
+ require 'unit/data_mapper/ordered_set/shared/clear_spec'
4
+
5
+ describe 'DataMapper::OrderedSet#clear' do
6
+ subject { ordered_set.clear }
7
+
8
+ let(:ordered_set) { DataMapper::OrderedSet.new(entries) }
9
+
10
+ let(:entry1) { 1 }
11
+ let(:entry2) { 2 }
12
+
13
+ context 'when no entries are present' do
14
+ let(:entries) { [] }
15
+
16
+ it_should_behave_like 'DataMapper::OrderedSet#clear when no entries are present'
17
+ end
18
+
19
+ context 'when entries are present' do
20
+ let(:entries) { [ entry1, entry2 ] }
21
+
22
+ it_should_behave_like 'DataMapper::OrderedSet#clear when entries are present'
23
+ end
24
+ end
@@ -0,0 +1,28 @@
1
+ require 'spec_helper'
2
+ require 'dm-core/support/ordered_set'
3
+ require 'unit/data_mapper/ordered_set/shared/delete_spec'
4
+
5
+ describe 'DataMapper::OrderedSet#delete' do
6
+ subject { ordered_set }
7
+
8
+ let(:ordered_set) { DataMapper::OrderedSet.new([ entry1, entry2, entry3 ]) }
9
+ let(:entry1) { 1 }
10
+ let(:entry2) { 2 }
11
+ let(:entry3) { 3 }
12
+
13
+ before do
14
+ ordered_set.delete(entry)
15
+ end
16
+
17
+ context 'when deleting an already included entry' do
18
+ let(:entry) { entry1 }
19
+
20
+ it_should_behave_like 'DataMapper::OrderedSet#delete when deleting an already included entry'
21
+ end
22
+
23
+ context 'when deleting a not yet included entry' do
24
+ let(:entry) { 4 }
25
+
26
+ it_should_behave_like 'DataMapper::OrderedSet#delete when deleting a not yet included entry'
27
+ end
28
+ end