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.
Files changed (55) hide show
  1. data/.gitignore +18 -0
  2. data/History.txt +10 -0
  3. data/MIT-LICENSE +1 -1
  4. data/Rakefile +4 -4
  5. data/dm-core.gemspec +40 -0
  6. data/lib/dm-core.rb +1 -1
  7. data/lib/dm-core/adapters/data_objects_adapter.rb +2 -2
  8. data/lib/dm-core/adapters/in_memory_adapter.rb +87 -0
  9. data/lib/dm-core/adapters/mysql_adapter.rb +1 -1
  10. data/lib/dm-core/adapters/postgres_adapter.rb +1 -1
  11. data/lib/dm-core/adapters/sqlite3_adapter.rb +1 -1
  12. data/lib/dm-core/associations/many_to_one.rb +1 -1
  13. data/lib/dm-core/associations/one_to_many.rb +18 -18
  14. data/lib/dm-core/associations/relationship.rb +9 -3
  15. data/lib/dm-core/associations/relationship_chain.rb +1 -1
  16. data/lib/dm-core/collection.rb +3 -3
  17. data/lib/dm-core/model.rb +5 -4
  18. data/lib/dm-core/resource.rb +11 -5
  19. data/lib/dm-core/version.rb +1 -1
  20. data/script/all +3 -4
  21. data/spec/integration/association_spec.rb +18 -18
  22. data/spec/integration/association_through_spec.rb +4 -4
  23. data/spec/integration/associations/many_to_many_spec.rb +9 -9
  24. data/spec/integration/associations/many_to_one_spec.rb +1 -1
  25. data/spec/integration/associations/one_to_many_spec.rb +3 -3
  26. data/spec/integration/collection_spec.rb +2 -2
  27. data/spec/integration/dependency_queue_spec.rb +1 -1
  28. data/spec/integration/model_spec.rb +1 -1
  29. data/spec/integration/mysql_adapter_spec.rb +1 -1
  30. data/spec/integration/postgres_adapter_spec.rb +16 -16
  31. data/spec/integration/property_spec.rb +10 -6
  32. data/spec/integration/query_spec.rb +4 -4
  33. data/spec/integration/repository_spec.rb +1 -1
  34. data/spec/integration/sqlite3_adapter_spec.rb +7 -7
  35. data/spec/integration/sti_spec.rb +6 -6
  36. data/spec/integration/strategic_eager_loading_spec.rb +14 -11
  37. data/spec/integration/type_spec.rb +10 -6
  38. data/spec/lib/logging_helper.rb +11 -11
  39. data/spec/models/content.rb +16 -0
  40. data/spec/spec_helper.rb +8 -4
  41. data/spec/unit/adapters/data_objects_adapter_spec.rb +9 -5
  42. data/spec/unit/adapters/in_memory_adapter_spec.rb +98 -0
  43. data/spec/unit/adapters/postgres_adapter_spec.rb +5 -5
  44. data/spec/unit/associations/many_to_many_spec.rb +2 -2
  45. data/spec/unit/associations/many_to_one_spec.rb +3 -3
  46. data/spec/unit/associations/one_to_many_spec.rb +2 -2
  47. data/spec/unit/associations/relationship_spec.rb +6 -6
  48. data/spec/unit/associations_spec.rb +21 -21
  49. data/spec/unit/identity_map_spec.rb +3 -3
  50. data/spec/unit/is_spec.rb +7 -7
  51. data/spec/unit/property_spec.rb +7 -7
  52. data/spec/unit/resource_spec.rb +12 -12
  53. data/spec/unit/transaction_spec.rb +1 -1
  54. data/tasks/dm.rb +1 -1
  55. metadata +10 -5
@@ -0,0 +1,18 @@
1
+ *.log
2
+ log/*
3
+ doc
4
+ cov
5
+ pkg
6
+ .DS_Store
7
+ coverage/*
8
+ *.db
9
+ spec/integration/*.db*
10
+ nbproject
11
+ profile_results.*
12
+ \#*
13
+ TAGS
14
+ lib/coverage.html
15
+ *.rbc
16
+ _Yardoc
17
+ .yardoc
18
+ tmp/*
@@ -1,3 +1,13 @@
1
+ === 0.9.10 / 2009-01-19
2
+
3
+ * 1 major enhancement:
4
+
5
+ * Ruby 1.9.1 compatibility
6
+
7
+ * 1 minor enhancement:
8
+
9
+ * Updated Resource marshaling to be more thorough
10
+
1
11
  === 0.9.9 / 2009-01-04
2
12
 
3
13
  * 1 minor enhancement:
@@ -1,4 +1,4 @@
1
- Copyright (c) 2007 Sam Smoot
1
+ Copyright (c) 2007, 2008, 2009 Sam Smoot, Dan Kubb
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person
4
4
  obtaining a copy of this software and associated documentation
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 = "Sam Smoot"
13
- EMAIL = "ssmoot@gmail.com"
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.10"],
17
- ["extlib", "~>0.9.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"
@@ -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
@@ -19,7 +19,7 @@ require 'yaml'
19
19
  gem 'addressable', '~>2.0.1'
20
20
  require 'addressable/uri'
21
21
 
22
- gem 'extlib', '~>0.9.9'
22
+ gem 'extlib', '~>0.9.11'
23
23
  require 'extlib'
24
24
  require 'extlib/inflection'
25
25
 
@@ -1,4 +1,4 @@
1
- gem 'data_objects', '~>0.9.10'
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
@@ -1,4 +1,4 @@
1
- gem 'do_mysql', '~>0.9.10'
1
+ gem 'do_mysql', '~>0.9.11'
2
2
  require 'do_mysql'
3
3
 
4
4
  module DataMapper
@@ -1,4 +1,4 @@
1
- gem 'do_postgres', '~>0.9.10'
1
+ gem 'do_postgres', '~>0.9.11'
2
2
  require 'do_postgres'
3
3
 
4
4
  module DataMapper
@@ -1,4 +1,4 @@
1
- gem 'do_sqlite3', '~>0.9.10'
1
+ gem 'do_sqlite3', '~>0.9.11'
2
2
  require 'do_sqlite3'
3
3
 
4
4
  module DataMapper
@@ -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
- super
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
- super
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
- super
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
- super
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
- super
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(super)
127
+ orphan_resource(children.pop)
128
128
  end
129
129
 
130
130
  def shift
131
131
  assert_mutable
132
- orphan_resource(super)
132
+ orphan_resource(children.shift)
133
133
  end
134
134
 
135
135
  def delete(resource)
136
136
  assert_mutable
137
- orphan_resource(super)
137
+ orphan_resource(children.delete(resource))
138
138
  end
139
139
 
140
140
  def delete_at(index)
141
141
  assert_mutable
142
- orphan_resource(super)
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
- super
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) ? super(attributes) : new_child(attributes)
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) ? super(attributes) : @relationship.child_model.new(attributes)
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) ? super(attributes) : @relationship.child_model.create(attributes)
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
- super
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
- super
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
- super
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
- super
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
- Class === @parent_model ? @parent_model : (Class === @child_model ? @child_model.find_const(@parent_model) : Object.find_const(@parent_model))
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
- Class === @child_model ? @child_model : (Class === @parent_model ? @parent_model.find_const(@child_model) : Object.find_const(@child_model))
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 unless child_value.nitems == child_value.size
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.instance_eval { links } + [remote_relationship.instance_eval { near_relationship } ]
63
+ remote_relationship.send(:links) + [ remote_relationship.send(:near_relationship) ]
64
64
  else
65
65
  [ remote_relationship ]
66
66
  end
@@ -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