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
@@ -0,0 +1,12 @@
1
+ module DataMapper
2
+ module LocalObjectSpace
3
+ def self.extended(klass)
4
+ (class << klass; self; end).send :attr_accessor, :hook_scopes
5
+ klass.hook_scopes = []
6
+ end
7
+
8
+ def object_by_id(object_id)
9
+ self.hook_scopes.detect { |object| object.object_id == object_id }
10
+ end
11
+ end
12
+ end
@@ -1,13 +1,200 @@
1
+ require "time" # httpdate
2
+ # ==== Public Extlib Logger API
3
+ #
4
+ # To replace an existing logger with a new one:
5
+ # Extlib::Logger.set_log(log{String, IO},level{Symbol, String})
6
+ #
7
+ # Available logging levels are
8
+ # Extlib::Logger::{ Fatal, Error, Warn, Info, Debug }
9
+ #
10
+ # Logging via:
11
+ # Extlib.logger.fatal(message<String>,&block)
12
+ # Extlib.logger.error(message<String>,&block)
13
+ # Extlib.logger.warn(message<String>,&block)
14
+ # Extlib.logger.info(message<String>,&block)
15
+ # Extlib.logger.debug(message<String>,&block)
16
+ #
17
+ # Logging with autoflush:
18
+ # Extlib.logger.fatal!(message<String>,&block)
19
+ # Extlib.logger.error!(message<String>,&block)
20
+ # Extlib.logger.warn!(message<String>,&block)
21
+ # Extlib.logger.info!(message<String>,&block)
22
+ # Extlib.logger.debug!(message<String>,&block)
23
+ #
24
+ # Flush the buffer to
25
+ # Extlib.logger.flush
26
+ #
27
+ # Remove the current log object
28
+ # Extlib.logger.close
29
+ #
30
+ # ==== Private Extlib Logger API
31
+ #
32
+ # To initialize the logger you create a new object, proxies to set_log.
33
+ # Extlib::Logger.new(log{String, IO},level{Symbol, String})
1
34
  module DataMapper
2
- class << self #:nodoc:
35
+
36
+ class << self
3
37
  attr_accessor :logger
4
38
  end
5
39
 
6
- class Logger < Extlib::Logger
7
- def initialize(*)
8
- super
40
+ class Logger
41
+
42
+ attr_accessor :level
43
+ attr_accessor :delimiter
44
+ attr_accessor :auto_flush
45
+ attr_reader :buffer
46
+ attr_reader :log
47
+ attr_reader :init_args
48
+
49
+ # ==== Notes
50
+ # Ruby (standard) logger levels:
51
+ # :fatal:: An unhandleable error that results in a program crash
52
+ # :error:: A handleable error condition
53
+ # :warn:: A warning
54
+ # :info:: generic (useful) information about system operation
55
+ # :debug:: low-level information for developers
56
+ Levels =
57
+ {
58
+ :fatal => 7,
59
+ :error => 6,
60
+ :warn => 4,
61
+ :info => 3,
62
+ :debug => 0
63
+ }
64
+
65
+ private
66
+
67
+ # Readies a log for writing.
68
+ #
69
+ # ==== Parameters
70
+ # log<IO, String>:: Either an IO object or a name of a logfile.
71
+ def initialize_log(log)
72
+ close if @log # be sure that we don't leave open files laying around.
73
+
74
+ if log.respond_to?(:write)
75
+ @log = log
76
+ elsif File.exist?(log)
77
+ @log = open(log, (File::WRONLY | File::APPEND))
78
+ @log.sync = true
79
+ else
80
+ FileUtils.mkdir_p(File.dirname(log)) unless File.directory?(File.dirname(log))
81
+ @log = open(log, (File::WRONLY | File::APPEND | File::CREAT))
82
+ @log.sync = true
83
+ @log.write("#{Time.now.httpdate} #{delimiter} info #{delimiter} Logfile created\n")
84
+ end
85
+ end
86
+
87
+ public
88
+
89
+ # To initialize the logger you create a new object, proxies to set_log.
90
+ #
91
+ # ==== Parameters
92
+ # *args:: Arguments to create the log from. See set_logs for specifics.
93
+ def initialize(*args)
94
+ @init_args = args
95
+ set_log(*args)
9
96
  self.auto_flush = true
10
97
  DataMapper.logger = self
11
98
  end
12
- end # class Logger
13
- end # module DataMapper
99
+
100
+ # Replaces an existing logger with a new one.
101
+ #
102
+ # ==== Parameters
103
+ # log<IO, String>:: Either an IO object or a name of a logfile.
104
+ # log_level<~to_sym>::
105
+ # The log level from, e.g. :fatal or :info. Defaults to :error in the
106
+ # production environment and :debug otherwise.
107
+ # delimiter<String>::
108
+ # Delimiter to use between message sections. Defaults to " ~ ".
109
+ # auto_flush<Boolean>::
110
+ # Whether the log should automatically flush after new messages are
111
+ # added. Defaults to false.
112
+ def set_log(log, log_level = nil, delimiter = " ~ ", auto_flush = false)
113
+ if log_level && Levels[log_level.to_sym]
114
+ @level = Levels[log_level.to_sym]
115
+ else
116
+ @level = Levels[:debug]
117
+ end
118
+ @buffer = []
119
+ @delimiter = delimiter
120
+ @auto_flush = auto_flush
121
+
122
+ initialize_log(log)
123
+ end
124
+
125
+ # Flush the entire buffer to the log object.
126
+ def flush
127
+ return unless @buffer.size > 0
128
+ @log.write(@buffer.slice!(0..-1).join)
129
+ end
130
+
131
+ # Close and remove the current log object.
132
+ def close
133
+ flush
134
+ @log.close if @log.respond_to?(:close) && !@log.tty?
135
+ @log = nil
136
+ end
137
+
138
+ # Appends a message to the log. The methods yield to an optional block and
139
+ # the output of this block will be appended to the message.
140
+ #
141
+ # ==== Parameters
142
+ # string<String>:: The message to be logged. Defaults to nil.
143
+ #
144
+ # ==== Returns
145
+ # String:: The resulting message added to the log file.
146
+ def <<(string = nil)
147
+ message = ""
148
+ message << delimiter
149
+ message << string if string
150
+ message << "\n" unless message[-1] == ?\n
151
+ @buffer << message
152
+ flush if @auto_flush
153
+
154
+ message
155
+ end
156
+ alias :push :<<
157
+
158
+ # Generate the logging methods for Extlib.logger for each log level.
159
+ Levels.each_pair do |name, number|
160
+ class_eval <<-LEVELMETHODS, __FILE__, __LINE__
161
+
162
+ # Appends a message to the log if the log level is at least as high as
163
+ # the log level of the logger.
164
+ #
165
+ # ==== Parameters
166
+ # string<String>:: The message to be logged. Defaults to nil.
167
+ #
168
+ # ==== Returns
169
+ # self:: The logger object for chaining.
170
+ def #{name}(message = nil)
171
+ self << message if #{number} >= level
172
+ self
173
+ end
174
+
175
+ # Appends a message to the log if the log level is at least as high as
176
+ # the log level of the logger. The bang! version of the method also auto
177
+ # flushes the log buffer to disk.
178
+ #
179
+ # ==== Parameters
180
+ # string<String>:: The message to be logged. Defaults to nil.
181
+ #
182
+ # ==== Returns
183
+ # self:: The logger object for chaining.
184
+ def #{name}!(message = nil)
185
+ self << message if #{number} >= level
186
+ flush if #{number} >= level
187
+ self
188
+ end
189
+
190
+ # ==== Returns
191
+ # Boolean:: True if this level will be logged by this logger.
192
+ def #{name}?
193
+ #{number} >= level
194
+ end
195
+ LEVELMETHODS
196
+ end
197
+
198
+ end
199
+
200
+ end
@@ -28,25 +28,25 @@ module DataMapper
28
28
 
29
29
  module UnderscoredAndPluralized
30
30
  def self.call(name)
31
- Extlib::Inflection.pluralize(Extlib::Inflection.underscore(name)).gsub('/', '_')
31
+ ActiveSupport::Inflector.pluralize(ActiveSupport::Inflector.underscore(name)).gsub('/', '_')
32
32
  end
33
33
  end # module UnderscoredAndPluralized
34
34
 
35
35
  module UnderscoredAndPluralizedWithoutModule
36
36
  def self.call(name)
37
- Extlib::Inflection.pluralize(Extlib::Inflection.underscore(Extlib::Inflection.demodulize(name)))
37
+ ActiveSupport::Inflector.pluralize(ActiveSupport::Inflector.underscore(ActiveSupport::Inflector.demodulize(name)))
38
38
  end
39
39
  end # module UnderscoredAndPluralizedWithoutModule
40
40
 
41
41
  module Underscored
42
42
  def self.call(name)
43
- Extlib::Inflection.underscore(name)
43
+ ActiveSupport::Inflector.underscore(name)
44
44
  end
45
45
  end # module Underscored
46
46
 
47
47
  module Yaml
48
48
  def self.call(name)
49
- "#{Extlib::Inflection.pluralize(Extlib::Inflection.underscore(name))}.yaml"
49
+ "#{ActiveSupport::Inflector.pluralize(ActiveSupport::Inflector.underscore(name))}.yaml"
50
50
  end
51
51
  end # module Yaml
52
52
 
@@ -56,25 +56,25 @@ module DataMapper
56
56
 
57
57
  module UnderscoredAndPluralized
58
58
  def self.call(property)
59
- Extlib::Inflection.pluralize(Extlib::Inflection.underscore(property.name.to_s)).gsub('/', '_')
59
+ ActiveSupport::Inflector.pluralize(ActiveSupport::Inflector.underscore(property.name.to_s)).gsub('/', '_')
60
60
  end
61
61
  end # module UnderscoredAndPluralized
62
62
 
63
63
  module UnderscoredAndPluralizedWithoutModule
64
64
  def self.call(property)
65
- Extlib::Inflection.pluralize(Extlib::Inflection.underscore(Extlib::Inflection.demodulize(property.name.to_s)))
65
+ ActiveSupport::Inflector.pluralize(ActiveSupport::Inflector.underscore(ActiveSupport::Inflector.demodulize(property.name.to_s)))
66
66
  end
67
67
  end # module UnderscoredAndPluralizedWithoutModule
68
68
 
69
69
  module Underscored
70
70
  def self.call(property)
71
- Extlib::Inflection.underscore(property.name.to_s)
71
+ ActiveSupport::Inflector.underscore(property.name.to_s)
72
72
  end
73
73
  end # module Underscored
74
74
 
75
75
  module Yaml
76
76
  def self.call(property)
77
- "#{Extlib::Inflection.pluralize(Extlib::Inflection.underscore(property.name.to_s))}.yaml"
77
+ "#{ActiveSupport::Inflector.pluralize(ActiveSupport::Inflector.underscore(property.name.to_s))}.yaml"
78
78
  end
79
79
  end # module Yaml
80
80
 
@@ -0,0 +1,33 @@
1
+ module DataMapper
2
+ module Subject
3
+ # Returns a default value of the subject for given resource
4
+ #
5
+ # When default value is a callable object, it is called with resource
6
+ # and subject passed as arguments.
7
+ #
8
+ # @param [Resource] resource
9
+ # the model instance for which the default is to be set
10
+ #
11
+ # @return [Object]
12
+ # the default value of this subject for +resource+
13
+ #
14
+ # @api semipublic
15
+ def default_for(resource)
16
+ if @default.respond_to?(:call)
17
+ @default.call(resource, self)
18
+ else
19
+ @default.try_dup
20
+ end
21
+ end
22
+
23
+ # Returns true if the subject has a default value
24
+ #
25
+ # @return [Boolean]
26
+ # true if the subject has a default value
27
+ #
28
+ # @api semipublic
29
+ def default?
30
+ @options.key?(:default)
31
+ end
32
+ end
33
+ end
data/lib/dm-core/type.rb CHANGED
@@ -83,6 +83,10 @@ module DataMapper
83
83
  # JSON = Json
84
84
  # end # module Types
85
85
  # end # module DataMapper
86
+
87
+ # TODO: this is only for the backward compatibility in case someone's subclassing from one of the deprecated types
88
+ module Types; end
89
+
86
90
  class Type
87
91
  # Until cooperation of Property and Type does not change, each must
88
92
  # have a separate list of options, because plugins (ex.: dm-validations)
@@ -1,3 +1,5 @@
1
+ require 'dm-core/type'
2
+
1
3
  module DataMapper
2
4
  module Types
3
5
  class Boolean < Type
@@ -0,0 +1,9 @@
1
+ require 'dm-core/type'
2
+
3
+ module DataMapper
4
+ module Types
5
+ class Decimal < Type
6
+ primitive BigDecimal
7
+ end # class Decimal
8
+ end # module Types
9
+ end # module DataMapper
@@ -1,3 +1,5 @@
1
+ require 'dm-core/type'
2
+
1
3
  module DataMapper
2
4
  module Types
3
5
  class Discriminator < Type
@@ -1,3 +1,6 @@
1
+ require 'dm-core/type'
2
+ require 'dm-core/types/text'
3
+
1
4
  module DataMapper
2
5
  module Types
3
6
  class Object < Type
@@ -1,3 +1,5 @@
1
+ require 'dm-core/type'
2
+
1
3
  module DataMapper
2
4
  module Types
3
5
  class Serial < Type
@@ -1,3 +1,5 @@
1
+ require 'dm-core/type'
2
+
1
3
  module DataMapper
2
4
  module Types
3
5
  class Text < Type
@@ -1,3 +1,3 @@
1
1
  module DataMapper
2
- VERSION = '0.10.2'.freeze
2
+ VERSION = '1.0.0.rc1'.freeze
3
3
  end
@@ -0,0 +1,67 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', '..', 'spec_helper'))
2
+
3
+ describe 'Many to Many Associations read across multiple join associations' do
4
+ before :all do
5
+ class ::User
6
+ include DataMapper::Resource
7
+
8
+ property :id, Serial
9
+
10
+ has n, :sales
11
+ has n, :sale_items, :through => :sales
12
+ has n, :items, :through => :sale_items
13
+ end
14
+
15
+ class ::Sale
16
+ include DataMapper::Resource
17
+
18
+ property :id, Serial
19
+
20
+ belongs_to :user
21
+ has n, :sale_items
22
+ has n, :items, :through => :sale_items
23
+ end
24
+
25
+ class ::SaleItem
26
+ include DataMapper::Resource
27
+
28
+ property :id, Serial
29
+
30
+ belongs_to :sale
31
+ belongs_to :item
32
+ end
33
+
34
+ class ::Item
35
+ include DataMapper::Resource
36
+
37
+ property :id, Serial
38
+
39
+ has n, :sale_items
40
+ end
41
+ end
42
+
43
+ supported_by :all do
44
+ before :all do
45
+ @user = User.create
46
+ @sale = @user.sales.create
47
+
48
+ 5.times { @sale.items.create }
49
+ end
50
+
51
+ before :all do
52
+ @no_join = defined?(DataMapper::Adapters::InMemoryAdapter) && @adapter.kind_of?(DataMapper::Adapters::InMemoryAdapter) ||
53
+ defined?(DataMapper::Adapters::YamlAdapter) && @adapter.kind_of?(DataMapper::Adapters::YamlAdapter)
54
+
55
+ @skip = @no_join
56
+ end
57
+
58
+ before do
59
+ pending if @skip
60
+ end
61
+
62
+ it 'should return all the created entries' do
63
+ @user.items.to_a.should == Item.all.to_a
64
+ @sale.items.to_a.should == Item.all.to_a
65
+ end
66
+ end
67
+ end