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.
- data/Manifest.txt +3 -0
- data/lib/dm-core.rb +14 -20
- data/lib/dm-core/adapters.rb +18 -0
- data/lib/dm-core/adapters/abstract_adapter.rb +17 -10
- data/lib/dm-core/adapters/data_objects_adapter.rb +17 -22
- data/lib/dm-core/adapters/in_memory_adapter.rb +87 -0
- data/lib/dm-core/adapters/mysql_adapter.rb +1 -1
- data/lib/dm-core/adapters/postgres_adapter.rb +2 -2
- data/lib/dm-core/adapters/sqlite3_adapter.rb +1 -1
- data/lib/dm-core/associations.rb +3 -2
- data/lib/dm-core/associations/many_to_many.rb +3 -3
- data/lib/dm-core/associations/one_to_many.rb +10 -2
- data/lib/dm-core/associations/relationship.rb +20 -16
- data/lib/dm-core/auto_migrations.rb +5 -4
- data/lib/dm-core/collection.rb +10 -6
- data/lib/dm-core/dependency_queue.rb +2 -1
- data/lib/dm-core/identity_map.rb +3 -6
- data/lib/dm-core/model.rb +48 -27
- data/lib/dm-core/property.rb +57 -37
- data/lib/dm-core/property_set.rb +29 -22
- data/lib/dm-core/query.rb +57 -49
- data/lib/dm-core/repository.rb +3 -3
- data/lib/dm-core/resource.rb +17 -15
- data/lib/dm-core/scope.rb +7 -7
- data/lib/dm-core/support/kernel.rb +6 -2
- data/lib/dm-core/transaction.rb +7 -7
- data/lib/dm-core/version.rb +1 -1
- data/script/performance.rb +114 -22
- data/spec/integration/association_spec.rb +31 -2
- data/spec/integration/association_through_spec.rb +2 -0
- data/spec/integration/associations/many_to_many_spec.rb +152 -0
- data/spec/integration/associations/one_to_many_spec.rb +40 -3
- data/spec/integration/dependency_queue_spec.rb +0 -12
- data/spec/integration/postgres_adapter_spec.rb +1 -1
- data/spec/integration/property_spec.rb +3 -3
- data/spec/integration/query_spec.rb +39 -8
- data/spec/integration/resource_spec.rb +10 -6
- data/spec/integration/sti_spec.rb +22 -0
- data/spec/integration/strategic_eager_loading_spec.rb +21 -6
- data/spec/integration/type_spec.rb +1 -0
- data/spec/lib/model_loader.rb +10 -1
- data/spec/models/content.rb +16 -0
- data/spec/spec_helper.rb +4 -1
- data/spec/unit/adapters/data_objects_adapter_spec.rb +11 -11
- data/spec/unit/adapters/in_memory_adapter_spec.rb +98 -0
- data/spec/unit/associations/many_to_many_spec.rb +16 -1
- data/spec/unit/model_spec.rb +0 -16
- data/spec/unit/property_set_spec.rb +8 -1
- data/spec/unit/property_spec.rb +476 -240
- data/spec/unit/query_spec.rb +41 -0
- data/spec/unit/resource_spec.rb +75 -56
- data/tasks/ci.rb +4 -36
- data/tasks/dm.rb +3 -3
- metadata +5 -2
data/spec/unit/query_spec.rb
CHANGED
@@ -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
|
data/spec/unit/resource_spec.rb
CHANGED
@@ -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
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
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
|
-
|
64
|
-
|
65
|
-
|
65
|
+
def age
|
66
|
+
attribute_get(:age)
|
67
|
+
end
|
66
68
|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
end
|
69
|
+
def to_s
|
70
|
+
name
|
71
|
+
end
|
72
|
+
end
|
71
73
|
|
72
|
-
|
73
|
-
|
74
|
+
Object.send(:remove_const, :Phone) if defined?(Phone)
|
75
|
+
class Phone
|
76
|
+
include DataMapper::Resource
|
74
77
|
|
75
|
-
|
76
|
-
|
77
|
-
end
|
78
|
+
property :name, String, :key => true
|
79
|
+
property :awesomeness, Integer
|
80
|
+
end
|
78
81
|
|
79
|
-
|
80
|
-
|
82
|
+
Object.send(:remove_const, :Fruit) if defined?(Fruit)
|
83
|
+
class Fruit
|
84
|
+
include DataMapper::Resource
|
81
85
|
|
82
|
-
|
83
|
-
|
84
|
-
end
|
86
|
+
property :id, Integer, :key => true
|
87
|
+
property :name, String
|
88
|
+
end
|
85
89
|
|
86
|
-
|
87
|
-
|
90
|
+
Object.send(:remove_const, :Grain) if defined?(Grain)
|
91
|
+
class Grain
|
92
|
+
include DataMapper::Resource
|
88
93
|
|
89
|
-
|
90
|
-
|
91
|
-
end
|
94
|
+
property :id, Serial
|
95
|
+
property :name, String, :default => 'wheat'
|
96
|
+
end
|
92
97
|
|
93
|
-
|
94
|
-
|
98
|
+
Object.send(:remove_const, :Vegetable) if defined?(Vegetable)
|
99
|
+
class Vegetable
|
100
|
+
include DataMapper::Resource
|
95
101
|
|
96
|
-
|
97
|
-
|
98
|
-
end
|
102
|
+
property :id, Serial
|
103
|
+
property :name, String
|
104
|
+
end
|
99
105
|
|
100
|
-
|
101
|
-
|
102
|
-
|
106
|
+
Object.send(:remove_const, :Banana) if defined?(Banana)
|
107
|
+
class Banana < Fruit
|
108
|
+
property :type, Discriminator
|
109
|
+
end
|
103
110
|
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
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
|
-
|
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 =>
|
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(
|
14
|
-
t.spec_opts = ["--format", "specdoc", "--format", "html:#{ROOT}/ci/
|
15
|
-
t.spec_files = Pathname.glob(ROOT +
|
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
|
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
|
28
|
+
unit_specs = ROOT + 'spec/unit/**/*_spec.rb'
|
29
29
|
integration_specs = ROOT + 'spec/integration/**/*_spec.rb'
|
30
|
-
all_specs
|
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.
|
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-
|
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
|