sbf-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 (259) hide show
  1. checksums.yaml +7 -0
  2. data/.autotest +29 -0
  3. data/.document +5 -0
  4. data/.gitignore +44 -0
  5. data/.rspec +1 -0
  6. data/.rubocop.yml +468 -0
  7. data/.travis.yml +57 -0
  8. data/.yardopts +1 -0
  9. data/Gemfile +70 -0
  10. data/LICENSE +20 -0
  11. data/README.md +269 -0
  12. data/Rakefile +4 -0
  13. data/dm-core.gemspec +21 -0
  14. data/lib/dm-core/adapters/abstract_adapter.rb +233 -0
  15. data/lib/dm-core/adapters/in_memory_adapter.rb +110 -0
  16. data/lib/dm-core/adapters.rb +249 -0
  17. data/lib/dm-core/associations/many_to_many.rb +477 -0
  18. data/lib/dm-core/associations/many_to_one.rb +282 -0
  19. data/lib/dm-core/associations/one_to_many.rb +332 -0
  20. data/lib/dm-core/associations/one_to_one.rb +84 -0
  21. data/lib/dm-core/associations/relationship.rb +650 -0
  22. data/lib/dm-core/backwards.rb +11 -0
  23. data/lib/dm-core/collection.rb +1486 -0
  24. data/lib/dm-core/core_ext/kernel.rb +21 -0
  25. data/lib/dm-core/core_ext/pathname.rb +4 -0
  26. data/lib/dm-core/core_ext/symbol.rb +10 -0
  27. data/lib/dm-core/identity_map.rb +6 -0
  28. data/lib/dm-core/model/hook.rb +99 -0
  29. data/lib/dm-core/model/is.rb +30 -0
  30. data/lib/dm-core/model/property.rb +244 -0
  31. data/lib/dm-core/model/relationship.rb +366 -0
  32. data/lib/dm-core/model/scope.rb +87 -0
  33. data/lib/dm-core/model.rb +876 -0
  34. data/lib/dm-core/property/binary.rb +19 -0
  35. data/lib/dm-core/property/boolean.rb +35 -0
  36. data/lib/dm-core/property/class.rb +23 -0
  37. data/lib/dm-core/property/date.rb +45 -0
  38. data/lib/dm-core/property/date_time.rb +44 -0
  39. data/lib/dm-core/property/decimal.rb +47 -0
  40. data/lib/dm-core/property/discriminator.rb +40 -0
  41. data/lib/dm-core/property/float.rb +27 -0
  42. data/lib/dm-core/property/integer.rb +32 -0
  43. data/lib/dm-core/property/invalid_value_error.rb +17 -0
  44. data/lib/dm-core/property/lookup.rb +26 -0
  45. data/lib/dm-core/property/numeric.rb +35 -0
  46. data/lib/dm-core/property/object.rb +33 -0
  47. data/lib/dm-core/property/serial.rb +13 -0
  48. data/lib/dm-core/property/string.rb +47 -0
  49. data/lib/dm-core/property/text.rb +12 -0
  50. data/lib/dm-core/property/time.rb +46 -0
  51. data/lib/dm-core/property/typecast/numeric.rb +32 -0
  52. data/lib/dm-core/property/typecast/time.rb +33 -0
  53. data/lib/dm-core/property.rb +856 -0
  54. data/lib/dm-core/property_set.rb +177 -0
  55. data/lib/dm-core/query/conditions/comparison.rb +886 -0
  56. data/lib/dm-core/query/conditions/operation.rb +710 -0
  57. data/lib/dm-core/query/direction.rb +33 -0
  58. data/lib/dm-core/query/operator.rb +34 -0
  59. data/lib/dm-core/query/path.rb +113 -0
  60. data/lib/dm-core/query/sort.rb +38 -0
  61. data/lib/dm-core/query.rb +1352 -0
  62. data/lib/dm-core/relationship_set.rb +69 -0
  63. data/lib/dm-core/repository.rb +226 -0
  64. data/lib/dm-core/resource/persistence_state/clean.rb +36 -0
  65. data/lib/dm-core/resource/persistence_state/deleted.rb +26 -0
  66. data/lib/dm-core/resource/persistence_state/dirty.rb +91 -0
  67. data/lib/dm-core/resource/persistence_state/immutable.rb +32 -0
  68. data/lib/dm-core/resource/persistence_state/persisted.rb +25 -0
  69. data/lib/dm-core/resource/persistence_state/transient.rb +87 -0
  70. data/lib/dm-core/resource/persistence_state.rb +70 -0
  71. data/lib/dm-core/resource.rb +1220 -0
  72. data/lib/dm-core/spec/lib/adapter_helpers.rb +63 -0
  73. data/lib/dm-core/spec/lib/collection_helpers.rb +21 -0
  74. data/lib/dm-core/spec/lib/counter_adapter.rb +38 -0
  75. data/lib/dm-core/spec/lib/pending_helpers.rb +50 -0
  76. data/lib/dm-core/spec/lib/spec_helper.rb +74 -0
  77. data/lib/dm-core/spec/setup.rb +164 -0
  78. data/lib/dm-core/spec/shared/adapter_spec.rb +366 -0
  79. data/lib/dm-core/spec/shared/public/property_spec.rb +229 -0
  80. data/lib/dm-core/spec/shared/resource_spec.rb +1221 -0
  81. data/lib/dm-core/spec/shared/sel_spec.rb +111 -0
  82. data/lib/dm-core/spec/shared/semipublic/property_spec.rb +184 -0
  83. data/lib/dm-core/spec/shared/semipublic/query/conditions/abstract_comparison_spec.rb +261 -0
  84. data/lib/dm-core/support/assertions.rb +8 -0
  85. data/lib/dm-core/support/chainable.rb +18 -0
  86. data/lib/dm-core/support/deprecate.rb +12 -0
  87. data/lib/dm-core/support/descendant_set.rb +89 -0
  88. data/lib/dm-core/support/equalizer.rb +48 -0
  89. data/lib/dm-core/support/ext/array.rb +22 -0
  90. data/lib/dm-core/support/ext/blank.rb +25 -0
  91. data/lib/dm-core/support/ext/hash.rb +67 -0
  92. data/lib/dm-core/support/ext/module.rb +47 -0
  93. data/lib/dm-core/support/ext/object.rb +57 -0
  94. data/lib/dm-core/support/ext/string.rb +24 -0
  95. data/lib/dm-core/support/ext/try_dup.rb +12 -0
  96. data/lib/dm-core/support/hook.rb +388 -0
  97. data/lib/dm-core/support/inflections.rb +60 -0
  98. data/lib/dm-core/support/inflector/inflections.rb +211 -0
  99. data/lib/dm-core/support/inflector/methods.rb +151 -0
  100. data/lib/dm-core/support/lazy_array.rb +451 -0
  101. data/lib/dm-core/support/local_object_space.rb +13 -0
  102. data/lib/dm-core/support/logger.rb +201 -0
  103. data/lib/dm-core/support/mash.rb +176 -0
  104. data/lib/dm-core/support/naming_conventions.rb +109 -0
  105. data/lib/dm-core/support/ordered_set.rb +381 -0
  106. data/lib/dm-core/support/subject.rb +33 -0
  107. data/lib/dm-core/support/subject_set.rb +251 -0
  108. data/lib/dm-core/version.rb +3 -0
  109. data/lib/dm-core.rb +274 -0
  110. data/script/performance.rb +275 -0
  111. data/script/profile.rb +218 -0
  112. data/spec/lib/rspec_immediate_feedback_formatter.rb +54 -0
  113. data/spec/public/associations/many_to_many/read_multiple_join_spec.rb +69 -0
  114. data/spec/public/associations/many_to_many_spec.rb +197 -0
  115. data/spec/public/associations/many_to_one_spec.rb +83 -0
  116. data/spec/public/associations/many_to_one_with_boolean_cpk_spec.rb +40 -0
  117. data/spec/public/associations/many_to_one_with_custom_fk_spec.rb +49 -0
  118. data/spec/public/associations/one_to_many_spec.rb +81 -0
  119. data/spec/public/associations/one_to_one_spec.rb +176 -0
  120. data/spec/public/associations/one_to_one_with_boolean_cpk_spec.rb +46 -0
  121. data/spec/public/collection_spec.rb +69 -0
  122. data/spec/public/finalize_spec.rb +77 -0
  123. data/spec/public/model/hook_spec.rb +245 -0
  124. data/spec/public/model/property_spec.rb +91 -0
  125. data/spec/public/model/relationship_spec.rb +1040 -0
  126. data/spec/public/model_spec.rb +456 -0
  127. data/spec/public/property/binary_spec.rb +43 -0
  128. data/spec/public/property/boolean_spec.rb +21 -0
  129. data/spec/public/property/class_spec.rb +27 -0
  130. data/spec/public/property/date_spec.rb +21 -0
  131. data/spec/public/property/date_time_spec.rb +21 -0
  132. data/spec/public/property/decimal_spec.rb +23 -0
  133. data/spec/public/property/discriminator_spec.rb +134 -0
  134. data/spec/public/property/float_spec.rb +22 -0
  135. data/spec/public/property/integer_spec.rb +22 -0
  136. data/spec/public/property/object_spec.rb +117 -0
  137. data/spec/public/property/serial_spec.rb +22 -0
  138. data/spec/public/property/string_spec.rb +21 -0
  139. data/spec/public/property/text_spec.rb +62 -0
  140. data/spec/public/property/time_spec.rb +21 -0
  141. data/spec/public/property_spec.rb +333 -0
  142. data/spec/public/resource/state_spec.rb +72 -0
  143. data/spec/public/resource_spec.rb +289 -0
  144. data/spec/public/sel_spec.rb +53 -0
  145. data/spec/public/setup_spec.rb +145 -0
  146. data/spec/public/shared/association_collection_shared_spec.rb +309 -0
  147. data/spec/public/shared/collection_finder_shared_spec.rb +267 -0
  148. data/spec/public/shared/collection_shared_spec.rb +1637 -0
  149. data/spec/public/shared/finder_shared_spec.rb +1647 -0
  150. data/spec/semipublic/adapters/abstract_adapter_spec.rb +30 -0
  151. data/spec/semipublic/adapters/in_memory_adapter_spec.rb +13 -0
  152. data/spec/semipublic/associations/many_to_many_spec.rb +94 -0
  153. data/spec/semipublic/associations/many_to_one_spec.rb +63 -0
  154. data/spec/semipublic/associations/one_to_many_spec.rb +55 -0
  155. data/spec/semipublic/associations/one_to_one_spec.rb +53 -0
  156. data/spec/semipublic/associations/relationship_spec.rb +200 -0
  157. data/spec/semipublic/associations_spec.rb +177 -0
  158. data/spec/semipublic/collection_spec.rb +110 -0
  159. data/spec/semipublic/model_spec.rb +96 -0
  160. data/spec/semipublic/property/binary_spec.rb +13 -0
  161. data/spec/semipublic/property/boolean_spec.rb +47 -0
  162. data/spec/semipublic/property/class_spec.rb +33 -0
  163. data/spec/semipublic/property/date_spec.rb +43 -0
  164. data/spec/semipublic/property/date_time_spec.rb +46 -0
  165. data/spec/semipublic/property/decimal_spec.rb +83 -0
  166. data/spec/semipublic/property/discriminator_spec.rb +19 -0
  167. data/spec/semipublic/property/float_spec.rb +82 -0
  168. data/spec/semipublic/property/integer_spec.rb +82 -0
  169. data/spec/semipublic/property/lookup_spec.rb +29 -0
  170. data/spec/semipublic/property/serial_spec.rb +13 -0
  171. data/spec/semipublic/property/string_spec.rb +13 -0
  172. data/spec/semipublic/property/text_spec.rb +31 -0
  173. data/spec/semipublic/property/time_spec.rb +50 -0
  174. data/spec/semipublic/property_spec.rb +114 -0
  175. data/spec/semipublic/query/conditions/comparison_spec.rb +1502 -0
  176. data/spec/semipublic/query/conditions/operation_spec.rb +1296 -0
  177. data/spec/semipublic/query/path_spec.rb +471 -0
  178. data/spec/semipublic/query_spec.rb +3665 -0
  179. data/spec/semipublic/resource/state/clean_spec.rb +89 -0
  180. data/spec/semipublic/resource/state/deleted_spec.rb +79 -0
  181. data/spec/semipublic/resource/state/dirty_spec.rb +163 -0
  182. data/spec/semipublic/resource/state/immutable_spec.rb +107 -0
  183. data/spec/semipublic/resource/state/transient_spec.rb +163 -0
  184. data/spec/semipublic/resource/state_spec.rb +230 -0
  185. data/spec/semipublic/resource_spec.rb +23 -0
  186. data/spec/semipublic/shared/condition_shared_spec.rb +9 -0
  187. data/spec/semipublic/shared/resource_shared_spec.rb +198 -0
  188. data/spec/semipublic/shared/resource_state_shared_spec.rb +91 -0
  189. data/spec/semipublic/shared/subject_shared_spec.rb +79 -0
  190. data/spec/spec_helper.rb +34 -0
  191. data/spec/support/core_ext/hash.rb +10 -0
  192. data/spec/support/core_ext/inheritable_attributes.rb +46 -0
  193. data/spec/support/properties/huge_integer.rb +17 -0
  194. data/spec/unit/array_spec.rb +23 -0
  195. data/spec/unit/blank_spec.rb +73 -0
  196. data/spec/unit/data_mapper/ordered_set/append_spec.rb +26 -0
  197. data/spec/unit/data_mapper/ordered_set/clear_spec.rb +24 -0
  198. data/spec/unit/data_mapper/ordered_set/delete_spec.rb +28 -0
  199. data/spec/unit/data_mapper/ordered_set/each_spec.rb +19 -0
  200. data/spec/unit/data_mapper/ordered_set/empty_spec.rb +20 -0
  201. data/spec/unit/data_mapper/ordered_set/entries_spec.rb +22 -0
  202. data/spec/unit/data_mapper/ordered_set/eql_spec.rb +51 -0
  203. data/spec/unit/data_mapper/ordered_set/equal_value_spec.rb +84 -0
  204. data/spec/unit/data_mapper/ordered_set/hash_spec.rb +12 -0
  205. data/spec/unit/data_mapper/ordered_set/include_spec.rb +23 -0
  206. data/spec/unit/data_mapper/ordered_set/index_spec.rb +28 -0
  207. data/spec/unit/data_mapper/ordered_set/initialize_spec.rb +32 -0
  208. data/spec/unit/data_mapper/ordered_set/merge_spec.rb +36 -0
  209. data/spec/unit/data_mapper/ordered_set/shared/append_spec.rb +24 -0
  210. data/spec/unit/data_mapper/ordered_set/shared/clear_spec.rb +9 -0
  211. data/spec/unit/data_mapper/ordered_set/shared/delete_spec.rb +25 -0
  212. data/spec/unit/data_mapper/ordered_set/shared/each_spec.rb +17 -0
  213. data/spec/unit/data_mapper/ordered_set/shared/empty_spec.rb +9 -0
  214. data/spec/unit/data_mapper/ordered_set/shared/entries_spec.rb +9 -0
  215. data/spec/unit/data_mapper/ordered_set/shared/include_spec.rb +9 -0
  216. data/spec/unit/data_mapper/ordered_set/shared/index_spec.rb +13 -0
  217. data/spec/unit/data_mapper/ordered_set/shared/initialize_spec.rb +28 -0
  218. data/spec/unit/data_mapper/ordered_set/shared/merge_spec.rb +28 -0
  219. data/spec/unit/data_mapper/ordered_set/shared/size_spec.rb +13 -0
  220. data/spec/unit/data_mapper/ordered_set/shared/to_ary_spec.rb +11 -0
  221. data/spec/unit/data_mapper/ordered_set/size_spec.rb +27 -0
  222. data/spec/unit/data_mapper/ordered_set/to_ary_spec.rb +23 -0
  223. data/spec/unit/data_mapper/subject_set/append_spec.rb +47 -0
  224. data/spec/unit/data_mapper/subject_set/clear_spec.rb +34 -0
  225. data/spec/unit/data_mapper/subject_set/delete_spec.rb +40 -0
  226. data/spec/unit/data_mapper/subject_set/each_spec.rb +30 -0
  227. data/spec/unit/data_mapper/subject_set/empty_spec.rb +31 -0
  228. data/spec/unit/data_mapper/subject_set/entries_spec.rb +31 -0
  229. data/spec/unit/data_mapper/subject_set/get_spec.rb +34 -0
  230. data/spec/unit/data_mapper/subject_set/include_spec.rb +32 -0
  231. data/spec/unit/data_mapper/subject_set/named_spec.rb +33 -0
  232. data/spec/unit/data_mapper/subject_set/shared/append_spec.rb +18 -0
  233. data/spec/unit/data_mapper/subject_set/shared/clear_spec.rb +9 -0
  234. data/spec/unit/data_mapper/subject_set/shared/delete_spec.rb +9 -0
  235. data/spec/unit/data_mapper/subject_set/shared/each_spec.rb +9 -0
  236. data/spec/unit/data_mapper/subject_set/shared/empty_spec.rb +9 -0
  237. data/spec/unit/data_mapper/subject_set/shared/entries_spec.rb +9 -0
  238. data/spec/unit/data_mapper/subject_set/shared/get_spec.rb +9 -0
  239. data/spec/unit/data_mapper/subject_set/shared/include_spec.rb +9 -0
  240. data/spec/unit/data_mapper/subject_set/shared/named_spec.rb +9 -0
  241. data/spec/unit/data_mapper/subject_set/shared/size_spec.rb +13 -0
  242. data/spec/unit/data_mapper/subject_set/shared/to_ary_spec.rb +9 -0
  243. data/spec/unit/data_mapper/subject_set/shared/values_at_spec.rb +44 -0
  244. data/spec/unit/data_mapper/subject_set/size_spec.rb +42 -0
  245. data/spec/unit/data_mapper/subject_set/to_ary_spec.rb +34 -0
  246. data/spec/unit/data_mapper/subject_set/values_at_spec.rb +57 -0
  247. data/spec/unit/hash_spec.rb +27 -0
  248. data/spec/unit/hook_spec.rb +1216 -0
  249. data/spec/unit/inflections_spec.rb +14 -0
  250. data/spec/unit/lazy_array_spec.rb +1949 -0
  251. data/spec/unit/mash_spec.rb +289 -0
  252. data/spec/unit/module_spec.rb +70 -0
  253. data/spec/unit/object_spec.rb +38 -0
  254. data/spec/unit/try_dup_spec.rb +46 -0
  255. data/tasks/ci.rake +1 -0
  256. data/tasks/spec.rake +18 -0
  257. data/tasks/yard.rake +9 -0
  258. data/tasks/yardstick.rake +19 -0
  259. metadata +323 -0
@@ -0,0 +1,471 @@
1
+ require_relative '../../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 { expect(DataMapper::Query::Path).to 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 'returns a Query::Path' do
39
+ expect(@path).to be_kind_of(DataMapper::Query::Path)
40
+ end
41
+
42
+ it 'sets Query::Path#relationships' do
43
+ expect(@path.relationships).to eql(@relationships)
44
+ end
45
+
46
+ it 'copies the relationships' do
47
+ expect(@path.relationships).not_to 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 'returns a Query::Path' do
57
+ expect(@path).to be_kind_of(DataMapper::Query::Path)
58
+ end
59
+
60
+ it 'sets Query::Path#relationships' do
61
+ expect(@path.relationships).to eql(@relationships)
62
+ end
63
+
64
+ it 'copies the relationships' do
65
+ expect(@path.relationships).not_to equal(@relationships)
66
+ end
67
+
68
+ it 'sets Query::Path#property' do
69
+ expect(@path.property).to equal(@property)
70
+ end
71
+ end
72
+
73
+ describe 'when supplied an unknown property' do
74
+ it 'raises an error' do
75
+ expect { DataMapper::Query::Path.new(@relationships, :unknown) }.to 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 { expect(@path).to 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 'returns true' do
121
+ expect(@return).to 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 'returns false' do
135
+ expect(@return).to 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 'returns false' do
149
+ expect(@return).to 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 'returns false' do
161
+ expect(@return).to 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 'returns false' do
173
+ expect(@return).to 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 'returns true' do
185
+ expect(@return).to be(true)
186
+ end
187
+ end
188
+ end
189
+
190
+ it { expect(@path).to 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 'returns true' do
201
+ expect(@return).to 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 'returns false' do
215
+ expect(@return).to 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 'returns false' do
227
+ expect(@return).to 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 'returns false' do
239
+ expect(@return).to 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 'returns true' do
251
+ expect(@return).to be(true)
252
+ end
253
+ end
254
+ end
255
+
256
+ it { expect(@path).to respond_to(:model) }
257
+
258
+ describe '#model' do
259
+ it 'returns a Model' do
260
+ expect(@path.model).to be_kind_of(DataMapper::Model)
261
+ end
262
+
263
+ it 'returns expected value' do
264
+ expect(@path.model).to eql(Article)
265
+ end
266
+ end
267
+
268
+ it { expect(@path).to respond_to(:property) }
269
+
270
+ describe '#property' do
271
+ describe 'when no property is defined' do
272
+ it 'returns nil' do
273
+ expect(@path.property).to 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 'returns a Property' do
283
+ expect(@path.property).to be_kind_of(DataMapper::Property::Object)
284
+ end
285
+
286
+ it 'returns expected value' do
287
+ expect(@path.property).to eql(@property)
288
+ end
289
+ end
290
+ end
291
+
292
+ it { expect(@path).to respond_to(:relationships) }
293
+
294
+ describe '#relationships' do
295
+ it 'returns an Array' do
296
+ expect(@path.relationships).to be_kind_of(Array)
297
+ end
298
+
299
+ it 'returns expected value' do
300
+ expect(@path.relationships).to eql(@relationships)
301
+ end
302
+ end
303
+
304
+ it { expect(@path).to 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 'returns true' do
313
+ expect(@return).to 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 'returns true' do
325
+ expect(@return).to 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 'returns true' do
335
+ expect(@return).to 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 'returns true' do
345
+ expect(@return).to 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 'returns false' do
355
+ expect(@return).to be(false)
356
+ end
357
+ end
358
+ end
359
+
360
+ it { expect(@path).to respond_to(:repository_name) }
361
+
362
+ describe '#repository_name' do
363
+ it 'returns a Symbol' do
364
+ expect(@path.repository_name).to be_kind_of(Symbol)
365
+ end
366
+
367
+ it 'returns expected value' do
368
+ expect(@path.repository_name).to 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 'returns the expected value' do
379
+ expect(@return).to 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 'returns the expected value' do
391
+ expect(@return).to 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 'returns a Query::Path' do
401
+ expect(@return).to be_kind_of(DataMapper::Query::Path)
402
+ end
403
+
404
+ it 'returns the expected value' do
405
+ expect(@return).to 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 'returns a Query::Path' do
415
+ expect(@return).to be_kind_of(DataMapper::Query::Path)
416
+ end
417
+
418
+ it 'returns the expected value' do
419
+ expect(@return).to eql(DataMapper::Query::Path.new(@relationships, :title))
420
+ end
421
+ end
422
+
423
+ describe 'when supplied an unknown method name' do
424
+ it 'raises an error' do
425
+ expect { @path.unknown }.to 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
+ expect(@return).to eq 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
+ expect(@return).to eq 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 'returns a Query::Operator' do
463
+ expect(@return).to be_kind_of(DataMapper::Query::Operator)
464
+ end
465
+
466
+ it 'returns expected value' do
467
+ expect(@return).to eql(DataMapper::Query::Operator.new(@path, slug))
468
+ end
469
+ end
470
+ end
471
+ end