sbf-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.
- checksums.yaml +7 -0
- data/.autotest +29 -0
- data/.document +5 -0
- data/.gitignore +44 -0
- data/.rspec +1 -0
- data/.rubocop.yml +468 -0
- data/.travis.yml +57 -0
- data/.yardopts +1 -0
- data/Gemfile +70 -0
- data/LICENSE +20 -0
- data/README.md +269 -0
- data/Rakefile +4 -0
- data/dm-core.gemspec +21 -0
- data/lib/dm-core/adapters/abstract_adapter.rb +233 -0
- data/lib/dm-core/adapters/in_memory_adapter.rb +110 -0
- data/lib/dm-core/adapters.rb +249 -0
- data/lib/dm-core/associations/many_to_many.rb +477 -0
- data/lib/dm-core/associations/many_to_one.rb +282 -0
- data/lib/dm-core/associations/one_to_many.rb +332 -0
- data/lib/dm-core/associations/one_to_one.rb +84 -0
- data/lib/dm-core/associations/relationship.rb +650 -0
- data/lib/dm-core/backwards.rb +11 -0
- data/lib/dm-core/collection.rb +1486 -0
- data/lib/dm-core/core_ext/kernel.rb +21 -0
- data/lib/dm-core/core_ext/pathname.rb +4 -0
- data/lib/dm-core/core_ext/symbol.rb +10 -0
- data/lib/dm-core/identity_map.rb +6 -0
- data/lib/dm-core/model/hook.rb +99 -0
- data/lib/dm-core/model/is.rb +30 -0
- data/lib/dm-core/model/property.rb +244 -0
- data/lib/dm-core/model/relationship.rb +366 -0
- data/lib/dm-core/model/scope.rb +87 -0
- data/lib/dm-core/model.rb +876 -0
- data/lib/dm-core/property/binary.rb +19 -0
- data/lib/dm-core/property/boolean.rb +35 -0
- data/lib/dm-core/property/class.rb +23 -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 +47 -0
- data/lib/dm-core/property/discriminator.rb +40 -0
- data/lib/dm-core/property/float.rb +27 -0
- data/lib/dm-core/property/integer.rb +32 -0
- data/lib/dm-core/property/invalid_value_error.rb +17 -0
- data/lib/dm-core/property/lookup.rb +26 -0
- data/lib/dm-core/property/numeric.rb +35 -0
- data/lib/dm-core/property/object.rb +33 -0
- data/lib/dm-core/property/serial.rb +13 -0
- data/lib/dm-core/property/string.rb +47 -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.rb +856 -0
- data/lib/dm-core/property_set.rb +177 -0
- data/lib/dm-core/query/conditions/comparison.rb +886 -0
- data/lib/dm-core/query/conditions/operation.rb +710 -0
- data/lib/dm-core/query/direction.rb +33 -0
- data/lib/dm-core/query/operator.rb +34 -0
- data/lib/dm-core/query/path.rb +113 -0
- data/lib/dm-core/query/sort.rb +38 -0
- data/lib/dm-core/query.rb +1352 -0
- data/lib/dm-core/relationship_set.rb +69 -0
- data/lib/dm-core/repository.rb +226 -0
- data/lib/dm-core/resource/persistence_state/clean.rb +36 -0
- data/lib/dm-core/resource/persistence_state/deleted.rb +26 -0
- data/lib/dm-core/resource/persistence_state/dirty.rb +91 -0
- data/lib/dm-core/resource/persistence_state/immutable.rb +32 -0
- data/lib/dm-core/resource/persistence_state/persisted.rb +25 -0
- data/lib/dm-core/resource/persistence_state/transient.rb +87 -0
- data/lib/dm-core/resource/persistence_state.rb +70 -0
- data/lib/dm-core/resource.rb +1220 -0
- data/lib/dm-core/spec/lib/adapter_helpers.rb +63 -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 +164 -0
- data/lib/dm-core/spec/shared/adapter_spec.rb +366 -0
- data/lib/dm-core/spec/shared/public/property_spec.rb +229 -0
- data/lib/dm-core/spec/shared/resource_spec.rb +1221 -0
- data/lib/dm-core/spec/shared/sel_spec.rb +111 -0
- data/lib/dm-core/spec/shared/semipublic/property_spec.rb +184 -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 +388 -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 +109 -0
- data/lib/dm-core/support/ordered_set.rb +381 -0
- data/lib/dm-core/support/subject.rb +33 -0
- data/lib/dm-core/support/subject_set.rb +251 -0
- data/lib/dm-core/version.rb +3 -0
- data/lib/dm-core.rb +274 -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 +69 -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 +77 -0
- data/spec/public/model/hook_spec.rb +245 -0
- data/spec/public/model/property_spec.rb +91 -0
- data/spec/public/model/relationship_spec.rb +1040 -0
- data/spec/public/model_spec.rb +456 -0
- data/spec/public/property/binary_spec.rb +43 -0
- data/spec/public/property/boolean_spec.rb +21 -0
- data/spec/public/property/class_spec.rb +27 -0
- data/spec/public/property/date_spec.rb +21 -0
- data/spec/public/property/date_time_spec.rb +21 -0
- data/spec/public/property/decimal_spec.rb +23 -0
- data/spec/public/property/discriminator_spec.rb +134 -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 +117 -0
- data/spec/public/property/serial_spec.rb +22 -0
- data/spec/public/property/string_spec.rb +21 -0
- data/spec/public/property/text_spec.rb +62 -0
- data/spec/public/property/time_spec.rb +21 -0
- data/spec/public/property_spec.rb +333 -0
- data/spec/public/resource/state_spec.rb +72 -0
- data/spec/public/resource_spec.rb +289 -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 +1637 -0
- data/spec/public/shared/finder_shared_spec.rb +1647 -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 +1502 -0
- data/spec/semipublic/query/conditions/operation_spec.rb +1296 -0
- data/spec/semipublic/query/path_spec.rb +471 -0
- data/spec/semipublic/query_spec.rb +3665 -0
- data/spec/semipublic/resource/state/clean_spec.rb +89 -0
- data/spec/semipublic/resource/state/deleted_spec.rb +79 -0
- data/spec/semipublic/resource/state/dirty_spec.rb +163 -0
- data/spec/semipublic/resource/state/immutable_spec.rb +107 -0
- data/spec/semipublic/resource/state/transient_spec.rb +163 -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 +198 -0
- data/spec/semipublic/shared/resource_state_shared_spec.rb +91 -0
- data/spec/semipublic/shared/subject_shared_spec.rb +79 -0
- data/spec/spec_helper.rb +34 -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 +27 -0
- data/spec/unit/hook_spec.rb +1216 -0
- data/spec/unit/inflections_spec.rb +14 -0
- data/spec/unit/lazy_array_spec.rb +1949 -0
- data/spec/unit/mash_spec.rb +289 -0
- data/spec/unit/module_spec.rb +70 -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 +18 -0
- data/tasks/yard.rake +9 -0
- data/tasks/yardstick.rake +19 -0
- metadata +323 -0
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
require_relative '../spec_helper'
|
|
2
|
+
|
|
3
|
+
describe 'SEL', 'with STI subclasses' do
|
|
4
|
+
before :all do
|
|
5
|
+
module ::Blog
|
|
6
|
+
class Author
|
|
7
|
+
include DataMapper::Resource
|
|
8
|
+
|
|
9
|
+
property :id, Serial
|
|
10
|
+
property :name, String
|
|
11
|
+
|
|
12
|
+
has n, :messages
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
class Message
|
|
16
|
+
include DataMapper::Resource
|
|
17
|
+
|
|
18
|
+
property :id, Serial
|
|
19
|
+
property :type, Discriminator
|
|
20
|
+
property :title, String, :required => true
|
|
21
|
+
|
|
22
|
+
belongs_to :author
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
class Article < Message; end
|
|
26
|
+
class Comment < Message; end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
DataMapper.finalize
|
|
30
|
+
|
|
31
|
+
@author_model = Blog::Author
|
|
32
|
+
@message_model = Blog::Message
|
|
33
|
+
@article_model = Blog::Article
|
|
34
|
+
@comment_model = Blog::Comment
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
supported_by :all do
|
|
38
|
+
before :all do
|
|
39
|
+
author1 = @author_model.create(:name => 'Dan Kubb')
|
|
40
|
+
author2 = @author_model.create(:name => 'Sindre Aarsaether')
|
|
41
|
+
|
|
42
|
+
@article_model.create(:title => 'SEL', :author => author1)
|
|
43
|
+
@article_model.create(:title => 'STI', :author => author1)
|
|
44
|
+
@comment_model.create(:title => 'SEL and STI error', :author => author2)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
it 'allows STI loading of mixed relationships' do
|
|
48
|
+
expect {
|
|
49
|
+
@message_model.all.each { |message| message.author }
|
|
50
|
+
}.not_to raise_error(ArgumentError)
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
require_relative '../spec_helper'
|
|
2
|
+
|
|
3
|
+
describe DataMapper do
|
|
4
|
+
describe '.setup' do
|
|
5
|
+
describe 'using connection string' do
|
|
6
|
+
before :all do
|
|
7
|
+
@return = DataMapper.setup(:setup_test, 'inmemory://user:pass@hostname:1234/path?foo=bar&baz=foo#fragment')
|
|
8
|
+
|
|
9
|
+
@options = @return.options
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
after :all do
|
|
13
|
+
DataMapper::Repository.adapters.delete(@return.name)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
it 'returns an Adapter' do
|
|
17
|
+
expect(@return).to be_kind_of(DataMapper::Adapters::AbstractAdapter)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
it 'sets up the repository' do
|
|
21
|
+
expect(DataMapper.repository(:setup_test).adapter).to equal(@return)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
{
|
|
25
|
+
:adapter => 'inmemory',
|
|
26
|
+
:user => 'user',
|
|
27
|
+
:password => 'pass',
|
|
28
|
+
:host => 'hostname',
|
|
29
|
+
:port => 1234,
|
|
30
|
+
:path => '/path',
|
|
31
|
+
:fragment => 'fragment'
|
|
32
|
+
}.each do |key, val|
|
|
33
|
+
it "extracts the #{key.inspect} option from the uri" do
|
|
34
|
+
expect(@options[key]).to eq val
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
it 'aliases the scheme of the uri as the adapter' do
|
|
39
|
+
expect(@options[:scheme]).to eq @options[:adapter]
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
it 'leaves the query param intact' do
|
|
43
|
+
expect(@options[:query]).to eq 'foo=bar&baz=foo'
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
it 'extracts the query param as top-level options' do
|
|
47
|
+
expect(@options[:foo]).to eq 'bar'
|
|
48
|
+
expect(@options[:baz]).to eq 'foo'
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
describe 'using options' do
|
|
53
|
+
before :all do
|
|
54
|
+
@return = DataMapper.setup(:setup_test, :adapter => :in_memory, :foo => 'bar')
|
|
55
|
+
|
|
56
|
+
@options = @return.options
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
after :all do
|
|
60
|
+
DataMapper::Repository.adapters.delete(@return.name)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
it 'returns an Adapter' do
|
|
64
|
+
expect(@return).to be_kind_of(DataMapper::Adapters::AbstractAdapter)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
it 'sets up the repository' do
|
|
68
|
+
expect(DataMapper.repository(:setup_test).adapter).to equal(@return)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
{
|
|
72
|
+
:adapter => :in_memory,
|
|
73
|
+
:foo => 'bar'
|
|
74
|
+
}.each do |key, val|
|
|
75
|
+
it "Sets the #{key.inspect} option" do
|
|
76
|
+
expect(@options[key]).to eq val
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
describe 'using invalid options' do
|
|
82
|
+
it 'Raises an exception' do
|
|
83
|
+
expect {
|
|
84
|
+
DataMapper.setup(:setup_test, :invalid)
|
|
85
|
+
}.to raise_error(ArgumentError, '+options+ should be Hash or Addressable::URI or String, but was Symbol')
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
describe 'using an instance of an adapter' do
|
|
90
|
+
before :all do
|
|
91
|
+
@adapter = DataMapper::Adapters::InMemoryAdapter.new(:setup_test)
|
|
92
|
+
|
|
93
|
+
@return = DataMapper.setup(@adapter)
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
after :all do
|
|
97
|
+
DataMapper::Repository.adapters.delete(@return.name)
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
it 'Returns an Adapter' do
|
|
101
|
+
expect(@return).to be_kind_of(DataMapper::Adapters::AbstractAdapter)
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
it 'Sets up the repository' do
|
|
105
|
+
expect(DataMapper.repository(:setup_test).adapter).to equal(@return)
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
it 'Uses the adapter given' do
|
|
109
|
+
expect(@return).to eq @adapter
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
it 'Uses the name given to the adapter' do
|
|
113
|
+
expect(@return.name).to eq @adapter.name
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
supported_by :postgres, :mysql, :sqlite3, :sqlserver do
|
|
118
|
+
{ :path => :database, :user => :username }.each do |original_key, new_key|
|
|
119
|
+
describe "using #{new_key.inspect} option" do
|
|
120
|
+
before :all do
|
|
121
|
+
@return = DataMapper.setup(:setup_test, :adapter => @adapter.options[:adapter], new_key => @adapter.options[original_key])
|
|
122
|
+
|
|
123
|
+
@options = @return.options
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
after :all do
|
|
127
|
+
DataMapper::Repository.adapters.delete(@return.name)
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
it 'Returns an Adapter' do
|
|
131
|
+
expect(@return).to be_kind_of(DataMapper::Adapters::AbstractAdapter)
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
it 'Sets up the repository' do
|
|
135
|
+
expect(DataMapper.repository(:setup_test).adapter).to equal(@return)
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
it "Sets the #{new_key.inspect} option" do
|
|
139
|
+
expect(@options[new_key]).to eq @adapter.options[original_key]
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
end
|
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
shared_examples 'It can transfer a Resource from another association' do
|
|
2
|
+
before :all do
|
|
3
|
+
@no_join = (defined?(DataMapper::Adapters::InMemoryAdapter) && @adapter.is_a?(DataMapper::Adapters::InMemoryAdapter)) ||
|
|
4
|
+
(defined?(DataMapper::Adapters::YamlAdapter) && @adapter.is_a?(DataMapper::Adapters::YamlAdapter))
|
|
5
|
+
|
|
6
|
+
@one_to_many = @articles.is_a?(DataMapper::Associations::OneToMany::Collection)
|
|
7
|
+
@many_to_many = @articles.is_a?(DataMapper::Associations::ManyToMany::Collection)
|
|
8
|
+
|
|
9
|
+
@skip = @no_join && @many_to_many
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
before :all do
|
|
13
|
+
unless @skip
|
|
14
|
+
%w(@resource @original).each do |ivar|
|
|
15
|
+
raise "+#{ivar}+ should be defined in before block" unless instance_variable_defined?(ivar)
|
|
16
|
+
raise "+#{ivar}+ should not be nil in before block" unless instance_variable_get(ivar)
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
before do
|
|
22
|
+
pending if @skip
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
it 'removes the Resource from the original Collection' do
|
|
26
|
+
pending do
|
|
27
|
+
expect(@original).not_to include(@resource)
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
shared_examples 'A public Association Collection' do
|
|
33
|
+
before :all do
|
|
34
|
+
@no_join = (defined?(DataMapper::Adapters::InMemoryAdapter) && @adapter.is_a?(DataMapper::Adapters::InMemoryAdapter)) ||
|
|
35
|
+
(defined?(DataMapper::Adapters::YamlAdapter) && @adapter.is_a?(DataMapper::Adapters::YamlAdapter))
|
|
36
|
+
|
|
37
|
+
@one_to_many = @articles.is_a?(DataMapper::Associations::OneToMany::Collection)
|
|
38
|
+
@many_to_many = @articles.is_a?(DataMapper::Associations::ManyToMany::Collection)
|
|
39
|
+
|
|
40
|
+
@skip = @no_join && @many_to_many
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
before :all do
|
|
44
|
+
unless @skip
|
|
45
|
+
%w(@articles @other_articles).each do |ivar|
|
|
46
|
+
raise "+#{ivar}+ should be defined in before block" unless instance_variable_get(ivar)
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
expect(@articles.loaded?).to eq loaded
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
before do
|
|
54
|
+
pending if @skip
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
describe '#<<' do
|
|
58
|
+
describe 'when provided a Resource belonging to another association' do
|
|
59
|
+
before :all do
|
|
60
|
+
@original = @other_articles
|
|
61
|
+
@resource = @original.first
|
|
62
|
+
|
|
63
|
+
rescue_if @skip do
|
|
64
|
+
@return = @articles << @resource
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
it 'returns a Collection' do
|
|
69
|
+
expect(@return).to be_kind_of(DataMapper::Collection)
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
it 'returns self' do
|
|
73
|
+
expect(@return).to equal(@articles)
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
it_behaves_like 'It can transfer a Resource from another association'
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
describe '#collect!' do
|
|
81
|
+
describe 'when provided a Resource belonging to another association' do
|
|
82
|
+
before :all do
|
|
83
|
+
@original = @other_articles
|
|
84
|
+
@resource = @original.first
|
|
85
|
+
@return = @articles.collect! { |_resource| @resource }
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
it 'returns a Collection' do
|
|
89
|
+
expect(@return).to be_kind_of(DataMapper::Collection)
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
it 'returns self' do
|
|
93
|
+
expect(@return).to equal(@articles)
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
it_behaves_like 'It can transfer a Resource from another association'
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
describe '#concat' do
|
|
101
|
+
describe 'when provided a Resource belonging to another association' do
|
|
102
|
+
before :all do
|
|
103
|
+
@original = @other_articles
|
|
104
|
+
@resource = @original.first
|
|
105
|
+
|
|
106
|
+
rescue_if @skip do
|
|
107
|
+
@return = @articles.concat([@resource])
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
it 'returns a Collection' do
|
|
112
|
+
expect(@return).to be_kind_of(DataMapper::Collection)
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
it 'returns self' do
|
|
116
|
+
expect(@return).to equal(@articles)
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
it_behaves_like 'It can transfer a Resource from another association'
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
describe '#create' do
|
|
124
|
+
describe 'when the parent is not saved' do
|
|
125
|
+
it 'raises an exception' do
|
|
126
|
+
author = @author_model.new(name: 'Dan Kubb')
|
|
127
|
+
expect {
|
|
128
|
+
author.articles.create
|
|
129
|
+
}.to raise_error(DataMapper::UnsavedParentError)
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
describe '#destroy' do
|
|
135
|
+
describe 'when the parent is not saved' do
|
|
136
|
+
it 'raises an exception' do
|
|
137
|
+
author = @author_model.new(name: 'Dan Kubb')
|
|
138
|
+
expect {
|
|
139
|
+
author.articles.destroy
|
|
140
|
+
}.to raise_error(DataMapper::UnsavedParentError, 'The source must be saved before mass-deleting the collection')
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
describe '#destroy!' do
|
|
146
|
+
describe 'when the parent is not saved' do
|
|
147
|
+
it 'raises an exception' do
|
|
148
|
+
author = @author_model.new(name: 'Dan Kubb')
|
|
149
|
+
expect {
|
|
150
|
+
author.articles.destroy!
|
|
151
|
+
}.to raise_error(DataMapper::UnsavedParentError, 'The source must be saved before mass-deleting the collection')
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
describe '#insert' do
|
|
157
|
+
describe 'when provided a Resource belonging to another association' do
|
|
158
|
+
before :all do
|
|
159
|
+
@original = @other_articles
|
|
160
|
+
@resource = @original.first
|
|
161
|
+
|
|
162
|
+
rescue_if @skip do
|
|
163
|
+
@return = @articles.insert(0, @resource)
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
it 'returns a Collection' do
|
|
168
|
+
expect(@return).to be_kind_of(DataMapper::Collection)
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
it 'returns self' do
|
|
172
|
+
expect(@return).to equal(@articles)
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
it_behaves_like 'It can transfer a Resource from another association'
|
|
176
|
+
end
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
it 'responds to a public collection method with #method_missing' do
|
|
180
|
+
@articles.respond_to?(:to_a)
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
describe '#method_missing' do
|
|
184
|
+
describe 'with a public collection method' do
|
|
185
|
+
before :all do
|
|
186
|
+
@return = @articles.to_a
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
it 'returns expected object' do
|
|
190
|
+
expect(@return).to eq @articles
|
|
191
|
+
end
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
describe 'with unknown method' do
|
|
195
|
+
it 'raises an exception' do
|
|
196
|
+
expect {
|
|
197
|
+
@articles.unknown
|
|
198
|
+
}.to raise_error(NoMethodError)
|
|
199
|
+
end
|
|
200
|
+
end
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
describe '#new' do
|
|
204
|
+
before :all do
|
|
205
|
+
@resource = @author.articles.new
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
it 'associates the Resource to the Collection' do
|
|
209
|
+
if @resource.respond_to?(:authors)
|
|
210
|
+
pending 'TODO: make sure the association is bidirectional'
|
|
211
|
+
|
|
212
|
+
expect(@resource.authors).to eq [@author]
|
|
213
|
+
else
|
|
214
|
+
expect(@resource.author).to eq @author
|
|
215
|
+
end
|
|
216
|
+
end
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
describe '#push' do
|
|
220
|
+
describe 'when provided a Resource belonging to another association' do
|
|
221
|
+
before :all do
|
|
222
|
+
@original = @other_articles
|
|
223
|
+
@resource = @original.first
|
|
224
|
+
|
|
225
|
+
rescue_if @skip do
|
|
226
|
+
@return = @articles.push(@resource)
|
|
227
|
+
end
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
it 'returns a Collection' do
|
|
231
|
+
expect(@return).to be_kind_of(DataMapper::Collection)
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
it 'returns self' do
|
|
235
|
+
expect(@return).to equal(@articles)
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
it_behaves_like 'It can transfer a Resource from another association'
|
|
239
|
+
end
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
describe '#replace' do
|
|
243
|
+
describe 'when provided a Resource belonging to another association' do
|
|
244
|
+
before :all do
|
|
245
|
+
@original = @other_articles
|
|
246
|
+
@resource = @original.first
|
|
247
|
+
|
|
248
|
+
rescue_if @skip do
|
|
249
|
+
@return = @articles.replace([@resource])
|
|
250
|
+
end
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
it 'returns a Collection' do
|
|
254
|
+
expect(@return).to be_kind_of(DataMapper::Collection)
|
|
255
|
+
end
|
|
256
|
+
|
|
257
|
+
it 'returns self' do
|
|
258
|
+
expect(@return).to equal(@articles)
|
|
259
|
+
end
|
|
260
|
+
|
|
261
|
+
it_behaves_like 'It can transfer a Resource from another association'
|
|
262
|
+
end
|
|
263
|
+
end
|
|
264
|
+
|
|
265
|
+
describe '#unshift' do
|
|
266
|
+
describe 'when provided a Resource belonging to another association' do
|
|
267
|
+
before :all do
|
|
268
|
+
@original = @other_articles
|
|
269
|
+
@resource = @original.first
|
|
270
|
+
|
|
271
|
+
rescue_if @skip do
|
|
272
|
+
@return = @articles.unshift(@resource)
|
|
273
|
+
end
|
|
274
|
+
end
|
|
275
|
+
|
|
276
|
+
it 'returns a Collection' do
|
|
277
|
+
expect(@return).to be_kind_of(DataMapper::Collection)
|
|
278
|
+
end
|
|
279
|
+
|
|
280
|
+
it 'returns self' do
|
|
281
|
+
expect(@return).to equal(@articles)
|
|
282
|
+
end
|
|
283
|
+
|
|
284
|
+
it_behaves_like 'It can transfer a Resource from another association'
|
|
285
|
+
end
|
|
286
|
+
end
|
|
287
|
+
|
|
288
|
+
describe '#update' do
|
|
289
|
+
describe 'when the parent is not saved' do
|
|
290
|
+
it 'raises an exception' do
|
|
291
|
+
author = @author_model.new(name: 'Dan Kubb')
|
|
292
|
+
expect {
|
|
293
|
+
author.articles.update(title: 'New Title')
|
|
294
|
+
}.to raise_error(DataMapper::UnsavedParentError, 'The source must be saved before mass-updating the collection')
|
|
295
|
+
end
|
|
296
|
+
end
|
|
297
|
+
end
|
|
298
|
+
|
|
299
|
+
describe '#update!' do
|
|
300
|
+
describe 'when the parent is not saved' do
|
|
301
|
+
it 'raises an exception' do
|
|
302
|
+
author = @author_model.new(name: 'Dan Kubb')
|
|
303
|
+
expect {
|
|
304
|
+
author.articles.update!(title: 'New Title')
|
|
305
|
+
}.to raise_error(DataMapper::UnsavedParentError, 'The source must be saved before mass-updating the collection')
|
|
306
|
+
end
|
|
307
|
+
end
|
|
308
|
+
end
|
|
309
|
+
end
|