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,79 @@
|
|
|
1
|
+
share_examples_for 'A method that delegates to the superclass #set' do
|
|
2
|
+
it 'should delegate to the superclass' do
|
|
3
|
+
# this is the only way I could think of to test if the
|
|
4
|
+
# superclass method is being called
|
|
5
|
+
DataMapper::Resource::PersistenceState.class_eval { alias_method :original_set, :set; undef_method(:set) }
|
|
6
|
+
method(:subject).should raise_error(NoMethodError)
|
|
7
|
+
DataMapper::Resource::PersistenceState.class_eval { alias_method :set, :original_set; undef_method(:original_set) }
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
share_examples_for 'A method that does not delegate to the superclass #set' do
|
|
12
|
+
it 'should delegate to the superclass' do
|
|
13
|
+
# this is the only way I could think of to test if the
|
|
14
|
+
# superclass method is not being called
|
|
15
|
+
DataMapper::Resource::PersistenceState.class_eval { alias_method :original_set, :set; undef_method(:set) }
|
|
16
|
+
method(:subject).should_not raise_error(NoMethodError)
|
|
17
|
+
DataMapper::Resource::PersistenceState.class_eval { alias_method :set, :original_set; undef_method(:original_set) }
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
share_examples_for 'It resets resource state' do
|
|
22
|
+
it 'should reset the dirty property' do
|
|
23
|
+
method(:subject).should change(@resource, :name).from('John Doe').to('Dan Kubb')
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it 'should reset the dirty m:1 relationship' do
|
|
27
|
+
method(:subject).should change(@resource, :parent).from(@resource).to(nil)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
it 'should reset the dirty 1:m relationship' do
|
|
31
|
+
method(:subject).should change(@resource, :children).from([ @resource ]).to([])
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
it 'should clear original attributes' do
|
|
35
|
+
method(:subject).should change { @resource.original_attributes.dup }.to({})
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
share_examples_for 'Resource::PersistenceState::Persisted#get' do
|
|
40
|
+
subject { @state.get(@key) }
|
|
41
|
+
|
|
42
|
+
supported_by :all do
|
|
43
|
+
describe 'with an unloaded subject' do
|
|
44
|
+
before do
|
|
45
|
+
@key = @model.relationships[:parent]
|
|
46
|
+
|
|
47
|
+
# set the parent relationship
|
|
48
|
+
@resource.attributes = { @key => @resource }
|
|
49
|
+
@resource.should be_dirty
|
|
50
|
+
@resource.save.should be(true)
|
|
51
|
+
|
|
52
|
+
attributes = Hash[ @model.key.zip(@resource.key) ]
|
|
53
|
+
@resource = @model.first(attributes.merge(:fields => @model.key))
|
|
54
|
+
@state = @state.class.new(@resource)
|
|
55
|
+
|
|
56
|
+
# make sure the subject is not loaded
|
|
57
|
+
@key.should_not be_loaded(@resource)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
it 'should lazy load the value' do
|
|
61
|
+
subject.key.should == @resource.key
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
describe 'with a loaded subject' do
|
|
66
|
+
before do
|
|
67
|
+
@key = @model.properties[:name]
|
|
68
|
+
@loaded_value ||= 'Dan Kubb'
|
|
69
|
+
|
|
70
|
+
# make sure the subject is loaded
|
|
71
|
+
@key.should be_loaded(@resource)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
it 'should return value' do
|
|
75
|
+
should == @loaded_value
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
share_examples_for 'A semipublic Subject' do
|
|
2
|
+
describe '#default?' do
|
|
3
|
+
describe 'with a default' do
|
|
4
|
+
subject { @subject_with_default.default? }
|
|
5
|
+
|
|
6
|
+
it { should be(true) }
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
describe 'without a default' do
|
|
10
|
+
subject { @subject_without_default.default? }
|
|
11
|
+
|
|
12
|
+
it { should be(false) }
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
describe '#default_for' do
|
|
17
|
+
describe 'without a default' do
|
|
18
|
+
subject { @subject_without_default.default_for(@resource) }
|
|
19
|
+
|
|
20
|
+
it 'should match the default value' do
|
|
21
|
+
DataMapper::Ext.blank?(subject).should == true
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
it 'should be used as a default for the subject accessor' do
|
|
25
|
+
should == @resource.__send__(@subject_without_default.name)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
it 'should persist the value' do
|
|
29
|
+
@resource.save.should be(true)
|
|
30
|
+
@resource = @resource.model.get!(*@resource.key)
|
|
31
|
+
@resource.without_default.should == subject
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
describe 'with a default value' do
|
|
36
|
+
subject { @subject_with_default.default_for(@resource) }
|
|
37
|
+
|
|
38
|
+
it 'should match the default value' do
|
|
39
|
+
if @default_value.kind_of?(DataMapper::Resource)
|
|
40
|
+
subject.key.should == @default_value.key
|
|
41
|
+
else
|
|
42
|
+
should == @default_value
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
it 'should be used as a default for the subject accessor' do
|
|
47
|
+
should == @resource.__send__(@subject_with_default.name)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
it 'should persist the value' do
|
|
51
|
+
@resource.save.should be(true)
|
|
52
|
+
@resource = @resource.model.get!(*@resource.key)
|
|
53
|
+
@resource.with_default.should == subject
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
describe 'with a default value responding to #call' do
|
|
58
|
+
subject { @subject_with_default_callable.default_for(@resource) }
|
|
59
|
+
|
|
60
|
+
it 'should match the default value' do
|
|
61
|
+
if @default_value.kind_of?(DataMapper::Resource)
|
|
62
|
+
subject.key.should == @default_value_callable.key
|
|
63
|
+
else
|
|
64
|
+
should == @default_value_callable
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
it 'should be used as a default for the subject accessor' do
|
|
69
|
+
should == @resource.__send__(@subject_with_default_callable.name)
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
it 'should persist the value' do
|
|
73
|
+
@resource.save.should be(true)
|
|
74
|
+
@resource = @resource.model.get!(*@resource.key)
|
|
75
|
+
@resource.with_default_callable.should == subject
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
data/spec/spec.opts
ADDED
data/spec/spec_helper.rb
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
require 'pathname'
|
|
2
|
+
require 'rubygems'
|
|
3
|
+
require 'backports'
|
|
4
|
+
require 'spec'
|
|
5
|
+
require 'dm-core/spec/setup'
|
|
6
|
+
|
|
7
|
+
ENV['ADAPTER'] ||= 'in_memory'
|
|
8
|
+
|
|
9
|
+
SPEC_ROOT = Pathname(__FILE__).dirname.expand_path
|
|
10
|
+
LIB_ROOT = SPEC_ROOT.parent + 'lib'
|
|
11
|
+
|
|
12
|
+
Pathname.glob((LIB_ROOT + 'dm-core/spec/**/*.rb' ).to_s).each { |file| require file }
|
|
13
|
+
Pathname.glob((SPEC_ROOT + '{lib,support,*/shared}/**/*.rb').to_s).each { |file| require file }
|
|
14
|
+
|
|
15
|
+
Spec::Runner.configure do |config|
|
|
16
|
+
|
|
17
|
+
config.extend( DataMapper::Spec::Adapters::Helpers)
|
|
18
|
+
config.include(DataMapper::Spec::PendingHelpers)
|
|
19
|
+
config.include(DataMapper::Spec::Helpers)
|
|
20
|
+
|
|
21
|
+
config.after :all do
|
|
22
|
+
DataMapper::Spec.cleanup_models
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
config.after :all do
|
|
26
|
+
# global ivar cleanup
|
|
27
|
+
DataMapper::Spec.remove_ivars(self, instance_variables.reject { |ivar| ivar[0, 2] == '@_' })
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
config.after :all do
|
|
31
|
+
# WTF: rspec holds a reference to the last match for some reason.
|
|
32
|
+
# When the object ivars are explicitly removed, this causes weird
|
|
33
|
+
# problems when rspec uses it (!). Why rspec does this I have no
|
|
34
|
+
# idea because I cannot determine the intention from the code.
|
|
35
|
+
DataMapper::Spec.remove_ivars(Spec::Matchers.last_matcher, %w[ @expected ])
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
end
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
class Class
|
|
2
|
+
def class_inheritable_reader(*ivars)
|
|
3
|
+
instance_reader = ivars.pop[:reader] if ivars.last.is_a?(Hash)
|
|
4
|
+
|
|
5
|
+
ivars.each do |ivar|
|
|
6
|
+
self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
|
7
|
+
def self.#{ivar}
|
|
8
|
+
return @#{ivar} if defined?(@#{ivar})
|
|
9
|
+
return nil if self.object_id == #{self.object_id}
|
|
10
|
+
ivar = superclass.#{ivar}
|
|
11
|
+
return nil if ivar.nil?
|
|
12
|
+
@#{ivar} = DataMapper::Ext.try_dup(ivar)
|
|
13
|
+
end
|
|
14
|
+
RUBY
|
|
15
|
+
|
|
16
|
+
unless instance_reader == false
|
|
17
|
+
self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
|
18
|
+
def #{ivar}
|
|
19
|
+
self.class.#{ivar}
|
|
20
|
+
end
|
|
21
|
+
RUBY
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def class_inheritable_writer(*ivars)
|
|
27
|
+
instance_writer = ivars.pop[:instance_writer] if ivars.last.is_a?(Hash)
|
|
28
|
+
ivars.each do |ivar|
|
|
29
|
+
self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
|
30
|
+
def self.#{ivar}=(obj)
|
|
31
|
+
@#{ivar} = obj
|
|
32
|
+
end
|
|
33
|
+
RUBY
|
|
34
|
+
unless instance_writer == false
|
|
35
|
+
self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
|
36
|
+
def #{ivar}=(obj) self.class.#{ivar} = obj end
|
|
37
|
+
RUBY
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def class_inheritable_accessor(*syms)
|
|
43
|
+
class_inheritable_reader(*syms)
|
|
44
|
+
class_inheritable_writer(*syms)
|
|
45
|
+
end
|
|
46
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
module DataMapper
|
|
2
|
+
class Property
|
|
3
|
+
class HugeInteger < DataMapper::Property::String
|
|
4
|
+
def load(value)
|
|
5
|
+
value.to_i unless value.nil?
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def dump(value)
|
|
9
|
+
value.to_s unless value.nil?
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def typecast(value)
|
|
13
|
+
load(value)
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'dm-core/support/ext/array'
|
|
3
|
+
require 'dm-core/support/mash'
|
|
4
|
+
|
|
5
|
+
describe DataMapper::Ext::Array do
|
|
6
|
+
before :all do
|
|
7
|
+
@array = [ [ :a, [ 1 ] ], [ :b, [ 2 ] ], [ :c, [ 3 ] ] ].freeze
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
describe '.to_mash' do
|
|
11
|
+
before :all do
|
|
12
|
+
@return = DataMapper::Ext::Array.to_mash(@array)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
it 'should return a Mash' do
|
|
16
|
+
@return.should be_kind_of(DataMapper::Mash)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
it 'should return expected value' do
|
|
20
|
+
@return.should == { 'a' => [ 1 ], 'b' => [ 2 ], 'c' => [ 3 ] }
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'dm-core/support/ext/blank'
|
|
3
|
+
|
|
4
|
+
describe 'DataMapper::Ext.blank?', Object do
|
|
5
|
+
it 'should be blank if it is nil' do
|
|
6
|
+
object = Object.new
|
|
7
|
+
class << object
|
|
8
|
+
def nil?; true end
|
|
9
|
+
end
|
|
10
|
+
DataMapper::Ext.blank?(object).should == true
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
it 'should be blank if it is empty' do
|
|
14
|
+
DataMapper::Ext.blank?({}).should == true
|
|
15
|
+
DataMapper::Ext.blank?([]).should == true
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
it 'should not be blank if not nil or empty' do
|
|
19
|
+
DataMapper::Ext.blank?(Object.new).should == false
|
|
20
|
+
DataMapper::Ext.blank?([nil]).should == false
|
|
21
|
+
DataMapper::Ext.blank?({ nil => 0 }).should == false
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
describe 'DataMapper::Ext.blank?', Numeric do
|
|
26
|
+
it 'should never be blank' do
|
|
27
|
+
DataMapper::Ext.blank?(1).should == false
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
describe 'DataMapper::Ext.blank?', NilClass do
|
|
32
|
+
it 'should always be blank' do
|
|
33
|
+
DataMapper::Ext.blank?(nil).should == true
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
describe 'DataMapper::Ext.blank?', TrueClass do
|
|
38
|
+
it 'should never be blank' do
|
|
39
|
+
DataMapper::Ext.blank?(true).should == false
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
describe 'DataMapper::Ext.blank?', FalseClass do
|
|
44
|
+
it 'should always be blank' do
|
|
45
|
+
DataMapper::Ext.blank?(false).should == true
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
describe 'DataMapper::Ext.blank?', String do
|
|
50
|
+
it 'should be blank if empty' do
|
|
51
|
+
DataMapper::Ext.blank?('').should == true
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
it 'should be blank if it only contains whitespace' do
|
|
55
|
+
DataMapper::Ext.blank?(' ').should == true
|
|
56
|
+
DataMapper::Ext.blank?(" \r \n \t ").should == true
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
it 'should not be blank if it contains non-whitespace' do
|
|
60
|
+
DataMapper::Ext.blank?(' a ').should == false
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
describe 'DataMapper::Ext.blank?', 'object with #blank?' do
|
|
65
|
+
subject { DataMapper::Ext.blank?(object) }
|
|
66
|
+
|
|
67
|
+
let(:return_value) { mock('Return Value') }
|
|
68
|
+
let(:object) { mock('Object', :blank? => return_value) }
|
|
69
|
+
|
|
70
|
+
it 'returns the object#blank? result if supported' do
|
|
71
|
+
should equal(return_value)
|
|
72
|
+
end
|
|
73
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'dm-core/support/ordered_set'
|
|
3
|
+
require 'unit/data_mapper/ordered_set/shared/append_spec'
|
|
4
|
+
|
|
5
|
+
describe 'DataMapper::OrderedSet#<<' do
|
|
6
|
+
subject { set << entry2 }
|
|
7
|
+
|
|
8
|
+
let(:set) { DataMapper::OrderedSet.new([ entry1 ]) }
|
|
9
|
+
let(:entry1) { Object.new }
|
|
10
|
+
|
|
11
|
+
before do
|
|
12
|
+
@old_index = set.index(entry1)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
context 'when appending a not yet included entry' do
|
|
16
|
+
let(:entry2) { Object.new }
|
|
17
|
+
|
|
18
|
+
it_should_behave_like 'DataMapper::OrderedSet#<< when appending a not yet included entry'
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
context 'when updating an already included entry' do
|
|
22
|
+
let(:entry2) { entry1 }
|
|
23
|
+
|
|
24
|
+
it_should_behave_like 'DataMapper::OrderedSet#<< when updating an already included entry'
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'dm-core/support/ordered_set'
|
|
3
|
+
require 'unit/data_mapper/ordered_set/shared/clear_spec'
|
|
4
|
+
|
|
5
|
+
describe 'DataMapper::OrderedSet#clear' do
|
|
6
|
+
subject { ordered_set.clear }
|
|
7
|
+
|
|
8
|
+
let(:ordered_set) { DataMapper::OrderedSet.new(entries) }
|
|
9
|
+
|
|
10
|
+
let(:entry1) { 1 }
|
|
11
|
+
let(:entry2) { 2 }
|
|
12
|
+
|
|
13
|
+
context 'when no entries are present' do
|
|
14
|
+
let(:entries) { [] }
|
|
15
|
+
|
|
16
|
+
it_should_behave_like 'DataMapper::OrderedSet#clear when no entries are present'
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
context 'when entries are present' do
|
|
20
|
+
let(:entries) { [ entry1, entry2 ] }
|
|
21
|
+
|
|
22
|
+
it_should_behave_like 'DataMapper::OrderedSet#clear when entries are present'
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'dm-core/support/ordered_set'
|
|
3
|
+
require 'unit/data_mapper/ordered_set/shared/delete_spec'
|
|
4
|
+
|
|
5
|
+
describe 'DataMapper::OrderedSet#delete' do
|
|
6
|
+
subject { ordered_set }
|
|
7
|
+
|
|
8
|
+
let(:ordered_set) { DataMapper::OrderedSet.new([ entry1, entry2, entry3 ]) }
|
|
9
|
+
let(:entry1) { 1 }
|
|
10
|
+
let(:entry2) { 2 }
|
|
11
|
+
let(:entry3) { 3 }
|
|
12
|
+
|
|
13
|
+
before do
|
|
14
|
+
ordered_set.delete(entry)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
context 'when deleting an already included entry' do
|
|
18
|
+
let(:entry) { entry1 }
|
|
19
|
+
|
|
20
|
+
it_should_behave_like 'DataMapper::OrderedSet#delete when deleting an already included entry'
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
context 'when deleting a not yet included entry' do
|
|
24
|
+
let(:entry) { 4 }
|
|
25
|
+
|
|
26
|
+
it_should_behave_like 'DataMapper::OrderedSet#delete when deleting a not yet included entry'
|
|
27
|
+
end
|
|
28
|
+
end
|