dm-core 1.1.0.rc2 → 1.1.0.rc3
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/Gemfile +1 -8
- data/VERSION +1 -1
- data/dm-core.gemspec +24 -15
- data/lib/dm-core.rb +9 -48
- data/lib/dm-core/adapters.rb +1 -1
- data/lib/dm-core/adapters/abstract_adapter.rb +2 -1
- data/lib/dm-core/associations/many_to_many.rb +3 -3
- data/lib/dm-core/associations/many_to_one.rb +15 -4
- data/lib/dm-core/associations/one_to_many.rb +1 -1
- data/lib/dm-core/associations/relationship.rb +7 -6
- data/lib/dm-core/collection.rb +7 -2
- data/lib/dm-core/core_ext/pathname.rb +0 -14
- data/lib/dm-core/ext/array.rb +41 -0
- data/lib/dm-core/ext/blank.rb +24 -0
- data/lib/dm-core/ext/hash.rb +67 -0
- data/lib/dm-core/ext/module.rb +49 -0
- data/lib/dm-core/ext/object.rb +57 -0
- data/lib/dm-core/ext/singleton_class.rb +8 -0
- data/lib/dm-core/ext/string.rb +24 -0
- data/lib/dm-core/ext/try_dup.rb +12 -0
- data/lib/dm-core/model.rb +2 -1
- data/lib/dm-core/model/property.rb +3 -2
- data/lib/dm-core/property.rb +1 -1
- data/lib/dm-core/property/class.rb +1 -1
- data/lib/dm-core/property/date.rb +3 -3
- data/lib/dm-core/property/date_time.rb +3 -3
- data/lib/dm-core/property/time.rb +3 -3
- data/lib/dm-core/property/typecast/time.rb +2 -2
- data/lib/dm-core/property_set.rb +1 -1
- data/lib/dm-core/query.rb +9 -12
- data/lib/dm-core/resource.rb +2 -2
- data/lib/dm-core/spec/lib/counter_adapter.rb +1 -1
- data/lib/dm-core/spec/lib/spec_helper.rb +1 -1
- data/lib/dm-core/spec/shared/resource_spec.rb +2 -1
- data/lib/dm-core/support/equalizer.rb +1 -1
- data/lib/dm-core/support/hook.rb +0 -15
- data/lib/dm-core/support/inflections.rb +60 -0
- data/lib/dm-core/support/inflector.rb +3 -0
- data/lib/dm-core/support/inflector/inflections.rb +211 -0
- data/lib/dm-core/support/inflector/methods.rb +151 -0
- data/lib/dm-core/support/lazy_array.rb +4 -4
- data/lib/dm-core/support/mash.rb +176 -0
- data/lib/dm-core/support/subject.rb +1 -1
- data/lib/dm-core/version.rb +1 -1
- data/spec/public/model/relationship_spec.rb +2 -1
- data/spec/public/shared/collection_shared_spec.rb +5 -2
- data/spec/public/shared/finder_shared_spec.rb +10 -6
- data/spec/semipublic/adapters/in_memory_adapter_spec.rb +1 -1
- data/spec/semipublic/query_spec.rb +2 -2
- data/spec/semipublic/resource/state/immutable_spec.rb +2 -1
- data/spec/semipublic/resource/state_spec.rb +1 -3
- data/spec/semipublic/shared/resource_state_shared_spec.rb +2 -1
- data/spec/semipublic/shared/subject_shared_spec.rb +1 -1
- data/spec/support/core_ext/hash.rb +10 -0
- data/spec/support/core_ext/inheritable_attributes.rb +46 -0
- data/spec/unit/array_spec.rb +8 -20
- data/spec/unit/blank_spec.rb +62 -0
- data/spec/unit/data_mapper/ordered_set/hash_spec.rb +1 -1
- data/spec/unit/hash_spec.rb +8 -16
- data/spec/unit/lazy_array_spec.rb +3 -14
- data/spec/unit/mash_spec.rb +312 -0
- data/spec/unit/module_spec.rb +15 -15
- data/spec/unit/object_spec.rb +9 -9
- data/spec/unit/try_dup_spec.rb +8 -8
- metadata +32 -39
- data/lib/dm-core/core_ext/array.rb +0 -36
- data/lib/dm-core/core_ext/hash.rb +0 -30
- data/lib/dm-core/core_ext/module.rb +0 -46
- data/lib/dm-core/core_ext/object.rb +0 -31
- data/lib/dm-core/core_ext/string.rb +0 -22
- data/lib/dm-core/core_ext/try_dup.rb +0 -44
data/Gemfile
CHANGED
@@ -5,17 +5,10 @@ source 'http://rubygems.org'
|
|
5
5
|
SOURCE = ENV.fetch('SOURCE', :git).to_sym
|
6
6
|
REPO_POSTFIX = SOURCE == :path ? '' : '.git'
|
7
7
|
DATAMAPPER = SOURCE == :path ? Pathname(__FILE__).dirname.parent : 'http://github.com/datamapper'
|
8
|
-
DM_VERSION = '~> 1.1.0.
|
8
|
+
DM_VERSION = '~> 1.1.0.rc3'
|
9
9
|
DO_VERSION = '~> 0.10.2'
|
10
10
|
DM_DO_ADAPTERS = %w[ sqlite postgres mysql oracle sqlserver ]
|
11
11
|
|
12
|
-
if ENV['EXTLIB']
|
13
|
-
gem 'extlib', '~> 0.9.15', SOURCE => "#{DATAMAPPER}/extlib#{REPO_POSTFIX}", :require => nil
|
14
|
-
else
|
15
|
-
gem 'activesupport', '~> 3.0.4', :require => nil
|
16
|
-
gem 'i18n', '~> 0.5.0'
|
17
|
-
end
|
18
|
-
|
19
12
|
gem 'addressable', '~> 2.2.4'
|
20
13
|
|
21
14
|
group :development do
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.1.0.
|
1
|
+
1.1.0.rc3
|
data/dm-core.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{dm-core}
|
8
|
-
s.version = "1.1.0.
|
8
|
+
s.version = "1.1.0.rc3"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Dan Kubb"]
|
12
|
-
s.date = %q{2011-03-
|
12
|
+
s.date = %q{2011-03-10}
|
13
13
|
s.description = %q{Faster, Better, Simpler.}
|
14
14
|
s.email = %q{dan.kubb@gmail.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -35,15 +35,17 @@ Gem::Specification.new do |s|
|
|
35
35
|
"lib/dm-core/associations/one_to_one.rb",
|
36
36
|
"lib/dm-core/associations/relationship.rb",
|
37
37
|
"lib/dm-core/collection.rb",
|
38
|
-
"lib/dm-core/core_ext/array.rb",
|
39
|
-
"lib/dm-core/core_ext/hash.rb",
|
40
38
|
"lib/dm-core/core_ext/kernel.rb",
|
41
|
-
"lib/dm-core/core_ext/module.rb",
|
42
|
-
"lib/dm-core/core_ext/object.rb",
|
43
39
|
"lib/dm-core/core_ext/pathname.rb",
|
44
|
-
"lib/dm-core/core_ext/string.rb",
|
45
40
|
"lib/dm-core/core_ext/symbol.rb",
|
46
|
-
"lib/dm-core/
|
41
|
+
"lib/dm-core/ext/array.rb",
|
42
|
+
"lib/dm-core/ext/blank.rb",
|
43
|
+
"lib/dm-core/ext/hash.rb",
|
44
|
+
"lib/dm-core/ext/module.rb",
|
45
|
+
"lib/dm-core/ext/object.rb",
|
46
|
+
"lib/dm-core/ext/singleton_class.rb",
|
47
|
+
"lib/dm-core/ext/string.rb",
|
48
|
+
"lib/dm-core/ext/try_dup.rb",
|
47
49
|
"lib/dm-core/identity_map.rb",
|
48
50
|
"lib/dm-core/model.rb",
|
49
51
|
"lib/dm-core/model/hook.rb",
|
@@ -106,9 +108,14 @@ Gem::Specification.new do |s|
|
|
106
108
|
"lib/dm-core/support/descendant_set.rb",
|
107
109
|
"lib/dm-core/support/equalizer.rb",
|
108
110
|
"lib/dm-core/support/hook.rb",
|
111
|
+
"lib/dm-core/support/inflections.rb",
|
112
|
+
"lib/dm-core/support/inflector.rb",
|
113
|
+
"lib/dm-core/support/inflector/inflections.rb",
|
114
|
+
"lib/dm-core/support/inflector/methods.rb",
|
109
115
|
"lib/dm-core/support/lazy_array.rb",
|
110
116
|
"lib/dm-core/support/local_object_space.rb",
|
111
117
|
"lib/dm-core/support/logger.rb",
|
118
|
+
"lib/dm-core/support/mash.rb",
|
112
119
|
"lib/dm-core/support/naming_conventions.rb",
|
113
120
|
"lib/dm-core/support/ordered_set.rb",
|
114
121
|
"lib/dm-core/support/subject.rb",
|
@@ -196,8 +203,11 @@ Gem::Specification.new do |s|
|
|
196
203
|
"spec/semipublic/shared/subject_shared_spec.rb",
|
197
204
|
"spec/spec.opts",
|
198
205
|
"spec/spec_helper.rb",
|
206
|
+
"spec/support/core_ext/hash.rb",
|
207
|
+
"spec/support/core_ext/inheritable_attributes.rb",
|
199
208
|
"spec/support/properties/huge_integer.rb",
|
200
209
|
"spec/unit/array_spec.rb",
|
210
|
+
"spec/unit/blank_spec.rb",
|
201
211
|
"spec/unit/data_mapper/ordered_set/append_spec.rb",
|
202
212
|
"spec/unit/data_mapper/ordered_set/clear_spec.rb",
|
203
213
|
"spec/unit/data_mapper/ordered_set/delete_spec.rb",
|
@@ -252,6 +262,7 @@ Gem::Specification.new do |s|
|
|
252
262
|
"spec/unit/hash_spec.rb",
|
253
263
|
"spec/unit/hook_spec.rb",
|
254
264
|
"spec/unit/lazy_array_spec.rb",
|
265
|
+
"spec/unit/mash_spec.rb",
|
255
266
|
"spec/unit/module_spec.rb",
|
256
267
|
"spec/unit/object_spec.rb",
|
257
268
|
"spec/unit/try_dup_spec.rb",
|
@@ -263,7 +274,7 @@ Gem::Specification.new do |s|
|
|
263
274
|
s.homepage = %q{http://github.com/datamapper/dm-core}
|
264
275
|
s.require_paths = ["lib"]
|
265
276
|
s.rubyforge_project = %q{datamapper}
|
266
|
-
s.rubygems_version = %q{1.
|
277
|
+
s.rubygems_version = %q{1.6.2}
|
267
278
|
s.summary = %q{An Object/Relational Mapper for Ruby}
|
268
279
|
s.test_files = [
|
269
280
|
"spec/lib/rspec_immediate_feedback_formatter.rb",
|
@@ -344,8 +355,11 @@ Gem::Specification.new do |s|
|
|
344
355
|
"spec/semipublic/shared/resource_state_shared_spec.rb",
|
345
356
|
"spec/semipublic/shared/subject_shared_spec.rb",
|
346
357
|
"spec/spec_helper.rb",
|
358
|
+
"spec/support/core_ext/hash.rb",
|
359
|
+
"spec/support/core_ext/inheritable_attributes.rb",
|
347
360
|
"spec/support/properties/huge_integer.rb",
|
348
361
|
"spec/unit/array_spec.rb",
|
362
|
+
"spec/unit/blank_spec.rb",
|
349
363
|
"spec/unit/data_mapper/ordered_set/append_spec.rb",
|
350
364
|
"spec/unit/data_mapper/ordered_set/clear_spec.rb",
|
351
365
|
"spec/unit/data_mapper/ordered_set/delete_spec.rb",
|
@@ -400,6 +414,7 @@ Gem::Specification.new do |s|
|
|
400
414
|
"spec/unit/hash_spec.rb",
|
401
415
|
"spec/unit/hook_spec.rb",
|
402
416
|
"spec/unit/lazy_array_spec.rb",
|
417
|
+
"spec/unit/mash_spec.rb",
|
403
418
|
"spec/unit/module_spec.rb",
|
404
419
|
"spec/unit/object_spec.rb",
|
405
420
|
"spec/unit/try_dup_spec.rb"
|
@@ -409,23 +424,17 @@ Gem::Specification.new do |s|
|
|
409
424
|
s.specification_version = 3
|
410
425
|
|
411
426
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
412
|
-
s.add_runtime_dependency(%q<activesupport>, ["~> 3.0.4"])
|
413
|
-
s.add_runtime_dependency(%q<i18n>, ["~> 0.5.0"])
|
414
427
|
s.add_runtime_dependency(%q<addressable>, ["~> 2.2.4"])
|
415
428
|
s.add_development_dependency(%q<jeweler>, ["~> 1.5.2"])
|
416
429
|
s.add_development_dependency(%q<rake>, ["~> 0.8.7"])
|
417
430
|
s.add_development_dependency(%q<rspec>, ["~> 1.3.1"])
|
418
431
|
else
|
419
|
-
s.add_dependency(%q<activesupport>, ["~> 3.0.4"])
|
420
|
-
s.add_dependency(%q<i18n>, ["~> 0.5.0"])
|
421
432
|
s.add_dependency(%q<addressable>, ["~> 2.2.4"])
|
422
433
|
s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
|
423
434
|
s.add_dependency(%q<rake>, ["~> 0.8.7"])
|
424
435
|
s.add_dependency(%q<rspec>, ["~> 1.3.1"])
|
425
436
|
end
|
426
437
|
else
|
427
|
-
s.add_dependency(%q<activesupport>, ["~> 3.0.4"])
|
428
|
-
s.add_dependency(%q<i18n>, ["~> 0.5.0"])
|
429
438
|
s.add_dependency(%q<addressable>, ["~> 2.2.4"])
|
430
439
|
s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
|
431
440
|
s.add_dependency(%q<rake>, ["~> 0.8.7"])
|
data/lib/dm-core.rb
CHANGED
@@ -11,53 +11,12 @@ module DataMapper
|
|
11
11
|
module Undefined; end
|
12
12
|
end
|
13
13
|
|
14
|
-
|
15
|
-
|
16
|
-
# Prefer active_support
|
17
|
-
|
18
|
-
require 'active_support/core_ext/kernel/singleton_class'
|
19
|
-
require 'active_support/core_ext/class/inheritable_attributes'
|
20
|
-
require 'active_support/core_ext/object/blank'
|
21
|
-
require 'active_support/core_ext/hash/except'
|
22
|
-
|
23
|
-
require 'active_support/hash_with_indifferent_access'
|
24
|
-
require 'active_support/inflector'
|
25
|
-
|
26
|
-
Mash = ActiveSupport::HashWithIndifferentAccess
|
27
|
-
|
28
|
-
require 'dm-core/core_ext/hash'
|
29
|
-
require 'dm-core/core_ext/object'
|
30
|
-
require 'dm-core/core_ext/string'
|
31
|
-
|
32
|
-
module DataMapper
|
33
|
-
Inflector = ActiveSupport::Inflector
|
34
|
-
end
|
35
|
-
|
36
|
-
rescue LoadError
|
14
|
+
require 'dm-core/ext/singleton_class'
|
15
|
+
require 'dm-core/ext/blank'
|
37
16
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
require 'extlib/mash'
|
42
|
-
require 'extlib/string'
|
43
|
-
require 'extlib/class'
|
44
|
-
require 'extlib/hash'
|
45
|
-
require 'extlib/object'
|
46
|
-
require 'extlib/blank'
|
47
|
-
|
48
|
-
class Object
|
49
|
-
unless respond_to?(:singleton_class)
|
50
|
-
def singleton_class
|
51
|
-
class << self; self end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
module DataMapper
|
57
|
-
Inflector = Extlib::Inflection
|
58
|
-
end
|
59
|
-
|
60
|
-
end
|
17
|
+
require 'dm-core/ext/hash'
|
18
|
+
require 'dm-core/ext/object'
|
19
|
+
require 'dm-core/ext/string'
|
61
20
|
|
62
21
|
begin
|
63
22
|
require 'fastthread'
|
@@ -66,9 +25,11 @@ rescue LoadError
|
|
66
25
|
end
|
67
26
|
|
68
27
|
require 'dm-core/core_ext/pathname'
|
69
|
-
require 'dm-core/
|
70
|
-
require 'dm-core/
|
28
|
+
require 'dm-core/ext/module'
|
29
|
+
require 'dm-core/ext/array'
|
71
30
|
|
31
|
+
require 'dm-core/support/mash'
|
32
|
+
require 'dm-core/support/inflector'
|
72
33
|
require 'dm-core/support/chainable'
|
73
34
|
require 'dm-core/support/deprecate'
|
74
35
|
require 'dm-core/support/descendant_set'
|
data/lib/dm-core/adapters.rb
CHANGED
@@ -208,7 +208,8 @@ module DataMapper
|
|
208
208
|
#
|
209
209
|
# @api semipublic
|
210
210
|
def attributes_as_fields(attributes)
|
211
|
-
attributes.map { |property, value| [ property.field, property.dump(value) ] }
|
211
|
+
pairs = attributes.map { |property, value| [ property.field, property.dump(value) ] }
|
212
|
+
DataMapper::Ext::Array.to_hash(pairs)
|
212
213
|
end
|
213
214
|
|
214
215
|
private
|
@@ -87,7 +87,7 @@ module DataMapper
|
|
87
87
|
repository_name = through.relative_target_repository_name
|
88
88
|
through_model = through.target_model
|
89
89
|
relationships = through_model.relationships(repository_name)
|
90
|
-
singular_name = name.to_s.
|
90
|
+
singular_name = DataMapper::Inflector.singularize(name.to_s).to_sym
|
91
91
|
|
92
92
|
@via = relationships[@via] ||
|
93
93
|
relationships[name] ||
|
@@ -195,7 +195,7 @@ module DataMapper
|
|
195
195
|
if anonymous_through_model?
|
196
196
|
namespace = through_model_namespace_name.first
|
197
197
|
relationship_name = DataMapper::Inflector.underscore(through_model.name.sub(/\A#{namespace.name}::/, '')).tr('/', '_')
|
198
|
-
|
198
|
+
DataMapper::Inflector.pluralize(relationship_name).to_sym
|
199
199
|
else
|
200
200
|
options[:through]
|
201
201
|
end
|
@@ -292,7 +292,7 @@ module DataMapper
|
|
292
292
|
|
293
293
|
options = self.options
|
294
294
|
|
295
|
-
|
295
|
+
DataMapper::Ext::Hash.only(options, *OPTIONS - [ :min, :max ]).update(
|
296
296
|
:through => through,
|
297
297
|
:child_key => options[:parent_key],
|
298
298
|
:parent_key => options[:child_key],
|
@@ -118,8 +118,13 @@ module DataMapper
|
|
118
118
|
# @api semipublic
|
119
119
|
def get(source, query = nil)
|
120
120
|
lazy_load(source)
|
121
|
-
|
122
|
-
|
121
|
+
|
122
|
+
if query
|
123
|
+
collection = get_collection(source)
|
124
|
+
collection.first(query) if collection
|
125
|
+
else
|
126
|
+
get!(source)
|
127
|
+
end
|
123
128
|
end
|
124
129
|
|
125
130
|
def get_collection(source)
|
@@ -229,12 +234,18 @@ module DataMapper
|
|
229
234
|
#
|
230
235
|
# @api private
|
231
236
|
def inverse_name
|
232
|
-
|
237
|
+
name = super
|
238
|
+
return name if name
|
239
|
+
|
240
|
+
name = DataMapper::Inflector.demodulize(source_model.name)
|
241
|
+
name = DataMapper::Inflector.underscore(name)
|
242
|
+
name = DataMapper::Inflector.pluralize(name)
|
243
|
+
name.to_sym
|
233
244
|
end
|
234
245
|
|
235
246
|
# @api private
|
236
247
|
def source_key_options(target_property)
|
237
|
-
options = target_property.options
|
248
|
+
options = DataMapper::Ext::Hash.only(target_property.options, :length, :precision, :scale).update(
|
238
249
|
:index => name,
|
239
250
|
:required => required?,
|
240
251
|
:key => key?
|
@@ -109,7 +109,7 @@ module DataMapper
|
|
109
109
|
|
110
110
|
# @api semipublic
|
111
111
|
def initialize(name, target_model, source_model, options = {})
|
112
|
-
target_model ||= DataMapper::Inflector.camelize(name.to_s
|
112
|
+
target_model ||= DataMapper::Inflector.camelize(DataMapper::Inflector.singularize(name.to_s))
|
113
113
|
options = { :min => 0, :max => source_model.n }.update(options)
|
114
114
|
super
|
115
115
|
end
|
@@ -168,7 +168,7 @@ module DataMapper
|
|
168
168
|
def child_model
|
169
169
|
return @child_model if defined?(@child_model)
|
170
170
|
child_model_name = self.child_model_name
|
171
|
-
@child_model = (@parent_model || Object
|
171
|
+
@child_model = DataMapper::Ext::Module.find_const(@parent_model || Object, child_model_name)
|
172
172
|
rescue NameError
|
173
173
|
raise NameError, "Cannot find the child_model #{child_model_name} for #{parent_model_name} in #{name}"
|
174
174
|
end
|
@@ -221,7 +221,7 @@ module DataMapper
|
|
221
221
|
def parent_model
|
222
222
|
return @parent_model if defined?(@parent_model)
|
223
223
|
parent_model_name = self.parent_model_name
|
224
|
-
@parent_model = (@child_model || Object
|
224
|
+
@parent_model = DataMapper::Ext::Module.find_const(@child_model || Object, parent_model_name)
|
225
225
|
rescue NameError
|
226
226
|
raise NameError, "Cannot find the parent_model #{parent_model_name} for #{child_model_name} in #{name}"
|
227
227
|
end
|
@@ -414,6 +414,7 @@ module DataMapper
|
|
414
414
|
|
415
415
|
# @api private
|
416
416
|
def hash
|
417
|
+
self.class.hash ^
|
417
418
|
name.hash ^
|
418
419
|
child_repository_name.hash ^
|
419
420
|
parent_repository_name.hash ^
|
@@ -451,8 +452,8 @@ module DataMapper
|
|
451
452
|
@options = options.dup.freeze
|
452
453
|
@child_repository_name = @options[:child_repository_name]
|
453
454
|
@parent_repository_name = @options[:parent_repository_name]
|
454
|
-
@child_properties = @options[:child_key].
|
455
|
-
@parent_properties = @options[:parent_key].
|
455
|
+
@child_properties = DataMapper::Ext.try_dup(@options[:child_key]).freeze
|
456
|
+
@parent_properties = DataMapper::Ext.try_dup(@options[:parent_key]).freeze
|
456
457
|
@min = @options[:min]
|
457
458
|
@max = @options[:max]
|
458
459
|
@reader_visibility = @options.fetch(:reader_visibility, :public)
|
@@ -470,7 +471,7 @@ module DataMapper
|
|
470
471
|
# query as :condition => and_object from self.query
|
471
472
|
# - this should provide the best performance
|
472
473
|
|
473
|
-
@query =
|
474
|
+
@query = DataMapper::Ext::Hash.except(@options, *self.class::OPTIONS).freeze
|
474
475
|
end
|
475
476
|
|
476
477
|
# Set the correct ivars for the named object
|
@@ -586,7 +587,7 @@ module DataMapper
|
|
586
587
|
|
587
588
|
# @api private
|
588
589
|
def inverted_options
|
589
|
-
|
590
|
+
DataMapper::Ext::Hash.only(options, *OPTIONS - [ :min, :max ]).update(:inverse => self)
|
590
591
|
end
|
591
592
|
|
592
593
|
# @api private
|
data/lib/dm-core/collection.rb
CHANGED
@@ -730,6 +730,11 @@ module DataMapper
|
|
730
730
|
super
|
731
731
|
end
|
732
732
|
|
733
|
+
# Determines whether the collection is empty.
|
734
|
+
#
|
735
|
+
# @api public
|
736
|
+
alias_method :blank?, :empty?
|
737
|
+
|
733
738
|
# Finds the first Resource by conditions, or initializes a new
|
734
739
|
# Resource with the attributes if none found
|
735
740
|
#
|
@@ -973,7 +978,7 @@ module DataMapper
|
|
973
978
|
|
974
979
|
# @api semipublic
|
975
980
|
def hash
|
976
|
-
query.hash
|
981
|
+
self.class.hash ^ query.hash
|
977
982
|
end
|
978
983
|
|
979
984
|
protected
|
@@ -1437,7 +1442,7 @@ module DataMapper
|
|
1437
1442
|
|
1438
1443
|
if model.respond_to?(method)
|
1439
1444
|
delegate_to_model(method, *args, &block)
|
1440
|
-
elsif relationship = relationships[method] || relationships[method.to_s.
|
1445
|
+
elsif relationship = relationships[method] || relationships[DataMapper::Inflector.singularize(method.to_s).to_sym]
|
1441
1446
|
delegate_to_relationship(relationship, *args)
|
1442
1447
|
else
|
1443
1448
|
super
|
@@ -1,18 +1,4 @@
|
|
1
1
|
class Pathname
|
2
|
-
# Append path segments and expand to absolute path
|
3
|
-
#
|
4
|
-
# file = Pathname(Dir.pwd) / "subdir1" / :subdir2 / "filename.ext"
|
5
|
-
#
|
6
|
-
# @param [Pathname, String, #to_s] path path segment to concatenate with receiver
|
7
|
-
#
|
8
|
-
# @return [Pathname]
|
9
|
-
# receiver with _path_ appended and expanded to an absolute path
|
10
|
-
#
|
11
|
-
# @api public
|
12
|
-
def /(path)
|
13
|
-
(self + path).expand_path
|
14
|
-
end
|
15
|
-
|
16
2
|
# alias_method :to_s, :to to_str when to_str not defined
|
17
3
|
unless public_instance_methods(false).any? { |m| m.to_sym == :to_str }
|
18
4
|
alias_method :to_str, :to_s
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module DataMapper; module Ext
|
2
|
+
module Array
|
3
|
+
# Transforms an Array of key/value pairs into a Hash.
|
4
|
+
#
|
5
|
+
# This is a better idiom than using Hash[*array.flatten] in Ruby 1.8.6
|
6
|
+
# because it is not possible to limit the flattening to a single
|
7
|
+
# level.
|
8
|
+
#
|
9
|
+
# @param [Array] array
|
10
|
+
# The array of key/value pairs to transform.
|
11
|
+
#
|
12
|
+
# @return [Hash]
|
13
|
+
# A Hash where each entry in the Array is turned into a key/value.
|
14
|
+
#
|
15
|
+
# @api semipublic
|
16
|
+
def self.to_hash(array)
|
17
|
+
h = {}
|
18
|
+
array.each { |k,v| h[k] = v }
|
19
|
+
h
|
20
|
+
end
|
21
|
+
|
22
|
+
# Transforms an Array of key/value pairs into a {Mash}.
|
23
|
+
#
|
24
|
+
# This is a better idiom than using Mash[*array.flatten] in Ruby 1.8.6
|
25
|
+
# because it is not possible to limit the flattening to a single
|
26
|
+
# level.
|
27
|
+
#
|
28
|
+
# @param [Array] array
|
29
|
+
# The array of key/value pairs to transform.
|
30
|
+
#
|
31
|
+
# @return [Mash]
|
32
|
+
# A {Mash} where each entry in the Array is turned into a key/value.
|
33
|
+
#
|
34
|
+
# @api semipublic
|
35
|
+
def self.to_mash(array)
|
36
|
+
m = Mash.new
|
37
|
+
array.each { |k,v| m[k] = v }
|
38
|
+
m
|
39
|
+
end
|
40
|
+
end # class Array
|
41
|
+
end; end
|