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,163 +0,0 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'spec_helper'))
2
-
3
- if ADAPTER
4
- module ManyToOneSpec
5
- class Parent
6
- include DataMapper::Resource
7
-
8
- def self.default_repository_name
9
- ADAPTER
10
- end
11
-
12
- property :id, Serial
13
- property :name, String
14
- end
15
-
16
- class Child
17
- include DataMapper::Resource
18
-
19
- def self.default_repository_name
20
- ADAPTER
21
- end
22
-
23
- property :id, Serial
24
- property :name, String
25
- property :type, Discriminator
26
-
27
- belongs_to :parent
28
- end
29
-
30
- class StepChild < Child
31
- end
32
- end
33
-
34
- describe DataMapper::Associations::ManyToOne::Proxy do
35
- before do
36
- [ ManyToOneSpec::Parent, ManyToOneSpec::Child ].each { |model| model.auto_migrate! }
37
-
38
- repository(ADAPTER) do
39
- @parent = ManyToOneSpec::Parent.create(:name => 'parent')
40
- @child = ManyToOneSpec::Child.create(:name => 'child', :parent => @parent)
41
- @other = ManyToOneSpec::Parent.create(:name => 'other parent')
42
- @step_child = ManyToOneSpec::StepChild.create(:name => 'step child', :parent => @other)
43
- @association = @child.parent
44
- end
45
- end
46
-
47
- describe "#association_accessor (STI)" do
48
- include LoggingHelper
49
-
50
- it "should set parent" do
51
- ManyToOneSpec::StepChild.first(:id => @step_child.id).parent.should == @other
52
- end
53
-
54
- it "should use the identity map for STI" do
55
- repository(ADAPTER) do |r|
56
- parent = ManyToOneSpec::Parent.first(:id => @parent.id)
57
- child = ManyToOneSpec::Child.first(:id => @child.id)
58
- step_child = ManyToOneSpec::StepChild.first(:id => @step_child.id)
59
- logger do |log|
60
- # should retrieve from the IdentityMap
61
- child.parent.should equal(parent)
62
-
63
- # should retrieve from the datasource
64
- other = step_child.parent
65
-
66
- # should retrieve from the IdentityMap
67
- step_child.parent.should == @other
68
- step_child.parent.object_id.should == other.object_id
69
-
70
- log.readlines.size.should == 1
71
- end
72
- end
73
- end
74
- end
75
-
76
- describe '#replace' do
77
- it 'should remove the resource from the collection' do
78
- @association.should == @parent
79
- @association.replace(@other)
80
- @association.should == @other
81
- end
82
-
83
- it 'should not automatically save that the resource was removed from the association' do
84
- @association.replace(@other)
85
- @child.reload.parent.should == @parent
86
- end
87
-
88
- it 'should return the association' do
89
- @association.replace(@other).object_id.should == @association.object_id
90
- end
91
- end
92
-
93
- describe '#save' do
94
- describe 'when the parent is nil' do
95
- before do
96
- @association.replace(nil)
97
- end
98
-
99
- it 'should not save the parent' do
100
- @association.save
101
- end
102
-
103
- it 'should return false' do
104
- @association.save.should == false
105
- end
106
- end
107
-
108
- describe 'when the parent is not a new record' do
109
- before do
110
- @parent.should_not be_new_record
111
- @child.should_not be_new_record
112
- end
113
-
114
- it 'should not save the parent' do
115
- @parent.should_not_receive(:save)
116
- @association.save
117
- end
118
-
119
- it 'should return true' do
120
- @association.save.should == true
121
- end
122
-
123
- it "should return true to the child" do
124
- @child.save.should == true
125
- end
126
- end
127
-
128
- describe 'when the parent is a new record' do
129
- before do
130
- @parent = ManyToOneSpec::Parent.new(:name => 'unsaved parent')
131
- @parent.should be_new_record
132
- @association.replace(@parent)
133
- end
134
-
135
- it 'should save the parent' do
136
- @association.save
137
- @parent.should_not be_new_record
138
- end
139
-
140
- it 'should return the result of the save' do
141
- @association.save.should == true
142
- end
143
- end
144
- end
145
-
146
- describe '#reload' do
147
- before do
148
- @child.parent_id.should == @parent.id
149
- @association.replace(@other)
150
- end
151
-
152
- it 'should not change the foreign key in the child' do
153
- @child.parent_id.should == @other.id
154
- @association.reload
155
- @child.parent_id.should == @other.id
156
- end
157
-
158
- it 'should return self' do
159
- @association.reload.object_id.should == @association.object_id
160
- end
161
- end
162
- end
163
- end
@@ -1,188 +0,0 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'spec_helper'))
2
- require 'pp'
3
- describe "OneToMany" do
4
- before(:all) do
5
- class ::Team
6
- include DataMapper::Resource
7
-
8
- def self.default_repository_name; ADAPTER end
9
-
10
- property :id, Serial
11
- property :name, String
12
- property :class_type, Discriminator
13
-
14
- has n, :players
15
- end
16
-
17
- class ::BaseballTeam < Team
18
- end
19
-
20
- class ::Player
21
- include DataMapper::Resource
22
-
23
- def self.default_repository_name; ADAPTER end
24
-
25
- property :id, Serial
26
- property :name, String
27
-
28
- belongs_to :team
29
- end
30
-
31
- [Team, Player].each { |k| k.auto_migrate!(ADAPTER) }
32
-
33
- Team.create(:name => "Cowboys")
34
- BaseballTeam.create(:name => "Giants")
35
- end
36
-
37
- describe "(saved parent, saved child)" do
38
- before(:each) do
39
- @dc_united = Team.create
40
- @emilio = Player.create(:team => @dc_united)
41
- end
42
-
43
- it "child association should return parent" do
44
- @emilio.team.should == @dc_united
45
- end
46
-
47
- it "parent association should return children" do
48
- @dc_united.players.should == [@emilio]
49
- end
50
- end
51
-
52
- describe "(saved parent, unsaved child)" do
53
- before(:each) do
54
- @dc_united = Team.create
55
- @emilio = Player.new(:team => @dc_united)
56
- end
57
-
58
- it "child association should return parent" do
59
- @emilio.team.should == @dc_united
60
- end
61
-
62
- it "parent association should return children" do
63
- pending("DataMapper does not yet support in-memory associations") do
64
- @dc_united.players.should == [@emilio]
65
- end
66
- end
67
- end
68
-
69
- describe "(unsaved parent, saved child)" do
70
- before(:each) do
71
- @dc_united = Team.new
72
- @emilio = Player.create(:team => @dc_united)
73
- end
74
-
75
- it "child association should return parent" do
76
- @emilio.team.should == @dc_united
77
- end
78
-
79
- it "parent association should return children" do
80
- @dc_united.players.should == [@emilio]
81
- end
82
-
83
- it "should return true to child.save" do
84
- @emilio.should_not be_a_new_record
85
- @emilio.save.should be_true
86
- end
87
- end
88
-
89
- describe "(unsaved parent, unsaved child)" do
90
- before(:each) do
91
- @dc_united = Team.new
92
- @emilio = Player.new(:team => @dc_united)
93
- end
94
-
95
- it "child association should return parent" do
96
- @emilio.team.should == @dc_united
97
- end
98
-
99
- it "parent association should return children" do
100
- pending("DataMapper does not yet support in-memory associations") do
101
- @dc_united.players.should == [@emilio]
102
- end
103
- end
104
- end
105
-
106
- describe "parent initialized child" do
107
- before(:each) do
108
- @ajax = Team.create
109
- @vandesar = @ajax.players.new
110
- @vandesar.save
111
- end
112
-
113
- it "child association should return parent" do
114
- @vandesar.team.should == @ajax
115
- end
116
-
117
- it "parent association should return children" do
118
- @ajax.players.should == [@vandesar]
119
- end
120
- end
121
-
122
- it "unsaved parent model should accept array of hashes for association" do
123
- players = [{ :name => "Brett Favre" }, { :name => "Reggie White" }]
124
-
125
- team = Team.new(:name => "Packers", :players => players)
126
- team.players.zip(players) do |player, values|
127
- player.should be_an_instance_of(Player)
128
- values.each { |k, v| player.send(k).should == v }
129
- end
130
-
131
- players = team.players
132
- team.save
133
-
134
- repository(ADAPTER) do
135
- Team.get(3).players.should == players
136
- end
137
- end
138
-
139
- it "saved parent model should accept array of hashes for association" do
140
- players = [{ :name => "Troy Aikman" }, { :name => "Chad Hennings" }]
141
-
142
- team = Team.get(1)
143
- team.players = players
144
- team.players.zip(players) do |player, values|
145
- player.should be_an_instance_of(Player)
146
- values.each { |k, v| player.send(k).should == v }
147
- end
148
-
149
- players = team.players
150
- team.save
151
-
152
- repository(ADAPTER) do
153
- Team.get(1).players.should == players
154
- end
155
- end
156
-
157
- describe "STI" do
158
- before(:all) do
159
- repository(ADAPTER) do
160
- @player = Player.create(:name => "Barry Bonds", :team => BaseballTeam.first)
161
- end
162
- end
163
-
164
- it "should work for child.parent" do
165
- repository(ADAPTER) do
166
- @player.team.should == BaseballTeam.first
167
- end
168
- end
169
-
170
- it "should work for parent.children" do
171
- repository(ADAPTER) do
172
- team = BaseballTeam.first
173
-
174
- team.players.size.should > 0
175
- team.players.each{|p| p.should be_an_instance_of(Player)}
176
- end
177
- end
178
- end
179
-
180
- describe "alone" do
181
- it "should work for parent.children without any parents in IM" do
182
- repository(ADAPTER) do
183
- team = BaseballTeam.first
184
- team.players.each{|p| p.should be_an_instance_of(Player)}
185
- end
186
- end
187
- end
188
- end