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,32 +0,0 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
2
-
3
- if [ HAS_SQLITE3, HAS_MYSQL, HAS_POSTGRES ].include?(ADAPTER)
4
- describe DataMapper::Adapters::DataObjectsAdapter, "with #{ADAPTER}" do
5
- describe 'a connection' do
6
- before do
7
- @adapter = DataMapper::Repository.adapters[ADAPTER]
8
- @transaction = DataMapper::Transaction.new(@adapter)
9
-
10
- @command = mock('command', :execute_non_query => nil)
11
- @connection = mock('connection', :create_command => @command)
12
- DataObjects::Connection.stub!(:new).and_return(@connection)
13
- end
14
-
15
- it 'should close automatically when no longer needed' do
16
- @connection.should_receive(:close)
17
- @adapter.execute('SELECT 1')
18
- end
19
-
20
- it 'should not close when a current transaction is active' do
21
- @connection.should_receive(:create_command).with('SELECT 1').twice.and_return(@command)
22
- @connection.should_not_receive(:close)
23
-
24
- @transaction.begin
25
- @transaction.within do
26
- @adapter.execute('SELECT 1')
27
- @adapter.execute('SELECT 1')
28
- end
29
- end
30
- end
31
- end
32
- end
@@ -1,46 +0,0 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
2
-
3
- describe "DataMapper::DependencyQueue" do
4
- before :each do
5
- @q = DataMapper::DependencyQueue.new
6
- @dependencies = @q.instance_variable_get("@dependencies")
7
- end
8
-
9
- describe "#add" do
10
- it "should store the supplied callback in @dependencies" do
11
- @q.add('MissingConstant') { true }
12
- @dependencies['MissingConstant'].first.call.should == true
13
- end
14
- end
15
-
16
- describe "#resolve!" do
17
- describe "(when dependency is not defined)" do
18
- it "should not alter @dependencies" do
19
- @q.add('MissingConstant') { true }
20
- old_dependencies = @dependencies.dup
21
- @q.resolve!
22
- old_dependencies.should == @dependencies
23
- end
24
- end
25
-
26
- describe "(when dependency is defined)" do
27
- before :each do
28
- @q.add('MissingConstant') { |klass| klass.instance_variable_set("@resolved", true) } # add before MissingConstant is loaded
29
-
30
- class ::MissingConstant
31
- end
32
- end
33
-
34
- it "should execute stored callbacks" do
35
- @q.resolve!
36
- MissingConstant.instance_variable_get("@resolved").should == true
37
- end
38
-
39
- it "should clear @dependencies" do
40
- @q.resolve!
41
- @dependencies['MissingConstant'].should be_empty
42
- end
43
- end
44
- end
45
-
46
- end
@@ -1,197 +0,0 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
2
-
3
- if ADAPTER
4
- module ::ModelSpec
5
- class STI
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
- property :type, Discriminator
15
- end
16
-
17
- class STIDescendant < STI
18
- end
19
- end
20
-
21
- describe "DataMapper::Model with #{ADAPTER}" do
22
- before do
23
- repository(ADAPTER) do
24
- ModelSpec::STI.auto_migrate!
25
- end
26
-
27
- @planet = DataMapper::Model.new('planet') do
28
- def self.default_repository_name; ADAPTER end
29
- property :name, String, :key => true
30
- property :distance, Integer
31
- end
32
-
33
- @moon = DataMapper::Model.new('moon') do
34
- def self.default_repository_name; ADAPTER end
35
- property :id, DM::Serial
36
- property :name, String
37
- end
38
-
39
- @planet.auto_migrate!(ADAPTER)
40
- @moon.auto_migrate!(ADAPTER)
41
-
42
- repository(ADAPTER) do
43
- @moon.create(:name => "Charon")
44
- @moon.create(:name => "Phobos")
45
- end
46
- end
47
-
48
- describe '.new' do
49
- it 'should be able to persist' do
50
- repository(ADAPTER) do
51
- pluto = @planet.new
52
- pluto.name = 'Pluto'
53
- pluto.distance = 1_000_000
54
- pluto.save
55
-
56
- clone = @planet.get!('Pluto')
57
- clone.name.should == 'Pluto'
58
- clone.distance.should == 1_000_000
59
- end
60
- end
61
- end
62
-
63
- describe ".get" do
64
- include LoggingHelper
65
-
66
- it "should typecast key" do
67
- resource = nil
68
- lambda {
69
- repository(ADAPTER) do
70
- resource = @moon.get("1")
71
- end
72
- }.should_not raise_error
73
- resource.should be_kind_of(DataMapper::Resource)
74
- end
75
-
76
- it "should use the identity map within a repository block" do
77
- logger do |log|
78
- repository(ADAPTER) do
79
- @moon.get("1")
80
- @moon.get(1)
81
- end
82
- log.readlines.size.should == 1
83
- end
84
- end
85
-
86
- it "should not use the identity map outside a repository block" do
87
- logger do |log|
88
- @moon.get(1)
89
- @moon.get(1)
90
- log.readlines.size.should == 2
91
- end
92
- end
93
- end
94
-
95
- describe ".base_model" do
96
- describe "(when called on base model)" do
97
- it "should refer to itself" do
98
- ModelSpec::STI.base_model.should == ModelSpec::STI
99
- end
100
- end
101
- describe "(when called on descendant model)" do
102
- it "should refer to the base model" do
103
- ModelSpec::STIDescendant.base_model.should == ModelSpec::STI.base_model
104
- end
105
- end
106
- end
107
-
108
- it 'should provide #load' do
109
- ModelSpec::STI.should respond_to(:load)
110
- end
111
-
112
- describe '#load' do
113
- it 'should load resources with nil discriminator fields' do
114
- resource = ModelSpec::STI.create(:name => 'resource')
115
- query = ModelSpec::STI.all.query
116
- fields = query.fields
117
-
118
- fields.should == ModelSpec::STI.properties(ADAPTER).slice(:id, :name, :type)
119
-
120
- # would blow up prior to fix
121
- lambda {
122
- ModelSpec::STI.load([ resource.id, resource.name, nil ], query)
123
- }.should_not raise_error(NoMethodError)
124
- end
125
- end
126
-
127
- it { ModelSpec::STI.should respond_to(:copy) }
128
-
129
- ([ :sqlite3, :mysql, :postgres ] - [ ADAPTER ]).each do |alternate|
130
- describe '#copy' do
131
- describe 'between identical models' do
132
- before do
133
- ModelSpec::STI.auto_migrate!(alternate)
134
-
135
- ModelSpec::STI.create(:name => 'Record 1')
136
- ModelSpec::STI.create(:name => 'Record 2')
137
-
138
- # copy from the default to the alternate repository
139
- @return = @resources = ModelSpec::STI.copy(:default, alternate)
140
- end
141
-
142
- it 'should return an Enumerable' do
143
- @return.should be_a_kind_of(Enumerable)
144
- end
145
-
146
- it 'should return Resources' do
147
- @return.each { |r| r.should be_a_kind_of(DataMapper::Resource) }
148
- end
149
-
150
- it 'should have each Resource set to the expected Repository' do
151
- @resources.each { |r| r.repository.name.should == alternate }
152
- end
153
-
154
- it 'should create the Resources in the expected Repository' do
155
- ModelSpec::STI.all(:repository => repository(alternate)).should == @resources
156
- end
157
- end
158
-
159
- describe 'between different models' do
160
- before do
161
- # add an extra property to the alternate model
162
- repository(alternate) do
163
- ModelSpec::STI.property :status, String, :default => 'new'
164
- end
165
-
166
- ModelSpec::STI.auto_migrate!(alternate)
167
-
168
- # add new resources to the alternate repository
169
- repository(alternate) do
170
- ModelSpec::STI.create(:name => 'Record 1')
171
- ModelSpec::STI.create(:name => 'Record 2')
172
- end
173
-
174
- # copy from the alternate to the default repository
175
- @return = @resources = ModelSpec::STI.copy(alternate, :default)
176
- end
177
-
178
- it 'should return an Enumerable' do
179
- @return.should be_a_kind_of(Enumerable)
180
- end
181
-
182
- it 'should return Resources' do
183
- @return.each { |r| r.should be_a_kind_of(DataMapper::Resource) }
184
- end
185
-
186
- it 'should have each Resource set to the expected Repository' do
187
- @resources.each { |r| r.repository.name.should == :default }
188
- end
189
-
190
- it 'should create the Resources in the expected Repository' do
191
- ModelSpec::STI.all.should == @resources
192
- end
193
- end
194
- end
195
- end
196
- end
197
- end
@@ -1,85 +0,0 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
2
-
3
- if HAS_MYSQL
4
- describe DataMapper::Adapters::MysqlAdapter do
5
- before :all do
6
- @adapter = repository(:mysql).adapter
7
- end
8
-
9
- before :all do
10
- class ::Sputnik
11
- include DataMapper::Resource
12
-
13
- property :id, Serial
14
- property :name, DM::Text
15
- property :object, Object
16
-
17
- auto_migrate!(:mysql)
18
- end
19
- end
20
-
21
- it "should handle Object type" do
22
- time = Time.now
23
- repository(:mysql) do
24
- Sputnik.create(:name => "Sputnik", :object => time)
25
- Sputnik.first.object.should == time
26
- end
27
- end
28
-
29
- describe "auto migrating" do
30
- it "#upgrade_model should work" do
31
- @adapter.destroy_model_storage(repository(:mysql), Sputnik)
32
- @adapter.storage_exists?("sputniks").should == false
33
- Sputnik.auto_migrate!(:mysql)
34
- @adapter.storage_exists?("sputniks").should == true
35
- @adapter.field_exists?("sputniks", "new_prop").should == false
36
- Sputnik.property :new_prop, Integer
37
- Sputnik.auto_upgrade!(:mysql)
38
- @adapter.field_exists?("sputniks", "new_prop").should == true
39
- end
40
- end
41
-
42
- describe "querying metadata" do
43
- it "#storage_exists? should return true for tables that exist" do
44
- @adapter.storage_exists?("sputniks").should == true
45
- end
46
-
47
- it "#storage_exists? should return false for tables that don't exist" do
48
- @adapter.storage_exists?("space turds").should == false
49
- end
50
-
51
- it "#field_exists? should return true for columns that exist" do
52
- @adapter.field_exists?("sputniks", "name").should == true
53
- end
54
-
55
- it "#storage_exists? should return false for tables that don't exist" do
56
- @adapter.field_exists?("sputniks", "plur").should == false
57
- end
58
- end
59
-
60
- describe "handling transactions" do
61
- before do
62
- @transaction = DataMapper::Transaction.new(@adapter)
63
- end
64
-
65
- it "should rollback changes when #rollback_transaction is called" do
66
- repository(:mysql) do
67
- @transaction.commit do |trans|
68
- Sputnik.create(:name => 'my pretty sputnik')
69
- trans.rollback
70
- end
71
- Sputnik.all(:name => 'my pretty sputnik').should be_empty
72
- end
73
- end
74
-
75
- it "should commit changes when #commit_transaction is called" do
76
- repository(:mysql) do
77
- @transaction.commit do
78
- Sputnik.create(:name => 'my pretty sputnik')
79
- end
80
- Sputnik.all(:name => 'my pretty sputnik').size.should == 1
81
- end
82
- end
83
- end
84
- end
85
- end