dm-core 0.10.2 → 1.0.0.rc1

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.
Files changed (183) hide show
  1. data/.gitignore +10 -1
  2. data/Gemfile +143 -0
  3. data/Rakefile +9 -5
  4. data/VERSION +1 -1
  5. data/dm-core.gemspec +160 -57
  6. data/lib/dm-core.rb +131 -56
  7. data/lib/dm-core/adapters.rb +98 -14
  8. data/lib/dm-core/adapters/abstract_adapter.rb +24 -4
  9. data/lib/dm-core/adapters/in_memory_adapter.rb +7 -2
  10. data/lib/dm-core/associations/many_to_many.rb +19 -30
  11. data/lib/dm-core/associations/many_to_one.rb +58 -42
  12. data/lib/dm-core/associations/one_to_many.rb +33 -23
  13. data/lib/dm-core/associations/one_to_one.rb +27 -11
  14. data/lib/dm-core/associations/relationship.rb +4 -4
  15. data/lib/dm-core/collection.rb +23 -16
  16. data/lib/dm-core/core_ext/array.rb +36 -0
  17. data/lib/dm-core/core_ext/hash.rb +30 -0
  18. data/lib/dm-core/core_ext/module.rb +46 -0
  19. data/lib/dm-core/core_ext/object.rb +31 -0
  20. data/lib/dm-core/core_ext/pathname.rb +20 -0
  21. data/lib/dm-core/core_ext/string.rb +22 -0
  22. data/lib/dm-core/core_ext/try_dup.rb +44 -0
  23. data/lib/dm-core/model.rb +88 -27
  24. data/lib/dm-core/model/hook.rb +75 -18
  25. data/lib/dm-core/model/property.rb +50 -9
  26. data/lib/dm-core/model/relationship.rb +31 -31
  27. data/lib/dm-core/model/scope.rb +3 -3
  28. data/lib/dm-core/property.rb +196 -516
  29. data/lib/dm-core/property/binary.rb +7 -0
  30. data/lib/dm-core/property/boolean.rb +35 -0
  31. data/lib/dm-core/property/class.rb +24 -0
  32. data/lib/dm-core/property/date.rb +47 -0
  33. data/lib/dm-core/property/date_time.rb +48 -0
  34. data/lib/dm-core/property/decimal.rb +43 -0
  35. data/lib/dm-core/property/discriminator.rb +48 -0
  36. data/lib/dm-core/property/float.rb +24 -0
  37. data/lib/dm-core/property/integer.rb +32 -0
  38. data/lib/dm-core/property/numeric.rb +43 -0
  39. data/lib/dm-core/property/object.rb +32 -0
  40. data/lib/dm-core/property/serial.rb +8 -0
  41. data/lib/dm-core/property/string.rb +49 -0
  42. data/lib/dm-core/property/text.rb +12 -0
  43. data/lib/dm-core/property/time.rb +48 -0
  44. data/lib/dm-core/property/typecast/numeric.rb +32 -0
  45. data/lib/dm-core/property/typecast/time.rb +28 -0
  46. data/lib/dm-core/property_set.rb +10 -4
  47. data/lib/dm-core/query.rb +14 -37
  48. data/lib/dm-core/query/conditions/comparison.rb +8 -6
  49. data/lib/dm-core/query/conditions/operation.rb +33 -2
  50. data/lib/dm-core/query/operator.rb +2 -5
  51. data/lib/dm-core/query/path.rb +4 -6
  52. data/lib/dm-core/repository.rb +21 -6
  53. data/lib/dm-core/resource.rb +316 -133
  54. data/lib/dm-core/resource/state.rb +79 -0
  55. data/lib/dm-core/resource/state/clean.rb +40 -0
  56. data/lib/dm-core/resource/state/deleted.rb +30 -0
  57. data/lib/dm-core/resource/state/dirty.rb +86 -0
  58. data/lib/dm-core/resource/state/immutable.rb +34 -0
  59. data/lib/dm-core/resource/state/persisted.rb +29 -0
  60. data/lib/dm-core/resource/state/transient.rb +70 -0
  61. data/lib/dm-core/spec/lib/adapter_helpers.rb +52 -0
  62. data/lib/dm-core/spec/lib/collection_helpers.rb +20 -0
  63. data/{spec → lib/dm-core/spec}/lib/counter_adapter.rb +5 -1
  64. data/lib/dm-core/spec/lib/pending_helpers.rb +50 -0
  65. data/lib/dm-core/spec/lib/spec_helper.rb +68 -0
  66. data/lib/dm-core/spec/setup.rb +165 -0
  67. data/lib/dm-core/spec/{adapter_shared_spec.rb → shared/adapter_spec.rb} +21 -7
  68. data/{spec/public/shared/resource_shared_spec.rb → lib/dm-core/spec/shared/resource_spec.rb} +120 -83
  69. data/{spec/public/shared/sel_shared_spec.rb → lib/dm-core/spec/shared/sel_spec.rb} +5 -6
  70. data/lib/dm-core/support/assertions.rb +8 -0
  71. data/lib/dm-core/support/equalizer.rb +1 -0
  72. data/lib/dm-core/support/hook.rb +420 -0
  73. data/lib/dm-core/support/lazy_array.rb +453 -0
  74. data/lib/dm-core/support/local_object_space.rb +12 -0
  75. data/lib/dm-core/support/logger.rb +193 -6
  76. data/lib/dm-core/support/naming_conventions.rb +8 -8
  77. data/lib/dm-core/support/subject.rb +33 -0
  78. data/lib/dm-core/type.rb +4 -0
  79. data/lib/dm-core/types/boolean.rb +2 -0
  80. data/lib/dm-core/types/decimal.rb +9 -0
  81. data/lib/dm-core/types/discriminator.rb +2 -0
  82. data/lib/dm-core/types/object.rb +3 -0
  83. data/lib/dm-core/types/serial.rb +2 -0
  84. data/lib/dm-core/types/text.rb +2 -0
  85. data/lib/dm-core/version.rb +1 -1
  86. data/spec/public/associations/many_to_many/read_multiple_join_spec.rb +67 -0
  87. data/spec/public/model/hook_spec.rb +209 -0
  88. data/spec/public/model/property_spec.rb +35 -0
  89. data/spec/public/model/relationship_spec.rb +33 -20
  90. data/spec/public/model_spec.rb +142 -10
  91. data/spec/public/property/binary_spec.rb +14 -0
  92. data/spec/public/property/boolean_spec.rb +14 -0
  93. data/spec/public/property/class_spec.rb +20 -0
  94. data/spec/public/property/date_spec.rb +14 -0
  95. data/spec/public/property/date_time_spec.rb +14 -0
  96. data/spec/public/property/decimal_spec.rb +14 -0
  97. data/spec/public/{types → property}/discriminator_spec.rb +2 -12
  98. data/spec/public/property/float_spec.rb +14 -0
  99. data/spec/public/property/integer_spec.rb +14 -0
  100. data/spec/public/property/object_spec.rb +9 -17
  101. data/spec/public/property/serial_spec.rb +14 -0
  102. data/spec/public/property/string_spec.rb +14 -0
  103. data/spec/public/property/text_spec.rb +52 -0
  104. data/spec/public/property/time_spec.rb +14 -0
  105. data/spec/public/property_spec.rb +28 -87
  106. data/spec/public/resource_spec.rb +101 -0
  107. data/spec/public/sel_spec.rb +5 -15
  108. data/spec/public/shared/collection_shared_spec.rb +16 -30
  109. data/spec/public/shared/finder_shared_spec.rb +2 -4
  110. data/spec/public/shared/property_shared_spec.rb +176 -0
  111. data/spec/semipublic/adapters/abstract_adapter_spec.rb +1 -1
  112. data/spec/semipublic/adapters/in_memory_adapter_spec.rb +2 -2
  113. data/spec/semipublic/associations/many_to_many_spec.rb +89 -0
  114. data/spec/semipublic/associations/many_to_one_spec.rb +24 -1
  115. data/spec/semipublic/associations/one_to_many_spec.rb +51 -0
  116. data/spec/semipublic/associations/one_to_one_spec.rb +49 -0
  117. data/spec/semipublic/associations/relationship_spec.rb +3 -3
  118. data/spec/semipublic/associations_spec.rb +1 -1
  119. data/spec/semipublic/property/binary_spec.rb +13 -0
  120. data/spec/semipublic/property/boolean_spec.rb +65 -0
  121. data/spec/semipublic/property/class_spec.rb +33 -0
  122. data/spec/semipublic/property/date_spec.rb +43 -0
  123. data/spec/semipublic/property/date_time_spec.rb +46 -0
  124. data/spec/semipublic/property/decimal_spec.rb +82 -0
  125. data/spec/semipublic/property/discriminator_spec.rb +19 -0
  126. data/spec/semipublic/property/float_spec.rb +82 -0
  127. data/spec/semipublic/property/integer_spec.rb +82 -0
  128. data/spec/semipublic/property/serial_spec.rb +13 -0
  129. data/spec/semipublic/property/string_spec.rb +13 -0
  130. data/spec/semipublic/property/text_spec.rb +31 -0
  131. data/spec/semipublic/property/time_spec.rb +50 -0
  132. data/spec/semipublic/property_spec.rb +2 -532
  133. data/spec/semipublic/query/conditions/comparison_spec.rb +171 -169
  134. data/spec/semipublic/query/conditions/operation_spec.rb +53 -51
  135. data/spec/semipublic/query/path_spec.rb +17 -17
  136. data/spec/semipublic/query_spec.rb +47 -78
  137. data/spec/semipublic/resource/state/clean_spec.rb +88 -0
  138. data/spec/semipublic/resource/state/deleted_spec.rb +78 -0
  139. data/spec/semipublic/resource/state/dirty_spec.rb +133 -0
  140. data/spec/semipublic/resource/state/immutable_spec.rb +99 -0
  141. data/spec/semipublic/resource/state/transient_spec.rb +128 -0
  142. data/spec/semipublic/resource/state_spec.rb +226 -0
  143. data/spec/semipublic/shared/property_shared_spec.rb +143 -0
  144. data/spec/semipublic/shared/resource_shared_spec.rb +16 -15
  145. data/spec/semipublic/shared/resource_state_shared_spec.rb +78 -0
  146. data/spec/semipublic/shared/subject_shared_spec.rb +79 -0
  147. data/spec/spec_helper.rb +21 -97
  148. data/spec/support/types/huge_integer.rb +17 -0
  149. data/spec/unit/array_spec.rb +48 -0
  150. data/spec/unit/hash_spec.rb +35 -0
  151. data/spec/unit/hook_spec.rb +1234 -0
  152. data/spec/unit/lazy_array_spec.rb +1959 -0
  153. data/spec/unit/module_spec.rb +70 -0
  154. data/spec/unit/object_spec.rb +37 -0
  155. data/spec/unit/try_dup_spec.rb +45 -0
  156. data/tasks/local_gemfile.rake +18 -0
  157. data/tasks/spec.rake +0 -3
  158. metadata +197 -71
  159. data/deps.rip +0 -2
  160. data/lib/dm-core/adapters/data_objects_adapter.rb +0 -712
  161. data/lib/dm-core/adapters/mysql_adapter.rb +0 -42
  162. data/lib/dm-core/adapters/oracle_adapter.rb +0 -229
  163. data/lib/dm-core/adapters/postgres_adapter.rb +0 -22
  164. data/lib/dm-core/adapters/sqlite3_adapter.rb +0 -17
  165. data/lib/dm-core/adapters/sqlserver_adapter.rb +0 -114
  166. data/lib/dm-core/adapters/yaml_adapter.rb +0 -111
  167. data/lib/dm-core/core_ext/enumerable.rb +0 -28
  168. data/lib/dm-core/migrations.rb +0 -1427
  169. data/lib/dm-core/spec/data_objects_adapter_shared_spec.rb +0 -366
  170. data/lib/dm-core/transaction.rb +0 -508
  171. data/lib/dm-core/types/paranoid_boolean.rb +0 -42
  172. data/lib/dm-core/types/paranoid_datetime.rb +0 -41
  173. data/spec/lib/adapter_helpers.rb +0 -105
  174. data/spec/lib/collection_helpers.rb +0 -18
  175. data/spec/lib/pending_helpers.rb +0 -46
  176. data/spec/public/migrations_spec.rb +0 -503
  177. data/spec/public/transaction_spec.rb +0 -153
  178. data/spec/semipublic/adapters/mysql_adapter_spec.rb +0 -17
  179. data/spec/semipublic/adapters/oracle_adapter_spec.rb +0 -194
  180. data/spec/semipublic/adapters/postgres_adapter_spec.rb +0 -17
  181. data/spec/semipublic/adapters/sqlite3_adapter_spec.rb +0 -17
  182. data/spec/semipublic/adapters/sqlserver_adapter_spec.rb +0 -17
  183. data/spec/semipublic/adapters/yaml_adapter_spec.rb +0 -12
data/lib/dm-core.rb CHANGED
@@ -2,71 +2,140 @@ require 'addressable/uri'
2
2
  require 'bigdecimal'
3
3
  require 'bigdecimal/util'
4
4
  require 'date'
5
- require 'extlib'
6
5
  require 'pathname'
7
6
  require 'set'
8
7
  require 'time'
9
8
  require 'yaml'
10
9
 
10
+ begin
11
+
12
+ # Prefer active_support
13
+
14
+ require 'active_support/core_ext/kernel/singleton_class'
15
+ require 'active_support/core_ext/class/inheritable_attributes'
16
+ require 'active_support/core_ext/object/blank'
17
+ require 'active_support/core_ext/hash/except'
18
+
19
+ require 'active_support/hash_with_indifferent_access'
20
+ require 'active_support/inflector'
21
+
22
+ Mash = ActiveSupport::HashWithIndifferentAccess
23
+
24
+ require 'dm-core/core_ext/hash'
25
+ require 'dm-core/core_ext/object'
26
+ require 'dm-core/core_ext/string'
27
+
28
+ rescue LoadError
29
+
30
+ # Default to extlib
31
+
32
+ require 'extlib/inflection'
33
+ require 'extlib/mash'
34
+ require 'extlib/string'
35
+ require 'extlib/class'
36
+ require 'extlib/hash'
37
+ require 'extlib/object'
38
+ require 'extlib/blank'
39
+
40
+ class Object
41
+ unless respond_to?(:singleton_class)
42
+ def singleton_class
43
+ class << self; self end
44
+ end
45
+ end
46
+ end
47
+
48
+ module ActiveSupport
49
+ Inflector = Extlib::Inflection
50
+ end
51
+
52
+ end
53
+
11
54
  begin
12
55
  require 'fastthread'
13
56
  rescue LoadError
14
57
  # fastthread not installed
15
58
  end
16
59
 
17
- dir = Pathname(__FILE__).dirname.expand_path / 'dm-core'
18
-
19
- require dir / 'support' / 'chainable'
20
- require dir / 'support' / 'deprecate'
21
- require dir / 'support' / 'equalizer'
22
-
23
- require dir / 'model'
24
- require dir / 'model' / 'descendant_set'
25
- require dir / 'model' / 'hook'
26
- require dir / 'model' / 'is'
27
- require dir / 'model' / 'scope'
28
- require dir / 'model' / 'relationship'
29
- require dir / 'model' / 'property'
30
-
31
- require dir / 'collection'
32
-
33
- require dir / 'type'
34
- require dir / 'types' / 'boolean'
35
- require dir / 'types' / 'discriminator'
36
- require dir / 'types' / 'text'
37
- require dir / 'types' / 'paranoid_datetime' # TODO: move to dm-more
38
- require dir / 'types' / 'paranoid_boolean' # TODO: move to dm-more
39
- require dir / 'types' / 'object'
40
- require dir / 'types' / 'serial'
41
-
42
- require dir / 'adapters'
43
- require dir / 'adapters' / 'abstract_adapter'
44
- require dir / 'associations' / 'relationship'
45
- require dir / 'associations' / 'one_to_many'
46
- require dir / 'associations' / 'one_to_one'
47
- require dir / 'associations' / 'many_to_one'
48
- require dir / 'associations' / 'many_to_many'
49
- require dir / 'identity_map'
50
- require dir / 'migrations' # TODO: move to dm-more
51
- require dir / 'property'
52
- require dir / 'property_set'
53
- require dir / 'query'
54
- require dir / 'query' / 'conditions' / 'operation'
55
- require dir / 'query' / 'conditions' / 'comparison'
56
- require dir / 'query' / 'operator'
57
- require dir / 'query' / 'direction'
58
- require dir / 'query' / 'path'
59
- require dir / 'query' / 'sort'
60
- require dir / 'repository'
61
- require dir / 'resource'
62
- require dir / 'support' / 'logger'
63
- require dir / 'support' / 'naming_conventions'
64
- require dir / 'transaction' # TODO: move to dm-more
65
- require dir / 'version'
66
-
67
- require dir / 'core_ext' / 'enumerable'
68
- require dir / 'core_ext' / 'kernel' # TODO: do not load automatically
69
- require dir / 'core_ext' / 'symbol' # TODO: do not load automatically
60
+ require 'dm-core/core_ext/pathname'
61
+ require 'dm-core/core_ext/module'
62
+ require 'dm-core/core_ext/array'
63
+
64
+ require 'dm-core/support/chainable'
65
+ require 'dm-core/support/deprecate'
66
+ require 'dm-core/support/equalizer'
67
+ require 'dm-core/support/assertions'
68
+ require 'dm-core/support/lazy_array'
69
+ require 'dm-core/support/local_object_space'
70
+ require 'dm-core/support/hook'
71
+ require 'dm-core/support/subject'
72
+ require 'dm-core/model'
73
+ require 'dm-core/model/descendant_set'
74
+ require 'dm-core/model/hook'
75
+ require 'dm-core/model/is'
76
+ require 'dm-core/model/scope'
77
+ require 'dm-core/model/relationship'
78
+ require 'dm-core/model/property'
79
+
80
+ require 'dm-core/collection'
81
+
82
+ require 'dm-core/type'
83
+ require 'dm-core/types/boolean'
84
+ require 'dm-core/types/discriminator'
85
+ require 'dm-core/types/text'
86
+ require 'dm-core/types/object'
87
+ require 'dm-core/types/serial'
88
+
89
+ require 'dm-core/property'
90
+ require 'dm-core/property/object'
91
+ require 'dm-core/property/string'
92
+ require 'dm-core/property/binary'
93
+ require 'dm-core/property/text'
94
+ require 'dm-core/property/numeric'
95
+ require 'dm-core/property/float'
96
+ require 'dm-core/property/decimal'
97
+ require 'dm-core/property/boolean'
98
+ require 'dm-core/property/integer'
99
+ require 'dm-core/property/serial'
100
+ require 'dm-core/property/date'
101
+ require 'dm-core/property/date_time'
102
+ require 'dm-core/property/time'
103
+ require 'dm-core/property/class'
104
+ require 'dm-core/property/discriminator'
105
+ require 'dm-core/property_set'
106
+
107
+ require 'dm-core/adapters'
108
+ require 'dm-core/adapters/abstract_adapter'
109
+ require 'dm-core/associations/relationship'
110
+ require 'dm-core/associations/one_to_many'
111
+ require 'dm-core/associations/one_to_one'
112
+ require 'dm-core/associations/many_to_one'
113
+ require 'dm-core/associations/many_to_many'
114
+ require 'dm-core/identity_map'
115
+ require 'dm-core/property'
116
+ require 'dm-core/property_set'
117
+ require 'dm-core/query'
118
+ require 'dm-core/query/conditions/operation'
119
+ require 'dm-core/query/conditions/comparison'
120
+ require 'dm-core/query/operator'
121
+ require 'dm-core/query/direction'
122
+ require 'dm-core/query/path'
123
+ require 'dm-core/query/sort'
124
+ require 'dm-core/repository'
125
+ require 'dm-core/resource'
126
+ require 'dm-core/resource/state'
127
+ require 'dm-core/resource/state/transient'
128
+ require 'dm-core/resource/state/immutable'
129
+ require 'dm-core/resource/state/persisted'
130
+ require 'dm-core/resource/state/clean'
131
+ require 'dm-core/resource/state/deleted'
132
+ require 'dm-core/resource/state/dirty'
133
+ require 'dm-core/support/logger'
134
+ require 'dm-core/support/naming_conventions'
135
+ require 'dm-core/version'
136
+
137
+ require 'dm-core/core_ext/kernel' # TODO: do not load automatically
138
+ require 'dm-core/core_ext/symbol' # TODO: do not load automatically
70
139
 
71
140
  # A logger should always be present. Lets be consistent with DO
72
141
  DataMapper::Logger.new(StringIO.new, :fatal)
@@ -121,7 +190,7 @@ end
121
190
  # see DataMapper::Logger for more information.
122
191
  #
123
192
  module DataMapper
124
- extend Extlib::Assertions
193
+ extend DataMapper::Assertions
125
194
 
126
195
  class RepositoryNotSetupError < StandardError; end
127
196
 
@@ -137,6 +206,12 @@ module DataMapper
137
206
 
138
207
  class UpdateConflictError < PersistenceError; end
139
208
 
209
+ class SaveFailureError < PersistenceError; end
210
+
211
+ class ImmutableError < RuntimeError; end
212
+
213
+ class ImmutableDeletedError < ImmutableError; end
214
+
140
215
  # Raised on attempt to operate on collection of child objects
141
216
  # when parent object is not yet saved.
142
217
  # For instance, if your article object is not saved,
@@ -195,7 +270,7 @@ module DataMapper
195
270
  context = Repository.context
196
271
 
197
272
  current_repository = if name
198
- assert_kind_of 'name', name, Symbol
273
+ name = name.to_sym
199
274
  context.detect { |repository| repository.name == name }
200
275
  else
201
276
  name = Repository.default_name
@@ -1,7 +1,7 @@
1
1
  module DataMapper
2
2
  module Adapters
3
3
  extend Chainable
4
- extend Extlib::Assertions
4
+ extend DataMapper::Assertions
5
5
 
6
6
  # Set up an adapter for a storage engine
7
7
  #
@@ -10,7 +10,35 @@ module DataMapper
10
10
  # @api private
11
11
  def self.new(repository_name, options)
12
12
  options = normalize_options(options)
13
- adapter_class(options[:adapter]).new(repository_name, options)
13
+ adapter_class(options.fetch(:adapter)).new(repository_name, options)
14
+ end
15
+
16
+ # The path used to require the in memory adapter
17
+ #
18
+ # Set this if you want to register your own adapter
19
+ # to be used when you specify an 'in_memory' connection
20
+ # during
21
+ #
22
+ # @see DataMapper.setup
23
+ #
24
+ # @param [String] path
25
+ # the path used to require the desired in memory adapter
26
+ #
27
+ # @api semipublic
28
+ def self.in_memory_adapter_path=(path)
29
+ @in_memory_adapter_path = path
30
+ end
31
+
32
+ # The path used to require the in memory adapter
33
+ #
34
+ # @see DataMapper.setup
35
+ #
36
+ # @return [String]
37
+ # the path used to require the desired in memory adapter
38
+ #
39
+ # @api semipublic
40
+ def self.in_memory_adapter_path
41
+ @in_memory_adapter_path ||= 'dm-core/adapters/in_memory_adapter'
14
42
  end
15
43
 
16
44
  class << self
@@ -65,11 +93,11 @@ module DataMapper
65
93
 
66
94
  # Extract the name/value pairs from the query portion of the
67
95
  # connection uri, and set them as options directly.
68
- if options[:query]
96
+ if options.fetch(:query)
69
97
  options.update(uri.query_values)
70
98
  end
71
99
 
72
- options[:adapter] = options[:scheme]
100
+ options[:adapter] = options.fetch(:scheme)
73
101
 
74
102
  options
75
103
  end
@@ -89,6 +117,9 @@ module DataMapper
89
117
 
90
118
  # Return the adapter class constant
91
119
  #
120
+ # @example
121
+ # DataMapper::Adapters.send(:adapter_class, 'mysql') # => DataMapper::Adapters::MysqlAdapter
122
+ #
92
123
  # @param [Symbol] name
93
124
  # the name of the adapter
94
125
  #
@@ -97,11 +128,28 @@ module DataMapper
97
128
  #
98
129
  # @api private
99
130
  def adapter_class(name)
100
- class_name = (Extlib::Inflection.camelize(name) << 'Adapter').to_sym
101
- load_adapter(name) unless const_defined?(class_name)
131
+ adapter_name = normalize_adapter_name(name)
132
+ class_name = (ActiveSupport::Inflector.camelize(adapter_name) << 'Adapter').to_sym
133
+ load_adapter(adapter_name) unless const_defined?(class_name)
102
134
  const_get(class_name)
103
135
  end
104
136
 
137
+ # Return the name of the adapter
138
+ #
139
+ # @example
140
+ # DataMapper::Adapters.adapter_name('MysqlAdapter') # => 'mysql'
141
+ #
142
+ # @param [String] const_name
143
+ # the adapter constant name
144
+ #
145
+ # @return [String]
146
+ # the name of the adapter
147
+ #
148
+ # @api semipublic
149
+ def adapter_name(const_name)
150
+ const_name.to_s.sub('Adapter', '').downcase
151
+ end
152
+
105
153
  # Require the adapter library
106
154
  #
107
155
  # @param [String, Symbol] name
@@ -112,17 +160,53 @@ module DataMapper
112
160
  #
113
161
  # @api private
114
162
  def load_adapter(name)
115
- assert_kind_of 'name', name, String, Symbol
163
+ require "dm-#{name}-adapter"
164
+ rescue LoadError
165
+ require in_memory_adapter?(name) ? in_memory_adapter_path : legacy_path(name)
166
+ end
167
+
168
+ # Returns wether or not the given adapter name is considered an in memory adapter
169
+ #
170
+ # @param [String, Symbol] name
171
+ # the name of the adapter
172
+ #
173
+ # @return [Boolean]
174
+ # true if the adapter is considered to be an in memory adapter
175
+ #
176
+ # @api private
177
+ def in_memory_adapter?(name)
178
+ name.to_s == 'in_memory'
179
+ end
116
180
 
117
- lib = "#{name}_adapter"
118
- file = DataMapper.root / 'lib' / 'dm-core' / 'adapters' / "#{lib}.rb"
181
+ # Returns the fallback filename that would be used to require the named adapter
182
+ #
183
+ # The fallback format is "#{name}_adapter" and will be phased out in favor of
184
+ # the properly 'namespaced' "dm-#{name}-adapter" format.
185
+ #
186
+ # @param [String, Symbol] name
187
+ # the name of the adapter to require
188
+ #
189
+ # @return [String]
190
+ # the filename that gets required for the adapter identified by name
191
+ #
192
+ # @api private
193
+ def legacy_path(name)
194
+ "#{name}_adapter"
195
+ end
119
196
 
120
- if file.file?
121
- require file
122
- else
123
- require lib
124
- end
197
+ # Adjust the adapter name to match the name used in the gem providing the adapter
198
+ #
199
+ # @param [String, Symbol] name
200
+ # the name of the adapter
201
+ #
202
+ # @return [String]
203
+ # the normalized adapter name
204
+ #
205
+ # @api private
206
+ def normalize_adapter_name(name)
207
+ (original = name.to_s) == 'sqlite3' ? 'sqlite' : original
125
208
  end
209
+
126
210
  end
127
211
 
128
212
  extendable do
@@ -12,8 +12,8 @@ module DataMapper
12
12
  # Note that in case of adapters to relational databases it makes
13
13
  # sense to inherit from DataObjectsAdapter class.
14
14
  class AbstractAdapter
15
- include Extlib::Assertions
16
- extend Extlib::Assertions
15
+ include DataMapper::Assertions
16
+ extend DataMapper::Assertions
17
17
  extend Equalizer
18
18
 
19
19
  equalize :name, :options, :resource_naming_convention, :field_naming_convention
@@ -27,7 +27,7 @@ module DataMapper
27
27
  #
28
28
  # DataMapper.setup(:default, 'postgres://postgres@localhost/dm_core_test')
29
29
  #
30
- # then adapter name is currently be set to is :default
30
+ # the adapter name is currently set to :default
31
31
  #
32
32
  # @return [Symbol]
33
33
  # the adapter name
@@ -142,6 +142,26 @@ module DataMapper
142
142
  raise NotImplementedError, "#{self.class}#delete not implemented"
143
143
  end
144
144
 
145
+ # Create a Query object or subclass.
146
+ #
147
+ # Alter this method if you'd like to return an adapter specific Query subclass.
148
+ #
149
+ # @param [Repository] repository
150
+ # the Repository to retrieve results from
151
+ # @param [Model] model
152
+ # the Model to retrieve results from
153
+ # @param [Hash] options
154
+ # the conditions and scope
155
+ #
156
+ # @return [Query]
157
+ #
158
+ # @api semipublic
159
+ #--
160
+ # TODO: DataObjects::Connection.create_command style magic (Adapter)::Query?
161
+ def new_query(repository, model, options = {})
162
+ Query.new(repository, model, options)
163
+ end
164
+
145
165
  protected
146
166
 
147
167
  # Set the serial value of the Resource
@@ -178,7 +198,7 @@ module DataMapper
178
198
  #
179
199
  # @api semipublic
180
200
  def attributes_as_fields(attributes)
181
- attributes.map { |property, value| [ property.field, value ] }.to_hash
201
+ attributes.map { |property, value| [ property.field, property.dump(value) ] }.to_hash
182
202
  end
183
203
 
184
204
  private
@@ -23,7 +23,7 @@ module DataMapper
23
23
 
24
24
  resources.each do |resource|
25
25
  initialize_serial(resource, records.size.succ)
26
- records << resource.attributes(:field)
26
+ records << attributes_as_fields(resource.attributes(nil))
27
27
  end
28
28
  end
29
29
 
@@ -55,7 +55,7 @@ module DataMapper
55
55
  # @api semipublic
56
56
  def update(attributes, collection)
57
57
  attributes = attributes_as_fields(attributes)
58
- read(collection.query).each { |resource| resource.update(attributes) }.size
58
+ read(collection.query).each { |record| record.update(attributes) }.size
59
59
  end
60
60
 
61
61
  # Destroys all the records matching the given query. "DELETE" in SQL.
@@ -74,6 +74,11 @@ module DataMapper
74
74
  records_to_delete.size
75
75
  end
76
76
 
77
+ # TODO consider proper automigrate functionality
78
+ def reset
79
+ @records = {}
80
+ end
81
+
77
82
  private
78
83
 
79
84
  # Make a new instance of the adapter. The @records ivar is the 'data-store'