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.
Files changed (259) hide show
  1. checksums.yaml +7 -0
  2. data/.autotest +29 -0
  3. data/.document +5 -0
  4. data/.gitignore +44 -0
  5. data/.rspec +1 -0
  6. data/.rubocop.yml +468 -0
  7. data/.travis.yml +57 -0
  8. data/.yardopts +1 -0
  9. data/Gemfile +70 -0
  10. data/LICENSE +20 -0
  11. data/README.md +269 -0
  12. data/Rakefile +4 -0
  13. data/dm-core.gemspec +21 -0
  14. data/lib/dm-core/adapters/abstract_adapter.rb +233 -0
  15. data/lib/dm-core/adapters/in_memory_adapter.rb +110 -0
  16. data/lib/dm-core/adapters.rb +249 -0
  17. data/lib/dm-core/associations/many_to_many.rb +477 -0
  18. data/lib/dm-core/associations/many_to_one.rb +282 -0
  19. data/lib/dm-core/associations/one_to_many.rb +332 -0
  20. data/lib/dm-core/associations/one_to_one.rb +84 -0
  21. data/lib/dm-core/associations/relationship.rb +650 -0
  22. data/lib/dm-core/backwards.rb +11 -0
  23. data/lib/dm-core/collection.rb +1486 -0
  24. data/lib/dm-core/core_ext/kernel.rb +21 -0
  25. data/lib/dm-core/core_ext/pathname.rb +4 -0
  26. data/lib/dm-core/core_ext/symbol.rb +10 -0
  27. data/lib/dm-core/identity_map.rb +6 -0
  28. data/lib/dm-core/model/hook.rb +99 -0
  29. data/lib/dm-core/model/is.rb +30 -0
  30. data/lib/dm-core/model/property.rb +244 -0
  31. data/lib/dm-core/model/relationship.rb +366 -0
  32. data/lib/dm-core/model/scope.rb +87 -0
  33. data/lib/dm-core/model.rb +876 -0
  34. data/lib/dm-core/property/binary.rb +19 -0
  35. data/lib/dm-core/property/boolean.rb +35 -0
  36. data/lib/dm-core/property/class.rb +23 -0
  37. data/lib/dm-core/property/date.rb +45 -0
  38. data/lib/dm-core/property/date_time.rb +44 -0
  39. data/lib/dm-core/property/decimal.rb +47 -0
  40. data/lib/dm-core/property/discriminator.rb +40 -0
  41. data/lib/dm-core/property/float.rb +27 -0
  42. data/lib/dm-core/property/integer.rb +32 -0
  43. data/lib/dm-core/property/invalid_value_error.rb +17 -0
  44. data/lib/dm-core/property/lookup.rb +26 -0
  45. data/lib/dm-core/property/numeric.rb +35 -0
  46. data/lib/dm-core/property/object.rb +33 -0
  47. data/lib/dm-core/property/serial.rb +13 -0
  48. data/lib/dm-core/property/string.rb +47 -0
  49. data/lib/dm-core/property/text.rb +12 -0
  50. data/lib/dm-core/property/time.rb +46 -0
  51. data/lib/dm-core/property/typecast/numeric.rb +32 -0
  52. data/lib/dm-core/property/typecast/time.rb +33 -0
  53. data/lib/dm-core/property.rb +856 -0
  54. data/lib/dm-core/property_set.rb +177 -0
  55. data/lib/dm-core/query/conditions/comparison.rb +886 -0
  56. data/lib/dm-core/query/conditions/operation.rb +710 -0
  57. data/lib/dm-core/query/direction.rb +33 -0
  58. data/lib/dm-core/query/operator.rb +34 -0
  59. data/lib/dm-core/query/path.rb +113 -0
  60. data/lib/dm-core/query/sort.rb +38 -0
  61. data/lib/dm-core/query.rb +1352 -0
  62. data/lib/dm-core/relationship_set.rb +69 -0
  63. data/lib/dm-core/repository.rb +226 -0
  64. data/lib/dm-core/resource/persistence_state/clean.rb +36 -0
  65. data/lib/dm-core/resource/persistence_state/deleted.rb +26 -0
  66. data/lib/dm-core/resource/persistence_state/dirty.rb +91 -0
  67. data/lib/dm-core/resource/persistence_state/immutable.rb +32 -0
  68. data/lib/dm-core/resource/persistence_state/persisted.rb +25 -0
  69. data/lib/dm-core/resource/persistence_state/transient.rb +87 -0
  70. data/lib/dm-core/resource/persistence_state.rb +70 -0
  71. data/lib/dm-core/resource.rb +1220 -0
  72. data/lib/dm-core/spec/lib/adapter_helpers.rb +63 -0
  73. data/lib/dm-core/spec/lib/collection_helpers.rb +21 -0
  74. data/lib/dm-core/spec/lib/counter_adapter.rb +38 -0
  75. data/lib/dm-core/spec/lib/pending_helpers.rb +50 -0
  76. data/lib/dm-core/spec/lib/spec_helper.rb +74 -0
  77. data/lib/dm-core/spec/setup.rb +164 -0
  78. data/lib/dm-core/spec/shared/adapter_spec.rb +366 -0
  79. data/lib/dm-core/spec/shared/public/property_spec.rb +229 -0
  80. data/lib/dm-core/spec/shared/resource_spec.rb +1221 -0
  81. data/lib/dm-core/spec/shared/sel_spec.rb +111 -0
  82. data/lib/dm-core/spec/shared/semipublic/property_spec.rb +184 -0
  83. data/lib/dm-core/spec/shared/semipublic/query/conditions/abstract_comparison_spec.rb +261 -0
  84. data/lib/dm-core/support/assertions.rb +8 -0
  85. data/lib/dm-core/support/chainable.rb +18 -0
  86. data/lib/dm-core/support/deprecate.rb +12 -0
  87. data/lib/dm-core/support/descendant_set.rb +89 -0
  88. data/lib/dm-core/support/equalizer.rb +48 -0
  89. data/lib/dm-core/support/ext/array.rb +22 -0
  90. data/lib/dm-core/support/ext/blank.rb +25 -0
  91. data/lib/dm-core/support/ext/hash.rb +67 -0
  92. data/lib/dm-core/support/ext/module.rb +47 -0
  93. data/lib/dm-core/support/ext/object.rb +57 -0
  94. data/lib/dm-core/support/ext/string.rb +24 -0
  95. data/lib/dm-core/support/ext/try_dup.rb +12 -0
  96. data/lib/dm-core/support/hook.rb +388 -0
  97. data/lib/dm-core/support/inflections.rb +60 -0
  98. data/lib/dm-core/support/inflector/inflections.rb +211 -0
  99. data/lib/dm-core/support/inflector/methods.rb +151 -0
  100. data/lib/dm-core/support/lazy_array.rb +451 -0
  101. data/lib/dm-core/support/local_object_space.rb +13 -0
  102. data/lib/dm-core/support/logger.rb +201 -0
  103. data/lib/dm-core/support/mash.rb +176 -0
  104. data/lib/dm-core/support/naming_conventions.rb +109 -0
  105. data/lib/dm-core/support/ordered_set.rb +381 -0
  106. data/lib/dm-core/support/subject.rb +33 -0
  107. data/lib/dm-core/support/subject_set.rb +251 -0
  108. data/lib/dm-core/version.rb +3 -0
  109. data/lib/dm-core.rb +274 -0
  110. data/script/performance.rb +275 -0
  111. data/script/profile.rb +218 -0
  112. data/spec/lib/rspec_immediate_feedback_formatter.rb +54 -0
  113. data/spec/public/associations/many_to_many/read_multiple_join_spec.rb +69 -0
  114. data/spec/public/associations/many_to_many_spec.rb +197 -0
  115. data/spec/public/associations/many_to_one_spec.rb +83 -0
  116. data/spec/public/associations/many_to_one_with_boolean_cpk_spec.rb +40 -0
  117. data/spec/public/associations/many_to_one_with_custom_fk_spec.rb +49 -0
  118. data/spec/public/associations/one_to_many_spec.rb +81 -0
  119. data/spec/public/associations/one_to_one_spec.rb +176 -0
  120. data/spec/public/associations/one_to_one_with_boolean_cpk_spec.rb +46 -0
  121. data/spec/public/collection_spec.rb +69 -0
  122. data/spec/public/finalize_spec.rb +77 -0
  123. data/spec/public/model/hook_spec.rb +245 -0
  124. data/spec/public/model/property_spec.rb +91 -0
  125. data/spec/public/model/relationship_spec.rb +1040 -0
  126. data/spec/public/model_spec.rb +456 -0
  127. data/spec/public/property/binary_spec.rb +43 -0
  128. data/spec/public/property/boolean_spec.rb +21 -0
  129. data/spec/public/property/class_spec.rb +27 -0
  130. data/spec/public/property/date_spec.rb +21 -0
  131. data/spec/public/property/date_time_spec.rb +21 -0
  132. data/spec/public/property/decimal_spec.rb +23 -0
  133. data/spec/public/property/discriminator_spec.rb +134 -0
  134. data/spec/public/property/float_spec.rb +22 -0
  135. data/spec/public/property/integer_spec.rb +22 -0
  136. data/spec/public/property/object_spec.rb +117 -0
  137. data/spec/public/property/serial_spec.rb +22 -0
  138. data/spec/public/property/string_spec.rb +21 -0
  139. data/spec/public/property/text_spec.rb +62 -0
  140. data/spec/public/property/time_spec.rb +21 -0
  141. data/spec/public/property_spec.rb +333 -0
  142. data/spec/public/resource/state_spec.rb +72 -0
  143. data/spec/public/resource_spec.rb +289 -0
  144. data/spec/public/sel_spec.rb +53 -0
  145. data/spec/public/setup_spec.rb +145 -0
  146. data/spec/public/shared/association_collection_shared_spec.rb +309 -0
  147. data/spec/public/shared/collection_finder_shared_spec.rb +267 -0
  148. data/spec/public/shared/collection_shared_spec.rb +1637 -0
  149. data/spec/public/shared/finder_shared_spec.rb +1647 -0
  150. data/spec/semipublic/adapters/abstract_adapter_spec.rb +30 -0
  151. data/spec/semipublic/adapters/in_memory_adapter_spec.rb +13 -0
  152. data/spec/semipublic/associations/many_to_many_spec.rb +94 -0
  153. data/spec/semipublic/associations/many_to_one_spec.rb +63 -0
  154. data/spec/semipublic/associations/one_to_many_spec.rb +55 -0
  155. data/spec/semipublic/associations/one_to_one_spec.rb +53 -0
  156. data/spec/semipublic/associations/relationship_spec.rb +200 -0
  157. data/spec/semipublic/associations_spec.rb +177 -0
  158. data/spec/semipublic/collection_spec.rb +110 -0
  159. data/spec/semipublic/model_spec.rb +96 -0
  160. data/spec/semipublic/property/binary_spec.rb +13 -0
  161. data/spec/semipublic/property/boolean_spec.rb +47 -0
  162. data/spec/semipublic/property/class_spec.rb +33 -0
  163. data/spec/semipublic/property/date_spec.rb +43 -0
  164. data/spec/semipublic/property/date_time_spec.rb +46 -0
  165. data/spec/semipublic/property/decimal_spec.rb +83 -0
  166. data/spec/semipublic/property/discriminator_spec.rb +19 -0
  167. data/spec/semipublic/property/float_spec.rb +82 -0
  168. data/spec/semipublic/property/integer_spec.rb +82 -0
  169. data/spec/semipublic/property/lookup_spec.rb +29 -0
  170. data/spec/semipublic/property/serial_spec.rb +13 -0
  171. data/spec/semipublic/property/string_spec.rb +13 -0
  172. data/spec/semipublic/property/text_spec.rb +31 -0
  173. data/spec/semipublic/property/time_spec.rb +50 -0
  174. data/spec/semipublic/property_spec.rb +114 -0
  175. data/spec/semipublic/query/conditions/comparison_spec.rb +1502 -0
  176. data/spec/semipublic/query/conditions/operation_spec.rb +1296 -0
  177. data/spec/semipublic/query/path_spec.rb +471 -0
  178. data/spec/semipublic/query_spec.rb +3665 -0
  179. data/spec/semipublic/resource/state/clean_spec.rb +89 -0
  180. data/spec/semipublic/resource/state/deleted_spec.rb +79 -0
  181. data/spec/semipublic/resource/state/dirty_spec.rb +163 -0
  182. data/spec/semipublic/resource/state/immutable_spec.rb +107 -0
  183. data/spec/semipublic/resource/state/transient_spec.rb +163 -0
  184. data/spec/semipublic/resource/state_spec.rb +230 -0
  185. data/spec/semipublic/resource_spec.rb +23 -0
  186. data/spec/semipublic/shared/condition_shared_spec.rb +9 -0
  187. data/spec/semipublic/shared/resource_shared_spec.rb +198 -0
  188. data/spec/semipublic/shared/resource_state_shared_spec.rb +91 -0
  189. data/spec/semipublic/shared/subject_shared_spec.rb +79 -0
  190. data/spec/spec_helper.rb +34 -0
  191. data/spec/support/core_ext/hash.rb +10 -0
  192. data/spec/support/core_ext/inheritable_attributes.rb +46 -0
  193. data/spec/support/properties/huge_integer.rb +17 -0
  194. data/spec/unit/array_spec.rb +23 -0
  195. data/spec/unit/blank_spec.rb +73 -0
  196. data/spec/unit/data_mapper/ordered_set/append_spec.rb +26 -0
  197. data/spec/unit/data_mapper/ordered_set/clear_spec.rb +24 -0
  198. data/spec/unit/data_mapper/ordered_set/delete_spec.rb +28 -0
  199. data/spec/unit/data_mapper/ordered_set/each_spec.rb +19 -0
  200. data/spec/unit/data_mapper/ordered_set/empty_spec.rb +20 -0
  201. data/spec/unit/data_mapper/ordered_set/entries_spec.rb +22 -0
  202. data/spec/unit/data_mapper/ordered_set/eql_spec.rb +51 -0
  203. data/spec/unit/data_mapper/ordered_set/equal_value_spec.rb +84 -0
  204. data/spec/unit/data_mapper/ordered_set/hash_spec.rb +12 -0
  205. data/spec/unit/data_mapper/ordered_set/include_spec.rb +23 -0
  206. data/spec/unit/data_mapper/ordered_set/index_spec.rb +28 -0
  207. data/spec/unit/data_mapper/ordered_set/initialize_spec.rb +32 -0
  208. data/spec/unit/data_mapper/ordered_set/merge_spec.rb +36 -0
  209. data/spec/unit/data_mapper/ordered_set/shared/append_spec.rb +24 -0
  210. data/spec/unit/data_mapper/ordered_set/shared/clear_spec.rb +9 -0
  211. data/spec/unit/data_mapper/ordered_set/shared/delete_spec.rb +25 -0
  212. data/spec/unit/data_mapper/ordered_set/shared/each_spec.rb +17 -0
  213. data/spec/unit/data_mapper/ordered_set/shared/empty_spec.rb +9 -0
  214. data/spec/unit/data_mapper/ordered_set/shared/entries_spec.rb +9 -0
  215. data/spec/unit/data_mapper/ordered_set/shared/include_spec.rb +9 -0
  216. data/spec/unit/data_mapper/ordered_set/shared/index_spec.rb +13 -0
  217. data/spec/unit/data_mapper/ordered_set/shared/initialize_spec.rb +28 -0
  218. data/spec/unit/data_mapper/ordered_set/shared/merge_spec.rb +28 -0
  219. data/spec/unit/data_mapper/ordered_set/shared/size_spec.rb +13 -0
  220. data/spec/unit/data_mapper/ordered_set/shared/to_ary_spec.rb +11 -0
  221. data/spec/unit/data_mapper/ordered_set/size_spec.rb +27 -0
  222. data/spec/unit/data_mapper/ordered_set/to_ary_spec.rb +23 -0
  223. data/spec/unit/data_mapper/subject_set/append_spec.rb +47 -0
  224. data/spec/unit/data_mapper/subject_set/clear_spec.rb +34 -0
  225. data/spec/unit/data_mapper/subject_set/delete_spec.rb +40 -0
  226. data/spec/unit/data_mapper/subject_set/each_spec.rb +30 -0
  227. data/spec/unit/data_mapper/subject_set/empty_spec.rb +31 -0
  228. data/spec/unit/data_mapper/subject_set/entries_spec.rb +31 -0
  229. data/spec/unit/data_mapper/subject_set/get_spec.rb +34 -0
  230. data/spec/unit/data_mapper/subject_set/include_spec.rb +32 -0
  231. data/spec/unit/data_mapper/subject_set/named_spec.rb +33 -0
  232. data/spec/unit/data_mapper/subject_set/shared/append_spec.rb +18 -0
  233. data/spec/unit/data_mapper/subject_set/shared/clear_spec.rb +9 -0
  234. data/spec/unit/data_mapper/subject_set/shared/delete_spec.rb +9 -0
  235. data/spec/unit/data_mapper/subject_set/shared/each_spec.rb +9 -0
  236. data/spec/unit/data_mapper/subject_set/shared/empty_spec.rb +9 -0
  237. data/spec/unit/data_mapper/subject_set/shared/entries_spec.rb +9 -0
  238. data/spec/unit/data_mapper/subject_set/shared/get_spec.rb +9 -0
  239. data/spec/unit/data_mapper/subject_set/shared/include_spec.rb +9 -0
  240. data/spec/unit/data_mapper/subject_set/shared/named_spec.rb +9 -0
  241. data/spec/unit/data_mapper/subject_set/shared/size_spec.rb +13 -0
  242. data/spec/unit/data_mapper/subject_set/shared/to_ary_spec.rb +9 -0
  243. data/spec/unit/data_mapper/subject_set/shared/values_at_spec.rb +44 -0
  244. data/spec/unit/data_mapper/subject_set/size_spec.rb +42 -0
  245. data/spec/unit/data_mapper/subject_set/to_ary_spec.rb +34 -0
  246. data/spec/unit/data_mapper/subject_set/values_at_spec.rb +57 -0
  247. data/spec/unit/hash_spec.rb +27 -0
  248. data/spec/unit/hook_spec.rb +1216 -0
  249. data/spec/unit/inflections_spec.rb +14 -0
  250. data/spec/unit/lazy_array_spec.rb +1949 -0
  251. data/spec/unit/mash_spec.rb +289 -0
  252. data/spec/unit/module_spec.rb +70 -0
  253. data/spec/unit/object_spec.rb +38 -0
  254. data/spec/unit/try_dup_spec.rb +46 -0
  255. data/tasks/ci.rake +1 -0
  256. data/tasks/spec.rake +18 -0
  257. data/tasks/yard.rake +9 -0
  258. data/tasks/yardstick.rake +19 -0
  259. 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