dm-core 0.9.5 → 0.9.6

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 (54) hide show
  1. data/Manifest.txt +3 -0
  2. data/lib/dm-core.rb +14 -20
  3. data/lib/dm-core/adapters.rb +18 -0
  4. data/lib/dm-core/adapters/abstract_adapter.rb +17 -10
  5. data/lib/dm-core/adapters/data_objects_adapter.rb +17 -22
  6. data/lib/dm-core/adapters/in_memory_adapter.rb +87 -0
  7. data/lib/dm-core/adapters/mysql_adapter.rb +1 -1
  8. data/lib/dm-core/adapters/postgres_adapter.rb +2 -2
  9. data/lib/dm-core/adapters/sqlite3_adapter.rb +1 -1
  10. data/lib/dm-core/associations.rb +3 -2
  11. data/lib/dm-core/associations/many_to_many.rb +3 -3
  12. data/lib/dm-core/associations/one_to_many.rb +10 -2
  13. data/lib/dm-core/associations/relationship.rb +20 -16
  14. data/lib/dm-core/auto_migrations.rb +5 -4
  15. data/lib/dm-core/collection.rb +10 -6
  16. data/lib/dm-core/dependency_queue.rb +2 -1
  17. data/lib/dm-core/identity_map.rb +3 -6
  18. data/lib/dm-core/model.rb +48 -27
  19. data/lib/dm-core/property.rb +57 -37
  20. data/lib/dm-core/property_set.rb +29 -22
  21. data/lib/dm-core/query.rb +57 -49
  22. data/lib/dm-core/repository.rb +3 -3
  23. data/lib/dm-core/resource.rb +17 -15
  24. data/lib/dm-core/scope.rb +7 -7
  25. data/lib/dm-core/support/kernel.rb +6 -2
  26. data/lib/dm-core/transaction.rb +7 -7
  27. data/lib/dm-core/version.rb +1 -1
  28. data/script/performance.rb +114 -22
  29. data/spec/integration/association_spec.rb +31 -2
  30. data/spec/integration/association_through_spec.rb +2 -0
  31. data/spec/integration/associations/many_to_many_spec.rb +152 -0
  32. data/spec/integration/associations/one_to_many_spec.rb +40 -3
  33. data/spec/integration/dependency_queue_spec.rb +0 -12
  34. data/spec/integration/postgres_adapter_spec.rb +1 -1
  35. data/spec/integration/property_spec.rb +3 -3
  36. data/spec/integration/query_spec.rb +39 -8
  37. data/spec/integration/resource_spec.rb +10 -6
  38. data/spec/integration/sti_spec.rb +22 -0
  39. data/spec/integration/strategic_eager_loading_spec.rb +21 -6
  40. data/spec/integration/type_spec.rb +1 -0
  41. data/spec/lib/model_loader.rb +10 -1
  42. data/spec/models/content.rb +16 -0
  43. data/spec/spec_helper.rb +4 -1
  44. data/spec/unit/adapters/data_objects_adapter_spec.rb +11 -11
  45. data/spec/unit/adapters/in_memory_adapter_spec.rb +98 -0
  46. data/spec/unit/associations/many_to_many_spec.rb +16 -1
  47. data/spec/unit/model_spec.rb +0 -16
  48. data/spec/unit/property_set_spec.rb +8 -1
  49. data/spec/unit/property_spec.rb +476 -240
  50. data/spec/unit/query_spec.rb +41 -0
  51. data/spec/unit/resource_spec.rb +75 -56
  52. data/tasks/ci.rb +4 -36
  53. data/tasks/dm.rb +3 -3
  54. metadata +5 -2
@@ -482,6 +482,47 @@ describe DataMapper::Query do
482
482
  @query.reverse!.object_id.should == @query.object_id
483
483
  end
484
484
  end
485
+
486
+ describe 'inheritance properties' do
487
+ before(:each) do
488
+ class Parent
489
+ include DataMapper::Resource
490
+ property :id, Serial
491
+ property :type, Discriminator
492
+ end
493
+ @query = DataMapper::Query.new(@repository, Parent)
494
+ @other_query = DataMapper::Query.new(@repository, Article)
495
+ end
496
+
497
+ it 'should provide #inheritance_property' do
498
+ @query.should respond_to(:inheritance_property)
499
+ end
500
+
501
+ describe '#inheritance_property' do
502
+ it 'should return a Property object if there is a Discriminator field' do
503
+ @query.inheritance_property.should be_kind_of(DataMapper::Property)
504
+ @query.inheritance_property.name.should == :type
505
+ @query.inheritance_property.type.should == DM::Discriminator
506
+ end
507
+
508
+ it 'should return nil if there is no Discriminator field' do
509
+ @other_query.inheritance_property.should be_nil
510
+ end
511
+ end
512
+
513
+ it 'should provide #inheritance_property_index' do
514
+ @query.should respond_to(:inheritance_property_index)
515
+ end
516
+
517
+ describe '#inheritance_property_index' do
518
+ it 'should return integer index if there is a Discriminator field' do
519
+ @query.inheritance_property_index.should be_kind_of(Integer)
520
+ @query.inheritance_property_index.should == 1
521
+ end
522
+
523
+ it 'should return nil if there is no Discriminator field'
524
+ end
525
+ end
485
526
  end
486
527
 
487
528
  describe DataMapper::Query::Operator do
@@ -41,80 +41,91 @@ describe DataMapper::Resource do
41
41
  end
42
42
  end
43
43
 
44
-
45
44
  # ---------- Old specs... BOOOOOOOOOO ---------------
46
45
 
47
- class Planet
48
- include DataMapper::Resource
49
-
50
- storage_names[:legacy] = "dying_planets"
51
-
52
- property :id, Integer, :key => true
53
- property :name, String
54
- property :age, Integer
55
- property :core, String, :accessor => :private
56
- property :type, Discriminator
57
- property :data, Object
58
-
59
- repository(:legacy) do
60
- property :cowabunga, String
61
- end
46
+ describe DataMapper::Resource do
47
+ before(:each) do
48
+ Object.send(:remove_const, :Planet) if defined?(Planet)
49
+ class Planet
50
+ include DataMapper::Resource
51
+
52
+ storage_names[:legacy] = "dying_planets"
53
+
54
+ property :id, Integer, :key => true
55
+ property :name, String
56
+ property :age, Integer
57
+ property :core, String, :accessor => :private
58
+ property :type, Discriminator
59
+ property :data, Object, :track => :get
60
+
61
+ repository(:legacy) do
62
+ property :cowabunga, String
63
+ end
62
64
 
63
- def age
64
- attribute_get(:age)
65
- end
65
+ def age
66
+ attribute_get(:age)
67
+ end
66
68
 
67
- def to_s
68
- name
69
- end
70
- end
69
+ def to_s
70
+ name
71
+ end
72
+ end
71
73
 
72
- class Phone
73
- include DataMapper::Resource
74
+ Object.send(:remove_const, :Phone) if defined?(Phone)
75
+ class Phone
76
+ include DataMapper::Resource
74
77
 
75
- property :name, String, :key => true
76
- property :awesomeness, Integer
77
- end
78
+ property :name, String, :key => true
79
+ property :awesomeness, Integer
80
+ end
78
81
 
79
- class Fruit
80
- include DataMapper::Resource
82
+ Object.send(:remove_const, :Fruit) if defined?(Fruit)
83
+ class Fruit
84
+ include DataMapper::Resource
81
85
 
82
- property :id, Integer, :key => true
83
- property :name, String
84
- end
86
+ property :id, Integer, :key => true
87
+ property :name, String
88
+ end
85
89
 
86
- class Grain
87
- include DataMapper::Resource
90
+ Object.send(:remove_const, :Grain) if defined?(Grain)
91
+ class Grain
92
+ include DataMapper::Resource
88
93
 
89
- property :id, Serial
90
- property :name, String, :default => 'wheat'
91
- end
94
+ property :id, Serial
95
+ property :name, String, :default => 'wheat'
96
+ end
92
97
 
93
- class Vegetable
94
- include DataMapper::Resource
98
+ Object.send(:remove_const, :Vegetable) if defined?(Vegetable)
99
+ class Vegetable
100
+ include DataMapper::Resource
95
101
 
96
- property :id, Serial
97
- property :name, String
98
- end
102
+ property :id, Serial
103
+ property :name, String
104
+ end
99
105
 
100
- class Banana < Fruit
101
- property :type, Discriminator
102
- end
106
+ Object.send(:remove_const, :Banana) if defined?(Banana)
107
+ class Banana < Fruit
108
+ property :type, Discriminator
109
+ end
103
110
 
104
- class Cyclist
105
- include DataMapper::Resource
106
- property :id, Integer, :serial => true
107
- property :victories, Integer
108
- end
111
+ Object.send(:remove_const, :Cyclist) if defined?(Cyclist)
112
+ class Cyclist
113
+ include DataMapper::Resource
114
+ property :id, Serial
115
+ property :victories, Integer
116
+ end
109
117
 
110
- describe DataMapper::Resource do
118
+ Fruit.auto_migrate!
119
+ Planet.auto_migrate!
120
+ Cyclist.auto_migrate!
121
+ end
111
122
 
112
123
  it 'should provide #save' do
113
124
  Planet.new.should respond_to(:save)
114
125
  end
115
126
 
116
127
  describe '#save' do
117
- before do
128
+ before(:each) do
118
129
  @adapter = repository(:default).adapter
119
130
  end
120
131
 
@@ -163,11 +174,19 @@ describe DataMapper::Resource do
163
174
  resource.should be_new_record
164
175
  resource.model.key.any? { |p| p.serial? }.should be_false
165
176
 
166
- @adapter.should_not_receive(:create)
167
-
168
177
  resource.save.should be_false
169
178
  end
170
179
 
180
+ it 'should return true even if the object is not dirty' do
181
+ resource = Cyclist.new
182
+ resource.victories = "0 victories"
183
+ resource.save.should be_true
184
+
185
+ resource.should_not be_dirty
186
+ resource.should_not be_new_record
187
+ resource.save.should be_true
188
+ end
189
+
171
190
  describe 'for integer fields' do
172
191
 
173
192
  it "should save strings without digits as nil" do
@@ -350,7 +369,7 @@ describe DataMapper::Resource do
350
369
  end
351
370
 
352
371
  it "should not mark attributes dirty if they are similar after typecasting" do
353
- jupiter = Planet.new(:name => 'Jupiter', :age => 1_000_000, :id => 42, :type => nil)
372
+ jupiter = Planet.new(:name => 'Jupiter', :age => 1_000_000, :id => 42, :type => Planet)
354
373
  jupiter.save.should be_true
355
374
  jupiter.dirty?.should be_false
356
375
 
data/tasks/ci.rb CHANGED
@@ -10,9 +10,9 @@ namespace :ci do
10
10
  mkdir_p ROOT + "ci/token"
11
11
  end
12
12
 
13
- Spec::Rake::SpecTask.new("spec:unit" => :prepare) do |t|
14
- t.spec_opts = ["--format", "specdoc", "--format", "html:#{ROOT}/ci/unit_rspec_report.html", "--diff"]
15
- t.spec_files = Pathname.glob(ROOT + "spec/unit/**/*_spec.rb")
13
+ Spec::Rake::SpecTask.new(:spec => :prepare) do |t|
14
+ t.spec_opts = ["--colour", "--format", "specdoc", "--format", "html:#{ROOT}/ci/rspec_report.html", "--diff"]
15
+ t.spec_files = Pathname.glob((ROOT + 'spec/**/*_spec.rb').to_s)
16
16
  unless ENV['NO_RCOV']
17
17
  t.rcov = true
18
18
  t.rcov_opts << '--exclude' << "spec,gems"
@@ -22,26 +22,6 @@ namespace :ci do
22
22
  end
23
23
  end
24
24
 
25
- Spec::Rake::SpecTask.new("spec:integration" => :prepare) do |t|
26
- t.spec_opts = ["--format", "specdoc", "--format", "html:#{ROOT}/ci/integration_rspec_report.html", "--diff"]
27
- t.spec_files = Pathname.glob(ROOT + "spec/integration/**/*_spec.rb")
28
- unless ENV['NO_RCOV']
29
- t.rcov = true
30
- t.rcov_opts << '--exclude' << "spec,gems"
31
- t.rcov_opts << '--text-summary'
32
- t.rcov_opts << '--sort' << 'coverage' << '--sort-reverse'
33
- t.rcov_opts << '--only-uncovered'
34
- end
35
- end
36
-
37
- task :spec do
38
- Rake::Task["ci:spec:unit"].invoke
39
- mv ROOT + "coverage", ROOT + "ci/unit_coverage"
40
-
41
- Rake::Task["ci:spec:integration"].invoke
42
- mv ROOT + "coverage", ROOT + "ci/integration_coverage"
43
- end
44
-
45
25
  task :saikuro => :prepare do
46
26
  system "saikuro -c -i lib -y 0 -w 10 -e 15 -o ci/cyclomatic"
47
27
  mv 'ci/cyclomatic/index_cyclo.html', 'ci/cyclomatic/index.html'
@@ -50,19 +30,7 @@ namespace :ci do
50
30
  mv 'ci/token/index_token.html', 'ci/token/index.html'
51
31
  end
52
32
 
53
- task :publish do
54
- out = ENV['CC_BUILD_ARTIFACTS'] || "out"
55
- mkdir_p out unless File.directory? out
56
-
57
- mv "ci/unit_rspec_report.html", "#{out}/unit_rspec_report.html"
58
- mv "ci/unit_coverage", "#{out}/unit_coverage"
59
- mv "ci/integration_rspec_report.html", "#{out}/integration_rspec_report.html"
60
- mv "ci/integration_coverage", "#{out}/integration_coverage"
61
- mv "ci/doc", "#{out}/doc"
62
- mv "ci/cyclomatic", "#{out}/cyclomatic_complexity"
63
- mv "ci/token", "#{out}/token_complexity"
64
- end
65
33
  end
66
34
 
67
35
  #task :ci => %w[ ci:spec ci:doc ci:saikuro install ci:publish ] # yard-related tasks do not work yet
68
- task :ci => %w[ ci:spec ci:saikuro install ]
36
+ task :ci => %w[ ci:spec ]
data/tasks/dm.rb CHANGED
@@ -16,7 +16,7 @@ namespace :dm do
16
16
  def run_spec(name, files, rcov)
17
17
  Spec::Rake::SpecTask.new(name) do |t|
18
18
  t.spec_opts << '--colour' << '--loadby' << 'random'
19
- t.spec_files = Pathname.glob(ENV['FILES'] || files)
19
+ t.spec_files = Pathname.glob(ENV['FILES'] || files.to_s)
20
20
  t.rcov = rcov
21
21
  t.rcov_opts << '--exclude' << 'spec,environment.rb'
22
22
  t.rcov_opts << '--text-summary'
@@ -25,9 +25,9 @@ namespace :dm do
25
25
  end
26
26
  end
27
27
 
28
- unit_specs = ROOT + 'spec/unit/**/*_spec.rb'
28
+ unit_specs = ROOT + 'spec/unit/**/*_spec.rb'
29
29
  integration_specs = ROOT + 'spec/integration/**/*_spec.rb'
30
- all_specs = ROOT + 'spec/**/*_spec.rb'
30
+ all_specs = ROOT + 'spec/**/*_spec.rb'
31
31
 
32
32
  desc "Run all specifications"
33
33
  run_spec('spec', all_specs, false)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dm-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.5
4
+ version: 0.9.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sam Smoot
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-08-26 00:00:00 -05:00
12
+ date: 2008-10-12 00:00:00 -06:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -79,6 +79,7 @@ files:
79
79
  - lib/dm-core/adapters.rb
80
80
  - lib/dm-core/adapters/abstract_adapter.rb
81
81
  - lib/dm-core/adapters/data_objects_adapter.rb
82
+ - lib/dm-core/adapters/in_memory_adapter.rb
82
83
  - lib/dm-core/adapters/mysql_adapter.rb
83
84
  - lib/dm-core/adapters/postgres_adapter.rb
84
85
  - lib/dm-core/adapters/sqlite3_adapter.rb
@@ -152,6 +153,7 @@ files:
152
153
  - spec/lib/mock_adapter.rb
153
154
  - spec/lib/model_loader.rb
154
155
  - spec/lib/publicize_methods.rb
156
+ - spec/models/content.rb
155
157
  - spec/models/vehicles.rb
156
158
  - spec/models/zoo.rb
157
159
  - spec/spec.opts
@@ -159,6 +161,7 @@ files:
159
161
  - spec/unit/adapters/abstract_adapter_spec.rb
160
162
  - spec/unit/adapters/adapter_shared_spec.rb
161
163
  - spec/unit/adapters/data_objects_adapter_spec.rb
164
+ - spec/unit/adapters/in_memory_adapter_spec.rb
162
165
  - spec/unit/adapters/postgres_adapter_spec.rb
163
166
  - spec/unit/associations/many_to_many_spec.rb
164
167
  - spec/unit/associations/many_to_one_spec.rb