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,81 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
# run the specs once with a loaded association and once not
|
|
4
|
+
[ false, true ].each do |loaded|
|
|
5
|
+
describe 'One to Many Associations' do
|
|
6
|
+
extend DataMapper::Spec::CollectionHelpers::GroupMethods
|
|
7
|
+
|
|
8
|
+
self.loaded = loaded
|
|
9
|
+
|
|
10
|
+
# define the model prior to supported_by
|
|
11
|
+
before :all do
|
|
12
|
+
module ::Blog
|
|
13
|
+
class Author
|
|
14
|
+
include DataMapper::Resource
|
|
15
|
+
|
|
16
|
+
property :id, Serial
|
|
17
|
+
property :name, String
|
|
18
|
+
|
|
19
|
+
has n, :articles
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
class Article
|
|
23
|
+
include DataMapper::Resource
|
|
24
|
+
|
|
25
|
+
property :id, Serial
|
|
26
|
+
property :title, String, :required => true
|
|
27
|
+
property :content, Text
|
|
28
|
+
property :subtitle, String
|
|
29
|
+
property :attachment, Object
|
|
30
|
+
|
|
31
|
+
belongs_to :author, :required => false
|
|
32
|
+
belongs_to :original, self, :required => false
|
|
33
|
+
has n, :revisions, self, :child_key => [ :original_id ]
|
|
34
|
+
has 1, :previous, self, :child_key => [ :original_id ], :order => [ :id.desc ]
|
|
35
|
+
has n, :publications, :through => Resource
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
class Publication
|
|
39
|
+
include DataMapper::Resource
|
|
40
|
+
|
|
41
|
+
property :id, Serial
|
|
42
|
+
property :name, String
|
|
43
|
+
|
|
44
|
+
has n, :articles, :through => Resource
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
DataMapper.finalize
|
|
49
|
+
|
|
50
|
+
@author_model = Blog::Author
|
|
51
|
+
@article_model = Blog::Article
|
|
52
|
+
@publication_model = Blog::Publication
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
supported_by :all do
|
|
56
|
+
before :all do
|
|
57
|
+
@author = @author_model.create(:name => 'Dan Kubb')
|
|
58
|
+
|
|
59
|
+
@original = @author.articles.create(:title => 'Original Article')
|
|
60
|
+
@article = @author.articles.create(:title => 'Sample Article', :content => 'Sample', :original => @original)
|
|
61
|
+
@other = @author.articles.create(:title => 'Other Article', :content => 'Other')
|
|
62
|
+
|
|
63
|
+
# load the targets without references to a single source
|
|
64
|
+
load_collection = lambda do |query|
|
|
65
|
+
@author_model.get(*@author.key).articles(query)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
@articles = load_collection.call(:title => 'Sample Article')
|
|
69
|
+
@other_articles = load_collection.call(:title => 'Other Article')
|
|
70
|
+
|
|
71
|
+
@articles.entries if loaded
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
it_should_behave_like 'A public Collection'
|
|
75
|
+
it_should_behave_like 'A public Association Collection'
|
|
76
|
+
it_should_behave_like 'A Collection supporting Strategic Eager Loading'
|
|
77
|
+
it_should_behave_like 'Finder Interface'
|
|
78
|
+
it_should_behave_like 'Collection Finder Interface'
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe 'One to One Associations' do
|
|
4
|
+
before :all do
|
|
5
|
+
module ::Blog
|
|
6
|
+
class User
|
|
7
|
+
include DataMapper::Resource
|
|
8
|
+
|
|
9
|
+
property :name, String, :key => true
|
|
10
|
+
property :age, Integer
|
|
11
|
+
property :summary, Text
|
|
12
|
+
property :description, Text
|
|
13
|
+
property :admin, Boolean, :accessor => :private
|
|
14
|
+
|
|
15
|
+
belongs_to :parent, self, :required => false
|
|
16
|
+
has n, :children, self, :inverse => :parent
|
|
17
|
+
|
|
18
|
+
belongs_to :referrer, self, :required => false
|
|
19
|
+
belongs_to :comment
|
|
20
|
+
|
|
21
|
+
# TODO: remove this after Relationship#inverse can dynamically
|
|
22
|
+
# create an inverse relationship when no perfect match can be found
|
|
23
|
+
has n, :referree, self, :child_key => [ :referrer_name ]
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
class Author < User; end
|
|
27
|
+
|
|
28
|
+
class Comment
|
|
29
|
+
include DataMapper::Resource
|
|
30
|
+
|
|
31
|
+
property :id, Serial
|
|
32
|
+
property :body, Text
|
|
33
|
+
|
|
34
|
+
has 1, :user
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
class Article
|
|
38
|
+
include DataMapper::Resource
|
|
39
|
+
|
|
40
|
+
property :id, Serial
|
|
41
|
+
property :body, Text
|
|
42
|
+
|
|
43
|
+
has 1, :paragraph
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
class Paragraph
|
|
47
|
+
include DataMapper::Resource
|
|
48
|
+
|
|
49
|
+
property :id, Serial
|
|
50
|
+
property :text, String
|
|
51
|
+
|
|
52
|
+
belongs_to :article
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
class ::Default
|
|
57
|
+
include DataMapper::Resource
|
|
58
|
+
|
|
59
|
+
property :name, String, :key => true, :default => 'a default value'
|
|
60
|
+
end
|
|
61
|
+
DataMapper.finalize
|
|
62
|
+
|
|
63
|
+
@user_model = Blog::User
|
|
64
|
+
@author_model = Blog::Author
|
|
65
|
+
@comment_model = Blog::Comment
|
|
66
|
+
@article_model = Blog::Article
|
|
67
|
+
@paragraph_model = Blog::Paragraph
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
supported_by :all do
|
|
71
|
+
before :all do
|
|
72
|
+
comment = @comment_model.create(:body => 'Cool spec')
|
|
73
|
+
user = @user_model.create(:name => 'dbussink', :age => 25, :description => 'Test', :comment => comment)
|
|
74
|
+
|
|
75
|
+
@comment = @comment_model.get(*comment.key)
|
|
76
|
+
@user = @comment.user
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
it_should_behave_like 'A public Resource'
|
|
80
|
+
it_should_behave_like 'A Resource supporting Strategic Eager Loading'
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
describe 'One to One Through Associations' do
|
|
85
|
+
before :all do
|
|
86
|
+
module ::Blog
|
|
87
|
+
class Referral
|
|
88
|
+
include DataMapper::Resource
|
|
89
|
+
|
|
90
|
+
property :referrer_name, String, :key => true
|
|
91
|
+
property :referree_name, String, :key => true
|
|
92
|
+
|
|
93
|
+
belongs_to :referrer, 'User', :child_key => [ :referrer_name ]
|
|
94
|
+
belongs_to :referree, 'User', :child_key => [ :referree_name ]
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
class User
|
|
98
|
+
include DataMapper::Resource
|
|
99
|
+
|
|
100
|
+
property :name, String, :key => true
|
|
101
|
+
property :age, Integer
|
|
102
|
+
property :summary, Text
|
|
103
|
+
property :description, Text
|
|
104
|
+
property :admin, Boolean, :accessor => :private
|
|
105
|
+
|
|
106
|
+
belongs_to :parent, self, :required => false
|
|
107
|
+
has n, :children, self, :inverse => :parent
|
|
108
|
+
|
|
109
|
+
has 1, :referral_from, Referral, :child_key => [ :referree_name ]
|
|
110
|
+
has 1, :referral_to, Referral, :child_key => [ :referrer_name ]
|
|
111
|
+
|
|
112
|
+
has 1, :referrer, self, :through => :referral_from
|
|
113
|
+
has 1, :referree, self, :through => :referral_to
|
|
114
|
+
has 1, :comment, :through => Resource
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
class Author < User; end
|
|
118
|
+
|
|
119
|
+
class Comment
|
|
120
|
+
include DataMapper::Resource
|
|
121
|
+
|
|
122
|
+
property :id, Serial
|
|
123
|
+
property :body, Text
|
|
124
|
+
|
|
125
|
+
has 1, :user, :through => Resource
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
class Article
|
|
129
|
+
include DataMapper::Resource
|
|
130
|
+
|
|
131
|
+
property :id, Serial
|
|
132
|
+
property :body, Text
|
|
133
|
+
|
|
134
|
+
has 1, :paragraph, :through => Resource
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
class Paragraph
|
|
138
|
+
include DataMapper::Resource
|
|
139
|
+
|
|
140
|
+
property :id, Serial
|
|
141
|
+
property :text, String
|
|
142
|
+
|
|
143
|
+
has 1, :article, :through => Resource
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
class ::Default
|
|
148
|
+
include DataMapper::Resource
|
|
149
|
+
|
|
150
|
+
property :name, String, :key => true, :default => 'a default value'
|
|
151
|
+
end
|
|
152
|
+
DataMapper.finalize
|
|
153
|
+
|
|
154
|
+
@referral_model = Blog::Referral
|
|
155
|
+
@user_model = Blog::User
|
|
156
|
+
@author_model = Blog::Author
|
|
157
|
+
@comment_model = Blog::Comment
|
|
158
|
+
@article_model = Blog::Article
|
|
159
|
+
@paragraph_model = Blog::Paragraph
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
supported_by :all do
|
|
163
|
+
before :all do
|
|
164
|
+
comment = @comment_model.create(:body => 'Cool spec')
|
|
165
|
+
user = @user_model.create(:name => 'dbussink', :age => 25, :description => 'Test', :comment => comment)
|
|
166
|
+
|
|
167
|
+
@comment = @comment_model.get(*comment.key)
|
|
168
|
+
@user = @comment.user
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
it_should_behave_like 'A public Resource'
|
|
172
|
+
|
|
173
|
+
# TODO: make this pass
|
|
174
|
+
#it_should_behave_like 'A Resource supporting Strategic Eager Loading'
|
|
175
|
+
end
|
|
176
|
+
end
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
# TODO: combine this into one_to_one_spec.rb
|
|
4
|
+
|
|
5
|
+
describe 'One to One Associations when foreign key is part of a composite key and contains a boolean, with an integer and a boolean making up the composite key' do
|
|
6
|
+
before :all do
|
|
7
|
+
class ::ParentModel
|
|
8
|
+
include DataMapper::Resource
|
|
9
|
+
|
|
10
|
+
property :integer_key, Integer, :key => true
|
|
11
|
+
property :boolean_key, Boolean, :key => true
|
|
12
|
+
|
|
13
|
+
has 1, :child_model, :child_key => [ :integer_key, :boolean_key ]
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
class ::ChildModel
|
|
17
|
+
include DataMapper::Resource
|
|
18
|
+
|
|
19
|
+
property :integer_key, Integer, :key => true
|
|
20
|
+
property :other_integer_key, Integer, :key => true
|
|
21
|
+
property :boolean_key, Boolean, :key => true
|
|
22
|
+
|
|
23
|
+
belongs_to :parent_model, :child_key => [ :integer_key, :boolean_key ]
|
|
24
|
+
end
|
|
25
|
+
DataMapper.finalize
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
supported_by :all do
|
|
29
|
+
before :all do
|
|
30
|
+
@parent = ParentModel.create(:integer_key => 1, :boolean_key => false)
|
|
31
|
+
@child = ChildModel.create(:integer_key => 1, :other_integer_key => 1, :boolean_key => false)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
it 'should be able to access the child' do
|
|
35
|
+
@parent.child_model.should == @child
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
it 'should be able to access the parent' do
|
|
39
|
+
@child.parent_model.should == @parent
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
it 'should be able to access the parent_key' do
|
|
43
|
+
@child.parent_model.key.should_not be_nil
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
# run the specs once with a loaded collection and once not
|
|
4
|
+
[ false, true ].each do |loaded|
|
|
5
|
+
describe DataMapper::Collection do
|
|
6
|
+
extend DataMapper::Spec::CollectionHelpers::GroupMethods
|
|
7
|
+
|
|
8
|
+
self.loaded = loaded
|
|
9
|
+
|
|
10
|
+
before :all do
|
|
11
|
+
module ::Blog
|
|
12
|
+
class Article
|
|
13
|
+
include DataMapper::Resource
|
|
14
|
+
|
|
15
|
+
property :id, Serial
|
|
16
|
+
property :title, String, :required => true
|
|
17
|
+
property :content, Text
|
|
18
|
+
property :subtitle, String
|
|
19
|
+
property :author, String, :required => true
|
|
20
|
+
property :attachment, Object
|
|
21
|
+
|
|
22
|
+
belongs_to :original, self, :required => false
|
|
23
|
+
has n, :revisions, self, :child_key => [ :original_id ]
|
|
24
|
+
has 1, :previous, self, :child_key => [ :original_id ], :order => [ :id.desc ]
|
|
25
|
+
has n, :publications, :through => Resource
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
class Publication
|
|
29
|
+
include DataMapper::Resource
|
|
30
|
+
|
|
31
|
+
property :id, Serial
|
|
32
|
+
property :name, String
|
|
33
|
+
|
|
34
|
+
has n, :articles, :through => Resource
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
DataMapper.finalize
|
|
39
|
+
|
|
40
|
+
@article_model = Blog::Article
|
|
41
|
+
@publication_model = Blog::Publication
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
supported_by :all do
|
|
45
|
+
before :all do
|
|
46
|
+
@author = 'Dan Kubb'
|
|
47
|
+
|
|
48
|
+
@original = @article_model.create(:title => 'Original Article', :author => @author)
|
|
49
|
+
@article = @article_model.create(:title => 'Sample Article', :content => 'Sample', :original => @original, :author => @author)
|
|
50
|
+
@other = @article_model.create(:title => 'Other Article', :content => 'Other', :author => @author)
|
|
51
|
+
|
|
52
|
+
# load the targets without references to a single source
|
|
53
|
+
load_collection = lambda do |query|
|
|
54
|
+
@article_model.all(query)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
@articles = load_collection.call(:title => 'Sample Article', :author => @author)
|
|
58
|
+
@other_articles = load_collection.call(:title => 'Other Article', :author => @author)
|
|
59
|
+
|
|
60
|
+
@articles.entries if loaded
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
it_should_behave_like 'A public Collection'
|
|
64
|
+
it_should_behave_like 'A Collection supporting Strategic Eager Loading'
|
|
65
|
+
it_should_behave_like 'Finder Interface'
|
|
66
|
+
it_should_behave_like 'Collection Finder Interface'
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe DataMapper do
|
|
4
|
+
describe '.finalize' do
|
|
5
|
+
subject { DataMapper.finalize }
|
|
6
|
+
|
|
7
|
+
it 'should not raise with valid models' do
|
|
8
|
+
class ::ValidObject
|
|
9
|
+
include DataMapper::Resource
|
|
10
|
+
property :id, Integer, :key => true
|
|
11
|
+
end
|
|
12
|
+
begin
|
|
13
|
+
method(:subject).should_not raise_error
|
|
14
|
+
ensure
|
|
15
|
+
DataMapper::Model.descendants.delete(ValidObject)
|
|
16
|
+
Object.send(:remove_const, :ValidObject)
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
it "should not raise on valid child model" do
|
|
21
|
+
class ::ValidChild
|
|
22
|
+
include DataMapper::Resource
|
|
23
|
+
belongs_to :valid_object, :key => true
|
|
24
|
+
end
|
|
25
|
+
class ::ValidObject
|
|
26
|
+
include DataMapper::Resource
|
|
27
|
+
property :id, Integer, :key => true
|
|
28
|
+
end
|
|
29
|
+
begin
|
|
30
|
+
method(:subject).should_not raise_error
|
|
31
|
+
ensure
|
|
32
|
+
DataMapper::Model.descendants.delete(ValidChild)
|
|
33
|
+
DataMapper::Model.descendants.delete(ValidObject)
|
|
34
|
+
Object.send(:remove_const, :ValidChild)
|
|
35
|
+
Object.send(:remove_const, :ValidObject)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
it 'should raise on an anonymous model' do
|
|
40
|
+
model = Class.new do
|
|
41
|
+
include DataMapper::Resource
|
|
42
|
+
property :id, Integer, :key => true
|
|
43
|
+
end
|
|
44
|
+
begin
|
|
45
|
+
method(:subject).should raise_error(DataMapper::IncompleteModelError, "#{model.inspect} must have a name")
|
|
46
|
+
ensure
|
|
47
|
+
DataMapper::Model.descendants.delete(model)
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
it 'should raise on an empty model' do
|
|
52
|
+
class ::EmptyObject
|
|
53
|
+
include DataMapper::Resource
|
|
54
|
+
end
|
|
55
|
+
begin
|
|
56
|
+
method(:subject).should raise_error(DataMapper::IncompleteModelError, 'EmptyObject must have at least one property or many to one relationship to be valid')
|
|
57
|
+
ensure
|
|
58
|
+
DataMapper::Model.descendants.delete(EmptyObject)
|
|
59
|
+
Object.send(:remove_const, :EmptyObject)
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
it 'should raise on a keyless model' do
|
|
64
|
+
class ::KeylessObject
|
|
65
|
+
include DataMapper::Resource
|
|
66
|
+
property :name, String
|
|
67
|
+
end
|
|
68
|
+
begin
|
|
69
|
+
method(:subject).should raise_error(DataMapper::IncompleteModelError, 'KeylessObject must have a key to be valid')
|
|
70
|
+
ensure
|
|
71
|
+
DataMapper::Model.descendants.delete(KeylessObject)
|
|
72
|
+
Object.send(:remove_const, :KeylessObject)
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|