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,81 @@
1
+ require 'spec_helper'
2
+
3
+ # run the specs once with a loaded association and once not
4
+ [ false, true ].each do |loaded|
5
+ describe 'One to Many Associations' do
6
+ extend DataMapper::Spec::CollectionHelpers::GroupMethods
7
+
8
+ self.loaded = loaded
9
+
10
+ # define the model prior to supported_by
11
+ before :all do
12
+ module ::Blog
13
+ class Author
14
+ include DataMapper::Resource
15
+
16
+ property :id, Serial
17
+ property :name, String
18
+
19
+ has n, :articles
20
+ end
21
+
22
+ class Article
23
+ include DataMapper::Resource
24
+
25
+ property :id, Serial
26
+ property :title, String, :required => true
27
+ property :content, Text
28
+ property :subtitle, String
29
+ property :attachment, Object
30
+
31
+ belongs_to :author, :required => false
32
+ belongs_to :original, self, :required => false
33
+ has n, :revisions, self, :child_key => [ :original_id ]
34
+ has 1, :previous, self, :child_key => [ :original_id ], :order => [ :id.desc ]
35
+ has n, :publications, :through => Resource
36
+ end
37
+
38
+ class Publication
39
+ include DataMapper::Resource
40
+
41
+ property :id, Serial
42
+ property :name, String
43
+
44
+ has n, :articles, :through => Resource
45
+ end
46
+ end
47
+
48
+ DataMapper.finalize
49
+
50
+ @author_model = Blog::Author
51
+ @article_model = Blog::Article
52
+ @publication_model = Blog::Publication
53
+ end
54
+
55
+ supported_by :all do
56
+ before :all do
57
+ @author = @author_model.create(:name => 'Dan Kubb')
58
+
59
+ @original = @author.articles.create(:title => 'Original Article')
60
+ @article = @author.articles.create(:title => 'Sample Article', :content => 'Sample', :original => @original)
61
+ @other = @author.articles.create(:title => 'Other Article', :content => 'Other')
62
+
63
+ # load the targets without references to a single source
64
+ load_collection = lambda do |query|
65
+ @author_model.get(*@author.key).articles(query)
66
+ end
67
+
68
+ @articles = load_collection.call(:title => 'Sample Article')
69
+ @other_articles = load_collection.call(:title => 'Other Article')
70
+
71
+ @articles.entries if loaded
72
+ end
73
+
74
+ it_should_behave_like 'A public Collection'
75
+ it_should_behave_like 'A public Association Collection'
76
+ it_should_behave_like 'A Collection supporting Strategic Eager Loading'
77
+ it_should_behave_like 'Finder Interface'
78
+ it_should_behave_like 'Collection Finder Interface'
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,176 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'One to One Associations' do
4
+ before :all do
5
+ module ::Blog
6
+ class User
7
+ include DataMapper::Resource
8
+
9
+ property :name, String, :key => true
10
+ property :age, Integer
11
+ property :summary, Text
12
+ property :description, Text
13
+ property :admin, Boolean, :accessor => :private
14
+
15
+ belongs_to :parent, self, :required => false
16
+ has n, :children, self, :inverse => :parent
17
+
18
+ belongs_to :referrer, self, :required => false
19
+ belongs_to :comment
20
+
21
+ # TODO: remove this after Relationship#inverse can dynamically
22
+ # create an inverse relationship when no perfect match can be found
23
+ has n, :referree, self, :child_key => [ :referrer_name ]
24
+ end
25
+
26
+ class Author < User; end
27
+
28
+ class Comment
29
+ include DataMapper::Resource
30
+
31
+ property :id, Serial
32
+ property :body, Text
33
+
34
+ has 1, :user
35
+ end
36
+
37
+ class Article
38
+ include DataMapper::Resource
39
+
40
+ property :id, Serial
41
+ property :body, Text
42
+
43
+ has 1, :paragraph
44
+ end
45
+
46
+ class Paragraph
47
+ include DataMapper::Resource
48
+
49
+ property :id, Serial
50
+ property :text, String
51
+
52
+ belongs_to :article
53
+ end
54
+ end
55
+
56
+ class ::Default
57
+ include DataMapper::Resource
58
+
59
+ property :name, String, :key => true, :default => 'a default value'
60
+ end
61
+ DataMapper.finalize
62
+
63
+ @user_model = Blog::User
64
+ @author_model = Blog::Author
65
+ @comment_model = Blog::Comment
66
+ @article_model = Blog::Article
67
+ @paragraph_model = Blog::Paragraph
68
+ end
69
+
70
+ supported_by :all do
71
+ before :all do
72
+ comment = @comment_model.create(:body => 'Cool spec')
73
+ user = @user_model.create(:name => 'dbussink', :age => 25, :description => 'Test', :comment => comment)
74
+
75
+ @comment = @comment_model.get(*comment.key)
76
+ @user = @comment.user
77
+ end
78
+
79
+ it_should_behave_like 'A public Resource'
80
+ it_should_behave_like 'A Resource supporting Strategic Eager Loading'
81
+ end
82
+ end
83
+
84
+ describe 'One to One Through Associations' do
85
+ before :all do
86
+ module ::Blog
87
+ class Referral
88
+ include DataMapper::Resource
89
+
90
+ property :referrer_name, String, :key => true
91
+ property :referree_name, String, :key => true
92
+
93
+ belongs_to :referrer, 'User', :child_key => [ :referrer_name ]
94
+ belongs_to :referree, 'User', :child_key => [ :referree_name ]
95
+ end
96
+
97
+ class User
98
+ include DataMapper::Resource
99
+
100
+ property :name, String, :key => true
101
+ property :age, Integer
102
+ property :summary, Text
103
+ property :description, Text
104
+ property :admin, Boolean, :accessor => :private
105
+
106
+ belongs_to :parent, self, :required => false
107
+ has n, :children, self, :inverse => :parent
108
+
109
+ has 1, :referral_from, Referral, :child_key => [ :referree_name ]
110
+ has 1, :referral_to, Referral, :child_key => [ :referrer_name ]
111
+
112
+ has 1, :referrer, self, :through => :referral_from
113
+ has 1, :referree, self, :through => :referral_to
114
+ has 1, :comment, :through => Resource
115
+ end
116
+
117
+ class Author < User; end
118
+
119
+ class Comment
120
+ include DataMapper::Resource
121
+
122
+ property :id, Serial
123
+ property :body, Text
124
+
125
+ has 1, :user, :through => Resource
126
+ end
127
+
128
+ class Article
129
+ include DataMapper::Resource
130
+
131
+ property :id, Serial
132
+ property :body, Text
133
+
134
+ has 1, :paragraph, :through => Resource
135
+ end
136
+
137
+ class Paragraph
138
+ include DataMapper::Resource
139
+
140
+ property :id, Serial
141
+ property :text, String
142
+
143
+ has 1, :article, :through => Resource
144
+ end
145
+ end
146
+
147
+ class ::Default
148
+ include DataMapper::Resource
149
+
150
+ property :name, String, :key => true, :default => 'a default value'
151
+ end
152
+ DataMapper.finalize
153
+
154
+ @referral_model = Blog::Referral
155
+ @user_model = Blog::User
156
+ @author_model = Blog::Author
157
+ @comment_model = Blog::Comment
158
+ @article_model = Blog::Article
159
+ @paragraph_model = Blog::Paragraph
160
+ end
161
+
162
+ supported_by :all do
163
+ before :all do
164
+ comment = @comment_model.create(:body => 'Cool spec')
165
+ user = @user_model.create(:name => 'dbussink', :age => 25, :description => 'Test', :comment => comment)
166
+
167
+ @comment = @comment_model.get(*comment.key)
168
+ @user = @comment.user
169
+ end
170
+
171
+ it_should_behave_like 'A public Resource'
172
+
173
+ # TODO: make this pass
174
+ #it_should_behave_like 'A Resource supporting Strategic Eager Loading'
175
+ end
176
+ end
@@ -0,0 +1,46 @@
1
+ require 'spec_helper'
2
+
3
+ # TODO: combine this into one_to_one_spec.rb
4
+
5
+ describe 'One to One Associations when foreign key is part of a composite key and contains a boolean, with an integer and a boolean making up the composite key' do
6
+ before :all do
7
+ class ::ParentModel
8
+ include DataMapper::Resource
9
+
10
+ property :integer_key, Integer, :key => true
11
+ property :boolean_key, Boolean, :key => true
12
+
13
+ has 1, :child_model, :child_key => [ :integer_key, :boolean_key ]
14
+ end
15
+
16
+ class ::ChildModel
17
+ include DataMapper::Resource
18
+
19
+ property :integer_key, Integer, :key => true
20
+ property :other_integer_key, Integer, :key => true
21
+ property :boolean_key, Boolean, :key => true
22
+
23
+ belongs_to :parent_model, :child_key => [ :integer_key, :boolean_key ]
24
+ end
25
+ DataMapper.finalize
26
+ end
27
+
28
+ supported_by :all do
29
+ before :all do
30
+ @parent = ParentModel.create(:integer_key => 1, :boolean_key => false)
31
+ @child = ChildModel.create(:integer_key => 1, :other_integer_key => 1, :boolean_key => false)
32
+ end
33
+
34
+ it 'should be able to access the child' do
35
+ @parent.child_model.should == @child
36
+ end
37
+
38
+ it 'should be able to access the parent' do
39
+ @child.parent_model.should == @parent
40
+ end
41
+
42
+ it 'should be able to access the parent_key' do
43
+ @child.parent_model.key.should_not be_nil
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,69 @@
1
+ require '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, :required => true
17
+ property :content, Text
18
+ property :subtitle, String
19
+ property :author, String, :required => true
20
+ property :attachment, Object
21
+
22
+ belongs_to :original, self, :required => false
23
+ has n, :revisions, self, :child_key => [ :original_id ]
24
+ has 1, :previous, self, :child_key => [ :original_id ], :order => [ :id.desc ]
25
+ has n, :publications, :through => Resource
26
+ end
27
+
28
+ class Publication
29
+ include DataMapper::Resource
30
+
31
+ property :id, Serial
32
+ property :name, String
33
+
34
+ has n, :articles, :through => Resource
35
+ end
36
+ end
37
+
38
+ DataMapper.finalize
39
+
40
+ @article_model = Blog::Article
41
+ @publication_model = Blog::Publication
42
+ end
43
+
44
+ supported_by :all do
45
+ before :all do
46
+ @author = 'Dan Kubb'
47
+
48
+ @original = @article_model.create(:title => 'Original Article', :author => @author)
49
+ @article = @article_model.create(:title => 'Sample Article', :content => 'Sample', :original => @original, :author => @author)
50
+ @other = @article_model.create(:title => 'Other Article', :content => 'Other', :author => @author)
51
+
52
+ # load the targets without references to a single source
53
+ load_collection = lambda do |query|
54
+ @article_model.all(query)
55
+ end
56
+
57
+ @articles = load_collection.call(:title => 'Sample Article', :author => @author)
58
+ @other_articles = load_collection.call(:title => 'Other Article', :author => @author)
59
+
60
+ @articles.entries if loaded
61
+ end
62
+
63
+ it_should_behave_like 'A public Collection'
64
+ it_should_behave_like 'A Collection supporting Strategic Eager Loading'
65
+ it_should_behave_like 'Finder Interface'
66
+ it_should_behave_like 'Collection Finder Interface'
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,76 @@
1
+ require 'spec_helper'
2
+
3
+ describe DataMapper do
4
+ describe '.finalize' do
5
+ subject { DataMapper.finalize }
6
+
7
+ it 'should not raise with valid models' do
8
+ class ::ValidObject
9
+ include DataMapper::Resource
10
+ property :id, Integer, :key => true
11
+ end
12
+ begin
13
+ method(:subject).should_not raise_error
14
+ ensure
15
+ DataMapper::Model.descendants.delete(ValidObject)
16
+ Object.send(:remove_const, :ValidObject)
17
+ end
18
+ end
19
+
20
+ it "should not raise on valid child model" do
21
+ class ::ValidChild
22
+ include DataMapper::Resource
23
+ belongs_to :valid_object, :key => true
24
+ end
25
+ class ::ValidObject
26
+ include DataMapper::Resource
27
+ property :id, Integer, :key => true
28
+ end
29
+ begin
30
+ method(:subject).should_not raise_error
31
+ ensure
32
+ DataMapper::Model.descendants.delete(ValidChild)
33
+ DataMapper::Model.descendants.delete(ValidObject)
34
+ Object.send(:remove_const, :ValidChild)
35
+ Object.send(:remove_const, :ValidObject)
36
+ end
37
+ end
38
+
39
+ it 'should raise on an anonymous model' do
40
+ model = Class.new do
41
+ include DataMapper::Resource
42
+ property :id, Integer, :key => true
43
+ end
44
+ begin
45
+ method(:subject).should raise_error(DataMapper::IncompleteModelError, "#{model.inspect} must have a name")
46
+ ensure
47
+ DataMapper::Model.descendants.delete(model)
48
+ end
49
+ end
50
+
51
+ it 'should raise on an empty model' do
52
+ class ::EmptyObject
53
+ include DataMapper::Resource
54
+ end
55
+ begin
56
+ method(:subject).should raise_error(DataMapper::IncompleteModelError, 'EmptyObject must have at least one property or many to one relationship to be valid')
57
+ ensure
58
+ DataMapper::Model.descendants.delete(EmptyObject)
59
+ Object.send(:remove_const, :EmptyObject)
60
+ end
61
+ end
62
+
63
+ it 'should raise on a keyless model' do
64
+ class ::KeylessObject
65
+ include DataMapper::Resource
66
+ property :name, String
67
+ end
68
+ begin
69
+ method(:subject).should raise_error(DataMapper::IncompleteModelError, 'KeylessObject must have a key to be valid')
70
+ ensure
71
+ DataMapper::Model.descendants.delete(KeylessObject)
72
+ Object.send(:remove_const, :KeylessObject)
73
+ end
74
+ end
75
+ end
76
+ end