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,471 @@
1
+ require 'spec_helper'
2
+
3
+ # class methods
4
+ describe DataMapper::Query::Path do
5
+ before :all do
6
+ class ::Author
7
+ include DataMapper::Resource
8
+
9
+ property :id, Serial
10
+ property :title, String
11
+
12
+ has n, :articles
13
+ end
14
+
15
+ class ::Article
16
+ include DataMapper::Resource
17
+
18
+ property :id, Serial
19
+ property :title, String
20
+
21
+ belongs_to :author
22
+ end
23
+
24
+ @relationship = Author.relationships[:articles]
25
+ @relationships = [ @relationship ]
26
+ @property = Article.properties[:title]
27
+ DataMapper.finalize
28
+ end
29
+
30
+ it { DataMapper::Query::Path.should respond_to(:new) }
31
+
32
+ describe '.new' do
33
+ describe 'when supplied an Array of Relationships' do
34
+ before do
35
+ @path = DataMapper::Query::Path.new(@relationships)
36
+ end
37
+
38
+ it 'should return a Query::Path' do
39
+ @path.should be_kind_of(DataMapper::Query::Path)
40
+ end
41
+
42
+ it 'should set Query::Path#relationships' do
43
+ @path.relationships.should eql(@relationships)
44
+ end
45
+
46
+ it 'should copy the relationships' do
47
+ @path.relationships.should_not equal(@relationships)
48
+ end
49
+ end
50
+
51
+ describe 'when supplied an Array of Relationships and a Property Symbol name' do
52
+ before do
53
+ @path = DataMapper::Query::Path.new(@relationships, @property.name)
54
+ end
55
+
56
+ it 'should return a Query::Path' do
57
+ @path.should be_kind_of(DataMapper::Query::Path)
58
+ end
59
+
60
+ it 'should set Query::Path#relationships' do
61
+ @path.relationships.should eql(@relationships)
62
+ end
63
+
64
+ it 'should copy the relationships' do
65
+ @path.relationships.should_not equal(@relationships)
66
+ end
67
+
68
+ it 'should set Query::Path#property' do
69
+ @path.property.should equal(@property)
70
+ end
71
+ end
72
+
73
+ describe 'when supplied an unknown property' do
74
+ it 'should raise an error' do
75
+ lambda { DataMapper::Query::Path.new(@relationships, :unknown) }.should raise_error(ArgumentError, "Unknown property 'unknown' in Article")
76
+ end
77
+ end
78
+ end
79
+ end
80
+
81
+ # instance methods
82
+ describe DataMapper::Query::Path do
83
+ before :all do
84
+ class ::Author
85
+ include DataMapper::Resource
86
+
87
+ property :id, Serial
88
+ property :title, String
89
+
90
+ has n, :articles
91
+ end
92
+
93
+ class ::Article
94
+ include DataMapper::Resource
95
+
96
+ property :id, Serial
97
+ property :title, String
98
+
99
+ belongs_to :author
100
+ end
101
+
102
+ @relationship = Author.relationships[:articles]
103
+ @relationships = [ @relationship ]
104
+ @property = Article.properties[:title]
105
+
106
+ @path = DataMapper::Query::Path.new(@relationships)
107
+ DataMapper.finalize
108
+ end
109
+
110
+ it { @path.should respond_to(:==) }
111
+
112
+ describe '#==' do
113
+ describe 'when other Query::Path is the same' do
114
+ before do
115
+ @other = @path
116
+
117
+ @return = @path == @other
118
+ end
119
+
120
+ it 'should return true' do
121
+ @return.should be(true)
122
+ end
123
+ end
124
+
125
+ describe 'when other Query::Path does not respond to #relationships' do
126
+ before do
127
+ class << @other = @path.dup
128
+ undef_method :relationships
129
+ end
130
+
131
+ @return = @path == @other
132
+ end
133
+
134
+ it 'should return false' do
135
+ @return.should be(false)
136
+ end
137
+ end
138
+
139
+ describe 'when other Query::Path does not respond to #property' do
140
+ before do
141
+ class << @other = @path.dup
142
+ undef_method :property
143
+ end
144
+
145
+ @return = @path == @other
146
+ end
147
+
148
+ it 'should return false' do
149
+ @return.should be(false)
150
+ end
151
+ end
152
+
153
+ describe 'when other Query::Path has different relationships' do
154
+ before do
155
+ @other = DataMapper::Query::Path.new([ Article.relationships[:author] ])
156
+
157
+ @return = @path == @other
158
+ end
159
+
160
+ it 'should return false' do
161
+ @return.should be(false)
162
+ end
163
+ end
164
+
165
+ describe 'when other Query::Path has different properties' do
166
+ before do
167
+ @other = DataMapper::Query::Path.new(@path.relationships, :title)
168
+
169
+ @return = @path == @other
170
+ end
171
+
172
+ it 'should return false' do
173
+ @return.should be(false)
174
+ end
175
+ end
176
+
177
+ describe 'when other Query::Path has the same relationship and property' do
178
+ before do
179
+ @other = DataMapper::Query::Path.new(@path.relationships, @path.property)
180
+
181
+ @return = @path == @other
182
+ end
183
+
184
+ it 'should return true' do
185
+ @return.should be(true)
186
+ end
187
+ end
188
+ end
189
+
190
+ it { @path.should respond_to(:eql?) }
191
+
192
+ describe '#eql?' do
193
+ describe 'when other Query::Path is the same' do
194
+ before do
195
+ @other = @path
196
+
197
+ @return = @path.eql?(@other)
198
+ end
199
+
200
+ it 'should return true' do
201
+ @return.should be(true)
202
+ end
203
+ end
204
+
205
+ describe 'when other Object is not an instance of Query::Path' do
206
+ before do
207
+ class MyQueryPath < DataMapper::Query::Path; end
208
+
209
+ @other = MyQueryPath.new(@path.relationships, @path.property)
210
+
211
+ @return = @path.eql?(@other)
212
+ end
213
+
214
+ it 'should return false' do
215
+ @return.should be(false)
216
+ end
217
+ end
218
+
219
+ describe 'when other Query::Path has different relationships' do
220
+ before do
221
+ @other = DataMapper::Query::Path.new([ Article.relationships[:author] ])
222
+
223
+ @return = @path.eql?(@other)
224
+ end
225
+
226
+ it 'should return false' do
227
+ @return.should be(false)
228
+ end
229
+ end
230
+
231
+ describe 'when other Query::Path has different properties' do
232
+ before do
233
+ @other = DataMapper::Query::Path.new(@path.relationships, :title)
234
+
235
+ @return = @path.eql?(@other)
236
+ end
237
+
238
+ it 'should return false' do
239
+ @return.should be(false)
240
+ end
241
+ end
242
+
243
+ describe 'when other Query::Path has the same relationship and property' do
244
+ before do
245
+ @other = DataMapper::Query::Path.new(@path.relationships, @path.property)
246
+
247
+ @return = @path.eql?(@other)
248
+ end
249
+
250
+ it 'should return true' do
251
+ @return.should be(true)
252
+ end
253
+ end
254
+ end
255
+
256
+ it { @path.should respond_to(:model) }
257
+
258
+ describe '#model' do
259
+ it 'should return a Model' do
260
+ @path.model.should be_kind_of(DataMapper::Model)
261
+ end
262
+
263
+ it 'should return expected value' do
264
+ @path.model.should eql(Article)
265
+ end
266
+ end
267
+
268
+ it { @path.should respond_to(:property) }
269
+
270
+ describe '#property' do
271
+ describe 'when no property is defined' do
272
+ it 'should return nil' do
273
+ @path.property.should be_nil
274
+ end
275
+ end
276
+
277
+ describe 'when a property is defined' do
278
+ before do
279
+ @path = @path.class.new(@path.relationships, @property.name)
280
+ end
281
+
282
+ it 'should return a Property' do
283
+ @path.property.should be_kind_of(DataMapper::Property::Object)
284
+ end
285
+
286
+ it 'should return expected value' do
287
+ @path.property.should eql(@property)
288
+ end
289
+ end
290
+ end
291
+
292
+ it { @path.should respond_to(:relationships) }
293
+
294
+ describe '#relationships' do
295
+ it 'should return an Array' do
296
+ @path.relationships.should be_kind_of(Array)
297
+ end
298
+
299
+ it 'should return expected value' do
300
+ @path.relationships.should eql(@relationships)
301
+ end
302
+ end
303
+
304
+ it { @path.should respond_to(:respond_to?) }
305
+
306
+ describe '#respond_to?' do
307
+ describe 'when supplied a method name provided by the parent class' do
308
+ before do
309
+ @return = @path.respond_to?(:class)
310
+ end
311
+
312
+ it 'should return true' do
313
+ @return.should be(true)
314
+ end
315
+ end
316
+
317
+ describe 'when supplied a method name provided by the property' do
318
+ before do
319
+ @path = @path.class.new(@path.relationships, @property.name)
320
+
321
+ @return = @path.respond_to?(:instance_variable_name)
322
+ end
323
+
324
+ it 'should return true' do
325
+ @return.should be(true)
326
+ end
327
+ end
328
+
329
+ describe 'when supplied a method name referring to a relationship' do
330
+ before do
331
+ @return = @path.respond_to?(:author)
332
+ end
333
+
334
+ it 'should return true' do
335
+ @return.should be(true)
336
+ end
337
+ end
338
+
339
+ describe 'when supplied a method name referring to a property' do
340
+ before do
341
+ @return = @path.respond_to?(:title)
342
+ end
343
+
344
+ it 'should return true' do
345
+ @return.should be(true)
346
+ end
347
+ end
348
+
349
+ describe 'when supplied an unknown method name' do
350
+ before do
351
+ @return = @path.respond_to?(:unknown)
352
+ end
353
+
354
+ it 'should return false' do
355
+ @return.should be(false)
356
+ end
357
+ end
358
+ end
359
+
360
+ it { @path.should respond_to(:repository_name) }
361
+
362
+ describe '#repository_name' do
363
+ it 'should return a Symbol' do
364
+ @path.repository_name.should be_kind_of(Symbol)
365
+ end
366
+
367
+ it 'should return expected value' do
368
+ @path.repository_name.should eql(:default)
369
+ end
370
+ end
371
+
372
+ describe '#method_missing' do
373
+ describe 'when supplied a method name provided by the parent class' do
374
+ before do
375
+ @return = @path.class
376
+ end
377
+
378
+ it 'should return the expected value' do
379
+ @return.should eql(DataMapper::Query::Path)
380
+ end
381
+ end
382
+
383
+ describe 'when supplied a method name provided by the property' do
384
+ before do
385
+ @path = @path.class.new(@path.relationships, @property.name)
386
+
387
+ @return = @path.instance_variable_name
388
+ end
389
+
390
+ it 'should return the expected value' do
391
+ @return.should eql('@title')
392
+ end
393
+ end
394
+
395
+ describe 'when supplied a method name referring to a relationship' do
396
+ before do
397
+ @return = @path.author
398
+ end
399
+
400
+ it 'should return a Query::Path' do
401
+ @return.should be_kind_of(DataMapper::Query::Path)
402
+ end
403
+
404
+ it 'should return the expected value' do
405
+ @return.should eql(DataMapper::Query::Path.new([ @relationship, Article.relationships[:author] ]))
406
+ end
407
+ end
408
+
409
+ describe 'when supplied a method name referring to a property' do
410
+ before do
411
+ @return = @path.title
412
+ end
413
+
414
+ it 'should return a Query::Path' do
415
+ @return.should be_kind_of(DataMapper::Query::Path)
416
+ end
417
+
418
+ it 'should return the expected value' do
419
+ @return.should eql(DataMapper::Query::Path.new(@relationships, :title))
420
+ end
421
+ end
422
+
423
+ describe 'when supplied an unknown method name' do
424
+ it 'should raise an error' do
425
+ lambda { @path.unknown }.should raise_error(NoMethodError, "undefined property or relationship 'unknown' on Article")
426
+ end
427
+ end
428
+ end
429
+
430
+ describe 'ordering' do
431
+ before do
432
+ @path = Article.author.title
433
+ end
434
+
435
+ describe '#desc' do
436
+ before do
437
+ @return = @path.desc
438
+ end
439
+
440
+ it 'returns a :desc operator from the path' do
441
+ @return.should == DataMapper::Query::Operator.new(@path.property, :desc)
442
+ end
443
+ end
444
+
445
+ describe '#asc' do
446
+ before do
447
+ @return = @path.asc
448
+ end
449
+
450
+ it 'returns a :desc operator from the path' do
451
+ @return.should == DataMapper::Query::Operator.new(@path.property, :asc)
452
+ end
453
+ end
454
+ end
455
+
456
+ ((DataMapper::Query::Conditions::Comparison.slugs | [ :not ]) - [ :eql, :in ]).each do |slug|
457
+ describe "##{slug}" do
458
+ before do
459
+ @return = @path.send(slug)
460
+ end
461
+
462
+ it 'should return a Query::Operator' do
463
+ @return.should be_kind_of(DataMapper::Query::Operator)
464
+ end
465
+
466
+ it 'should return expected value' do
467
+ @return.should eql(DataMapper::Query::Operator.new(@path, slug))
468
+ end
469
+ end
470
+ end
471
+ end