ghost_dm-core 1.3.0.beta
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.autotest +29 -0
- data/.document +5 -0
- data/.gitignore +35 -0
- data/.yardopts +1 -0
- data/Gemfile +65 -0
- data/LICENSE +20 -0
- data/README.md +269 -0
- data/Rakefile +4 -0
- data/dm-core.gemspec +24 -0
- data/lib/dm-core.rb +292 -0
- data/lib/dm-core/adapters.rb +222 -0
- data/lib/dm-core/adapters/abstract_adapter.rb +237 -0
- data/lib/dm-core/adapters/in_memory_adapter.rb +113 -0
- data/lib/dm-core/associations/many_to_many.rb +499 -0
- data/lib/dm-core/associations/many_to_one.rb +290 -0
- data/lib/dm-core/associations/one_to_many.rb +348 -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 +1515 -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 +874 -0
- data/lib/dm-core/model/hook.rb +103 -0
- data/lib/dm-core/model/is.rb +32 -0
- data/lib/dm-core/model/property.rb +249 -0
- data/lib/dm-core/model/relationship.rb +378 -0
- data/lib/dm-core/model/scope.rb +89 -0
- data/lib/dm-core/property.rb +866 -0
- data/lib/dm-core/property/binary.rb +21 -0
- data/lib/dm-core/property/boolean.rb +20 -0
- data/lib/dm-core/property/class.rb +17 -0
- data/lib/dm-core/property/date.rb +10 -0
- data/lib/dm-core/property/date_time.rb +10 -0
- data/lib/dm-core/property/decimal.rb +36 -0
- data/lib/dm-core/property/discriminator.rb +44 -0
- data/lib/dm-core/property/float.rb +16 -0
- data/lib/dm-core/property/integer.rb +22 -0
- data/lib/dm-core/property/invalid_value_error.rb +22 -0
- data/lib/dm-core/property/lookup.rb +27 -0
- data/lib/dm-core/property/numeric.rb +38 -0
- data/lib/dm-core/property/object.rb +34 -0
- data/lib/dm-core/property/serial.rb +14 -0
- data/lib/dm-core/property/string.rb +38 -0
- data/lib/dm-core/property/text.rb +9 -0
- data/lib/dm-core/property/time.rb +10 -0
- data/lib/dm-core/property_set.rb +177 -0
- data/lib/dm-core/query.rb +1366 -0
- data/lib/dm-core/query/conditions/comparison.rb +911 -0
- data/lib/dm-core/query/conditions/operation.rb +721 -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 +1214 -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 +80 -0
- data/lib/dm-core/spec/lib/adapter_helpers.rb +64 -0
- data/lib/dm-core/spec/lib/collection_helpers.rb +21 -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 +174 -0
- data/lib/dm-core/spec/shared/adapter_spec.rb +341 -0
- data/lib/dm-core/spec/shared/public/property_spec.rb +229 -0
- data/lib/dm-core/spec/shared/resource_spec.rb +1232 -0
- data/lib/dm-core/spec/shared/sel_spec.rb +111 -0
- data/lib/dm-core/spec/shared/semipublic/property_spec.rb +176 -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 +405 -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 +13 -0
- data/lib/dm-core/support/logger.rb +201 -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 +462 -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 +288 -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 +1667 -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 +13 -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 +3682 -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 +162 -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 +38 -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/inflections_spec.rb +16 -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/spec.rake +38 -0
- data/tasks/yard.rake +9 -0
- data/tasks/yardstick.rake +19 -0
- metadata +365 -0
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'dm-core/support/mash'
|
|
3
|
+
|
|
4
|
+
class AwesomeHash < Hash
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
describe DataMapper::Mash do
|
|
8
|
+
before(:each) do
|
|
9
|
+
@hash = { "mash" => "indifferent", :hash => "different" }
|
|
10
|
+
@sub = AwesomeHash.new("mash" => "indifferent", :hash => "different")
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
describe "#initialize" do
|
|
14
|
+
it 'converts all keys into strings when param is a Hash' do
|
|
15
|
+
mash = DataMapper::Mash.new(@hash)
|
|
16
|
+
|
|
17
|
+
mash.keys.any? { |key| key.is_a?(Symbol) }.should be(false)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
it 'converts all pure Hash values into Mashes if param is a Hash' do
|
|
21
|
+
mash = DataMapper::Mash.new :hash => @hash
|
|
22
|
+
|
|
23
|
+
mash["hash"].should be_an_instance_of(DataMapper::Mash)
|
|
24
|
+
# sanity check
|
|
25
|
+
mash["hash"]["hash"].should == "different"
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
it 'doesn not convert Hash subclass values into Mashes' do
|
|
29
|
+
mash = DataMapper::Mash.new :sub => @sub
|
|
30
|
+
mash["sub"].should be_an_instance_of(AwesomeHash)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
it 'converts all value items if value is an Array' do
|
|
34
|
+
mash = DataMapper::Mash.new :arry => { :hash => [@hash] }
|
|
35
|
+
|
|
36
|
+
mash["arry"].should be_an_instance_of(DataMapper::Mash)
|
|
37
|
+
# sanity check
|
|
38
|
+
mash["arry"]["hash"].first["hash"].should == "different"
|
|
39
|
+
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
it 'delegates to superclass constructor if param is not a Hash' do
|
|
43
|
+
mash = DataMapper::Mash.new("dash berlin")
|
|
44
|
+
|
|
45
|
+
mash["unexisting key"].should == "dash berlin"
|
|
46
|
+
end
|
|
47
|
+
end # describe "#initialize"
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
describe "#update" do
|
|
52
|
+
it 'converts all keys into strings when param is a Hash' do
|
|
53
|
+
mash = DataMapper::Mash.new(@hash)
|
|
54
|
+
mash.update("starry" => "night")
|
|
55
|
+
|
|
56
|
+
mash.keys.any? { |key| key.is_a?(Symbol) }.should be(false)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
it 'converts all Hash values into Mashes if param is a Hash' do
|
|
60
|
+
mash = DataMapper::Mash.new :hash => @hash
|
|
61
|
+
mash.update(:hash => { :hash => "is buggy in Ruby 1.8.6" })
|
|
62
|
+
|
|
63
|
+
mash["hash"].should be_an_instance_of(DataMapper::Mash)
|
|
64
|
+
end
|
|
65
|
+
end # describe "#update"
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
describe "#[]=" do
|
|
70
|
+
it 'converts key into string' do
|
|
71
|
+
mash = DataMapper::Mash.new(@hash)
|
|
72
|
+
mash[:hash] = { "starry" => "night" }
|
|
73
|
+
|
|
74
|
+
mash.keys.any? { |key| key.is_a?(Symbol) }.should be(false)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
it 'converts all Hash value into Mash' do
|
|
78
|
+
mash = DataMapper::Mash.new :hash => @hash
|
|
79
|
+
mash[:hash] = { :hash => "is buggy in Ruby 1.8.6" }
|
|
80
|
+
|
|
81
|
+
mash["hash"].should be_an_instance_of(DataMapper::Mash)
|
|
82
|
+
end
|
|
83
|
+
end # describe "#[]="
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
describe "#key?" do
|
|
88
|
+
before(:each) do
|
|
89
|
+
@mash = DataMapper::Mash.new(@hash)
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
it 'converts key before lookup' do
|
|
93
|
+
@mash.key?("mash").should be(true)
|
|
94
|
+
@mash.key?(:mash).should be(true)
|
|
95
|
+
|
|
96
|
+
@mash.key?("hash").should be(true)
|
|
97
|
+
@mash.key?(:hash).should be(true)
|
|
98
|
+
|
|
99
|
+
@mash.key?(:rainclouds).should be(false)
|
|
100
|
+
@mash.key?("rainclouds").should be(false)
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
it 'is aliased as include?' do
|
|
104
|
+
@mash.include?("mash").should be(true)
|
|
105
|
+
@mash.include?(:mash).should be(true)
|
|
106
|
+
|
|
107
|
+
@mash.include?("hash").should be(true)
|
|
108
|
+
@mash.include?(:hash).should be(true)
|
|
109
|
+
|
|
110
|
+
@mash.include?(:rainclouds).should be(false)
|
|
111
|
+
@mash.include?("rainclouds").should be(false)
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
it 'is aliased as member?' do
|
|
115
|
+
@mash.member?("mash").should be(true)
|
|
116
|
+
@mash.member?(:mash).should be(true)
|
|
117
|
+
|
|
118
|
+
@mash.member?("hash").should be(true)
|
|
119
|
+
@mash.member?(:hash).should be(true)
|
|
120
|
+
|
|
121
|
+
@mash.member?(:rainclouds).should be(false)
|
|
122
|
+
@mash.member?("rainclouds").should be(false)
|
|
123
|
+
end
|
|
124
|
+
end # describe "#key?"
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
describe "#dup" do
|
|
128
|
+
it 'returns instance of Mash' do
|
|
129
|
+
DataMapper::Mash.new(@hash).dup.should be_an_instance_of(DataMapper::Mash)
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
it 'preserves keys' do
|
|
133
|
+
mash = DataMapper::Mash.new(@hash)
|
|
134
|
+
dup = mash.dup
|
|
135
|
+
|
|
136
|
+
mash.keys.sort.should == dup.keys.sort
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
it 'preserves value' do
|
|
140
|
+
mash = DataMapper::Mash.new(@hash)
|
|
141
|
+
dup = mash.dup
|
|
142
|
+
|
|
143
|
+
mash.values.sort.should == dup.values.sort
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
describe "#to_hash" do
|
|
150
|
+
it 'returns instance of Mash' do
|
|
151
|
+
DataMapper::Mash.new(@hash).to_hash.should be_an_instance_of(Hash)
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
it 'preserves keys' do
|
|
155
|
+
mash = DataMapper::Mash.new(@hash)
|
|
156
|
+
converted = mash.to_hash
|
|
157
|
+
|
|
158
|
+
mash.keys.sort.should == converted.keys.sort
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
it 'preserves value' do
|
|
162
|
+
mash = DataMapper::Mash.new(@hash)
|
|
163
|
+
converted = mash.to_hash
|
|
164
|
+
|
|
165
|
+
mash.values.sort.should == converted.values.sort
|
|
166
|
+
end
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
describe "#symbolize_keys" do
|
|
172
|
+
it 'returns instance of Mash' do
|
|
173
|
+
DataMapper::Mash.new(@hash).symbolize_keys.should be_an_instance_of(Hash)
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
it 'converts keys to symbols' do
|
|
177
|
+
mash = DataMapper::Mash.new(@hash)
|
|
178
|
+
converted = mash.symbolize_keys
|
|
179
|
+
|
|
180
|
+
converted_keys = converted.keys.sort{|k1, k2| k1.to_s <=> k2.to_s}
|
|
181
|
+
orig_keys = mash.keys.map{|k| k.to_sym}.sort{|i1, i2| i1.to_s <=> i2.to_s}
|
|
182
|
+
|
|
183
|
+
converted_keys.should == orig_keys
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
it 'preserves value' do
|
|
187
|
+
mash = DataMapper::Mash.new(@hash)
|
|
188
|
+
converted = mash.symbolize_keys
|
|
189
|
+
|
|
190
|
+
mash.values.sort.should == converted.values.sort
|
|
191
|
+
end
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
describe "#delete" do
|
|
197
|
+
it 'converts Symbol key into String before deleting' do
|
|
198
|
+
mash = DataMapper::Mash.new(@hash)
|
|
199
|
+
|
|
200
|
+
mash.delete(:hash)
|
|
201
|
+
mash.key?("hash").should be(false)
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
it 'works with String keys as well' do
|
|
205
|
+
mash = DataMapper::Mash.new(@hash)
|
|
206
|
+
|
|
207
|
+
mash.delete("mash")
|
|
208
|
+
mash.key?("mash").should be(false)
|
|
209
|
+
end
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
describe "#except" do
|
|
215
|
+
it "converts Symbol key into String before calling super" do
|
|
216
|
+
mash = DataMapper::Mash.new(@hash)
|
|
217
|
+
|
|
218
|
+
hashless_mash = mash.except(:hash)
|
|
219
|
+
hashless_mash.key?("hash").should be(false)
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
it "works with String keys as well" do
|
|
223
|
+
mash = DataMapper::Mash.new(@hash)
|
|
224
|
+
|
|
225
|
+
mashless_mash = mash.except("mash")
|
|
226
|
+
mashless_mash.key?("mash").should be(false)
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
it "works with multiple keys" do
|
|
230
|
+
mash = DataMapper::Mash.new(@hash)
|
|
231
|
+
|
|
232
|
+
mashless = mash.except("hash", :mash)
|
|
233
|
+
mashless.key?(:hash).should be(false)
|
|
234
|
+
mashless.key?("mash").should be(false)
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
it "should return a mash" do
|
|
238
|
+
mash = DataMapper::Mash.new(@hash)
|
|
239
|
+
|
|
240
|
+
hashless_mash = mash.except(:hash)
|
|
241
|
+
hashless_mash.class.should be(DataMapper::Mash)
|
|
242
|
+
end
|
|
243
|
+
end
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
|
|
247
|
+
describe "#merge" do
|
|
248
|
+
before(:each) do
|
|
249
|
+
@mash = DataMapper::Mash.new(@hash).merge(:no => "in between")
|
|
250
|
+
end
|
|
251
|
+
|
|
252
|
+
it 'returns instance of Mash' do
|
|
253
|
+
@mash.should be_an_instance_of(DataMapper::Mash)
|
|
254
|
+
end
|
|
255
|
+
|
|
256
|
+
it 'merges in give Hash' do
|
|
257
|
+
@mash["no"].should == "in between"
|
|
258
|
+
end
|
|
259
|
+
end
|
|
260
|
+
|
|
261
|
+
|
|
262
|
+
|
|
263
|
+
describe "#fetch" do
|
|
264
|
+
before(:each) do
|
|
265
|
+
@mash = DataMapper::Mash.new(@hash).merge(:no => "in between")
|
|
266
|
+
end
|
|
267
|
+
|
|
268
|
+
it 'converts key before fetching' do
|
|
269
|
+
@mash.fetch("no").should == "in between"
|
|
270
|
+
end
|
|
271
|
+
|
|
272
|
+
it 'returns alternative value if key lookup fails' do
|
|
273
|
+
@mash.fetch("flying", "screwdriver").should == "screwdriver"
|
|
274
|
+
end
|
|
275
|
+
end
|
|
276
|
+
|
|
277
|
+
|
|
278
|
+
describe "#default" do
|
|
279
|
+
before(:each) do
|
|
280
|
+
@mash = DataMapper::Mash.new(:yet_another_technical_revolution)
|
|
281
|
+
end
|
|
282
|
+
|
|
283
|
+
it 'returns default value unless key exists in mash' do
|
|
284
|
+
@mash.default("peak oil is now behind, baby").should == :yet_another_technical_revolution
|
|
285
|
+
end
|
|
286
|
+
|
|
287
|
+
it 'returns existing value if key is Symbol and exists in mash' do
|
|
288
|
+
@mash.update(:no => "in between")
|
|
289
|
+
@mash.default(:no).should == "in between"
|
|
290
|
+
end
|
|
291
|
+
end
|
|
292
|
+
|
|
293
|
+
|
|
294
|
+
describe "#values_at" do
|
|
295
|
+
before(:each) do
|
|
296
|
+
@mash = DataMapper::Mash.new(@hash).merge(:no => "in between")
|
|
297
|
+
end
|
|
298
|
+
|
|
299
|
+
it 'is indifferent to whether keys are strings or symbols' do
|
|
300
|
+
@mash.values_at("hash", :mash, :no).should == ["different", "indifferent", "in between"]
|
|
301
|
+
end
|
|
302
|
+
end
|
|
303
|
+
|
|
304
|
+
|
|
305
|
+
describe "#stringify_keys!" do
|
|
306
|
+
it 'returns the mash itself' do
|
|
307
|
+
mash = DataMapper::Mash.new(@hash)
|
|
308
|
+
|
|
309
|
+
mash.stringify_keys!.object_id.should == mash.object_id
|
|
310
|
+
end
|
|
311
|
+
end
|
|
312
|
+
end
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'dm-core/support/ext/module'
|
|
3
|
+
|
|
4
|
+
describe DataMapper::Ext::Module do
|
|
5
|
+
|
|
6
|
+
before :all do
|
|
7
|
+
Object.send(:remove_const, :Foo) if defined?(Foo)
|
|
8
|
+
Object.send(:remove_const, :Baz) if defined?(Baz)
|
|
9
|
+
Object.send(:remove_const, :Bar) if defined?(Bar)
|
|
10
|
+
|
|
11
|
+
module ::Foo
|
|
12
|
+
module ModBar
|
|
13
|
+
module Noo
|
|
14
|
+
module Too
|
|
15
|
+
module Boo; end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
class Zed; end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
class ::Baz; end
|
|
24
|
+
|
|
25
|
+
class ::Bar; end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
it "should raise NameError for a missing constant" do
|
|
29
|
+
lambda { DataMapper::Ext::Module.find_const(Foo, 'Moo') }.should raise_error(NameError)
|
|
30
|
+
lambda { DataMapper::Ext::Module.find_const(Object, 'MissingConstant') }.should raise_error(NameError)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
it "should be able to get a recursive constant" do
|
|
34
|
+
DataMapper::Ext::Module.find_const(Object, 'Foo::ModBar').should == Foo::ModBar
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
it "should ignore get Constants from the Kernel namespace correctly" do
|
|
38
|
+
DataMapper::Ext::Module.find_const(Object, '::Foo::ModBar').should == ::Foo::ModBar
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
it "should find relative constants" do
|
|
42
|
+
DataMapper::Ext::Module.find_const(Foo, 'ModBar').should == Foo::ModBar
|
|
43
|
+
DataMapper::Ext::Module.find_const(Foo, 'Baz').should == Baz
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
it "should find sibling constants" do
|
|
47
|
+
DataMapper::Ext::Module.find_const(Foo::ModBar, "Zed").should == Foo::Zed
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
it "should find nested constants on nested constants" do
|
|
51
|
+
DataMapper::Ext::Module.find_const(Foo::ModBar, 'Noo::Too').should == Foo::ModBar::Noo::Too
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
it "should find constants outside of nested constants" do
|
|
55
|
+
DataMapper::Ext::Module.find_const(Foo::ModBar::Noo::Too, "Zed").should == Foo::Zed
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
it 'should be able to find past the second nested level' do
|
|
59
|
+
DataMapper::Ext::Module.find_const(Foo::ModBar::Noo, 'Too').should == Foo::ModBar::Noo::Too
|
|
60
|
+
DataMapper::Ext::Module.find_const(Foo::ModBar::Noo::Too, 'Boo').should == Foo::ModBar::Noo::Too::Boo
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
it "should be able to deal with constants being added and removed" do
|
|
65
|
+
DataMapper::Ext::Module.find_const(Object, 'Bar') # First we load Bar with find_const
|
|
66
|
+
Object.module_eval { remove_const('Bar') } # Now we delete it
|
|
67
|
+
module ::Bar; end; # Now we redefine it
|
|
68
|
+
DataMapper::Ext::Module.find_const(Object, 'Bar').should == Bar
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'dm-core/support/ext/object'
|
|
3
|
+
|
|
4
|
+
describe DataMapper::Ext::Object do
|
|
5
|
+
before :all do
|
|
6
|
+
Object.send(:remove_const, :HactiveSupport) if defined?(HactiveSupport)
|
|
7
|
+
module ::HactiveSupport
|
|
8
|
+
class MemoizeConsideredUseless; end
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
Object.send(:remove_const, :Foo) if defined?(Foo)
|
|
12
|
+
module ::Foo
|
|
13
|
+
class Bar; end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
Object.send(:remove_const, :Oi) if defined?(Oi)
|
|
17
|
+
class ::Oi
|
|
18
|
+
attr_accessor :foo
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
describe ".full_const_get" do
|
|
23
|
+
it 'returns constant by FQ name in receiver namespace' do
|
|
24
|
+
DataMapper::Ext::Object.full_const_get("Oi").should == Oi
|
|
25
|
+
DataMapper::Ext::Object.full_const_get("Foo::Bar").should == Foo::Bar
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
describe ".full_const_set" do
|
|
30
|
+
it 'sets constant value by FQ name in receiver namespace' do
|
|
31
|
+
DataMapper::Ext::Object.full_const_set("HactiveSupport::MCU", HactiveSupport::MemoizeConsideredUseless)
|
|
32
|
+
|
|
33
|
+
DataMapper::Ext::Object.full_const_get("HactiveSupport::MCU").should == HactiveSupport::MemoizeConsideredUseless
|
|
34
|
+
DataMapper::Ext::Object.full_const_get(HactiveSupport, "MCU").should == HactiveSupport::MemoizeConsideredUseless
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
end
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'dm-core/support/ext/try_dup'
|
|
3
|
+
|
|
4
|
+
describe "try_dup" do
|
|
5
|
+
it "returns a duplicate version on regular objects" do
|
|
6
|
+
obj = Object.new
|
|
7
|
+
oth = DataMapper::Ext.try_dup(obj)
|
|
8
|
+
obj.should_not === oth
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
it "returns self on Numerics" do
|
|
12
|
+
obj = 12
|
|
13
|
+
oth = DataMapper::Ext.try_dup(obj)
|
|
14
|
+
obj.should === oth
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
it "returns self on Symbols" do
|
|
18
|
+
obj = :test
|
|
19
|
+
oth = DataMapper::Ext.try_dup(obj)
|
|
20
|
+
obj.should === oth
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
it "returns self on true" do
|
|
24
|
+
obj = true
|
|
25
|
+
oth = DataMapper::Ext.try_dup(obj)
|
|
26
|
+
obj.should === oth
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it "returns self on false" do
|
|
30
|
+
obj = false
|
|
31
|
+
oth = DataMapper::Ext.try_dup(obj)
|
|
32
|
+
obj.should === oth
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
it "returns self on nil" do
|
|
36
|
+
obj = nil
|
|
37
|
+
oth = DataMapper::Ext.try_dup(obj)
|
|
38
|
+
obj.should === oth
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
it "returns self on modules" do
|
|
42
|
+
obj = Module.new
|
|
43
|
+
oth = DataMapper::Ext.try_dup(obj)
|
|
44
|
+
obj.object_id.should == oth.object_id
|
|
45
|
+
end
|
|
46
|
+
end
|