dm-core 0.9.5 → 0.9.6

Sign up to get free protection for your applications and to get access to all the features.
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