sam-dm-core 0.9.10 → 0.9.11
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +18 -0
- data/History.txt +10 -0
- data/MIT-LICENSE +1 -1
- data/Rakefile +4 -4
- data/dm-core.gemspec +40 -0
- data/lib/dm-core.rb +1 -1
- data/lib/dm-core/adapters/data_objects_adapter.rb +2 -2
- 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 +1 -1
- data/lib/dm-core/adapters/sqlite3_adapter.rb +1 -1
- data/lib/dm-core/associations/many_to_one.rb +1 -1
- data/lib/dm-core/associations/one_to_many.rb +18 -18
- data/lib/dm-core/associations/relationship.rb +9 -3
- data/lib/dm-core/associations/relationship_chain.rb +1 -1
- data/lib/dm-core/collection.rb +3 -3
- data/lib/dm-core/model.rb +5 -4
- data/lib/dm-core/resource.rb +11 -5
- data/lib/dm-core/version.rb +1 -1
- data/script/all +3 -4
- data/spec/integration/association_spec.rb +18 -18
- data/spec/integration/association_through_spec.rb +4 -4
- data/spec/integration/associations/many_to_many_spec.rb +9 -9
- data/spec/integration/associations/many_to_one_spec.rb +1 -1
- data/spec/integration/associations/one_to_many_spec.rb +3 -3
- data/spec/integration/collection_spec.rb +2 -2
- data/spec/integration/dependency_queue_spec.rb +1 -1
- data/spec/integration/model_spec.rb +1 -1
- data/spec/integration/mysql_adapter_spec.rb +1 -1
- data/spec/integration/postgres_adapter_spec.rb +16 -16
- data/spec/integration/property_spec.rb +10 -6
- data/spec/integration/query_spec.rb +4 -4
- data/spec/integration/repository_spec.rb +1 -1
- data/spec/integration/sqlite3_adapter_spec.rb +7 -7
- data/spec/integration/sti_spec.rb +6 -6
- data/spec/integration/strategic_eager_loading_spec.rb +14 -11
- data/spec/integration/type_spec.rb +10 -6
- data/spec/lib/logging_helper.rb +11 -11
- data/spec/models/content.rb +16 -0
- data/spec/spec_helper.rb +8 -4
- data/spec/unit/adapters/data_objects_adapter_spec.rb +9 -5
- data/spec/unit/adapters/in_memory_adapter_spec.rb +98 -0
- data/spec/unit/adapters/postgres_adapter_spec.rb +5 -5
- data/spec/unit/associations/many_to_many_spec.rb +2 -2
- data/spec/unit/associations/many_to_one_spec.rb +3 -3
- data/spec/unit/associations/one_to_many_spec.rb +2 -2
- data/spec/unit/associations/relationship_spec.rb +6 -6
- data/spec/unit/associations_spec.rb +21 -21
- data/spec/unit/identity_map_spec.rb +3 -3
- data/spec/unit/is_spec.rb +7 -7
- data/spec/unit/property_spec.rb +7 -7
- data/spec/unit/resource_spec.rb +12 -12
- data/spec/unit/transaction_spec.rb +1 -1
- data/tasks/dm.rb +1 -1
- metadata +10 -5
data/.gitignore
ADDED
data/History.txt
CHANGED
data/MIT-LICENSE
CHANGED
data/Rakefile
CHANGED
@@ -9,12 +9,12 @@ require 'lib/dm-core/version'
|
|
9
9
|
|
10
10
|
ROOT = Pathname(__FILE__).dirname.expand_path
|
11
11
|
|
12
|
-
AUTHOR = "
|
13
|
-
EMAIL = "
|
12
|
+
AUTHOR = "Dan Kubb"
|
13
|
+
EMAIL = "dan.kubb@gmail.com"
|
14
14
|
GEM_NAME = "dm-core"
|
15
15
|
GEM_VERSION = DataMapper::VERSION
|
16
|
-
GEM_DEPENDENCIES = ["data_objects", "~>0.9.
|
17
|
-
["extlib", "~>0.9.
|
16
|
+
GEM_DEPENDENCIES = ["data_objects", "~>0.9.11"],
|
17
|
+
["extlib", "~>0.9.11"],
|
18
18
|
["addressable", "~>2.0.1"]
|
19
19
|
|
20
20
|
PROJECT_NAME = "datamapper"
|
data/dm-core.gemspec
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{dm-core}
|
5
|
+
s.version = "0.9.11"
|
6
|
+
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = ["Dan Kubb"]
|
9
|
+
s.date = %q{2009-01-19}
|
10
|
+
s.description = %q{Faster, Better, Simpler.}
|
11
|
+
s.email = ["dan.kubb@gmail.com"]
|
12
|
+
s.extra_rdoc_files = ["History.txt", "Manifest.txt", "README.txt"]
|
13
|
+
s.files = [".autotest", ".gitignore", "CONTRIBUTING", "FAQ", "History.txt", "MIT-LICENSE", "Manifest.txt", "QUICKLINKS", "README.txt", "Rakefile", "SPECS", "TODO", "dm-core.gemspec", "lib/dm-core.rb", "lib/dm-core/adapters.rb", "lib/dm-core/adapters/abstract_adapter.rb", "lib/dm-core/adapters/data_objects_adapter.rb", "lib/dm-core/adapters/in_memory_adapter.rb", "lib/dm-core/adapters/mysql_adapter.rb", "lib/dm-core/adapters/postgres_adapter.rb", "lib/dm-core/adapters/sqlite3_adapter.rb", "lib/dm-core/associations.rb", "lib/dm-core/associations/many_to_many.rb", "lib/dm-core/associations/many_to_one.rb", "lib/dm-core/associations/one_to_many.rb", "lib/dm-core/associations/one_to_one.rb", "lib/dm-core/associations/relationship.rb", "lib/dm-core/associations/relationship_chain.rb", "lib/dm-core/auto_migrations.rb", "lib/dm-core/collection.rb", "lib/dm-core/dependency_queue.rb", "lib/dm-core/hook.rb", "lib/dm-core/identity_map.rb", "lib/dm-core/is.rb", "lib/dm-core/logger.rb", "lib/dm-core/migrations/destructive_migrations.rb", "lib/dm-core/migrator.rb", "lib/dm-core/model.rb", "lib/dm-core/naming_conventions.rb", "lib/dm-core/property.rb", "lib/dm-core/property_set.rb", "lib/dm-core/query.rb", "lib/dm-core/repository.rb", "lib/dm-core/resource.rb", "lib/dm-core/scope.rb", "lib/dm-core/support.rb", "lib/dm-core/support/array.rb", "lib/dm-core/support/assertions.rb", "lib/dm-core/support/errors.rb", "lib/dm-core/support/kernel.rb", "lib/dm-core/support/symbol.rb", "lib/dm-core/transaction.rb", "lib/dm-core/type.rb", "lib/dm-core/type_map.rb", "lib/dm-core/types.rb", "lib/dm-core/types/boolean.rb", "lib/dm-core/types/discriminator.rb", "lib/dm-core/types/object.rb", "lib/dm-core/types/paranoid_boolean.rb", "lib/dm-core/types/paranoid_datetime.rb", "lib/dm-core/types/serial.rb", "lib/dm-core/types/text.rb", "lib/dm-core/version.rb", "script/all", "script/performance.rb", "script/profile.rb", "spec/integration/association_spec.rb", "spec/integration/association_through_spec.rb", "spec/integration/associations/many_to_many_spec.rb", "spec/integration/associations/many_to_one_spec.rb", "spec/integration/associations/one_to_many_spec.rb", "spec/integration/auto_migrations_spec.rb", "spec/integration/collection_spec.rb", "spec/integration/data_objects_adapter_spec.rb", "spec/integration/dependency_queue_spec.rb", "spec/integration/model_spec.rb", "spec/integration/mysql_adapter_spec.rb", "spec/integration/postgres_adapter_spec.rb", "spec/integration/property_spec.rb", "spec/integration/query_spec.rb", "spec/integration/repository_spec.rb", "spec/integration/resource_spec.rb", "spec/integration/sqlite3_adapter_spec.rb", "spec/integration/sti_spec.rb", "spec/integration/strategic_eager_loading_spec.rb", "spec/integration/transaction_spec.rb", "spec/integration/type_spec.rb", "spec/lib/logging_helper.rb", "spec/lib/mock_adapter.rb", "spec/lib/model_loader.rb", "spec/lib/publicize_methods.rb", "spec/models/content.rb", "spec/models/vehicles.rb", "spec/models/zoo.rb", "spec/spec.opts", "spec/spec_helper.rb", "spec/unit/adapters/abstract_adapter_spec.rb", "spec/unit/adapters/adapter_shared_spec.rb", "spec/unit/adapters/data_objects_adapter_spec.rb", "spec/unit/adapters/in_memory_adapter_spec.rb", "spec/unit/adapters/postgres_adapter_spec.rb", "spec/unit/associations/many_to_many_spec.rb", "spec/unit/associations/many_to_one_spec.rb", "spec/unit/associations/one_to_many_spec.rb", "spec/unit/associations/one_to_one_spec.rb", "spec/unit/associations/relationship_spec.rb", "spec/unit/associations_spec.rb", "spec/unit/auto_migrations_spec.rb", "spec/unit/collection_spec.rb", "spec/unit/data_mapper_spec.rb", "spec/unit/identity_map_spec.rb", "spec/unit/is_spec.rb", "spec/unit/migrator_spec.rb", "spec/unit/model_spec.rb", "spec/unit/naming_conventions_spec.rb", "spec/unit/property_set_spec.rb", "spec/unit/property_spec.rb", "spec/unit/query_spec.rb", "spec/unit/repository_spec.rb", "spec/unit/resource_spec.rb", "spec/unit/scope_spec.rb", "spec/unit/transaction_spec.rb", "spec/unit/type_map_spec.rb", "spec/unit/type_spec.rb", "tasks/ci.rb", "tasks/dm.rb", "tasks/doc.rb", "tasks/gemspec.rb", "tasks/hoe.rb", "tasks/install.rb"]
|
14
|
+
s.has_rdoc = true
|
15
|
+
s.homepage = %q{http://datamapper.org}
|
16
|
+
s.rdoc_options = ["--main", "README.txt"]
|
17
|
+
s.require_paths = ["lib"]
|
18
|
+
s.rubyforge_project = %q{datamapper}
|
19
|
+
s.rubygems_version = %q{1.3.1}
|
20
|
+
s.summary = %q{An Object/Relational Mapper for Ruby}
|
21
|
+
|
22
|
+
if s.respond_to? :specification_version then
|
23
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
24
|
+
s.specification_version = 2
|
25
|
+
|
26
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
27
|
+
s.add_runtime_dependency(%q<data_objects>, ["~> 0.9.11"])
|
28
|
+
s.add_runtime_dependency(%q<extlib>, ["~> 0.9.11"])
|
29
|
+
s.add_runtime_dependency(%q<addressable>, ["~> 2.0.1"])
|
30
|
+
else
|
31
|
+
s.add_dependency(%q<data_objects>, ["~> 0.9.11"])
|
32
|
+
s.add_dependency(%q<extlib>, ["~> 0.9.11"])
|
33
|
+
s.add_dependency(%q<addressable>, ["~> 2.0.1"])
|
34
|
+
end
|
35
|
+
else
|
36
|
+
s.add_dependency(%q<data_objects>, ["~> 0.9.11"])
|
37
|
+
s.add_dependency(%q<extlib>, ["~> 0.9.11"])
|
38
|
+
s.add_dependency(%q<addressable>, ["~> 2.0.1"])
|
39
|
+
end
|
40
|
+
end
|
data/lib/dm-core.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
gem 'data_objects', '~>0.9.
|
1
|
+
gem 'data_objects', '~>0.9.11'
|
2
2
|
require 'data_objects'
|
3
3
|
|
4
4
|
module DataMapper
|
@@ -172,7 +172,7 @@ module DataMapper
|
|
172
172
|
connection = create_connection
|
173
173
|
return yield(connection)
|
174
174
|
rescue => e
|
175
|
-
DataMapper.logger.error(e)
|
175
|
+
DataMapper.logger.error(e.to_s)
|
176
176
|
raise e
|
177
177
|
ensure
|
178
178
|
close_connection(connection) if connection
|
@@ -0,0 +1,87 @@
|
|
1
|
+
module DataMapper
|
2
|
+
module Adapters
|
3
|
+
class InMemoryAdapter < AbstractAdapter
|
4
|
+
def initialize(name, uri_or_options)
|
5
|
+
@records = Hash.new { |hash,model| hash[model] = Array.new }
|
6
|
+
end
|
7
|
+
|
8
|
+
def create(resources)
|
9
|
+
resources.each do |resource|
|
10
|
+
@records[resource.model] << resource
|
11
|
+
end.size # just return the number of records
|
12
|
+
end
|
13
|
+
|
14
|
+
def update(attributes, query)
|
15
|
+
read_many(query).each do |resource|
|
16
|
+
attributes.each do |property,value|
|
17
|
+
property.set!(resource, value)
|
18
|
+
end
|
19
|
+
end.size
|
20
|
+
end
|
21
|
+
|
22
|
+
def read_one(query)
|
23
|
+
read(query, query.model, false)
|
24
|
+
end
|
25
|
+
|
26
|
+
def read_many(query)
|
27
|
+
Collection.new(query) do |set|
|
28
|
+
read(query, set, true)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def delete(query)
|
33
|
+
records = @records[query.model]
|
34
|
+
|
35
|
+
read_many(query).each do |resource|
|
36
|
+
records.delete(resource)
|
37
|
+
end.size
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def read(query, set, many = true)
|
43
|
+
model = query.model
|
44
|
+
conditions = query.conditions
|
45
|
+
|
46
|
+
match_with = many ? :select : :detect
|
47
|
+
|
48
|
+
# Iterate over the records for this model, and return
|
49
|
+
# the ones that match the conditions
|
50
|
+
result = @records[model].send(match_with) do |resource|
|
51
|
+
conditions.all? do |tuple|
|
52
|
+
operator, property, bind_value = *tuple
|
53
|
+
|
54
|
+
value = property.get!(resource)
|
55
|
+
|
56
|
+
case operator
|
57
|
+
when :eql, :in then equality_comparison(bind_value, value)
|
58
|
+
when :not then !equality_comparison(bind_value, value)
|
59
|
+
when :like then Regexp.new(bind_value) =~ value
|
60
|
+
when :gt then !value.nil? && value > bind_value
|
61
|
+
when :gte then !value.nil? && value >= bind_value
|
62
|
+
when :lt then !value.nil? && value < bind_value
|
63
|
+
when :lte then !value.nil? && value <= bind_value
|
64
|
+
else raise "Invalid query operator: #{operator.inspect}"
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
return result unless many
|
70
|
+
|
71
|
+
# TODO Sort
|
72
|
+
|
73
|
+
# TODO Limit
|
74
|
+
|
75
|
+
set.replace(result)
|
76
|
+
end
|
77
|
+
|
78
|
+
def equality_comparison(bind_value, value)
|
79
|
+
case bind_value
|
80
|
+
when Array, Range then bind_value.include?(value)
|
81
|
+
when NilClass then value.nil?
|
82
|
+
else bind_value == value
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -48,7 +48,7 @@ module DataMapper
|
|
48
48
|
class Proxy
|
49
49
|
include Assertions
|
50
50
|
|
51
|
-
instance_methods.each { |m| undef_method m unless %w[ __id__ __send__ kind_of? respond_to? assert_kind_of should should_not instance_variable_set instance_variable_get ].include?(m.to_s) }
|
51
|
+
instance_methods.each { |m| undef_method m unless %w[ __id__ __send__ object_id kind_of? respond_to? assert_kind_of should should_not instance_variable_set instance_variable_get ].include?(m.to_s) }
|
52
52
|
|
53
53
|
def replace(parent)
|
54
54
|
@parent = parent
|
@@ -72,7 +72,7 @@ module DataMapper
|
|
72
72
|
class Proxy
|
73
73
|
include Assertions
|
74
74
|
|
75
|
-
instance_methods.each { |m| undef_method m unless %w[ __id__ __send__ class kind_of? respond_to? assert_kind_of should should_not instance_variable_set instance_variable_get ].include?(m.to_s) }
|
75
|
+
instance_methods.each { |m| undef_method m unless %w[ __id__ __send__ class object_id kind_of? respond_to? assert_kind_of should should_not instance_variable_set instance_variable_get ].include?(m.to_s) }
|
76
76
|
|
77
77
|
# FIXME: remove when RelationshipChain#get_children can return a Collection
|
78
78
|
def all(query = {})
|
@@ -85,14 +85,14 @@ module DataMapper
|
|
85
85
|
query = args.pop
|
86
86
|
@relationship.get_children(@parent, query, :first, *args)
|
87
87
|
else
|
88
|
-
|
88
|
+
children.first(*args)
|
89
89
|
end
|
90
90
|
end
|
91
91
|
|
92
92
|
def <<(resource)
|
93
93
|
assert_mutable
|
94
94
|
return self if !resource.new_record? && self.include?(resource)
|
95
|
-
|
95
|
+
children << resource
|
96
96
|
relate_resource(resource)
|
97
97
|
self
|
98
98
|
end
|
@@ -100,7 +100,7 @@ module DataMapper
|
|
100
100
|
def push(*resources)
|
101
101
|
assert_mutable
|
102
102
|
resources.reject { |resource| !resource.new_record? && self.include?(resource) }
|
103
|
-
|
103
|
+
children.push(*resources)
|
104
104
|
resources.each { |resource| relate_resource(resource) }
|
105
105
|
self
|
106
106
|
end
|
@@ -108,7 +108,7 @@ module DataMapper
|
|
108
108
|
def unshift(*resources)
|
109
109
|
assert_mutable
|
110
110
|
resources.reject { |resource| !resource.new_record? && self.include?(resource) }
|
111
|
-
|
111
|
+
children.unshift(*resources)
|
112
112
|
resources.each { |resource| relate_resource(resource) }
|
113
113
|
self
|
114
114
|
end
|
@@ -117,42 +117,42 @@ module DataMapper
|
|
117
117
|
assert_mutable
|
118
118
|
each { |resource| orphan_resource(resource) }
|
119
119
|
other = other.map { |resource| resource.kind_of?(Hash) ? new_child(resource) : resource }
|
120
|
-
|
120
|
+
children.replace(other)
|
121
121
|
other.each { |resource| relate_resource(resource) }
|
122
122
|
self
|
123
123
|
end
|
124
124
|
|
125
125
|
def pop
|
126
126
|
assert_mutable
|
127
|
-
orphan_resource(
|
127
|
+
orphan_resource(children.pop)
|
128
128
|
end
|
129
129
|
|
130
130
|
def shift
|
131
131
|
assert_mutable
|
132
|
-
orphan_resource(
|
132
|
+
orphan_resource(children.shift)
|
133
133
|
end
|
134
134
|
|
135
135
|
def delete(resource)
|
136
136
|
assert_mutable
|
137
|
-
orphan_resource(
|
137
|
+
orphan_resource(children.delete(resource))
|
138
138
|
end
|
139
139
|
|
140
140
|
def delete_at(index)
|
141
141
|
assert_mutable
|
142
|
-
orphan_resource(
|
142
|
+
orphan_resource(children.delete_at(index))
|
143
143
|
end
|
144
144
|
|
145
145
|
def clear
|
146
146
|
assert_mutable
|
147
147
|
each { |resource| orphan_resource(resource) }
|
148
|
-
|
148
|
+
children.clear
|
149
149
|
self
|
150
150
|
end
|
151
151
|
|
152
152
|
def build(attributes = {})
|
153
153
|
assert_mutable
|
154
154
|
attributes = default_attributes.merge(attributes)
|
155
|
-
resource = children.respond_to?(:build) ?
|
155
|
+
resource = children.respond_to?(:build) ? children.build(attributes) : new_child(attributes)
|
156
156
|
resource
|
157
157
|
end
|
158
158
|
|
@@ -160,7 +160,7 @@ module DataMapper
|
|
160
160
|
assert_mutable
|
161
161
|
raise UnsavedParentError, 'You cannot intialize until the parent is saved' if @parent.new_record?
|
162
162
|
attributes = default_attributes.merge(attributes)
|
163
|
-
resource = children.respond_to?(:new) ?
|
163
|
+
resource = children.respond_to?(:new) ? children.new(attributes) : @relationship.child_model.new(attributes)
|
164
164
|
self << resource
|
165
165
|
resource
|
166
166
|
end
|
@@ -169,7 +169,7 @@ module DataMapper
|
|
169
169
|
assert_mutable
|
170
170
|
raise UnsavedParentError, 'You cannot create until the parent is saved' if @parent.new_record?
|
171
171
|
attributes = default_attributes.merge(attributes)
|
172
|
-
resource = children.respond_to?(:create) ?
|
172
|
+
resource = children.respond_to?(:create) ? children.create(attributes) : @relationship.child_model.create(attributes)
|
173
173
|
self << resource
|
174
174
|
resource
|
175
175
|
end
|
@@ -177,25 +177,25 @@ module DataMapper
|
|
177
177
|
def update(attributes = {})
|
178
178
|
assert_mutable
|
179
179
|
raise UnsavedParentError, 'You cannot mass-update until the parent is saved' if @parent.new_record?
|
180
|
-
|
180
|
+
children.update(attributes)
|
181
181
|
end
|
182
182
|
|
183
183
|
def update!(attributes = {})
|
184
184
|
assert_mutable
|
185
185
|
raise UnsavedParentError, 'You cannot mass-update without validations until the parent is saved' if @parent.new_record?
|
186
|
-
|
186
|
+
children.update!(attributes)
|
187
187
|
end
|
188
188
|
|
189
189
|
def destroy
|
190
190
|
assert_mutable
|
191
191
|
raise UnsavedParentError, 'You cannot mass-delete until the parent is saved' if @parent.new_record?
|
192
|
-
|
192
|
+
children.destroy
|
193
193
|
end
|
194
194
|
|
195
195
|
def destroy!
|
196
196
|
assert_mutable
|
197
197
|
raise UnsavedParentError, 'You cannot mass-delete without validations until the parent is saved' if @parent.new_record?
|
198
|
-
|
198
|
+
children.destroy!
|
199
199
|
end
|
200
200
|
|
201
201
|
def reload
|
@@ -60,14 +60,16 @@ module DataMapper
|
|
60
60
|
|
61
61
|
# @api private
|
62
62
|
def parent_model
|
63
|
-
|
63
|
+
return @parent_model if model_defined?(@parent_model)
|
64
|
+
@parent_model = @child_model.find_const(@parent_model)
|
64
65
|
rescue NameError
|
65
66
|
raise NameError, "Cannot find the parent_model #{@parent_model} for #{@child_model}"
|
66
67
|
end
|
67
68
|
|
68
69
|
# @api private
|
69
70
|
def child_model
|
70
|
-
|
71
|
+
return @child_model if model_defined?(@child_model)
|
72
|
+
@child_model = @parent_model.find_const(@child_model)
|
71
73
|
rescue NameError
|
72
74
|
raise NameError, "Cannot find the child_model #{@child_model} for #{@parent_model}"
|
73
75
|
end
|
@@ -130,7 +132,7 @@ module DataMapper
|
|
130
132
|
# @api private
|
131
133
|
def get_parent(child, parent = nil)
|
132
134
|
child_value = child_key.get(child)
|
133
|
-
return nil
|
135
|
+
return nil if child_value.any? { |v| v.nil? }
|
134
136
|
|
135
137
|
with_repository(parent || parent_model) do
|
136
138
|
parent_identity_map = (parent || parent_model).repository.identity_map(parent_model.base_model)
|
@@ -190,6 +192,10 @@ module DataMapper
|
|
190
192
|
assert_kind_of 'child_model', child_model, String, Class
|
191
193
|
assert_kind_of 'parent_model', parent_model, String, Class
|
192
194
|
|
195
|
+
unless model_defined?(child_model) || model_defined?(parent_model)
|
196
|
+
raise 'at least one of child_model and parent_model must be a Model object'
|
197
|
+
end
|
198
|
+
|
193
199
|
if child_properties = options[:child_key]
|
194
200
|
assert_kind_of 'options[:child_key]', child_properties, Array
|
195
201
|
end
|
@@ -60,7 +60,7 @@ module DataMapper
|
|
60
60
|
# @api private
|
61
61
|
def links
|
62
62
|
if remote_relationship.kind_of?(RelationshipChain)
|
63
|
-
remote_relationship.
|
63
|
+
remote_relationship.send(:links) + [ remote_relationship.send(:near_relationship) ]
|
64
64
|
else
|
65
65
|
[ remote_relationship ]
|
66
66
|
end
|
data/lib/dm-core/collection.rb
CHANGED
@@ -491,7 +491,7 @@ module DataMapper
|
|
491
491
|
#
|
492
492
|
# @api public
|
493
493
|
def respond_to?(method, include_private = false)
|
494
|
-
super || model.public_methods(false).include?(method.to_s) || relationships.has_key?(method)
|
494
|
+
super || model.public_methods(false).map { |m| m.to_s }.include?(method.to_s) || relationships.has_key?(method)
|
495
495
|
end
|
496
496
|
|
497
497
|
# TODO: add docs
|
@@ -537,7 +537,7 @@ module DataMapper
|
|
537
537
|
|
538
538
|
unless block_given?
|
539
539
|
# It can be helpful (relationship.rb: 112-13, used for SEL) to have a non-lazy Collection.
|
540
|
-
block = lambda {}
|
540
|
+
block = lambda { |c| }
|
541
541
|
end
|
542
542
|
|
543
543
|
@query = query
|
@@ -639,7 +639,7 @@ module DataMapper
|
|
639
639
|
##
|
640
640
|
# @api private
|
641
641
|
def method_missing(method, *args, &block)
|
642
|
-
if model.public_methods(false).include?(method.to_s)
|
642
|
+
if model.public_methods(false).map { |m| m.to_s }.include?(method.to_s)
|
643
643
|
model.send(:with_scope, query) do
|
644
644
|
model.send(method, *args, &block)
|
645
645
|
end
|