dm-core 1.0.2 → 1.1.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (184) hide show
  1. data/Gemfile +28 -94
  2. data/LICENSE +1 -1
  3. data/README.rdoc +44 -11
  4. data/Rakefile +1 -7
  5. data/VERSION +1 -1
  6. data/dm-core.gemspec +398 -299
  7. data/lib/dm-core.rb +23 -13
  8. data/lib/dm-core/adapters/abstract_adapter.rb +1 -1
  9. data/lib/dm-core/associations/many_to_many.rb +1 -3
  10. data/lib/dm-core/associations/many_to_one.rb +54 -36
  11. data/lib/dm-core/associations/one_to_many.rb +1 -2
  12. data/lib/dm-core/associations/relationship.rb +11 -2
  13. data/lib/dm-core/collection.rb +3 -7
  14. data/lib/dm-core/core_ext/symbol.rb +1 -1
  15. data/lib/dm-core/identity_map.rb +0 -5
  16. data/lib/dm-core/model.rb +11 -21
  17. data/lib/dm-core/model/property.rb +43 -58
  18. data/lib/dm-core/model/relationship.rb +49 -44
  19. data/lib/dm-core/property.rb +106 -130
  20. data/lib/dm-core/property/date_time.rb +1 -3
  21. data/lib/dm-core/property/decimal.rb +11 -7
  22. data/lib/dm-core/property/integer.rb +2 -2
  23. data/lib/dm-core/property/lookup.rb +3 -16
  24. data/lib/dm-core/property/numeric.rb +3 -3
  25. data/lib/dm-core/property/object.rb +2 -11
  26. data/lib/dm-core/property/string.rb +1 -1
  27. data/lib/dm-core/property_set.rb +34 -54
  28. data/lib/dm-core/query.rb +85 -56
  29. data/lib/dm-core/query/conditions/comparison.rb +3 -6
  30. data/lib/dm-core/query/direction.rb +0 -4
  31. data/lib/dm-core/query/path.rb +22 -6
  32. data/lib/dm-core/relationship_set.rb +74 -0
  33. data/lib/dm-core/resource.rb +21 -32
  34. data/lib/dm-core/resource/state.rb +3 -4
  35. data/lib/dm-core/spec/lib/spec_helper.rb +1 -4
  36. data/lib/dm-core/spec/setup.rb +12 -5
  37. data/lib/dm-core/spec/shared/public/property_spec.rb +35 -21
  38. data/lib/dm-core/spec/shared/resource_spec.rb +1 -1
  39. data/lib/dm-core/spec/shared/semipublic/property_spec.rb +9 -9
  40. data/lib/dm-core/spec/shared/semipublic/query/conditions/abstract_comparison_spec.rb +261 -0
  41. data/lib/dm-core/support/deprecate.rb +1 -1
  42. data/lib/dm-core/support/descendant_set.rb +12 -5
  43. data/lib/dm-core/support/ordered_set.rb +382 -0
  44. data/lib/dm-core/support/subject_set.rb +252 -0
  45. data/lib/dm-core/version.rb +1 -1
  46. data/spec/public/associations/many_to_many/read_multiple_join_spec.rb +1 -2
  47. data/spec/public/associations/many_to_many_spec.rb +11 -9
  48. data/spec/public/associations/many_to_one_spec.rb +1 -1
  49. data/spec/public/associations/many_to_one_with_boolean_cpk_spec.rb +1 -1
  50. data/spec/public/associations/many_to_one_with_custom_fk_spec.rb +2 -2
  51. data/spec/public/associations/one_to_many_spec.rb +6 -5
  52. data/spec/public/associations/one_to_one_spec.rb +1 -1
  53. data/spec/public/associations/one_to_one_with_boolean_cpk_spec.rb +1 -1
  54. data/spec/public/collection_spec.rb +7 -6
  55. data/spec/public/finalize_spec.rb +1 -1
  56. data/spec/public/model/hook_spec.rb +4 -3
  57. data/spec/public/model/property_spec.rb +9 -3
  58. data/spec/public/model/relationship_spec.rb +2 -4
  59. data/spec/public/model_spec.rb +1 -1
  60. data/spec/public/property/binary_spec.rb +1 -1
  61. data/spec/public/property/boolean_spec.rb +1 -1
  62. data/spec/public/property/class_spec.rb +1 -1
  63. data/spec/public/property/date_spec.rb +1 -1
  64. data/spec/public/property/date_time_spec.rb +1 -1
  65. data/spec/public/property/decimal_spec.rb +7 -6
  66. data/spec/public/property/discriminator_spec.rb +1 -1
  67. data/spec/public/property/float_spec.rb +1 -1
  68. data/spec/public/property/integer_spec.rb +1 -1
  69. data/spec/public/property/object_spec.rb +2 -2
  70. data/spec/public/property/serial_spec.rb +1 -1
  71. data/spec/public/property/string_spec.rb +1 -1
  72. data/spec/public/property/text_spec.rb +6 -3
  73. data/spec/public/property/time_spec.rb +1 -1
  74. data/spec/public/property_spec.rb +13 -11
  75. data/spec/public/resource_spec.rb +43 -1
  76. data/spec/public/sel_spec.rb +1 -1
  77. data/spec/public/setup_spec.rb +1 -1
  78. data/spec/public/shared/collection_shared_spec.rb +6 -1
  79. data/spec/semipublic/adapters/abstract_adapter_spec.rb +1 -1
  80. data/spec/semipublic/adapters/in_memory_adapter_spec.rb +1 -1
  81. data/spec/semipublic/associations/many_to_many_spec.rb +1 -1
  82. data/spec/semipublic/associations/many_to_one_spec.rb +1 -1
  83. data/spec/semipublic/associations/one_to_many_spec.rb +1 -1
  84. data/spec/semipublic/associations/one_to_one_spec.rb +1 -1
  85. data/spec/semipublic/associations/relationship_spec.rb +1 -1
  86. data/spec/semipublic/associations_spec.rb +1 -1
  87. data/spec/semipublic/collection_spec.rb +1 -1
  88. data/spec/semipublic/model_spec.rb +1 -1
  89. data/spec/semipublic/property/binary_spec.rb +1 -1
  90. data/spec/semipublic/property/boolean_spec.rb +1 -1
  91. data/spec/semipublic/property/class_spec.rb +1 -1
  92. data/spec/semipublic/property/date_spec.rb +1 -1
  93. data/spec/semipublic/property/date_time_spec.rb +1 -1
  94. data/spec/semipublic/property/decimal_spec.rb +6 -5
  95. data/spec/semipublic/property/discriminator_spec.rb +1 -1
  96. data/spec/semipublic/property/float_spec.rb +1 -1
  97. data/spec/semipublic/property/integer_spec.rb +1 -1
  98. data/spec/semipublic/property/lookup_spec.rb +8 -5
  99. data/spec/semipublic/property/serial_spec.rb +1 -1
  100. data/spec/semipublic/property/string_spec.rb +1 -1
  101. data/spec/semipublic/property/text_spec.rb +1 -1
  102. data/spec/semipublic/property/time_spec.rb +1 -1
  103. data/spec/semipublic/property_spec.rb +32 -7
  104. data/spec/semipublic/query/conditions/comparison_spec.rb +1 -264
  105. data/spec/semipublic/query/conditions/operation_spec.rb +1 -2
  106. data/spec/semipublic/query/path_spec.rb +27 -1
  107. data/spec/semipublic/query_spec.rb +87 -36
  108. data/spec/semipublic/resource/state/clean_spec.rb +1 -2
  109. data/spec/semipublic/resource/state/deleted_spec.rb +1 -2
  110. data/spec/semipublic/resource/state/dirty_spec.rb +1 -2
  111. data/spec/semipublic/resource/state/immutable_spec.rb +1 -2
  112. data/spec/semipublic/resource/state/transient_spec.rb +7 -2
  113. data/spec/semipublic/resource/state_spec.rb +1 -1
  114. data/spec/semipublic/resource_spec.rb +1 -1
  115. data/spec/unit/array_spec.rb +1 -0
  116. data/spec/unit/data_mapper/ordered_set/append_spec.rb +26 -0
  117. data/spec/unit/data_mapper/ordered_set/clear_spec.rb +24 -0
  118. data/spec/unit/data_mapper/ordered_set/delete_spec.rb +28 -0
  119. data/spec/unit/data_mapper/ordered_set/each_spec.rb +19 -0
  120. data/spec/unit/data_mapper/ordered_set/empty_spec.rb +20 -0
  121. data/spec/unit/data_mapper/ordered_set/entries_spec.rb +22 -0
  122. data/spec/unit/data_mapper/ordered_set/eql_spec.rb +51 -0
  123. data/spec/unit/data_mapper/ordered_set/equal_value_spec.rb +84 -0
  124. data/spec/unit/data_mapper/ordered_set/hash_spec.rb +12 -0
  125. data/spec/unit/data_mapper/ordered_set/include_spec.rb +23 -0
  126. data/spec/unit/data_mapper/ordered_set/index_spec.rb +28 -0
  127. data/spec/unit/data_mapper/ordered_set/initialize_spec.rb +32 -0
  128. data/spec/unit/data_mapper/ordered_set/merge_spec.rb +36 -0
  129. data/spec/unit/data_mapper/ordered_set/shared/append_spec.rb +24 -0
  130. data/spec/unit/data_mapper/ordered_set/shared/clear_spec.rb +9 -0
  131. data/spec/unit/data_mapper/ordered_set/shared/delete_spec.rb +25 -0
  132. data/spec/unit/data_mapper/ordered_set/shared/each_spec.rb +17 -0
  133. data/spec/unit/data_mapper/ordered_set/shared/empty_spec.rb +9 -0
  134. data/spec/unit/data_mapper/ordered_set/shared/entries_spec.rb +9 -0
  135. data/spec/unit/data_mapper/ordered_set/shared/include_spec.rb +9 -0
  136. data/spec/unit/data_mapper/ordered_set/shared/index_spec.rb +13 -0
  137. data/spec/unit/data_mapper/ordered_set/shared/initialize_spec.rb +28 -0
  138. data/spec/unit/data_mapper/ordered_set/shared/merge_spec.rb +28 -0
  139. data/spec/unit/data_mapper/ordered_set/shared/size_spec.rb +13 -0
  140. data/spec/unit/data_mapper/ordered_set/shared/to_ary_spec.rb +11 -0
  141. data/spec/unit/data_mapper/ordered_set/size_spec.rb +27 -0
  142. data/spec/unit/data_mapper/ordered_set/to_ary_spec.rb +23 -0
  143. data/spec/unit/data_mapper/subject_set/append_spec.rb +47 -0
  144. data/spec/unit/data_mapper/subject_set/clear_spec.rb +34 -0
  145. data/spec/unit/data_mapper/subject_set/delete_spec.rb +40 -0
  146. data/spec/unit/data_mapper/subject_set/each_spec.rb +30 -0
  147. data/spec/unit/data_mapper/subject_set/empty_spec.rb +31 -0
  148. data/spec/unit/data_mapper/subject_set/entries_spec.rb +31 -0
  149. data/spec/unit/data_mapper/subject_set/get_spec.rb +34 -0
  150. data/spec/unit/data_mapper/subject_set/include_spec.rb +32 -0
  151. data/spec/unit/data_mapper/subject_set/named_spec.rb +33 -0
  152. data/spec/unit/data_mapper/subject_set/shared/append_spec.rb +18 -0
  153. data/spec/unit/data_mapper/subject_set/shared/clear_spec.rb +9 -0
  154. data/spec/unit/data_mapper/subject_set/shared/delete_spec.rb +9 -0
  155. data/spec/unit/data_mapper/subject_set/shared/each_spec.rb +9 -0
  156. data/spec/unit/data_mapper/subject_set/shared/empty_spec.rb +9 -0
  157. data/spec/unit/data_mapper/subject_set/shared/entries_spec.rb +9 -0
  158. data/spec/unit/data_mapper/subject_set/shared/get_spec.rb +9 -0
  159. data/spec/unit/data_mapper/subject_set/shared/include_spec.rb +9 -0
  160. data/spec/unit/data_mapper/subject_set/shared/named_spec.rb +9 -0
  161. data/spec/unit/data_mapper/subject_set/shared/size_spec.rb +13 -0
  162. data/spec/unit/data_mapper/subject_set/shared/to_ary_spec.rb +9 -0
  163. data/spec/unit/data_mapper/subject_set/shared/values_at_spec.rb +44 -0
  164. data/spec/unit/data_mapper/subject_set/size_spec.rb +42 -0
  165. data/spec/unit/data_mapper/subject_set/to_ary_spec.rb +34 -0
  166. data/spec/unit/data_mapper/subject_set/values_at_spec.rb +57 -0
  167. data/spec/unit/hash_spec.rb +2 -1
  168. data/spec/unit/hook_spec.rb +1 -0
  169. data/spec/unit/lazy_array_spec.rb +2 -1
  170. data/spec/unit/module_spec.rb +2 -1
  171. data/spec/unit/object_spec.rb +1 -0
  172. data/spec/unit/try_dup_spec.rb +1 -0
  173. data/tasks/spec.rake +0 -3
  174. metadata +149 -52
  175. data/.gitignore +0 -37
  176. data/lib/dm-core/type.rb +0 -216
  177. data/lib/dm-core/types/boolean.rb +0 -9
  178. data/lib/dm-core/types/decimal.rb +0 -9
  179. data/lib/dm-core/types/discriminator.rb +0 -50
  180. data/lib/dm-core/types/object.rb +0 -25
  181. data/lib/dm-core/types/serial.rb +0 -11
  182. data/lib/dm-core/types/text.rb +0 -11
  183. data/tasks/local_gemfile.rake +0 -16
  184. data/tasks/metrics.rake +0 -37
@@ -0,0 +1,252 @@
1
+ require 'dm-core/support/ordered_set'
2
+
3
+ module DataMapper
4
+
5
+ # An insertion ordered set of named objects
6
+ #
7
+ # {SubjectSet} uses {DataMapper::OrderedSet}
8
+ # under the hood to keep track of a set of
9
+ # entries. In DataMapper code, a subject
10
+ # can be either a {DataMapper::Property}, or
11
+ # a {DataMapper::Associations::Relationship}.
12
+ #
13
+ # All entries added to instances of this
14
+ # class must respond to the {#name} method
15
+ #
16
+ # The motivation behind this is that we
17
+ # use this class as a base to keep track
18
+ # properties and relationships.
19
+ # The following constraints apply for these
20
+ # types of objects: {Property} names must be
21
+ # unique within any model.
22
+ # {Associations::Relationship} names must be
23
+ # unique within any model
24
+ #
25
+ # When adding an entry with a name that
26
+ # already exists, the already existing
27
+ # entry will be replaced with the new
28
+ # entry with the same name. This is because
29
+ # we want to be able to update properties,
30
+ # and relationship during the course of
31
+ # initializing our application.
32
+ #
33
+ # This also happens to be consistent with
34
+ # the way ruby handles redefining methods,
35
+ # where the last definitions "wins".
36
+ #
37
+ # Furthermore, the builtin ruby {Set#<<} method
38
+ # also updates the old object if a new object
39
+ # gets added.
40
+ #
41
+ # @api private
42
+ class SubjectSet
43
+
44
+ # An {OrderedSet::Cache::API} implementation that establishes
45
+ # set semantics based on the name of its entries. The cache
46
+ # uses the entries' names as cache key and refuses to add
47
+ # entries that don't respond_to?(:name).
48
+ #
49
+ # @see OrderedSet::Cache::API
50
+ #
51
+ # @api private
52
+ class NameCache
53
+
54
+ include OrderedSet::Cache::API
55
+
56
+ # Tests if the given entry qualifies to be added to the cache
57
+ #
58
+ # @param [#name] entry
59
+ # the entry to be checked
60
+ #
61
+ # @return [Boolean]
62
+ # true if the entry respond_to?(:name)
63
+ #
64
+ # @api private
65
+ def valid?(entry)
66
+ entry.respond_to?(:name)
67
+ end
68
+
69
+ # Given an entry, return the key to be used in the cache
70
+ #
71
+ # @param [#name] entry
72
+ # the entry to get the key for
73
+ #
74
+ # @return [#to_s, nil]
75
+ # the entry's name or nil if the entry isn't #valid?
76
+ #
77
+ # @api private
78
+ def key_for(entry)
79
+ valid?(entry) ? entry.name : nil
80
+ end
81
+
82
+ end # class NameCache
83
+
84
+ include Enumerable
85
+
86
+ # The elements in the SubjectSet
87
+ #
88
+ # @return [OrderedSet]
89
+ #
90
+ # @api private
91
+ attr_reader :entries
92
+
93
+ # Initialize a SubjectSet
94
+ #
95
+ # @param [Enumerable<#name>] entries
96
+ # the entries to initialize this set with
97
+ #
98
+ # @api private
99
+ def initialize(entries = [])
100
+ @entries = OrderedSet.new(entries, NameCache)
101
+ end
102
+
103
+ # Initialize a copy of a SubjectSet
104
+ #
105
+ # @api private
106
+ def initialize_copy(*)
107
+ @entries = @entries.dup
108
+ end
109
+
110
+ # Make sure that entry is part of this SubjectSet
111
+ #
112
+ # If an entry with the same name already exists, it
113
+ # will be updated. If no such named entry exists, it
114
+ # will be added.
115
+ #
116
+ # @param [#name] entry
117
+ # the entry to be added
118
+ #
119
+ # @return [SubjectSet] self
120
+ #
121
+ # @api private
122
+ def <<(entry)
123
+ entries << entry
124
+ self
125
+ end
126
+
127
+ # Delete an entry from this SubjectSet
128
+ #
129
+ # @param [#name] entry
130
+ # the entry to delete
131
+ #
132
+ # @return [#name, nil]
133
+ # the deleted entry or nil
134
+ #
135
+ # @api private
136
+ def delete(entry)
137
+ entries.delete(entry)
138
+ end
139
+
140
+ # Removes all entries and returns self
141
+ #
142
+ # @return [SubjectSet] self
143
+ #
144
+ # @api private
145
+ def clear
146
+ entries.clear
147
+ self
148
+ end
149
+
150
+ # Test if the given entry is included in this SubjectSet
151
+ #
152
+ # @param [#name] entry
153
+ # the entry to test for
154
+ #
155
+ # @return [Boolean]
156
+ # true if the entry is included in this SubjectSet
157
+ #
158
+ # @api private
159
+ def include?(entry)
160
+ entries.include?(entry)
161
+ end
162
+
163
+ # Tests wether the SubjectSet contains a entry named name
164
+ #
165
+ # @param [#to_s] name
166
+ # the entry name to test for
167
+ #
168
+ # @return [Boolean]
169
+ # true if the SubjectSet contains a entry named name
170
+ #
171
+ # @api private
172
+ def named?(name)
173
+ !self[name].nil?
174
+ end
175
+
176
+ # Check if there are any entries
177
+ #
178
+ # @return [Boolean]
179
+ # true if the set contains at least one entry
180
+ #
181
+ # @api private
182
+ def empty?
183
+ entries.empty?
184
+ end
185
+
186
+ # Lookup an entry in the SubjectSet based on a given name
187
+ #
188
+ # @param [#to_s] name
189
+ # the name of the entry
190
+ #
191
+ # @return [Object, nil]
192
+ # the entry having the given name, or nil if not found
193
+ #
194
+ # @api private
195
+ def [](name)
196
+ name = name.to_s
197
+ entries.detect { |entry| entry.name.to_s == name }
198
+ end
199
+
200
+ # Iterate over each entry in the set
201
+ #
202
+ # @yield [entry]
203
+ # each entry in the set
204
+ #
205
+ # @yieldparam [#name] entry
206
+ # an entry in the set
207
+ #
208
+ # @return [SubjectSet] self
209
+ #
210
+ # @api private
211
+ def each
212
+ entries.each { |entry| yield(entry) }
213
+ self
214
+ end
215
+
216
+ # All entries (or nil values) that have any of the given names
217
+ #
218
+ # @param [Enumerable<#to_s>] names
219
+ # the names of the desired entries
220
+ #
221
+ # @return [Array<#name, nil>]
222
+ # an array containing entries whose names match any of the given
223
+ # names, or nil values for those names with no matching entries
224
+ # in the set
225
+ #
226
+ # @api private
227
+ def values_at(*names)
228
+ names.map { |name| self[name] }
229
+ end
230
+
231
+ # Get the number of elements inside this SubjectSet
232
+ #
233
+ # @return [Integer]
234
+ # the number of elements
235
+ #
236
+ # @api private
237
+ def size
238
+ entries.size
239
+ end
240
+
241
+ # Convert the SubjectSet into an Array
242
+ #
243
+ # @return [Array]
244
+ # an array containing all the SubjectSet's entries
245
+ #
246
+ # @api private
247
+ def to_ary
248
+ to_a
249
+ end
250
+
251
+ end # class SubjectSet
252
+ end # module DataMapper
@@ -1,3 +1,3 @@
1
1
  module DataMapper
2
- VERSION = '1.0.0'
2
+ VERSION = '1.1.0.rc1'
3
3
  end
@@ -1,5 +1,4 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', '..', 'spec_helper'))
2
-
1
+ require 'spec_helper'
3
2
  describe 'Many to Many Associations read across multiple join associations' do
4
3
  before :all do
5
4
  class ::User
@@ -1,4 +1,4 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'spec_helper'))
1
+ require 'spec_helper'
2
2
 
3
3
  share_examples_for 'A Limited Many to Many Collection' do
4
4
  describe '#destroy!' do
@@ -39,10 +39,11 @@ end
39
39
  class Article
40
40
  include DataMapper::Resource
41
41
 
42
- property :id, Serial
43
- property :title, String, :required => true
44
- property :content, Text
45
- property :subtitle, String
42
+ property :id, Serial
43
+ property :title, String, :required => true
44
+ property :content, Text
45
+ property :subtitle, String
46
+ property :attachment, Object
46
47
 
47
48
  has n, :authors, :through => Resource
48
49
  belongs_to :original, self, :required => false
@@ -129,10 +130,11 @@ end
129
130
  class Article
130
131
  include DataMapper::Resource
131
132
 
132
- property :id, Serial
133
- property :title, String, :required => true
134
- property :content, Text
135
- property :subtitle, String
133
+ property :id, Serial
134
+ property :title, String, :required => true
135
+ property :content, Text
136
+ property :subtitle, String
137
+ property :attachment, Object
136
138
 
137
139
  property :site_name, String, :default => 'default'
138
140
 
@@ -1,4 +1,4 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'spec_helper'))
1
+ require 'spec_helper'
2
2
 
3
3
  describe 'Many to One Associations' do
4
4
  before :all do
@@ -1,4 +1,4 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'spec_helper'))
1
+ require 'spec_helper'
2
2
 
3
3
  # TODO: combine this into many_to_one_spec.rb
4
4
 
@@ -1,8 +1,8 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'spec_helper'))
1
+ require 'spec_helper'
2
2
 
3
3
  # TODO: combine this into many_to_one_spec.rb
4
4
 
5
- describe 'Many to One Associations when foreign key is a custom property' do
5
+ describe 'Many to One Associations when foreign key is a property subclass' do
6
6
  before :all do
7
7
  class ::CustomPK < DataMapper::Property::String
8
8
  key true
@@ -1,4 +1,4 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'spec_helper'))
1
+ require 'spec_helper'
2
2
 
3
3
  # run the specs once with a loaded association and once not
4
4
  [ false, true ].each do |loaded|
@@ -22,10 +22,11 @@ require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'spec_hel
22
22
  class Article
23
23
  include DataMapper::Resource
24
24
 
25
- property :id, Serial
26
- property :title, String, :required => true
27
- property :content, Text
28
- property :subtitle, String
25
+ property :id, Serial
26
+ property :title, String, :required => true
27
+ property :content, Text
28
+ property :subtitle, String
29
+ property :attachment, Object
29
30
 
30
31
  belongs_to :author, :required => false
31
32
  belongs_to :original, self, :required => false
@@ -1,4 +1,4 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'spec_helper'))
1
+ require 'spec_helper'
2
2
 
3
3
  describe 'One to One Associations' do
4
4
  before :all do
@@ -1,4 +1,4 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'spec_helper'))
1
+ require 'spec_helper'
2
2
 
3
3
  # TODO: combine this into one_to_one_spec.rb
4
4
 
@@ -1,4 +1,4 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
1
+ require 'spec_helper'
2
2
 
3
3
  # run the specs once with a loaded collection and once not
4
4
  [ false, true ].each do |loaded|
@@ -12,11 +12,12 @@ require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
12
12
  class Article
13
13
  include DataMapper::Resource
14
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
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
20
21
 
21
22
  belongs_to :original, self, :required => false
22
23
  has n, :revisions, self, :child_key => [ :original_id ]
@@ -1,4 +1,4 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
1
+ require 'spec_helper'
2
2
 
3
3
  describe DataMapper do
4
4
  describe '.finalize' do
@@ -1,4 +1,4 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'spec_helper'))
1
+ require 'spec_helper'
2
2
 
3
3
  describe DataMapper::Model::Hook do
4
4
  before :all do
@@ -6,6 +6,7 @@ describe DataMapper::Model::Hook do
6
6
  include DataMapper::Resource
7
7
 
8
8
  property :id, Serial
9
+ property :value, Integer, :required => true, :default => 1
9
10
 
10
11
  def an_instance_method
11
12
  end
@@ -71,7 +72,7 @@ describe DataMapper::Model::Hook do
71
72
  ModelHookSpecs.before(:update) { hooks << :before_update }
72
73
 
73
74
  @resource.save
74
- @resource.update(:id => 2)
75
+ @resource.update(:value => 2)
75
76
  end
76
77
 
77
78
  it 'should execute before update hook' do
@@ -182,7 +183,7 @@ describe DataMapper::Model::Hook do
182
183
  ModelHookSpecs.after(:update) { hooks << :after_update }
183
184
 
184
185
  @resource.save
185
- @resource.update(:id => 2)
186
+ @resource.update(:value => 2)
186
187
  end
187
188
 
188
189
  it 'should execute after update hook' do
@@ -1,7 +1,7 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'spec_helper'))
1
+ require 'spec_helper'
2
2
 
3
3
  describe DataMapper::Model::Property do
4
- before :each do
4
+ before do
5
5
  Object.send(:remove_const, :ModelPropertySpecs) if defined?(ModelPropertySpecs)
6
6
  class ::ModelPropertySpecs
7
7
  include DataMapper::Resource
@@ -30,7 +30,13 @@ describe DataMapper::Model::Property do
30
30
  it 'should raise an exception if the method exists' do
31
31
  lambda {
32
32
  ModelPropertySpecs.property(:key, String)
33
- }.should raise_error(ArgumentError, '+name+ was :key, which cannot be used as a property name since it collides with an existing method')
33
+ }.should raise_error(ArgumentError, '+name+ was :key, which cannot be used as a property name since it collides with an existing method or a query option')
34
+ end
35
+
36
+ it 'should raise an exception if the name is the same as one of the query options' do
37
+ lambda {
38
+ ModelPropertySpecs.property(:order, String)
39
+ }.should raise_error(ArgumentError, '+name+ was :order, which cannot be used as a property name since it collides with an existing method or a query option')
34
40
  end
35
41
  end
36
42
  end