datamapper-dm-core 0.9.11 → 0.10.0

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 (192) hide show
  1. data/.autotest +17 -14
  2. data/.gitignore +3 -1
  3. data/FAQ +6 -5
  4. data/History.txt +5 -39
  5. data/Manifest.txt +67 -76
  6. data/QUICKLINKS +1 -1
  7. data/README.txt +21 -15
  8. data/Rakefile +16 -15
  9. data/SPECS +2 -29
  10. data/TODO +1 -1
  11. data/dm-core.gemspec +11 -15
  12. data/lib/dm-core/adapters/abstract_adapter.rb +182 -185
  13. data/lib/dm-core/adapters/data_objects_adapter.rb +482 -534
  14. data/lib/dm-core/adapters/in_memory_adapter.rb +90 -69
  15. data/lib/dm-core/adapters/mysql_adapter.rb +22 -115
  16. data/lib/dm-core/adapters/oracle_adapter.rb +249 -0
  17. data/lib/dm-core/adapters/postgres_adapter.rb +7 -173
  18. data/lib/dm-core/adapters/sqlite3_adapter.rb +4 -97
  19. data/lib/dm-core/adapters/yaml_adapter.rb +116 -0
  20. data/lib/dm-core/adapters.rb +135 -16
  21. data/lib/dm-core/associations/many_to_many.rb +372 -90
  22. data/lib/dm-core/associations/many_to_one.rb +220 -73
  23. data/lib/dm-core/associations/one_to_many.rb +319 -255
  24. data/lib/dm-core/associations/one_to_one.rb +66 -53
  25. data/lib/dm-core/associations/relationship.rb +560 -158
  26. data/lib/dm-core/collection.rb +1104 -381
  27. data/lib/dm-core/core_ext/kernel.rb +12 -0
  28. data/lib/dm-core/core_ext/symbol.rb +10 -0
  29. data/lib/dm-core/identity_map.rb +4 -34
  30. data/lib/dm-core/migrations.rb +1283 -0
  31. data/lib/dm-core/model/descendant_set.rb +81 -0
  32. data/lib/dm-core/model/hook.rb +45 -0
  33. data/lib/dm-core/model/is.rb +32 -0
  34. data/lib/dm-core/model/property.rb +248 -0
  35. data/lib/dm-core/model/relationship.rb +335 -0
  36. data/lib/dm-core/model/scope.rb +90 -0
  37. data/lib/dm-core/model.rb +570 -369
  38. data/lib/dm-core/property.rb +753 -280
  39. data/lib/dm-core/property_set.rb +141 -98
  40. data/lib/dm-core/query/conditions/comparison.rb +814 -0
  41. data/lib/dm-core/query/conditions/operation.rb +247 -0
  42. data/lib/dm-core/query/direction.rb +43 -0
  43. data/lib/dm-core/query/operator.rb +42 -0
  44. data/lib/dm-core/query/path.rb +102 -0
  45. data/lib/dm-core/query/sort.rb +45 -0
  46. data/lib/dm-core/query.rb +974 -492
  47. data/lib/dm-core/repository.rb +147 -107
  48. data/lib/dm-core/resource.rb +644 -429
  49. data/lib/dm-core/spec/adapter_shared_spec.rb +294 -0
  50. data/lib/dm-core/spec/data_objects_adapter_shared_spec.rb +106 -0
  51. data/lib/dm-core/support/chainable.rb +20 -0
  52. data/lib/dm-core/support/deprecate.rb +12 -0
  53. data/lib/dm-core/support/equalizer.rb +23 -0
  54. data/lib/dm-core/support/logger.rb +13 -0
  55. data/lib/dm-core/{naming_conventions.rb → support/naming_conventions.rb} +6 -6
  56. data/lib/dm-core/transaction.rb +333 -92
  57. data/lib/dm-core/type.rb +98 -60
  58. data/lib/dm-core/types/boolean.rb +1 -1
  59. data/lib/dm-core/types/discriminator.rb +34 -20
  60. data/lib/dm-core/types/object.rb +7 -4
  61. data/lib/dm-core/types/paranoid_boolean.rb +11 -9
  62. data/lib/dm-core/types/paranoid_datetime.rb +11 -9
  63. data/lib/dm-core/types/serial.rb +3 -3
  64. data/lib/dm-core/types/text.rb +3 -4
  65. data/lib/dm-core/version.rb +1 -1
  66. data/lib/dm-core.rb +106 -110
  67. data/script/performance.rb +102 -109
  68. data/script/profile.rb +169 -38
  69. data/spec/lib/adapter_helpers.rb +105 -0
  70. data/spec/lib/collection_helpers.rb +18 -0
  71. data/spec/lib/counter_adapter.rb +34 -0
  72. data/spec/lib/pending_helpers.rb +27 -0
  73. data/spec/lib/rspec_immediate_feedback_formatter.rb +53 -0
  74. data/spec/public/associations/many_to_many_spec.rb +193 -0
  75. data/spec/public/associations/many_to_one_spec.rb +73 -0
  76. data/spec/public/associations/one_to_many_spec.rb +77 -0
  77. data/spec/public/associations/one_to_one_spec.rb +156 -0
  78. data/spec/public/collection_spec.rb +65 -0
  79. data/spec/public/model/relationship_spec.rb +924 -0
  80. data/spec/public/model_spec.rb +159 -0
  81. data/spec/public/property_spec.rb +829 -0
  82. data/spec/public/resource_spec.rb +71 -0
  83. data/spec/public/sel_spec.rb +44 -0
  84. data/spec/public/setup_spec.rb +145 -0
  85. data/spec/public/shared/association_collection_shared_spec.rb +317 -0
  86. data/spec/public/shared/collection_shared_spec.rb +1723 -0
  87. data/spec/public/shared/finder_shared_spec.rb +1619 -0
  88. data/spec/public/shared/resource_shared_spec.rb +924 -0
  89. data/spec/public/shared/sel_shared_spec.rb +112 -0
  90. data/spec/public/transaction_spec.rb +129 -0
  91. data/spec/public/types/discriminator_spec.rb +130 -0
  92. data/spec/semipublic/adapters/abstract_adapter_spec.rb +30 -0
  93. data/spec/semipublic/adapters/in_memory_adapter_spec.rb +12 -0
  94. data/spec/semipublic/adapters/mysql_adapter_spec.rb +17 -0
  95. data/spec/semipublic/adapters/oracle_adapter_spec.rb +194 -0
  96. data/spec/semipublic/adapters/postgres_adapter_spec.rb +17 -0
  97. data/spec/semipublic/adapters/sqlite3_adapter_spec.rb +17 -0
  98. data/spec/semipublic/adapters/yaml_adapter_spec.rb +12 -0
  99. data/spec/semipublic/associations/many_to_one_spec.rb +53 -0
  100. data/spec/semipublic/associations/relationship_spec.rb +194 -0
  101. data/spec/semipublic/associations_spec.rb +177 -0
  102. data/spec/semipublic/collection_spec.rb +142 -0
  103. data/spec/semipublic/property_spec.rb +61 -0
  104. data/spec/semipublic/query/conditions_spec.rb +528 -0
  105. data/spec/semipublic/query/path_spec.rb +443 -0
  106. data/spec/semipublic/query_spec.rb +2626 -0
  107. data/spec/semipublic/resource_spec.rb +47 -0
  108. data/spec/semipublic/shared/resource_shared_spec.rb +126 -0
  109. data/spec/spec.opts +3 -1
  110. data/spec/spec_helper.rb +80 -57
  111. data/tasks/ci.rb +19 -31
  112. data/tasks/dm.rb +43 -48
  113. data/tasks/doc.rb +8 -11
  114. data/tasks/gemspec.rb +5 -5
  115. data/tasks/hoe.rb +15 -16
  116. data/tasks/install.rb +8 -10
  117. metadata +72 -93
  118. data/lib/dm-core/associations/relationship_chain.rb +0 -81
  119. data/lib/dm-core/associations.rb +0 -207
  120. data/lib/dm-core/auto_migrations.rb +0 -105
  121. data/lib/dm-core/dependency_queue.rb +0 -32
  122. data/lib/dm-core/hook.rb +0 -11
  123. data/lib/dm-core/is.rb +0 -16
  124. data/lib/dm-core/logger.rb +0 -232
  125. data/lib/dm-core/migrations/destructive_migrations.rb +0 -17
  126. data/lib/dm-core/migrator.rb +0 -29
  127. data/lib/dm-core/scope.rb +0 -58
  128. data/lib/dm-core/support/array.rb +0 -13
  129. data/lib/dm-core/support/assertions.rb +0 -8
  130. data/lib/dm-core/support/errors.rb +0 -23
  131. data/lib/dm-core/support/kernel.rb +0 -11
  132. data/lib/dm-core/support/symbol.rb +0 -41
  133. data/lib/dm-core/support.rb +0 -7
  134. data/lib/dm-core/type_map.rb +0 -80
  135. data/lib/dm-core/types.rb +0 -19
  136. data/script/all +0 -4
  137. data/spec/integration/association_spec.rb +0 -1382
  138. data/spec/integration/association_through_spec.rb +0 -203
  139. data/spec/integration/associations/many_to_many_spec.rb +0 -449
  140. data/spec/integration/associations/many_to_one_spec.rb +0 -163
  141. data/spec/integration/associations/one_to_many_spec.rb +0 -188
  142. data/spec/integration/auto_migrations_spec.rb +0 -413
  143. data/spec/integration/collection_spec.rb +0 -1073
  144. data/spec/integration/data_objects_adapter_spec.rb +0 -32
  145. data/spec/integration/dependency_queue_spec.rb +0 -46
  146. data/spec/integration/model_spec.rb +0 -197
  147. data/spec/integration/mysql_adapter_spec.rb +0 -85
  148. data/spec/integration/postgres_adapter_spec.rb +0 -731
  149. data/spec/integration/property_spec.rb +0 -253
  150. data/spec/integration/query_spec.rb +0 -514
  151. data/spec/integration/repository_spec.rb +0 -61
  152. data/spec/integration/resource_spec.rb +0 -513
  153. data/spec/integration/sqlite3_adapter_spec.rb +0 -352
  154. data/spec/integration/sti_spec.rb +0 -273
  155. data/spec/integration/strategic_eager_loading_spec.rb +0 -156
  156. data/spec/integration/transaction_spec.rb +0 -75
  157. data/spec/integration/type_spec.rb +0 -275
  158. data/spec/lib/logging_helper.rb +0 -18
  159. data/spec/lib/mock_adapter.rb +0 -27
  160. data/spec/lib/model_loader.rb +0 -100
  161. data/spec/lib/publicize_methods.rb +0 -28
  162. data/spec/models/content.rb +0 -16
  163. data/spec/models/vehicles.rb +0 -34
  164. data/spec/models/zoo.rb +0 -48
  165. data/spec/unit/adapters/abstract_adapter_spec.rb +0 -133
  166. data/spec/unit/adapters/adapter_shared_spec.rb +0 -15
  167. data/spec/unit/adapters/data_objects_adapter_spec.rb +0 -632
  168. data/spec/unit/adapters/in_memory_adapter_spec.rb +0 -98
  169. data/spec/unit/adapters/postgres_adapter_spec.rb +0 -133
  170. data/spec/unit/associations/many_to_many_spec.rb +0 -32
  171. data/spec/unit/associations/many_to_one_spec.rb +0 -159
  172. data/spec/unit/associations/one_to_many_spec.rb +0 -393
  173. data/spec/unit/associations/one_to_one_spec.rb +0 -7
  174. data/spec/unit/associations/relationship_spec.rb +0 -71
  175. data/spec/unit/associations_spec.rb +0 -242
  176. data/spec/unit/auto_migrations_spec.rb +0 -111
  177. data/spec/unit/collection_spec.rb +0 -182
  178. data/spec/unit/data_mapper_spec.rb +0 -35
  179. data/spec/unit/identity_map_spec.rb +0 -126
  180. data/spec/unit/is_spec.rb +0 -80
  181. data/spec/unit/migrator_spec.rb +0 -33
  182. data/spec/unit/model_spec.rb +0 -321
  183. data/spec/unit/naming_conventions_spec.rb +0 -36
  184. data/spec/unit/property_set_spec.rb +0 -90
  185. data/spec/unit/property_spec.rb +0 -753
  186. data/spec/unit/query_spec.rb +0 -571
  187. data/spec/unit/repository_spec.rb +0 -93
  188. data/spec/unit/resource_spec.rb +0 -649
  189. data/spec/unit/scope_spec.rb +0 -142
  190. data/spec/unit/transaction_spec.rb +0 -493
  191. data/spec/unit/type_map_spec.rb +0 -114
  192. data/spec/unit/type_spec.rb +0 -119
@@ -1,253 +0,0 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
2
-
3
- # if RUBY_VERSION >= '1.9.0'
4
- # require 'csv'
5
- # else
6
- # gem 'fastercsv', '~>1.4.0'
7
- # require 'fastercsv'
8
- # end
9
-
10
- describe DataMapper::Property do
11
- before do
12
- module ::PropertySpec
13
- class Resource
14
- include DataMapper::Resource
15
- end
16
- end
17
-
18
- @property = PropertySpec::Resource.property :id, DM::Serial
19
- end
20
-
21
- it 'should be serializable with Marshal' do
22
- Marshal.load(Marshal.dump(@property)).should == @property
23
- end
24
- end
25
-
26
- if ADAPTER
27
- describe DataMapper::Property, "with #{ADAPTER}" do
28
- describe " tracking strategies" do
29
- before :all do
30
- class ::Actor
31
- include DataMapper::Resource
32
-
33
- property :id, Serial
34
- property :name, String, :track => :set # :track default is :get for mutable types
35
- property :notes, DataMapper::Types::Text
36
- property :age, Integer # :track default is :set for immutable types
37
- property :rating, Integer
38
- property :location, String
39
- property :lead, TrueClass, :track => :load
40
- property :cv, Object # :track should be :hash
41
- property :agent, String, :track => :hash # :track only Object#hash value on :load.
42
- # Potentially faster, but less safe, so use judiciously, when the odds of a hash-collision are low.
43
- end
44
- end
45
-
46
- before do
47
- Actor.auto_migrate!(ADAPTER)
48
- end
49
-
50
- it "should set up tracking information" do
51
- Actor.properties[:name].track.should == :set
52
- Actor.properties[:location].track.should == :get
53
- Actor.properties[:rating].track.should == :set
54
- Actor.properties[:lead].track.should == :load
55
- Actor.properties[:cv].track.should == :hash
56
- Actor.properties[:agent].track.should == :hash
57
- end
58
-
59
- it "should track on :set" do
60
- repository(ADAPTER) do
61
- bob = Actor.new(:name => 'bob')
62
- bob.save
63
-
64
- bob.original_values.should_not have_key(:name)
65
- bob.dirty?.should == false
66
-
67
- bob.name = "Bob"
68
- bob.original_values.should have_key(:name)
69
- bob.original_values[:name].should == 'bob'
70
- bob.dirty?.should == true
71
- end
72
- end
73
-
74
- it "should track on :get" do
75
- repository(ADAPTER) do
76
- jon = Actor.new(:name => 'jon', :location => 'dallas')
77
- jon.save
78
-
79
- jon.location
80
- jon.original_values.should have_key(:location)
81
- jon.original_values[:location].should == 'dallas'
82
-
83
- jon.dirty?.should be_false
84
- jon.save.should be_true
85
-
86
- jon.location.upcase!
87
- jon.location.should == 'DALLAS'
88
- jon.original_values[:location].should == 'dallas'
89
-
90
- jon.dirty?.should be_true
91
- jon.save.should be_true
92
-
93
- jon.location << '!'
94
- jon.original_values[:location].should == 'DALLAS'
95
- jon.dirty?.should be_true
96
- end
97
- end
98
-
99
- it "should track on :load" do
100
- repository(ADAPTER) do
101
- jan = Actor.create(:name => 'jan', :lead => true)
102
- jan.lead = false
103
- jan.original_values[:lead].should be_true
104
- jan.dirty?.should == true
105
- end
106
- repository(ADAPTER) do
107
- jan = Actor.first
108
- jan.original_values.should have_key(:lead)
109
- jan.original_values[:lead].should be_true
110
- jan.dirty?.should == false
111
- end
112
- end
113
-
114
- it "should track on :hash" do
115
- cv = { 2005 => "Othello" }
116
- repository(ADAPTER) do
117
- tom = Actor.create(:name => 'tom', :cv => cv)
118
- end
119
- repository(ADAPTER) do
120
- tom = Actor.first(:name => 'tom')
121
- tom.cv.merge!({2006 => "Macbeth"})
122
-
123
- tom.original_values.should have_key(:cv)
124
- # tom.original_values[:cv].should == cv.hash
125
- tom.cv.should == { 2005 => "Othello", 2006 => "Macbeth" }
126
- tom.dirty?.should == true
127
- end
128
- end
129
-
130
- it "should track with lazy text fields (#342)" do
131
- repository(ADAPTER) do
132
- tim = Actor.create(:name => 'tim')
133
- end
134
- repository(ADAPTER) do
135
- tim = Actor.first(:name => 'tim')
136
- tim.notes # make sure they're loaded...
137
- tim.dirty?.should be_false
138
- tim.save.should be_true
139
- tim.notes = "Testing"
140
- tim.dirty?.should be_true
141
- tim.save.should be_true
142
- end
143
- repository(ADAPTER) do
144
- tim = Actor.first(:name => 'tim')
145
- tim.notes.should == "Testing"
146
- end
147
- end
148
- end
149
-
150
- describe "lazy loading" do
151
- before :all do
152
- class ::RowBoat
153
- include DataMapper::Resource
154
- property :id, Serial
155
- property :notes, String, :lazy => [:notes]
156
- property :trip_report, String, :lazy => [:notes,:trip]
157
- property :miles, Integer, :lazy => [:trip]
158
- end
159
- end
160
-
161
- before do
162
- RowBoat.auto_migrate!(ADAPTER)
163
-
164
- repository(ADAPTER) do
165
- RowBoat.create(:id => 1, :notes=>'Note',:trip_report=>'Report',:miles=>23)
166
- RowBoat.create(:id => 2, :notes=>'Note',:trip_report=>'Report',:miles=>23)
167
- RowBoat.create(:id => 3, :notes=>'Note',:trip_report=>'Report',:miles=>23)
168
- end
169
- end
170
-
171
- it "should lazy load in context" do
172
- result = repository(ADAPTER) { RowBoat.all.to_a }
173
-
174
- result[0].attribute_loaded?(:notes).should be_false
175
- result[0].attribute_loaded?(:trip_report).should be_false
176
- result[1].attribute_loaded?(:notes).should be_false
177
-
178
- result[0].notes.should_not be_nil
179
-
180
- result[1].attribute_loaded?(:notes).should be_true
181
- result[1].attribute_loaded?(:trip_report).should be_true
182
- result[1].attribute_loaded?(:miles).should be_false
183
-
184
- result = repository(ADAPTER) { RowBoat.all.to_a }
185
-
186
- result[0].attribute_loaded?(:trip_report).should be_false
187
- result[0].attribute_loaded?(:miles).should be_false
188
-
189
- result[1].trip_report.should_not be_nil
190
- result[2].attribute_loaded?(:miles).should be_true
191
- end
192
-
193
- it "should lazy load on Property#set" do
194
- repository(ADAPTER) do
195
- boat = RowBoat.first
196
- boat.attribute_loaded?(:notes).should be_false
197
- boat.notes = 'New Note'
198
- boat.original_values[:notes].should == "Note"
199
- end
200
- end
201
- end
202
-
203
- describe 'defaults' do
204
- before :all do
205
- class ::Catamaran
206
- include DataMapper::Resource
207
- property :id, Serial
208
- property :name, String
209
-
210
- # Boolean
211
- property :could_be_bool0, TrueClass, :default => true
212
- property :could_be_bool1, TrueClass, :default => false
213
- end
214
-
215
- repository(ADAPTER){ Catamaran.auto_migrate!(ADAPTER) }
216
- end
217
-
218
- before :each do
219
- @cat = Catamaran.new
220
- end
221
-
222
- it "should have defaults" do
223
- @cat.could_be_bool0.should == true
224
- @cat.could_be_bool1.should_not be_nil
225
- @cat.could_be_bool1.should == false
226
-
227
- @cat.name = 'Mary Mayweather'
228
-
229
- repository(ADAPTER) do
230
- @cat.save
231
-
232
- cat = Catamaran.first
233
- cat.could_be_bool0.should == true
234
- cat.could_be_bool1.should_not be_nil
235
- cat.could_be_bool1.should == false
236
- cat.destroy
237
- end
238
-
239
- end
240
-
241
- it "should have defaults even with creates" do
242
- repository(ADAPTER) do
243
- Catamaran.create(:name => 'Jingle All The Way')
244
- cat = Catamaran.first
245
- cat.name.should == 'Jingle All The Way'
246
- cat.could_be_bool0.should == true
247
- cat.could_be_bool1.should_not be_nil
248
- cat.could_be_bool1.should == false
249
- end
250
- end
251
- end
252
- end
253
- end