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.
Files changed (254) hide show
  1. data/.autotest +29 -0
  2. data/.document +5 -0
  3. data/.gitignore +35 -0
  4. data/.yardopts +1 -0
  5. data/Gemfile +65 -0
  6. data/LICENSE +20 -0
  7. data/README.md +269 -0
  8. data/Rakefile +4 -0
  9. data/dm-core.gemspec +24 -0
  10. data/lib/dm-core.rb +292 -0
  11. data/lib/dm-core/adapters.rb +222 -0
  12. data/lib/dm-core/adapters/abstract_adapter.rb +237 -0
  13. data/lib/dm-core/adapters/in_memory_adapter.rb +113 -0
  14. data/lib/dm-core/associations/many_to_many.rb +499 -0
  15. data/lib/dm-core/associations/many_to_one.rb +290 -0
  16. data/lib/dm-core/associations/one_to_many.rb +348 -0
  17. data/lib/dm-core/associations/one_to_one.rb +86 -0
  18. data/lib/dm-core/associations/relationship.rb +663 -0
  19. data/lib/dm-core/backwards.rb +13 -0
  20. data/lib/dm-core/collection.rb +1515 -0
  21. data/lib/dm-core/core_ext/kernel.rb +23 -0
  22. data/lib/dm-core/core_ext/pathname.rb +6 -0
  23. data/lib/dm-core/core_ext/symbol.rb +10 -0
  24. data/lib/dm-core/identity_map.rb +7 -0
  25. data/lib/dm-core/model.rb +874 -0
  26. data/lib/dm-core/model/hook.rb +103 -0
  27. data/lib/dm-core/model/is.rb +32 -0
  28. data/lib/dm-core/model/property.rb +249 -0
  29. data/lib/dm-core/model/relationship.rb +378 -0
  30. data/lib/dm-core/model/scope.rb +89 -0
  31. data/lib/dm-core/property.rb +866 -0
  32. data/lib/dm-core/property/binary.rb +21 -0
  33. data/lib/dm-core/property/boolean.rb +20 -0
  34. data/lib/dm-core/property/class.rb +17 -0
  35. data/lib/dm-core/property/date.rb +10 -0
  36. data/lib/dm-core/property/date_time.rb +10 -0
  37. data/lib/dm-core/property/decimal.rb +36 -0
  38. data/lib/dm-core/property/discriminator.rb +44 -0
  39. data/lib/dm-core/property/float.rb +16 -0
  40. data/lib/dm-core/property/integer.rb +22 -0
  41. data/lib/dm-core/property/invalid_value_error.rb +22 -0
  42. data/lib/dm-core/property/lookup.rb +27 -0
  43. data/lib/dm-core/property/numeric.rb +38 -0
  44. data/lib/dm-core/property/object.rb +34 -0
  45. data/lib/dm-core/property/serial.rb +14 -0
  46. data/lib/dm-core/property/string.rb +38 -0
  47. data/lib/dm-core/property/text.rb +9 -0
  48. data/lib/dm-core/property/time.rb +10 -0
  49. data/lib/dm-core/property_set.rb +177 -0
  50. data/lib/dm-core/query.rb +1366 -0
  51. data/lib/dm-core/query/conditions/comparison.rb +911 -0
  52. data/lib/dm-core/query/conditions/operation.rb +721 -0
  53. data/lib/dm-core/query/direction.rb +36 -0
  54. data/lib/dm-core/query/operator.rb +35 -0
  55. data/lib/dm-core/query/path.rb +114 -0
  56. data/lib/dm-core/query/sort.rb +39 -0
  57. data/lib/dm-core/relationship_set.rb +72 -0
  58. data/lib/dm-core/repository.rb +226 -0
  59. data/lib/dm-core/resource.rb +1214 -0
  60. data/lib/dm-core/resource/persistence_state.rb +75 -0
  61. data/lib/dm-core/resource/persistence_state/clean.rb +40 -0
  62. data/lib/dm-core/resource/persistence_state/deleted.rb +30 -0
  63. data/lib/dm-core/resource/persistence_state/dirty.rb +96 -0
  64. data/lib/dm-core/resource/persistence_state/immutable.rb +34 -0
  65. data/lib/dm-core/resource/persistence_state/persisted.rb +29 -0
  66. data/lib/dm-core/resource/persistence_state/transient.rb +80 -0
  67. data/lib/dm-core/spec/lib/adapter_helpers.rb +64 -0
  68. data/lib/dm-core/spec/lib/collection_helpers.rb +21 -0
  69. data/lib/dm-core/spec/lib/counter_adapter.rb +38 -0
  70. data/lib/dm-core/spec/lib/pending_helpers.rb +50 -0
  71. data/lib/dm-core/spec/lib/spec_helper.rb +74 -0
  72. data/lib/dm-core/spec/setup.rb +174 -0
  73. data/lib/dm-core/spec/shared/adapter_spec.rb +341 -0
  74. data/lib/dm-core/spec/shared/public/property_spec.rb +229 -0
  75. data/lib/dm-core/spec/shared/resource_spec.rb +1232 -0
  76. data/lib/dm-core/spec/shared/sel_spec.rb +111 -0
  77. data/lib/dm-core/spec/shared/semipublic/property_spec.rb +176 -0
  78. data/lib/dm-core/spec/shared/semipublic/query/conditions/abstract_comparison_spec.rb +261 -0
  79. data/lib/dm-core/support/assertions.rb +8 -0
  80. data/lib/dm-core/support/chainable.rb +18 -0
  81. data/lib/dm-core/support/deprecate.rb +12 -0
  82. data/lib/dm-core/support/descendant_set.rb +89 -0
  83. data/lib/dm-core/support/equalizer.rb +48 -0
  84. data/lib/dm-core/support/ext/array.rb +22 -0
  85. data/lib/dm-core/support/ext/blank.rb +25 -0
  86. data/lib/dm-core/support/ext/hash.rb +67 -0
  87. data/lib/dm-core/support/ext/module.rb +47 -0
  88. data/lib/dm-core/support/ext/object.rb +57 -0
  89. data/lib/dm-core/support/ext/string.rb +24 -0
  90. data/lib/dm-core/support/ext/try_dup.rb +12 -0
  91. data/lib/dm-core/support/hook.rb +405 -0
  92. data/lib/dm-core/support/inflections.rb +60 -0
  93. data/lib/dm-core/support/inflector/inflections.rb +211 -0
  94. data/lib/dm-core/support/inflector/methods.rb +151 -0
  95. data/lib/dm-core/support/lazy_array.rb +451 -0
  96. data/lib/dm-core/support/local_object_space.rb +13 -0
  97. data/lib/dm-core/support/logger.rb +201 -0
  98. data/lib/dm-core/support/mash.rb +176 -0
  99. data/lib/dm-core/support/naming_conventions.rb +90 -0
  100. data/lib/dm-core/support/ordered_set.rb +380 -0
  101. data/lib/dm-core/support/subject.rb +33 -0
  102. data/lib/dm-core/support/subject_set.rb +250 -0
  103. data/lib/dm-core/version.rb +3 -0
  104. data/script/performance.rb +275 -0
  105. data/script/profile.rb +218 -0
  106. data/spec/lib/rspec_immediate_feedback_formatter.rb +54 -0
  107. data/spec/public/associations/many_to_many/read_multiple_join_spec.rb +68 -0
  108. data/spec/public/associations/many_to_many_spec.rb +197 -0
  109. data/spec/public/associations/many_to_one_spec.rb +83 -0
  110. data/spec/public/associations/many_to_one_with_boolean_cpk_spec.rb +40 -0
  111. data/spec/public/associations/many_to_one_with_custom_fk_spec.rb +49 -0
  112. data/spec/public/associations/one_to_many_spec.rb +81 -0
  113. data/spec/public/associations/one_to_one_spec.rb +176 -0
  114. data/spec/public/associations/one_to_one_with_boolean_cpk_spec.rb +46 -0
  115. data/spec/public/collection_spec.rb +69 -0
  116. data/spec/public/finalize_spec.rb +76 -0
  117. data/spec/public/model/hook_spec.rb +246 -0
  118. data/spec/public/model/property_spec.rb +88 -0
  119. data/spec/public/model/relationship_spec.rb +1040 -0
  120. data/spec/public/model_spec.rb +462 -0
  121. data/spec/public/property/binary_spec.rb +41 -0
  122. data/spec/public/property/boolean_spec.rb +22 -0
  123. data/spec/public/property/class_spec.rb +28 -0
  124. data/spec/public/property/date_spec.rb +22 -0
  125. data/spec/public/property/date_time_spec.rb +22 -0
  126. data/spec/public/property/decimal_spec.rb +23 -0
  127. data/spec/public/property/discriminator_spec.rb +135 -0
  128. data/spec/public/property/float_spec.rb +22 -0
  129. data/spec/public/property/integer_spec.rb +22 -0
  130. data/spec/public/property/object_spec.rb +107 -0
  131. data/spec/public/property/serial_spec.rb +22 -0
  132. data/spec/public/property/string_spec.rb +22 -0
  133. data/spec/public/property/text_spec.rb +63 -0
  134. data/spec/public/property/time_spec.rb +22 -0
  135. data/spec/public/property_spec.rb +341 -0
  136. data/spec/public/resource_spec.rb +288 -0
  137. data/spec/public/sel_spec.rb +53 -0
  138. data/spec/public/setup_spec.rb +145 -0
  139. data/spec/public/shared/association_collection_shared_spec.rb +309 -0
  140. data/spec/public/shared/collection_finder_shared_spec.rb +267 -0
  141. data/spec/public/shared/collection_shared_spec.rb +1667 -0
  142. data/spec/public/shared/finder_shared_spec.rb +1629 -0
  143. data/spec/rcov.opts +6 -0
  144. data/spec/semipublic/adapters/abstract_adapter_spec.rb +30 -0
  145. data/spec/semipublic/adapters/in_memory_adapter_spec.rb +13 -0
  146. data/spec/semipublic/associations/many_to_many_spec.rb +94 -0
  147. data/spec/semipublic/associations/many_to_one_spec.rb +63 -0
  148. data/spec/semipublic/associations/one_to_many_spec.rb +55 -0
  149. data/spec/semipublic/associations/one_to_one_spec.rb +53 -0
  150. data/spec/semipublic/associations/relationship_spec.rb +200 -0
  151. data/spec/semipublic/associations_spec.rb +177 -0
  152. data/spec/semipublic/collection_spec.rb +110 -0
  153. data/spec/semipublic/model_spec.rb +96 -0
  154. data/spec/semipublic/property/binary_spec.rb +13 -0
  155. data/spec/semipublic/property/boolean_spec.rb +47 -0
  156. data/spec/semipublic/property/class_spec.rb +33 -0
  157. data/spec/semipublic/property/date_spec.rb +43 -0
  158. data/spec/semipublic/property/date_time_spec.rb +46 -0
  159. data/spec/semipublic/property/decimal_spec.rb +83 -0
  160. data/spec/semipublic/property/discriminator_spec.rb +19 -0
  161. data/spec/semipublic/property/float_spec.rb +82 -0
  162. data/spec/semipublic/property/integer_spec.rb +82 -0
  163. data/spec/semipublic/property/lookup_spec.rb +29 -0
  164. data/spec/semipublic/property/serial_spec.rb +13 -0
  165. data/spec/semipublic/property/string_spec.rb +13 -0
  166. data/spec/semipublic/property/text_spec.rb +31 -0
  167. data/spec/semipublic/property/time_spec.rb +50 -0
  168. data/spec/semipublic/property_spec.rb +114 -0
  169. data/spec/semipublic/query/conditions/comparison_spec.rb +1501 -0
  170. data/spec/semipublic/query/conditions/operation_spec.rb +1294 -0
  171. data/spec/semipublic/query/path_spec.rb +471 -0
  172. data/spec/semipublic/query_spec.rb +3682 -0
  173. data/spec/semipublic/resource/state/clean_spec.rb +88 -0
  174. data/spec/semipublic/resource/state/deleted_spec.rb +78 -0
  175. data/spec/semipublic/resource/state/dirty_spec.rb +162 -0
  176. data/spec/semipublic/resource/state/immutable_spec.rb +105 -0
  177. data/spec/semipublic/resource/state/transient_spec.rb +162 -0
  178. data/spec/semipublic/resource/state_spec.rb +230 -0
  179. data/spec/semipublic/resource_spec.rb +23 -0
  180. data/spec/semipublic/shared/condition_shared_spec.rb +9 -0
  181. data/spec/semipublic/shared/resource_shared_spec.rb +199 -0
  182. data/spec/semipublic/shared/resource_state_shared_spec.rb +79 -0
  183. data/spec/semipublic/shared/subject_shared_spec.rb +79 -0
  184. data/spec/spec.opts +5 -0
  185. data/spec/spec_helper.rb +38 -0
  186. data/spec/support/core_ext/hash.rb +10 -0
  187. data/spec/support/core_ext/inheritable_attributes.rb +46 -0
  188. data/spec/support/properties/huge_integer.rb +17 -0
  189. data/spec/unit/array_spec.rb +23 -0
  190. data/spec/unit/blank_spec.rb +73 -0
  191. data/spec/unit/data_mapper/ordered_set/append_spec.rb +26 -0
  192. data/spec/unit/data_mapper/ordered_set/clear_spec.rb +24 -0
  193. data/spec/unit/data_mapper/ordered_set/delete_spec.rb +28 -0
  194. data/spec/unit/data_mapper/ordered_set/each_spec.rb +19 -0
  195. data/spec/unit/data_mapper/ordered_set/empty_spec.rb +20 -0
  196. data/spec/unit/data_mapper/ordered_set/entries_spec.rb +22 -0
  197. data/spec/unit/data_mapper/ordered_set/eql_spec.rb +51 -0
  198. data/spec/unit/data_mapper/ordered_set/equal_value_spec.rb +84 -0
  199. data/spec/unit/data_mapper/ordered_set/hash_spec.rb +12 -0
  200. data/spec/unit/data_mapper/ordered_set/include_spec.rb +23 -0
  201. data/spec/unit/data_mapper/ordered_set/index_spec.rb +28 -0
  202. data/spec/unit/data_mapper/ordered_set/initialize_spec.rb +32 -0
  203. data/spec/unit/data_mapper/ordered_set/merge_spec.rb +36 -0
  204. data/spec/unit/data_mapper/ordered_set/shared/append_spec.rb +24 -0
  205. data/spec/unit/data_mapper/ordered_set/shared/clear_spec.rb +9 -0
  206. data/spec/unit/data_mapper/ordered_set/shared/delete_spec.rb +25 -0
  207. data/spec/unit/data_mapper/ordered_set/shared/each_spec.rb +17 -0
  208. data/spec/unit/data_mapper/ordered_set/shared/empty_spec.rb +9 -0
  209. data/spec/unit/data_mapper/ordered_set/shared/entries_spec.rb +9 -0
  210. data/spec/unit/data_mapper/ordered_set/shared/include_spec.rb +9 -0
  211. data/spec/unit/data_mapper/ordered_set/shared/index_spec.rb +13 -0
  212. data/spec/unit/data_mapper/ordered_set/shared/initialize_spec.rb +28 -0
  213. data/spec/unit/data_mapper/ordered_set/shared/merge_spec.rb +28 -0
  214. data/spec/unit/data_mapper/ordered_set/shared/size_spec.rb +13 -0
  215. data/spec/unit/data_mapper/ordered_set/shared/to_ary_spec.rb +11 -0
  216. data/spec/unit/data_mapper/ordered_set/size_spec.rb +27 -0
  217. data/spec/unit/data_mapper/ordered_set/to_ary_spec.rb +23 -0
  218. data/spec/unit/data_mapper/subject_set/append_spec.rb +47 -0
  219. data/spec/unit/data_mapper/subject_set/clear_spec.rb +34 -0
  220. data/spec/unit/data_mapper/subject_set/delete_spec.rb +40 -0
  221. data/spec/unit/data_mapper/subject_set/each_spec.rb +30 -0
  222. data/spec/unit/data_mapper/subject_set/empty_spec.rb +31 -0
  223. data/spec/unit/data_mapper/subject_set/entries_spec.rb +31 -0
  224. data/spec/unit/data_mapper/subject_set/get_spec.rb +34 -0
  225. data/spec/unit/data_mapper/subject_set/include_spec.rb +32 -0
  226. data/spec/unit/data_mapper/subject_set/named_spec.rb +33 -0
  227. data/spec/unit/data_mapper/subject_set/shared/append_spec.rb +18 -0
  228. data/spec/unit/data_mapper/subject_set/shared/clear_spec.rb +9 -0
  229. data/spec/unit/data_mapper/subject_set/shared/delete_spec.rb +9 -0
  230. data/spec/unit/data_mapper/subject_set/shared/each_spec.rb +9 -0
  231. data/spec/unit/data_mapper/subject_set/shared/empty_spec.rb +9 -0
  232. data/spec/unit/data_mapper/subject_set/shared/entries_spec.rb +9 -0
  233. data/spec/unit/data_mapper/subject_set/shared/get_spec.rb +9 -0
  234. data/spec/unit/data_mapper/subject_set/shared/include_spec.rb +9 -0
  235. data/spec/unit/data_mapper/subject_set/shared/named_spec.rb +9 -0
  236. data/spec/unit/data_mapper/subject_set/shared/size_spec.rb +13 -0
  237. data/spec/unit/data_mapper/subject_set/shared/to_ary_spec.rb +9 -0
  238. data/spec/unit/data_mapper/subject_set/shared/values_at_spec.rb +44 -0
  239. data/spec/unit/data_mapper/subject_set/size_spec.rb +42 -0
  240. data/spec/unit/data_mapper/subject_set/to_ary_spec.rb +34 -0
  241. data/spec/unit/data_mapper/subject_set/values_at_spec.rb +57 -0
  242. data/spec/unit/hash_spec.rb +28 -0
  243. data/spec/unit/hook_spec.rb +1235 -0
  244. data/spec/unit/inflections_spec.rb +16 -0
  245. data/spec/unit/lazy_array_spec.rb +1949 -0
  246. data/spec/unit/mash_spec.rb +312 -0
  247. data/spec/unit/module_spec.rb +71 -0
  248. data/spec/unit/object_spec.rb +38 -0
  249. data/spec/unit/try_dup_spec.rb +46 -0
  250. data/tasks/ci.rake +1 -0
  251. data/tasks/spec.rake +38 -0
  252. data/tasks/yard.rake +9 -0
  253. data/tasks/yardstick.rake +19 -0
  254. metadata +365 -0
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+ require 'dm-core/support/ordered_set'
3
+ require 'unit/data_mapper/ordered_set/shared/each_spec'
4
+
5
+ describe 'DataMapper::OrderedSet' do
6
+ subject { DataMapper::OrderedSet.new }
7
+
8
+ it_should_behave_like 'DataMapper::OrderedSet'
9
+ end
10
+
11
+ describe 'DataMapper::OrderedSet#each' do
12
+ subject { set.each { |entry| yields << entry } }
13
+
14
+ let(:set) { DataMapper::OrderedSet.new([ entry ]) }
15
+ let(:entry) { 1 }
16
+ let(:yields) { [] }
17
+
18
+ it_should_behave_like 'DataMapper::OrderedSet#each'
19
+ end
@@ -0,0 +1,20 @@
1
+ require 'spec_helper'
2
+ require 'dm-core/support/ordered_set'
3
+ require 'unit/data_mapper/ordered_set/shared/empty_spec'
4
+
5
+ describe 'DataMapper::OrderedSet#empty?' do
6
+ subject { set.empty? }
7
+
8
+ context 'with no entries in it' do
9
+ let(:set) { DataMapper::OrderedSet.new }
10
+
11
+ it_should_behave_like 'DataMapper::OrderedSet#empty? with no entries in it'
12
+ end
13
+
14
+ context 'with entries in it' do
15
+ let(:set) { DataMapper::OrderedSet.new([ entry ]) }
16
+ let(:entry) { 1 }
17
+
18
+ it_should_behave_like 'DataMapper::OrderedSet#empty? with entries in it'
19
+ end
20
+ end
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+ require 'dm-core/support/ordered_set'
3
+ require 'unit/data_mapper/ordered_set/shared/entries_spec'
4
+
5
+ describe 'DataMapper::OrderedSet#entries' do
6
+ subject { ordered_set.entries }
7
+
8
+ let(:ordered_set) { set }
9
+
10
+ context 'with no entries' do
11
+ let(:set) { DataMapper::OrderedSet.new }
12
+
13
+ it_should_behave_like 'DataMapper::OrderedSet#entries with no entries'
14
+ end
15
+
16
+ context 'with entries' do
17
+ let(:set) { DataMapper::OrderedSet.new([ entry ]) }
18
+ let(:entry) { 1 }
19
+
20
+ it_should_behave_like 'DataMapper::OrderedSet#entries with entries'
21
+ end
22
+ end
@@ -0,0 +1,51 @@
1
+ require 'spec_helper'
2
+ require 'dm-core/support/ordered_set'
3
+
4
+ describe 'DataMapper::OrderedSet#eql?' do
5
+ subject { ordered_set.eql?(other) }
6
+
7
+ let(:original_entry) { 1 }
8
+ let(:ordered_set) { DataMapper::OrderedSet.new([ original_entry ]) }
9
+
10
+ context 'with the same ordered_set' do
11
+ let(:other) { ordered_set }
12
+
13
+ it { should be(true) }
14
+
15
+ it 'is symmetric' do
16
+ should == other.eql?(ordered_set)
17
+ end
18
+ end
19
+
20
+ context 'with equivalent ordered_set' do
21
+ let(:other) { ordered_set.dup }
22
+
23
+ it { should be(true) }
24
+
25
+ it 'is symmetric' do
26
+ should == other.eql?(ordered_set)
27
+ end
28
+ end
29
+
30
+ context 'with both containing no ordered_set' do
31
+ let(:ordered_set) { DataMapper::OrderedSet.new }
32
+ let(:other) { DataMapper::OrderedSet.new }
33
+
34
+ it { should be(true) }
35
+
36
+ it 'is symmetric' do
37
+ should == other.eql?(ordered_set)
38
+ end
39
+ end
40
+
41
+ context 'with different ordered_set' do
42
+ let(:different_entry) { 2 }
43
+ let(:other) { DataMapper::OrderedSet.new([ different_entry ]) }
44
+
45
+ it { should be(false) }
46
+
47
+ it 'is symmetric' do
48
+ should == other.eql?(ordered_set)
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,84 @@
1
+ require 'spec_helper'
2
+ require 'dm-core/support/ordered_set'
3
+
4
+ module DataMapper::Specs
5
+
6
+ # Used to test duck typing behavior
7
+ class OrderedSetDuck
8
+ attr_reader :entries
9
+
10
+ def initialize(columns = [])
11
+ @entries = DataMapper::OrderedSet.new
12
+ end
13
+ end
14
+ end
15
+
16
+ describe 'DataMapper::OrderedSet#==' do
17
+ subject { ordered_set == other }
18
+
19
+ let(:original_entry) { 1 }
20
+ let(:ordered_set) { DataMapper::OrderedSet.new([ original_entry ]) }
21
+
22
+ context 'with the same ordered_set' do
23
+ let(:other) { ordered_set }
24
+
25
+ it { should be(true) }
26
+
27
+ it 'is symmetric' do
28
+ should == (other == ordered_set)
29
+ end
30
+ end
31
+
32
+ context 'with equivalent ordered_set' do
33
+ let(:other) { ordered_set.dup }
34
+
35
+ it { should be(true) }
36
+
37
+ it 'is symmetric' do
38
+ should == (other == ordered_set)
39
+ end
40
+ end
41
+
42
+ # TODO This probably needs more thought
43
+ context 'with a class that quacks like OrderedSet and is equivalent otherwise' do
44
+ let(:other) { DataMapper::Specs::OrderedSetDuck.new([ original_entry ]) }
45
+
46
+ it { should be(false) }
47
+
48
+ it 'is symmetric' do
49
+ should == (other == ordered_set)
50
+ end
51
+ end
52
+
53
+ context 'with a subclass that is equivalent otherwise' do
54
+ let(:other) { Class.new(DataMapper::OrderedSet).new([ original_entry ]) }
55
+
56
+ it { should be(true) }
57
+
58
+ it 'is symmetric' do
59
+ should == (other == ordered_set)
60
+ end
61
+ end
62
+
63
+ context 'with both containing no ordered_set' do
64
+ let(:ordered_set) { DataMapper::OrderedSet.new }
65
+ let(:other) { DataMapper::OrderedSet.new }
66
+
67
+ it { should be(true) }
68
+
69
+ it 'is symmetric' do
70
+ should == (other == ordered_set)
71
+ end
72
+ end
73
+
74
+ context 'with different ordered_set' do
75
+ let(:different_entry) { 2 }
76
+ let(:other) { DataMapper::OrderedSet.new([ different_entry ]) }
77
+
78
+ it { should be(false) }
79
+
80
+ it 'is symmetric' do
81
+ should == (other == ordered_set)
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,12 @@
1
+ require 'spec_helper'
2
+ require 'dm-core/support/ordered_set'
3
+
4
+ describe 'DataMapper::OrderedSet#hash' do
5
+ subject { ordered_set.hash }
6
+
7
+ let(:entry) { 1 }
8
+ let(:ordered_set) { DataMapper::OrderedSet.new([ entry ]) }
9
+
10
+ it { should be_kind_of(Integer) }
11
+ it { should == ordered_set.class.hash ^ ordered_set.entries.hash }
12
+ end
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+ require 'dm-core/support/ordered_set'
3
+ require 'unit/data_mapper/ordered_set/shared/include_spec'
4
+
5
+ describe 'DataMapper::OrderedSet#include?' do
6
+ subject { ordered_set.include?(entry) }
7
+
8
+ let(:ordered_set) { set }
9
+
10
+ context 'when the entry is present' do
11
+ let(:set) { DataMapper::OrderedSet.new([ entry ]) }
12
+ let(:entry) { 1 }
13
+
14
+ it_should_behave_like 'DataMapper::OrderedSet#include? when the entry is present'
15
+ end
16
+
17
+ context 'when the entry is not present' do
18
+ let(:set) { DataMapper::OrderedSet.new }
19
+ let(:entry) { 1 }
20
+
21
+ it_should_behave_like 'DataMapper::OrderedSet#include? when the entry is not present'
22
+ end
23
+ end
@@ -0,0 +1,28 @@
1
+ require 'spec_helper'
2
+ require 'dm-core/support/ordered_set'
3
+ require 'unit/data_mapper/ordered_set/shared/index_spec'
4
+
5
+ describe 'DataMapper::OrderedSet#index' do
6
+ subject { ordered_set.index(entry) }
7
+
8
+ context 'when the entry is not present' do
9
+ let(:ordered_set) { DataMapper::OrderedSet.new }
10
+ let(:entry) { 1 }
11
+
12
+ it_should_behave_like 'DataMapper::OrderedSet#index when the entry is not present'
13
+ end
14
+
15
+ context 'when 1 entry is present' do
16
+ let(:ordered_set) { DataMapper::OrderedSet.new([ entry ]) }
17
+ let(:entry) { 1 }
18
+
19
+ it_should_behave_like 'DataMapper::OrderedSet#index when 1 entry is present'
20
+ end
21
+
22
+ context 'when 2 entries are present' do
23
+ let(:ordered_set) { DataMapper::OrderedSet.new([ 2, entry ]) }
24
+ let(:entry) { 1 }
25
+
26
+ it_should_behave_like 'DataMapper::OrderedSet#index when 2 entries are present'
27
+ end
28
+ end
@@ -0,0 +1,32 @@
1
+ require 'spec_helper'
2
+ require 'dm-core/support/ordered_set'
3
+ require 'unit/data_mapper/ordered_set/shared/initialize_spec'
4
+
5
+ describe 'DataMapper::OrderedSet#initialize' do
6
+
7
+ context 'when no entries are given' do
8
+ subject { DataMapper::OrderedSet.new }
9
+
10
+ it_should_behave_like 'DataMapper::OrderedSet#initialize when no entries are given'
11
+ end
12
+
13
+ context 'when entries are given' do
14
+ subject { DataMapper::OrderedSet.new(entries) }
15
+
16
+ context 'and they do not contain duplicates' do
17
+ let(:entries) { [ entry1, entry2 ] }
18
+ let(:entry1) { 1 }
19
+ let(:entry2) { 2 }
20
+
21
+ it_should_behave_like 'DataMapper::OrderedSet#initialize when entries are given and they do not contain duplicates'
22
+ end
23
+
24
+ context 'and they contain duplicates' do
25
+ let(:entries) { [ entry1, entry2 ] }
26
+ let(:entry1) { 1 }
27
+ let(:entry2) { 1 }
28
+
29
+ it_should_behave_like 'DataMapper::OrderedSet#initialize when entries are given and they contain duplicates'
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+ require 'dm-core/support/ordered_set'
3
+ require 'unit/data_mapper/ordered_set/shared/merge_spec'
4
+
5
+ describe 'DataMapper::OrderedSet#merge' do
6
+
7
+ context 'when merging two empty sets' do
8
+ subject { ordered_set.merge([]) }
9
+
10
+ let(:ordered_set) { set }
11
+ let(:set) { DataMapper::OrderedSet.new }
12
+
13
+ it_should_behave_like 'DataMapper::OrderedSet#merge when merging two empty sets'
14
+ end
15
+
16
+ context 'when merging a set with already present entries' do
17
+ subject { ordered_set.merge([ entry ]) }
18
+
19
+ let(:ordered_set) { set }
20
+ let(:set) { DataMapper::OrderedSet.new([ entry ]) }
21
+ let(:entry) { 1 }
22
+
23
+ it_should_behave_like 'DataMapper::OrderedSet#merge when merging a set with already present entries'
24
+ end
25
+
26
+ context 'when merging a set with not yet present entries' do
27
+ subject { ordered_set.merge([ entry2 ]) }
28
+
29
+ let(:ordered_set) { set }
30
+ let(:set) { DataMapper::OrderedSet.new([ entry1 ]) }
31
+ let(:entry1) { 1 }
32
+ let(:entry2) { 2 }
33
+
34
+ it_should_behave_like 'DataMapper::OrderedSet#merge when merging a set with not yet present entries'
35
+ end
36
+ end
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+
3
+ shared_examples_for 'DataMapper::OrderedSet#<< when appending a not yet included entry' do
4
+ its(:size ) { should == 2 }
5
+ its(:entries) { should include(entry1) }
6
+ its(:entries) { should include(entry2) }
7
+
8
+ it 'should not alter the position of the existing entry' do
9
+ subject.entries.index(entry1).should == @old_index
10
+ end
11
+
12
+ it 'should append columns at the end of the set' do
13
+ subject.entries.index(entry2).should == @old_index + 1
14
+ end
15
+ end
16
+
17
+ shared_examples_for 'DataMapper::OrderedSet#<< when updating an already included entry' do
18
+ its(:size ) { should == 1 }
19
+ its(:entries) { should include(entry2) }
20
+
21
+ it 'should not alter the position of the existing entry' do
22
+ subject.entries.index(entry2).should == @old_index
23
+ end
24
+ end
@@ -0,0 +1,9 @@
1
+ require 'spec_helper'
2
+
3
+ shared_examples_for 'DataMapper::OrderedSet#clear when no entries are present' do
4
+ it { should be_empty }
5
+ end
6
+
7
+ shared_examples_for 'DataMapper::OrderedSet#clear when entries are present' do
8
+ it { should be_empty }
9
+ end
@@ -0,0 +1,25 @@
1
+ require 'spec_helper'
2
+
3
+ shared_examples_for 'DataMapper::OrderedSet#delete when deleting an already included entry' do
4
+ its(:entries) { should_not include(entry1) }
5
+ its(:entries) { should include(entry2) }
6
+ its(:entries) { should include(entry3) }
7
+
8
+ it 'should correct the index' do
9
+ ordered_set.index(entry1).should be_nil
10
+ ordered_set.index(entry2).should == 0
11
+ ordered_set.index(entry3).should == 1
12
+ end
13
+ end
14
+
15
+ shared_examples_for 'DataMapper::OrderedSet#delete when deleting a not yet included entry' do
16
+ its(:entries) { should include(entry1) }
17
+ its(:entries) { should include(entry2) }
18
+ its(:entries) { should include(entry3) }
19
+
20
+ it 'should not alter the index' do
21
+ ordered_set.index(entry1).should == 0
22
+ ordered_set.index(entry2).should == 1
23
+ ordered_set.index(entry3).should == 2
24
+ end
25
+ end
@@ -0,0 +1,17 @@
1
+ require 'spec_helper'
2
+
3
+ shared_examples_for 'DataMapper::OrderedSet' do
4
+ it { should be_kind_of(Enumerable) }
5
+
6
+ it 'case matches Enumerable' do
7
+ (Enumerable === subject).should be(true)
8
+ end
9
+ end
10
+
11
+ shared_examples_for 'DataMapper::OrderedSet#each' do
12
+ it { should equal(set) }
13
+
14
+ it 'yields each column' do
15
+ expect { subject }.to change { yields.dup }.from([]).to([ entry ])
16
+ end
17
+ end
@@ -0,0 +1,9 @@
1
+ require 'spec_helper'
2
+
3
+ shared_examples_for 'DataMapper::OrderedSet#empty? with no entries in it' do
4
+ it { should be(true) }
5
+ end
6
+
7
+ shared_examples_for 'DataMapper::OrderedSet#empty? with entries in it' do
8
+ it { should be(false) }
9
+ end
@@ -0,0 +1,9 @@
1
+ require 'spec_helper'
2
+
3
+ shared_examples_for 'DataMapper::OrderedSet#entries with no entries' do
4
+ it { should be_empty }
5
+ end
6
+
7
+ shared_examples_for 'DataMapper::OrderedSet#entries with entries' do
8
+ it { should include(entry) }
9
+ end