ardm-core 1.2.1

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 (259) hide show
  1. checksums.yaml +7 -0
  2. data/.autotest +29 -0
  3. data/.document +5 -0
  4. data/.gitignore +35 -0
  5. data/.travis.yml +23 -0
  6. data/.yardopts +1 -0
  7. data/Gemfile +63 -0
  8. data/LICENSE +20 -0
  9. data/README.rdoc +237 -0
  10. data/Rakefile +4 -0
  11. data/VERSION +1 -0
  12. data/ardm-core.gemspec +25 -0
  13. data/lib/ardm-core.rb +1 -0
  14. data/lib/dm-core.rb +285 -0
  15. data/lib/dm-core/adapters.rb +222 -0
  16. data/lib/dm-core/adapters/abstract_adapter.rb +236 -0
  17. data/lib/dm-core/adapters/in_memory_adapter.rb +113 -0
  18. data/lib/dm-core/associations/many_to_many.rb +496 -0
  19. data/lib/dm-core/associations/many_to_one.rb +296 -0
  20. data/lib/dm-core/associations/one_to_many.rb +345 -0
  21. data/lib/dm-core/associations/one_to_one.rb +86 -0
  22. data/lib/dm-core/associations/relationship.rb +663 -0
  23. data/lib/dm-core/backwards.rb +13 -0
  24. data/lib/dm-core/collection.rb +1514 -0
  25. data/lib/dm-core/core_ext/kernel.rb +23 -0
  26. data/lib/dm-core/core_ext/pathname.rb +6 -0
  27. data/lib/dm-core/core_ext/symbol.rb +10 -0
  28. data/lib/dm-core/identity_map.rb +7 -0
  29. data/lib/dm-core/model.rb +869 -0
  30. data/lib/dm-core/model/hook.rb +102 -0
  31. data/lib/dm-core/model/is.rb +32 -0
  32. data/lib/dm-core/model/property.rb +253 -0
  33. data/lib/dm-core/model/relationship.rb +377 -0
  34. data/lib/dm-core/model/scope.rb +89 -0
  35. data/lib/dm-core/property.rb +839 -0
  36. data/lib/dm-core/property/binary.rb +22 -0
  37. data/lib/dm-core/property/boolean.rb +31 -0
  38. data/lib/dm-core/property/class.rb +24 -0
  39. data/lib/dm-core/property/date.rb +45 -0
  40. data/lib/dm-core/property/date_time.rb +44 -0
  41. data/lib/dm-core/property/decimal.rb +50 -0
  42. data/lib/dm-core/property/discriminator.rb +46 -0
  43. data/lib/dm-core/property/float.rb +28 -0
  44. data/lib/dm-core/property/integer.rb +32 -0
  45. data/lib/dm-core/property/lookup.rb +29 -0
  46. data/lib/dm-core/property/numeric.rb +40 -0
  47. data/lib/dm-core/property/object.rb +28 -0
  48. data/lib/dm-core/property/serial.rb +13 -0
  49. data/lib/dm-core/property/string.rb +50 -0
  50. data/lib/dm-core/property/text.rb +12 -0
  51. data/lib/dm-core/property/time.rb +46 -0
  52. data/lib/dm-core/property/typecast/numeric.rb +32 -0
  53. data/lib/dm-core/property/typecast/time.rb +33 -0
  54. data/lib/dm-core/property_set.rb +177 -0
  55. data/lib/dm-core/query.rb +1444 -0
  56. data/lib/dm-core/query/conditions/comparison.rb +910 -0
  57. data/lib/dm-core/query/conditions/operation.rb +720 -0
  58. data/lib/dm-core/query/direction.rb +36 -0
  59. data/lib/dm-core/query/operator.rb +35 -0
  60. data/lib/dm-core/query/path.rb +114 -0
  61. data/lib/dm-core/query/sort.rb +39 -0
  62. data/lib/dm-core/relationship_set.rb +72 -0
  63. data/lib/dm-core/repository.rb +226 -0
  64. data/lib/dm-core/resource.rb +1228 -0
  65. data/lib/dm-core/resource/persistence_state.rb +75 -0
  66. data/lib/dm-core/resource/persistence_state/clean.rb +40 -0
  67. data/lib/dm-core/resource/persistence_state/deleted.rb +30 -0
  68. data/lib/dm-core/resource/persistence_state/dirty.rb +96 -0
  69. data/lib/dm-core/resource/persistence_state/immutable.rb +34 -0
  70. data/lib/dm-core/resource/persistence_state/persisted.rb +29 -0
  71. data/lib/dm-core/resource/persistence_state/transient.rb +78 -0
  72. data/lib/dm-core/spec/lib/adapter_helpers.rb +54 -0
  73. data/lib/dm-core/spec/lib/collection_helpers.rb +20 -0
  74. data/lib/dm-core/spec/lib/counter_adapter.rb +38 -0
  75. data/lib/dm-core/spec/lib/pending_helpers.rb +50 -0
  76. data/lib/dm-core/spec/lib/spec_helper.rb +74 -0
  77. data/lib/dm-core/spec/setup.rb +173 -0
  78. data/lib/dm-core/spec/shared/adapter_spec.rb +326 -0
  79. data/lib/dm-core/spec/shared/public/property_spec.rb +229 -0
  80. data/lib/dm-core/spec/shared/resource_spec.rb +1236 -0
  81. data/lib/dm-core/spec/shared/sel_spec.rb +111 -0
  82. data/lib/dm-core/spec/shared/semipublic/property_spec.rb +134 -0
  83. data/lib/dm-core/spec/shared/semipublic/query/conditions/abstract_comparison_spec.rb +261 -0
  84. data/lib/dm-core/support/assertions.rb +8 -0
  85. data/lib/dm-core/support/chainable.rb +18 -0
  86. data/lib/dm-core/support/deprecate.rb +12 -0
  87. data/lib/dm-core/support/descendant_set.rb +89 -0
  88. data/lib/dm-core/support/equalizer.rb +48 -0
  89. data/lib/dm-core/support/ext/array.rb +22 -0
  90. data/lib/dm-core/support/ext/blank.rb +25 -0
  91. data/lib/dm-core/support/ext/hash.rb +67 -0
  92. data/lib/dm-core/support/ext/module.rb +47 -0
  93. data/lib/dm-core/support/ext/object.rb +57 -0
  94. data/lib/dm-core/support/ext/string.rb +24 -0
  95. data/lib/dm-core/support/ext/try_dup.rb +12 -0
  96. data/lib/dm-core/support/hook.rb +402 -0
  97. data/lib/dm-core/support/inflections.rb +60 -0
  98. data/lib/dm-core/support/inflector/inflections.rb +211 -0
  99. data/lib/dm-core/support/inflector/methods.rb +151 -0
  100. data/lib/dm-core/support/lazy_array.rb +451 -0
  101. data/lib/dm-core/support/local_object_space.rb +12 -0
  102. data/lib/dm-core/support/logger.rb +199 -0
  103. data/lib/dm-core/support/mash.rb +176 -0
  104. data/lib/dm-core/support/naming_conventions.rb +90 -0
  105. data/lib/dm-core/support/ordered_set.rb +380 -0
  106. data/lib/dm-core/support/subject.rb +33 -0
  107. data/lib/dm-core/support/subject_set.rb +250 -0
  108. data/lib/dm-core/version.rb +3 -0
  109. data/script/performance.rb +275 -0
  110. data/script/profile.rb +218 -0
  111. data/spec/lib/rspec_immediate_feedback_formatter.rb +54 -0
  112. data/spec/public/associations/many_to_many/read_multiple_join_spec.rb +68 -0
  113. data/spec/public/associations/many_to_many_spec.rb +197 -0
  114. data/spec/public/associations/many_to_one_spec.rb +83 -0
  115. data/spec/public/associations/many_to_one_with_boolean_cpk_spec.rb +40 -0
  116. data/spec/public/associations/many_to_one_with_custom_fk_spec.rb +49 -0
  117. data/spec/public/associations/one_to_many_spec.rb +81 -0
  118. data/spec/public/associations/one_to_one_spec.rb +176 -0
  119. data/spec/public/associations/one_to_one_with_boolean_cpk_spec.rb +46 -0
  120. data/spec/public/collection_spec.rb +69 -0
  121. data/spec/public/finalize_spec.rb +76 -0
  122. data/spec/public/model/hook_spec.rb +246 -0
  123. data/spec/public/model/property_spec.rb +88 -0
  124. data/spec/public/model/relationship_spec.rb +1040 -0
  125. data/spec/public/model_spec.rb +458 -0
  126. data/spec/public/property/binary_spec.rb +41 -0
  127. data/spec/public/property/boolean_spec.rb +22 -0
  128. data/spec/public/property/class_spec.rb +28 -0
  129. data/spec/public/property/date_spec.rb +22 -0
  130. data/spec/public/property/date_time_spec.rb +22 -0
  131. data/spec/public/property/decimal_spec.rb +23 -0
  132. data/spec/public/property/discriminator_spec.rb +135 -0
  133. data/spec/public/property/float_spec.rb +22 -0
  134. data/spec/public/property/integer_spec.rb +22 -0
  135. data/spec/public/property/object_spec.rb +107 -0
  136. data/spec/public/property/serial_spec.rb +22 -0
  137. data/spec/public/property/string_spec.rb +22 -0
  138. data/spec/public/property/text_spec.rb +63 -0
  139. data/spec/public/property/time_spec.rb +22 -0
  140. data/spec/public/property_spec.rb +341 -0
  141. data/spec/public/resource_spec.rb +284 -0
  142. data/spec/public/sel_spec.rb +53 -0
  143. data/spec/public/setup_spec.rb +145 -0
  144. data/spec/public/shared/association_collection_shared_spec.rb +309 -0
  145. data/spec/public/shared/collection_finder_shared_spec.rb +267 -0
  146. data/spec/public/shared/collection_shared_spec.rb +1669 -0
  147. data/spec/public/shared/finder_shared_spec.rb +1629 -0
  148. data/spec/rcov.opts +6 -0
  149. data/spec/semipublic/adapters/abstract_adapter_spec.rb +30 -0
  150. data/spec/semipublic/adapters/in_memory_adapter_spec.rb +12 -0
  151. data/spec/semipublic/associations/many_to_many_spec.rb +94 -0
  152. data/spec/semipublic/associations/many_to_one_spec.rb +63 -0
  153. data/spec/semipublic/associations/one_to_many_spec.rb +55 -0
  154. data/spec/semipublic/associations/one_to_one_spec.rb +53 -0
  155. data/spec/semipublic/associations/relationship_spec.rb +200 -0
  156. data/spec/semipublic/associations_spec.rb +177 -0
  157. data/spec/semipublic/collection_spec.rb +110 -0
  158. data/spec/semipublic/model_spec.rb +96 -0
  159. data/spec/semipublic/property/binary_spec.rb +13 -0
  160. data/spec/semipublic/property/boolean_spec.rb +47 -0
  161. data/spec/semipublic/property/class_spec.rb +33 -0
  162. data/spec/semipublic/property/date_spec.rb +43 -0
  163. data/spec/semipublic/property/date_time_spec.rb +46 -0
  164. data/spec/semipublic/property/decimal_spec.rb +83 -0
  165. data/spec/semipublic/property/discriminator_spec.rb +19 -0
  166. data/spec/semipublic/property/float_spec.rb +82 -0
  167. data/spec/semipublic/property/integer_spec.rb +82 -0
  168. data/spec/semipublic/property/lookup_spec.rb +29 -0
  169. data/spec/semipublic/property/serial_spec.rb +13 -0
  170. data/spec/semipublic/property/string_spec.rb +13 -0
  171. data/spec/semipublic/property/text_spec.rb +31 -0
  172. data/spec/semipublic/property/time_spec.rb +50 -0
  173. data/spec/semipublic/property_spec.rb +114 -0
  174. data/spec/semipublic/query/conditions/comparison_spec.rb +1501 -0
  175. data/spec/semipublic/query/conditions/operation_spec.rb +1294 -0
  176. data/spec/semipublic/query/path_spec.rb +471 -0
  177. data/spec/semipublic/query_spec.rb +3777 -0
  178. data/spec/semipublic/resource/state/clean_spec.rb +88 -0
  179. data/spec/semipublic/resource/state/deleted_spec.rb +78 -0
  180. data/spec/semipublic/resource/state/dirty_spec.rb +156 -0
  181. data/spec/semipublic/resource/state/immutable_spec.rb +105 -0
  182. data/spec/semipublic/resource/state/transient_spec.rb +162 -0
  183. data/spec/semipublic/resource/state_spec.rb +230 -0
  184. data/spec/semipublic/resource_spec.rb +23 -0
  185. data/spec/semipublic/shared/condition_shared_spec.rb +9 -0
  186. data/spec/semipublic/shared/resource_shared_spec.rb +199 -0
  187. data/spec/semipublic/shared/resource_state_shared_spec.rb +79 -0
  188. data/spec/semipublic/shared/subject_shared_spec.rb +79 -0
  189. data/spec/spec.opts +5 -0
  190. data/spec/spec_helper.rb +37 -0
  191. data/spec/support/core_ext/hash.rb +10 -0
  192. data/spec/support/core_ext/inheritable_attributes.rb +46 -0
  193. data/spec/support/properties/huge_integer.rb +17 -0
  194. data/spec/unit/array_spec.rb +23 -0
  195. data/spec/unit/blank_spec.rb +73 -0
  196. data/spec/unit/data_mapper/ordered_set/append_spec.rb +26 -0
  197. data/spec/unit/data_mapper/ordered_set/clear_spec.rb +24 -0
  198. data/spec/unit/data_mapper/ordered_set/delete_spec.rb +28 -0
  199. data/spec/unit/data_mapper/ordered_set/each_spec.rb +19 -0
  200. data/spec/unit/data_mapper/ordered_set/empty_spec.rb +20 -0
  201. data/spec/unit/data_mapper/ordered_set/entries_spec.rb +22 -0
  202. data/spec/unit/data_mapper/ordered_set/eql_spec.rb +51 -0
  203. data/spec/unit/data_mapper/ordered_set/equal_value_spec.rb +84 -0
  204. data/spec/unit/data_mapper/ordered_set/hash_spec.rb +12 -0
  205. data/spec/unit/data_mapper/ordered_set/include_spec.rb +23 -0
  206. data/spec/unit/data_mapper/ordered_set/index_spec.rb +28 -0
  207. data/spec/unit/data_mapper/ordered_set/initialize_spec.rb +32 -0
  208. data/spec/unit/data_mapper/ordered_set/merge_spec.rb +36 -0
  209. data/spec/unit/data_mapper/ordered_set/shared/append_spec.rb +24 -0
  210. data/spec/unit/data_mapper/ordered_set/shared/clear_spec.rb +9 -0
  211. data/spec/unit/data_mapper/ordered_set/shared/delete_spec.rb +25 -0
  212. data/spec/unit/data_mapper/ordered_set/shared/each_spec.rb +17 -0
  213. data/spec/unit/data_mapper/ordered_set/shared/empty_spec.rb +9 -0
  214. data/spec/unit/data_mapper/ordered_set/shared/entries_spec.rb +9 -0
  215. data/spec/unit/data_mapper/ordered_set/shared/include_spec.rb +9 -0
  216. data/spec/unit/data_mapper/ordered_set/shared/index_spec.rb +13 -0
  217. data/spec/unit/data_mapper/ordered_set/shared/initialize_spec.rb +28 -0
  218. data/spec/unit/data_mapper/ordered_set/shared/merge_spec.rb +28 -0
  219. data/spec/unit/data_mapper/ordered_set/shared/size_spec.rb +13 -0
  220. data/spec/unit/data_mapper/ordered_set/shared/to_ary_spec.rb +11 -0
  221. data/spec/unit/data_mapper/ordered_set/size_spec.rb +27 -0
  222. data/spec/unit/data_mapper/ordered_set/to_ary_spec.rb +23 -0
  223. data/spec/unit/data_mapper/subject_set/append_spec.rb +47 -0
  224. data/spec/unit/data_mapper/subject_set/clear_spec.rb +34 -0
  225. data/spec/unit/data_mapper/subject_set/delete_spec.rb +40 -0
  226. data/spec/unit/data_mapper/subject_set/each_spec.rb +30 -0
  227. data/spec/unit/data_mapper/subject_set/empty_spec.rb +31 -0
  228. data/spec/unit/data_mapper/subject_set/entries_spec.rb +31 -0
  229. data/spec/unit/data_mapper/subject_set/get_spec.rb +34 -0
  230. data/spec/unit/data_mapper/subject_set/include_spec.rb +32 -0
  231. data/spec/unit/data_mapper/subject_set/named_spec.rb +33 -0
  232. data/spec/unit/data_mapper/subject_set/shared/append_spec.rb +18 -0
  233. data/spec/unit/data_mapper/subject_set/shared/clear_spec.rb +9 -0
  234. data/spec/unit/data_mapper/subject_set/shared/delete_spec.rb +9 -0
  235. data/spec/unit/data_mapper/subject_set/shared/each_spec.rb +9 -0
  236. data/spec/unit/data_mapper/subject_set/shared/empty_spec.rb +9 -0
  237. data/spec/unit/data_mapper/subject_set/shared/entries_spec.rb +9 -0
  238. data/spec/unit/data_mapper/subject_set/shared/get_spec.rb +9 -0
  239. data/spec/unit/data_mapper/subject_set/shared/include_spec.rb +9 -0
  240. data/spec/unit/data_mapper/subject_set/shared/named_spec.rb +9 -0
  241. data/spec/unit/data_mapper/subject_set/shared/size_spec.rb +13 -0
  242. data/spec/unit/data_mapper/subject_set/shared/to_ary_spec.rb +9 -0
  243. data/spec/unit/data_mapper/subject_set/shared/values_at_spec.rb +44 -0
  244. data/spec/unit/data_mapper/subject_set/size_spec.rb +42 -0
  245. data/spec/unit/data_mapper/subject_set/to_ary_spec.rb +34 -0
  246. data/spec/unit/data_mapper/subject_set/values_at_spec.rb +57 -0
  247. data/spec/unit/hash_spec.rb +28 -0
  248. data/spec/unit/hook_spec.rb +1235 -0
  249. data/spec/unit/lazy_array_spec.rb +1949 -0
  250. data/spec/unit/mash_spec.rb +312 -0
  251. data/spec/unit/module_spec.rb +71 -0
  252. data/spec/unit/object_spec.rb +38 -0
  253. data/spec/unit/try_dup_spec.rb +46 -0
  254. data/tasks/ci.rake +1 -0
  255. data/tasks/db.rake +11 -0
  256. data/tasks/spec.rake +38 -0
  257. data/tasks/yard.rake +9 -0
  258. data/tasks/yardstick.rake +19 -0
  259. metadata +491 -0
@@ -0,0 +1,22 @@
1
+ module DataMapper
2
+ class Property
3
+ class Binary < String
4
+ include PassThroughLoadDump
5
+
6
+ if RUBY_VERSION >= "1.9"
7
+
8
+ def load(value)
9
+ super.dup.force_encoding("BINARY") unless value.nil?
10
+ end
11
+
12
+ def dump(value)
13
+ value.dup.force_encoding("BINARY") unless value.nil?
14
+ rescue
15
+ value
16
+ end
17
+
18
+ end
19
+
20
+ end # class Binary
21
+ end # class Property
22
+ end # module DataMapper
@@ -0,0 +1,31 @@
1
+ module DataMapper
2
+ class Property
3
+ class Boolean < Object
4
+ include PassThroughLoadDump
5
+
6
+ primitive ::TrueClass
7
+
8
+ TRUE_VALUES = [ 1, '1', 't', 'T', 'true', 'TRUE' ].freeze
9
+ FALSE_VALUES = [ 0, '0', 'f', 'F', 'false', 'FALSE' ].freeze
10
+ BOOLEAN_MAP = Hash[
11
+ TRUE_VALUES.product([ true ]) + FALSE_VALUES.product([ false ]) ].freeze
12
+
13
+ def primitive?(value)
14
+ value == true || value == false
15
+ end
16
+
17
+ # Typecast a value to a true or false
18
+ #
19
+ # @param [Integer, #to_str] value
20
+ # value to typecast
21
+ #
22
+ # @return [Boolean]
23
+ # true or false constructed from value
24
+ #
25
+ # @api private
26
+ def typecast_to_primitive(value)
27
+ BOOLEAN_MAP.fetch(value, value)
28
+ end
29
+ end # class Boolean
30
+ end # class Property
31
+ end # module DataMapper
@@ -0,0 +1,24 @@
1
+ module DataMapper
2
+ class Property
3
+ class Class < Object
4
+ include PassThroughLoadDump
5
+
6
+ primitive ::Class
7
+
8
+ # Typecast a value to a Class
9
+ #
10
+ # @param [#to_s] value
11
+ # value to typecast
12
+ #
13
+ # @return [Class]
14
+ # Class constructed from value
15
+ #
16
+ # @api private
17
+ def typecast_to_primitive(value)
18
+ DataMapper::Ext::Module.find_const(model, value.to_s)
19
+ rescue NameError
20
+ value
21
+ end
22
+ end # class Class
23
+ end # class Property
24
+ end # module DataMapper
@@ -0,0 +1,45 @@
1
+ module DataMapper
2
+ class Property
3
+ class Date < Object
4
+ include PassThroughLoadDump
5
+ include Typecast::Time
6
+
7
+ primitive ::Date
8
+
9
+ # Typecasts an arbitrary value to a Date
10
+ # Handles both Hashes and Date instances.
11
+ #
12
+ # @param [Hash, #to_mash, #to_s] value
13
+ # value to be typecast
14
+ #
15
+ # @return [Date]
16
+ # Date constructed from value
17
+ #
18
+ # @api private
19
+ def typecast_to_primitive(value)
20
+ if value.respond_to?(:to_date)
21
+ value.to_date
22
+ elsif value.is_a?(::Hash) || value.respond_to?(:to_mash)
23
+ typecast_hash_to_date(value)
24
+ else
25
+ ::Date.parse(value.to_s)
26
+ end
27
+ rescue ArgumentError
28
+ value
29
+ end
30
+
31
+ # Creates a Date instance from a Hash with keys :year, :month, :day
32
+ #
33
+ # @param [Hash, #to_mash] value
34
+ # value to be typecast
35
+ #
36
+ # @return [Date]
37
+ # Date constructed from hash
38
+ #
39
+ # @api private
40
+ def typecast_hash_to_date(value)
41
+ ::Date.new(*extract_time(value)[0, 3])
42
+ end
43
+ end # class Date
44
+ end # class Property
45
+ end # module DataMapper
@@ -0,0 +1,44 @@
1
+ module DataMapper
2
+ class Property
3
+ class DateTime < Object
4
+ include PassThroughLoadDump
5
+ include Typecast::Time
6
+
7
+ primitive ::DateTime
8
+
9
+ # Typecasts an arbitrary value to a DateTime.
10
+ # Handles both Hashes and DateTime instances.
11
+ #
12
+ # @param [Hash, #to_mash, #to_s] value
13
+ # value to be typecast
14
+ #
15
+ # @return [DateTime]
16
+ # DateTime constructed from value
17
+ #
18
+ # @api private
19
+ def typecast_to_primitive(value)
20
+ if value.is_a?(::Hash) || value.respond_to?(:to_mash)
21
+ typecast_hash_to_datetime(value)
22
+ else
23
+ ::DateTime.parse(value.to_s)
24
+ end
25
+ rescue ArgumentError
26
+ value
27
+ end
28
+
29
+ # Creates a DateTime instance from a Hash with keys :year, :month, :day,
30
+ # :hour, :min, :sec
31
+ #
32
+ # @param [Hash, #to_mash] value
33
+ # value to be typecast
34
+ #
35
+ # @return [DateTime]
36
+ # DateTime constructed from hash
37
+ #
38
+ # @api private
39
+ def typecast_hash_to_datetime(value)
40
+ ::DateTime.new(*extract_time(value))
41
+ end
42
+ end # class DateTime
43
+ end # class Property
44
+ end # module DataMapper
@@ -0,0 +1,50 @@
1
+ module DataMapper
2
+ class Property
3
+ class Decimal < Numeric
4
+ primitive BigDecimal
5
+
6
+ DEFAULT_PRECISION = 10
7
+ DEFAULT_SCALE = 0
8
+
9
+ precision(DEFAULT_PRECISION)
10
+ scale(DEFAULT_SCALE)
11
+
12
+ protected
13
+
14
+ def initialize(model, name, options = {})
15
+ super
16
+
17
+ [ :scale, :precision ].each do |key|
18
+ unless @options.key?(key)
19
+ warn "options[#{key.inspect}] should be set for #{self.class}, defaulting to #{send(key).inspect} (#{caller.first})"
20
+ end
21
+ end
22
+
23
+ unless @scale >= 0
24
+ raise ArgumentError, "scale must be equal to or greater than 0, but was #{@scale.inspect}"
25
+ end
26
+
27
+ unless @precision >= @scale
28
+ raise ArgumentError, "precision must be equal to or greater than scale, but was #{@precision.inspect} and scale was #{@scale.inspect}"
29
+ end
30
+ end
31
+
32
+ # Typecast a value to a BigDecimal
33
+ #
34
+ # @param [#to_str, #to_d, Integer] value
35
+ # value to typecast
36
+ #
37
+ # @return [BigDecimal]
38
+ # BigDecimal constructed from value
39
+ #
40
+ # @api private
41
+ def typecast_to_primitive(value)
42
+ if value.kind_of?(::Integer)
43
+ value.to_s.to_d
44
+ else
45
+ typecast_to_numeric(value, :to_d)
46
+ end
47
+ end
48
+ end # class Decimal
49
+ end # class Property
50
+ end # module DataMapper
@@ -0,0 +1,46 @@
1
+ module DataMapper
2
+ class Property
3
+ class Discriminator < Class
4
+ include PassThroughLoadDump
5
+
6
+ default lambda { |resource, property| resource.model }
7
+ required true
8
+
9
+ # @api private
10
+ def bind
11
+ model.extend Model unless model < Model
12
+ end
13
+
14
+ module Model
15
+ def inherited(model)
16
+ super # setup self.descendants
17
+ set_discriminator_scope_for(model)
18
+ end
19
+
20
+ def new(*args, &block)
21
+ if args.size == 1 && args.first.kind_of?(Hash)
22
+ discriminator = properties(repository_name).discriminator
23
+
24
+ if discriminator_value = args.first[discriminator.name]
25
+ model = discriminator.typecast_to_primitive(discriminator_value)
26
+
27
+ if model.kind_of?(Model) && !model.equal?(self)
28
+ return model.new(*args, &block)
29
+ end
30
+ end
31
+ end
32
+
33
+ super
34
+ end
35
+
36
+ private
37
+
38
+ def set_discriminator_scope_for(model)
39
+ discriminator = self.properties.discriminator
40
+ default_scope = model.default_scope(discriminator.repository_name)
41
+ default_scope.update(discriminator.name => model.descendants.dup << model)
42
+ end
43
+ end
44
+ end # class Discriminator
45
+ end # module Property
46
+ end # module DataMapper
@@ -0,0 +1,28 @@
1
+ module DataMapper
2
+ class Property
3
+ class Float < Numeric
4
+ primitive ::Float
5
+
6
+ DEFAULT_PRECISION = 10
7
+ DEFAULT_SCALE = nil
8
+
9
+ precision(DEFAULT_PRECISION)
10
+ scale(DEFAULT_SCALE)
11
+
12
+ protected
13
+
14
+ # Typecast a value to a Float
15
+ #
16
+ # @param [#to_str, #to_f] value
17
+ # value to typecast
18
+ #
19
+ # @return [Float]
20
+ # Float constructed from value
21
+ #
22
+ # @api private
23
+ def typecast_to_primitive(value)
24
+ typecast_to_numeric(value, :to_f)
25
+ end
26
+ end # class Float
27
+ end # class Property
28
+ end # module DataMapper
@@ -0,0 +1,32 @@
1
+ module DataMapper
2
+ class Property
3
+ class Integer < Numeric
4
+ primitive ::Integer
5
+
6
+ accept_options :serial
7
+
8
+ protected
9
+
10
+ # @api semipublic
11
+ def initialize(model, name, options = {})
12
+ if options.key?(:serial) && !kind_of?(Serial)
13
+ raise "Integer #{name} with explicit :serial option is deprecated, use Serial instead (#{caller[2]})"
14
+ end
15
+ super
16
+ end
17
+
18
+ # Typecast a value to an Integer
19
+ #
20
+ # @param [#to_str, #to_i] value
21
+ # value to typecast
22
+ #
23
+ # @return [Integer]
24
+ # Integer constructed from value
25
+ #
26
+ # @api private
27
+ def typecast_to_primitive(value)
28
+ typecast_to_numeric(value, :to_i)
29
+ end
30
+ end # class Integer
31
+ end # class Property
32
+ end # module DataMapper
@@ -0,0 +1,29 @@
1
+ module DataMapper
2
+ class Property
3
+ module Lookup
4
+
5
+ protected
6
+
7
+ #
8
+ # Provides transparent access to the Properties defined in
9
+ # {Property}.
10
+ #
11
+ # @param [Symbol] name
12
+ # The name of the property to lookup.
13
+ #
14
+ # @return [Property]
15
+ # The property with the given name.
16
+ #
17
+ # @raise [NameError]
18
+ # The property could not be found.
19
+ #
20
+ # @api private
21
+ #
22
+ # @since 1.0.1
23
+ #
24
+ def const_missing(name)
25
+ Property.find_class(name.to_s) || super
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,40 @@
1
+ module DataMapper
2
+ class Property
3
+ class Numeric < Object
4
+ include PassThroughLoadDump
5
+ include Typecast::Numeric
6
+
7
+ accept_options :precision, :scale, :min, :max
8
+ attr_reader :precision, :scale, :min, :max
9
+
10
+ DEFAULT_NUMERIC_MIN = 0
11
+ DEFAULT_NUMERIC_MAX = 2**31-1
12
+
13
+ protected
14
+
15
+ def initialize(model, name, options = {})
16
+ super
17
+
18
+ if @primitive == BigDecimal || @primitive == ::Float
19
+ @precision = @options.fetch(:precision)
20
+ @scale = @options.fetch(:scale)
21
+
22
+ unless @precision > 0
23
+ raise ArgumentError, "precision must be greater than 0, but was #{@precision.inspect}"
24
+ end
25
+ end
26
+
27
+ if @options.key?(:min) || @options.key?(:max)
28
+ @min = @options.fetch(:min, self.class::DEFAULT_NUMERIC_MIN)
29
+ @max = @options.fetch(:max, self.class::DEFAULT_NUMERIC_MAX)
30
+
31
+ if @max < DEFAULT_NUMERIC_MIN && !@options.key?(:min)
32
+ raise ArgumentError, "min should be specified when the max is less than #{DEFAULT_NUMERIC_MIN}"
33
+ elsif @max < @min
34
+ raise ArgumentError, "max must be less than the min, but was #{@max} while the min was #{@min}"
35
+ end
36
+ end
37
+ end
38
+ end # class Numeric
39
+ end # class Property
40
+ end # module DataMapper
@@ -0,0 +1,28 @@
1
+ module DataMapper
2
+ class Property
3
+ class Object < Property
4
+ primitive ::Object
5
+
6
+ # @api semipublic
7
+ def dump(value)
8
+ return if value.nil?
9
+ [ Marshal.dump(value) ].pack('m')
10
+ end
11
+
12
+ # @api semipublic
13
+ def load(value)
14
+ case value
15
+ when ::String
16
+ Marshal.load(value.unpack('m').first)
17
+ when ::Object
18
+ value
19
+ end
20
+ end
21
+
22
+ # @api private
23
+ def to_child_key
24
+ self.class
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,13 @@
1
+ module DataMapper
2
+ class Property
3
+ class Serial < Integer
4
+ serial true
5
+ min 1
6
+
7
+ # @api private
8
+ def to_child_key
9
+ Property::Integer
10
+ end
11
+ end # class Text
12
+ end # module Property
13
+ end # module DataMapper