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.
- checksums.yaml +7 -0
- data/.autotest +29 -0
- data/.document +5 -0
- data/.gitignore +35 -0
- data/.travis.yml +23 -0
- data/.yardopts +1 -0
- data/Gemfile +63 -0
- data/LICENSE +20 -0
- data/README.rdoc +237 -0
- data/Rakefile +4 -0
- data/VERSION +1 -0
- data/ardm-core.gemspec +25 -0
- data/lib/ardm-core.rb +1 -0
- data/lib/dm-core.rb +285 -0
- data/lib/dm-core/adapters.rb +222 -0
- data/lib/dm-core/adapters/abstract_adapter.rb +236 -0
- data/lib/dm-core/adapters/in_memory_adapter.rb +113 -0
- data/lib/dm-core/associations/many_to_many.rb +496 -0
- data/lib/dm-core/associations/many_to_one.rb +296 -0
- data/lib/dm-core/associations/one_to_many.rb +345 -0
- data/lib/dm-core/associations/one_to_one.rb +86 -0
- data/lib/dm-core/associations/relationship.rb +663 -0
- data/lib/dm-core/backwards.rb +13 -0
- data/lib/dm-core/collection.rb +1514 -0
- data/lib/dm-core/core_ext/kernel.rb +23 -0
- data/lib/dm-core/core_ext/pathname.rb +6 -0
- data/lib/dm-core/core_ext/symbol.rb +10 -0
- data/lib/dm-core/identity_map.rb +7 -0
- data/lib/dm-core/model.rb +869 -0
- data/lib/dm-core/model/hook.rb +102 -0
- data/lib/dm-core/model/is.rb +32 -0
- data/lib/dm-core/model/property.rb +253 -0
- data/lib/dm-core/model/relationship.rb +377 -0
- data/lib/dm-core/model/scope.rb +89 -0
- data/lib/dm-core/property.rb +839 -0
- data/lib/dm-core/property/binary.rb +22 -0
- data/lib/dm-core/property/boolean.rb +31 -0
- data/lib/dm-core/property/class.rb +24 -0
- data/lib/dm-core/property/date.rb +45 -0
- data/lib/dm-core/property/date_time.rb +44 -0
- data/lib/dm-core/property/decimal.rb +50 -0
- data/lib/dm-core/property/discriminator.rb +46 -0
- data/lib/dm-core/property/float.rb +28 -0
- data/lib/dm-core/property/integer.rb +32 -0
- data/lib/dm-core/property/lookup.rb +29 -0
- data/lib/dm-core/property/numeric.rb +40 -0
- data/lib/dm-core/property/object.rb +28 -0
- data/lib/dm-core/property/serial.rb +13 -0
- data/lib/dm-core/property/string.rb +50 -0
- data/lib/dm-core/property/text.rb +12 -0
- data/lib/dm-core/property/time.rb +46 -0
- data/lib/dm-core/property/typecast/numeric.rb +32 -0
- data/lib/dm-core/property/typecast/time.rb +33 -0
- data/lib/dm-core/property_set.rb +177 -0
- data/lib/dm-core/query.rb +1444 -0
- data/lib/dm-core/query/conditions/comparison.rb +910 -0
- data/lib/dm-core/query/conditions/operation.rb +720 -0
- data/lib/dm-core/query/direction.rb +36 -0
- data/lib/dm-core/query/operator.rb +35 -0
- data/lib/dm-core/query/path.rb +114 -0
- data/lib/dm-core/query/sort.rb +39 -0
- data/lib/dm-core/relationship_set.rb +72 -0
- data/lib/dm-core/repository.rb +226 -0
- data/lib/dm-core/resource.rb +1228 -0
- data/lib/dm-core/resource/persistence_state.rb +75 -0
- data/lib/dm-core/resource/persistence_state/clean.rb +40 -0
- data/lib/dm-core/resource/persistence_state/deleted.rb +30 -0
- data/lib/dm-core/resource/persistence_state/dirty.rb +96 -0
- data/lib/dm-core/resource/persistence_state/immutable.rb +34 -0
- data/lib/dm-core/resource/persistence_state/persisted.rb +29 -0
- data/lib/dm-core/resource/persistence_state/transient.rb +78 -0
- data/lib/dm-core/spec/lib/adapter_helpers.rb +54 -0
- data/lib/dm-core/spec/lib/collection_helpers.rb +20 -0
- data/lib/dm-core/spec/lib/counter_adapter.rb +38 -0
- data/lib/dm-core/spec/lib/pending_helpers.rb +50 -0
- data/lib/dm-core/spec/lib/spec_helper.rb +74 -0
- data/lib/dm-core/spec/setup.rb +173 -0
- data/lib/dm-core/spec/shared/adapter_spec.rb +326 -0
- data/lib/dm-core/spec/shared/public/property_spec.rb +229 -0
- data/lib/dm-core/spec/shared/resource_spec.rb +1236 -0
- data/lib/dm-core/spec/shared/sel_spec.rb +111 -0
- data/lib/dm-core/spec/shared/semipublic/property_spec.rb +134 -0
- data/lib/dm-core/spec/shared/semipublic/query/conditions/abstract_comparison_spec.rb +261 -0
- data/lib/dm-core/support/assertions.rb +8 -0
- data/lib/dm-core/support/chainable.rb +18 -0
- data/lib/dm-core/support/deprecate.rb +12 -0
- data/lib/dm-core/support/descendant_set.rb +89 -0
- data/lib/dm-core/support/equalizer.rb +48 -0
- data/lib/dm-core/support/ext/array.rb +22 -0
- data/lib/dm-core/support/ext/blank.rb +25 -0
- data/lib/dm-core/support/ext/hash.rb +67 -0
- data/lib/dm-core/support/ext/module.rb +47 -0
- data/lib/dm-core/support/ext/object.rb +57 -0
- data/lib/dm-core/support/ext/string.rb +24 -0
- data/lib/dm-core/support/ext/try_dup.rb +12 -0
- data/lib/dm-core/support/hook.rb +402 -0
- data/lib/dm-core/support/inflections.rb +60 -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 +451 -0
- data/lib/dm-core/support/local_object_space.rb +12 -0
- data/lib/dm-core/support/logger.rb +199 -0
- data/lib/dm-core/support/mash.rb +176 -0
- data/lib/dm-core/support/naming_conventions.rb +90 -0
- data/lib/dm-core/support/ordered_set.rb +380 -0
- data/lib/dm-core/support/subject.rb +33 -0
- data/lib/dm-core/support/subject_set.rb +250 -0
- data/lib/dm-core/version.rb +3 -0
- data/script/performance.rb +275 -0
- data/script/profile.rb +218 -0
- data/spec/lib/rspec_immediate_feedback_formatter.rb +54 -0
- data/spec/public/associations/many_to_many/read_multiple_join_spec.rb +68 -0
- data/spec/public/associations/many_to_many_spec.rb +197 -0
- data/spec/public/associations/many_to_one_spec.rb +83 -0
- data/spec/public/associations/many_to_one_with_boolean_cpk_spec.rb +40 -0
- data/spec/public/associations/many_to_one_with_custom_fk_spec.rb +49 -0
- data/spec/public/associations/one_to_many_spec.rb +81 -0
- data/spec/public/associations/one_to_one_spec.rb +176 -0
- data/spec/public/associations/one_to_one_with_boolean_cpk_spec.rb +46 -0
- data/spec/public/collection_spec.rb +69 -0
- data/spec/public/finalize_spec.rb +76 -0
- data/spec/public/model/hook_spec.rb +246 -0
- data/spec/public/model/property_spec.rb +88 -0
- data/spec/public/model/relationship_spec.rb +1040 -0
- data/spec/public/model_spec.rb +458 -0
- data/spec/public/property/binary_spec.rb +41 -0
- data/spec/public/property/boolean_spec.rb +22 -0
- data/spec/public/property/class_spec.rb +28 -0
- data/spec/public/property/date_spec.rb +22 -0
- data/spec/public/property/date_time_spec.rb +22 -0
- data/spec/public/property/decimal_spec.rb +23 -0
- data/spec/public/property/discriminator_spec.rb +135 -0
- data/spec/public/property/float_spec.rb +22 -0
- data/spec/public/property/integer_spec.rb +22 -0
- data/spec/public/property/object_spec.rb +107 -0
- data/spec/public/property/serial_spec.rb +22 -0
- data/spec/public/property/string_spec.rb +22 -0
- data/spec/public/property/text_spec.rb +63 -0
- data/spec/public/property/time_spec.rb +22 -0
- data/spec/public/property_spec.rb +341 -0
- data/spec/public/resource_spec.rb +284 -0
- data/spec/public/sel_spec.rb +53 -0
- data/spec/public/setup_spec.rb +145 -0
- data/spec/public/shared/association_collection_shared_spec.rb +309 -0
- data/spec/public/shared/collection_finder_shared_spec.rb +267 -0
- data/spec/public/shared/collection_shared_spec.rb +1669 -0
- data/spec/public/shared/finder_shared_spec.rb +1629 -0
- data/spec/rcov.opts +6 -0
- data/spec/semipublic/adapters/abstract_adapter_spec.rb +30 -0
- data/spec/semipublic/adapters/in_memory_adapter_spec.rb +12 -0
- data/spec/semipublic/associations/many_to_many_spec.rb +94 -0
- data/spec/semipublic/associations/many_to_one_spec.rb +63 -0
- data/spec/semipublic/associations/one_to_many_spec.rb +55 -0
- data/spec/semipublic/associations/one_to_one_spec.rb +53 -0
- data/spec/semipublic/associations/relationship_spec.rb +200 -0
- data/spec/semipublic/associations_spec.rb +177 -0
- data/spec/semipublic/collection_spec.rb +110 -0
- data/spec/semipublic/model_spec.rb +96 -0
- data/spec/semipublic/property/binary_spec.rb +13 -0
- data/spec/semipublic/property/boolean_spec.rb +47 -0
- data/spec/semipublic/property/class_spec.rb +33 -0
- data/spec/semipublic/property/date_spec.rb +43 -0
- data/spec/semipublic/property/date_time_spec.rb +46 -0
- data/spec/semipublic/property/decimal_spec.rb +83 -0
- data/spec/semipublic/property/discriminator_spec.rb +19 -0
- data/spec/semipublic/property/float_spec.rb +82 -0
- data/spec/semipublic/property/integer_spec.rb +82 -0
- data/spec/semipublic/property/lookup_spec.rb +29 -0
- data/spec/semipublic/property/serial_spec.rb +13 -0
- data/spec/semipublic/property/string_spec.rb +13 -0
- data/spec/semipublic/property/text_spec.rb +31 -0
- data/spec/semipublic/property/time_spec.rb +50 -0
- data/spec/semipublic/property_spec.rb +114 -0
- data/spec/semipublic/query/conditions/comparison_spec.rb +1501 -0
- data/spec/semipublic/query/conditions/operation_spec.rb +1294 -0
- data/spec/semipublic/query/path_spec.rb +471 -0
- data/spec/semipublic/query_spec.rb +3777 -0
- data/spec/semipublic/resource/state/clean_spec.rb +88 -0
- data/spec/semipublic/resource/state/deleted_spec.rb +78 -0
- data/spec/semipublic/resource/state/dirty_spec.rb +156 -0
- data/spec/semipublic/resource/state/immutable_spec.rb +105 -0
- data/spec/semipublic/resource/state/transient_spec.rb +162 -0
- data/spec/semipublic/resource/state_spec.rb +230 -0
- data/spec/semipublic/resource_spec.rb +23 -0
- data/spec/semipublic/shared/condition_shared_spec.rb +9 -0
- data/spec/semipublic/shared/resource_shared_spec.rb +199 -0
- data/spec/semipublic/shared/resource_state_shared_spec.rb +79 -0
- data/spec/semipublic/shared/subject_shared_spec.rb +79 -0
- data/spec/spec.opts +5 -0
- data/spec/spec_helper.rb +37 -0
- data/spec/support/core_ext/hash.rb +10 -0
- data/spec/support/core_ext/inheritable_attributes.rb +46 -0
- data/spec/support/properties/huge_integer.rb +17 -0
- data/spec/unit/array_spec.rb +23 -0
- data/spec/unit/blank_spec.rb +73 -0
- data/spec/unit/data_mapper/ordered_set/append_spec.rb +26 -0
- data/spec/unit/data_mapper/ordered_set/clear_spec.rb +24 -0
- data/spec/unit/data_mapper/ordered_set/delete_spec.rb +28 -0
- data/spec/unit/data_mapper/ordered_set/each_spec.rb +19 -0
- data/spec/unit/data_mapper/ordered_set/empty_spec.rb +20 -0
- data/spec/unit/data_mapper/ordered_set/entries_spec.rb +22 -0
- data/spec/unit/data_mapper/ordered_set/eql_spec.rb +51 -0
- data/spec/unit/data_mapper/ordered_set/equal_value_spec.rb +84 -0
- data/spec/unit/data_mapper/ordered_set/hash_spec.rb +12 -0
- data/spec/unit/data_mapper/ordered_set/include_spec.rb +23 -0
- data/spec/unit/data_mapper/ordered_set/index_spec.rb +28 -0
- data/spec/unit/data_mapper/ordered_set/initialize_spec.rb +32 -0
- data/spec/unit/data_mapper/ordered_set/merge_spec.rb +36 -0
- data/spec/unit/data_mapper/ordered_set/shared/append_spec.rb +24 -0
- data/spec/unit/data_mapper/ordered_set/shared/clear_spec.rb +9 -0
- data/spec/unit/data_mapper/ordered_set/shared/delete_spec.rb +25 -0
- data/spec/unit/data_mapper/ordered_set/shared/each_spec.rb +17 -0
- data/spec/unit/data_mapper/ordered_set/shared/empty_spec.rb +9 -0
- data/spec/unit/data_mapper/ordered_set/shared/entries_spec.rb +9 -0
- data/spec/unit/data_mapper/ordered_set/shared/include_spec.rb +9 -0
- data/spec/unit/data_mapper/ordered_set/shared/index_spec.rb +13 -0
- data/spec/unit/data_mapper/ordered_set/shared/initialize_spec.rb +28 -0
- data/spec/unit/data_mapper/ordered_set/shared/merge_spec.rb +28 -0
- data/spec/unit/data_mapper/ordered_set/shared/size_spec.rb +13 -0
- data/spec/unit/data_mapper/ordered_set/shared/to_ary_spec.rb +11 -0
- data/spec/unit/data_mapper/ordered_set/size_spec.rb +27 -0
- data/spec/unit/data_mapper/ordered_set/to_ary_spec.rb +23 -0
- data/spec/unit/data_mapper/subject_set/append_spec.rb +47 -0
- data/spec/unit/data_mapper/subject_set/clear_spec.rb +34 -0
- data/spec/unit/data_mapper/subject_set/delete_spec.rb +40 -0
- data/spec/unit/data_mapper/subject_set/each_spec.rb +30 -0
- data/spec/unit/data_mapper/subject_set/empty_spec.rb +31 -0
- data/spec/unit/data_mapper/subject_set/entries_spec.rb +31 -0
- data/spec/unit/data_mapper/subject_set/get_spec.rb +34 -0
- data/spec/unit/data_mapper/subject_set/include_spec.rb +32 -0
- data/spec/unit/data_mapper/subject_set/named_spec.rb +33 -0
- data/spec/unit/data_mapper/subject_set/shared/append_spec.rb +18 -0
- data/spec/unit/data_mapper/subject_set/shared/clear_spec.rb +9 -0
- data/spec/unit/data_mapper/subject_set/shared/delete_spec.rb +9 -0
- data/spec/unit/data_mapper/subject_set/shared/each_spec.rb +9 -0
- data/spec/unit/data_mapper/subject_set/shared/empty_spec.rb +9 -0
- data/spec/unit/data_mapper/subject_set/shared/entries_spec.rb +9 -0
- data/spec/unit/data_mapper/subject_set/shared/get_spec.rb +9 -0
- data/spec/unit/data_mapper/subject_set/shared/include_spec.rb +9 -0
- data/spec/unit/data_mapper/subject_set/shared/named_spec.rb +9 -0
- data/spec/unit/data_mapper/subject_set/shared/size_spec.rb +13 -0
- data/spec/unit/data_mapper/subject_set/shared/to_ary_spec.rb +9 -0
- data/spec/unit/data_mapper/subject_set/shared/values_at_spec.rb +44 -0
- data/spec/unit/data_mapper/subject_set/size_spec.rb +42 -0
- data/spec/unit/data_mapper/subject_set/to_ary_spec.rb +34 -0
- data/spec/unit/data_mapper/subject_set/values_at_spec.rb +57 -0
- data/spec/unit/hash_spec.rb +28 -0
- data/spec/unit/hook_spec.rb +1235 -0
- data/spec/unit/lazy_array_spec.rb +1949 -0
- data/spec/unit/mash_spec.rb +312 -0
- data/spec/unit/module_spec.rb +71 -0
- data/spec/unit/object_spec.rb +38 -0
- data/spec/unit/try_dup_spec.rb +46 -0
- data/tasks/ci.rake +1 -0
- data/tasks/db.rake +11 -0
- data/tasks/spec.rake +38 -0
- data/tasks/yard.rake +9 -0
- data/tasks/yardstick.rake +19 -0
- 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
|