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,46 @@
1
+ class Class
2
+ def class_inheritable_reader(*ivars)
3
+ instance_reader = ivars.pop[:reader] if ivars.last.is_a?(Hash)
4
+
5
+ ivars.each do |ivar|
6
+ self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
7
+ def self.#{ivar}
8
+ return @#{ivar} if defined?(@#{ivar})
9
+ return nil if self.object_id == #{self.object_id}
10
+ ivar = superclass.#{ivar}
11
+ return nil if ivar.nil?
12
+ @#{ivar} = DataMapper::Ext.try_dup(ivar)
13
+ end
14
+ RUBY
15
+
16
+ unless instance_reader == false
17
+ self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
18
+ def #{ivar}
19
+ self.class.#{ivar}
20
+ end
21
+ RUBY
22
+ end
23
+ end
24
+ end
25
+
26
+ def class_inheritable_writer(*ivars)
27
+ instance_writer = ivars.pop[:instance_writer] if ivars.last.is_a?(Hash)
28
+ ivars.each do |ivar|
29
+ self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
30
+ def self.#{ivar}=(obj)
31
+ @#{ivar} = obj
32
+ end
33
+ RUBY
34
+ unless instance_writer == false
35
+ self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
36
+ def #{ivar}=(obj) self.class.#{ivar} = obj end
37
+ RUBY
38
+ end
39
+ end
40
+ end
41
+
42
+ def class_inheritable_accessor(*syms)
43
+ class_inheritable_reader(*syms)
44
+ class_inheritable_writer(*syms)
45
+ end
46
+ end
@@ -0,0 +1,17 @@
1
+ module DataMapper
2
+ class Property
3
+ class HugeInteger < DataMapper::Property::String
4
+ def load(value)
5
+ value&.to_i
6
+ end
7
+
8
+ def dump(value)
9
+ value&.to_s
10
+ end
11
+
12
+ def typecast(value)
13
+ load(value)
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,23 @@
1
+ require_relative '../spec_helper'
2
+ require 'dm-core/support/ext/array'
3
+ require 'dm-core/support/mash'
4
+
5
+ describe DataMapper::Ext::Array do
6
+ before :all do
7
+ @array = [ [ :a, [ 1 ] ], [ :b, [ 2 ] ], [ :c, [ 3 ] ] ].freeze
8
+ end
9
+
10
+ describe '.to_mash' do
11
+ before :all do
12
+ @return = DataMapper::Ext::Array.to_mash(@array)
13
+ end
14
+
15
+ it 'returns a Mash' do
16
+ expect(@return).to be_kind_of(DataMapper::Mash)
17
+ end
18
+
19
+ it 'returns expected value' do
20
+ expect(@return).to eq({'a' => [1], 'b' => [2], 'c' => [3]})
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,73 @@
1
+ require_relative '../spec_helper'
2
+ require 'dm-core/support/ext/blank'
3
+
4
+ describe 'DataMapper::Ext.blank?', Object do
5
+ it 'is blank if it is nil' do
6
+ object = Object.new
7
+ class << object
8
+ def nil?; true end
9
+ end
10
+ expect(DataMapper::Ext.blank?(object)).to eq true
11
+ end
12
+
13
+ it 'is blank if it is empty' do
14
+ expect(DataMapper::Ext.blank?({})).to eq true
15
+ expect(DataMapper::Ext.blank?([])).to eq true
16
+ end
17
+
18
+ it 'is not blank if not nil or empty' do
19
+ expect(DataMapper::Ext.blank?(Object.new)).to eq false
20
+ expect(DataMapper::Ext.blank?([nil])).to eq false
21
+ expect(DataMapper::Ext.blank?({nil => 0})).to eq false
22
+ end
23
+ end
24
+
25
+ describe 'DataMapper::Ext.blank?', Numeric do
26
+ it 'is never be blank' do
27
+ expect(DataMapper::Ext.blank?(1)).to eq false
28
+ end
29
+ end
30
+
31
+ describe 'DataMapper::Ext.blank?', NilClass do
32
+ it 'is always blank' do
33
+ expect(DataMapper::Ext.blank?(nil)).to eq true
34
+ end
35
+ end
36
+
37
+ describe 'DataMapper::Ext.blank?', TrueClass do
38
+ it 'is never blank' do
39
+ expect(DataMapper::Ext.blank?(true)).to eq false
40
+ end
41
+ end
42
+
43
+ describe 'DataMapper::Ext.blank?', FalseClass do
44
+ it 'is always blank' do
45
+ expect(DataMapper::Ext.blank?(false)).to eq true
46
+ end
47
+ end
48
+
49
+ describe 'DataMapper::Ext.blank?', String do
50
+ it 'is blank if empty' do
51
+ expect(DataMapper::Ext.blank?('')).to eq true
52
+ end
53
+
54
+ it 'is blank if it only contains whitespace' do
55
+ expect(DataMapper::Ext.blank?(' ')).to eq true
56
+ expect(DataMapper::Ext.blank?(" \r \n \t ")).to eq true
57
+ end
58
+
59
+ it 'is not blank if it contains non-whitespace' do
60
+ expect(DataMapper::Ext.blank?(' a ')).to eq false
61
+ end
62
+ end
63
+
64
+ describe 'DataMapper::Ext.blank?', 'object with #blank?' do
65
+ subject { DataMapper::Ext.blank?(object) }
66
+
67
+ let(:return_value) { double('Return Value') }
68
+ let(:object) { double('Object', blank?: return_value) }
69
+
70
+ it 'returns the object#blank? result if supported' do
71
+ is_expected.to equal(return_value)
72
+ end
73
+ end
@@ -0,0 +1,26 @@
1
+ require_relative '../../../spec_helper'
2
+ require 'dm-core/support/ordered_set'
3
+ require_relative 'shared/append_spec'
4
+
5
+ describe 'DataMapper::OrderedSet#<<' do
6
+ subject { set << entry2 }
7
+
8
+ let(:set) { DataMapper::OrderedSet.new([ entry1 ]) }
9
+ let(:entry1) { Object.new }
10
+
11
+ before do
12
+ @old_index = set.index(entry1)
13
+ end
14
+
15
+ context 'when appending a not yet included entry' do
16
+ let(:entry2) { Object.new }
17
+
18
+ it_behaves_like 'DataMapper::OrderedSet#<< when appending a not yet included entry'
19
+ end
20
+
21
+ context 'when updating an already included entry' do
22
+ let(:entry2) { entry1 }
23
+
24
+ it_behaves_like 'DataMapper::OrderedSet#<< when updating an already included entry'
25
+ end
26
+ end
@@ -0,0 +1,24 @@
1
+ require_relative '../../../spec_helper'
2
+ require 'dm-core/support/ordered_set'
3
+ require_relative 'shared/clear_spec'
4
+
5
+ describe 'DataMapper::OrderedSet#clear' do
6
+ subject { ordered_set.clear }
7
+
8
+ let(:ordered_set) { DataMapper::OrderedSet.new(entries) }
9
+
10
+ let(:entry1) { 1 }
11
+ let(:entry2) { 2 }
12
+
13
+ context 'when no entries are present' do
14
+ let(:entries) { [] }
15
+
16
+ it_behaves_like 'DataMapper::OrderedSet#clear when no entries are present'
17
+ end
18
+
19
+ context 'when entries are present' do
20
+ let(:entries) { [ entry1, entry2 ] }
21
+
22
+ it_behaves_like 'DataMapper::OrderedSet#clear when entries are present'
23
+ end
24
+ end
@@ -0,0 +1,28 @@
1
+ require_relative '../../../spec_helper'
2
+ require 'dm-core/support/ordered_set'
3
+ require_relative 'shared/delete_spec'
4
+
5
+ describe 'DataMapper::OrderedSet#delete' do
6
+ subject { ordered_set }
7
+
8
+ let(:ordered_set) { DataMapper::OrderedSet.new([ entry1, entry2, entry3 ]) }
9
+ let(:entry1) { 1 }
10
+ let(:entry2) { 2 }
11
+ let(:entry3) { 3 }
12
+
13
+ before do
14
+ ordered_set.delete(entry)
15
+ end
16
+
17
+ context 'when deleting an already included entry' do
18
+ let(:entry) { entry1 }
19
+
20
+ it_behaves_like 'DataMapper::OrderedSet#delete when deleting an already included entry'
21
+ end
22
+
23
+ context 'when deleting a not yet included entry' do
24
+ let(:entry) { 4 }
25
+
26
+ it_behaves_like 'DataMapper::OrderedSet#delete when deleting a not yet included entry'
27
+ end
28
+ end
@@ -0,0 +1,19 @@
1
+ require_relative '../../../spec_helper'
2
+ require 'dm-core/support/ordered_set'
3
+ require_relative 'shared/each_spec'
4
+
5
+ describe 'DataMapper::OrderedSet' do
6
+ subject { DataMapper::OrderedSet.new }
7
+
8
+ it_behaves_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_behaves_like 'DataMapper::OrderedSet#each'
19
+ end
@@ -0,0 +1,20 @@
1
+ require_relative '../../../spec_helper'
2
+ require 'dm-core/support/ordered_set'
3
+ require_relative '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_behaves_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_behaves_like 'DataMapper::OrderedSet#empty? with entries in it'
19
+ end
20
+ end
@@ -0,0 +1,22 @@
1
+ require_relative '../../../spec_helper'
2
+ require 'dm-core/support/ordered_set'
3
+ require_relative '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_behaves_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_behaves_like 'DataMapper::OrderedSet#entries with entries'
21
+ end
22
+ end
@@ -0,0 +1,51 @@
1
+ require_relative '../../../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 { is_expected.to be(true) }
14
+
15
+ it 'is symmetric' do
16
+ is_expected.to eq 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 { is_expected.to be(true) }
24
+
25
+ it 'is symmetric' do
26
+ is_expected.to eq 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 { is_expected.to be(true) }
35
+
36
+ it 'is symmetric' do
37
+ is_expected.to eq 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 { is_expected.to be(false) }
46
+
47
+ it 'is symmetric' do
48
+ is_expected.to eq other.eql?(ordered_set)
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,84 @@
1
+ require_relative '../../../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 { is_expected.to be(true) }
26
+
27
+ it 'is symmetric' do
28
+ is_expected.to eq(other == ordered_set)
29
+ end
30
+ end
31
+
32
+ context 'with equivalent ordered_set' do
33
+ let(:other) { ordered_set.dup }
34
+
35
+ it { is_expected.to be(true) }
36
+
37
+ it 'is symmetric' do
38
+ is_expected.to eq(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 { is_expected.to be(false) }
47
+
48
+ it 'is symmetric' do
49
+ is_expected.to eq(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 { is_expected.to be(true) }
57
+
58
+ it 'is symmetric' do
59
+ is_expected.to eq(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 { is_expected.to be(true) }
68
+
69
+ it 'is symmetric' do
70
+ is_expected.to eq(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 { is_expected.to be(false) }
79
+
80
+ it 'is symmetric' do
81
+ is_expected.to eq(other == ordered_set)
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,12 @@
1
+ require_relative '../../../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 { is_expected.to be_kind_of(Integer) }
11
+ it { is_expected.to eq ordered_set.class.hash ^ ordered_set.entries.hash }
12
+ end
@@ -0,0 +1,23 @@
1
+ require_relative '../../../spec_helper'
2
+ require 'dm-core/support/ordered_set'
3
+ require_relative '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_behaves_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_behaves_like 'DataMapper::OrderedSet#include? when the entry is not present'
22
+ end
23
+ end
@@ -0,0 +1,28 @@
1
+ require_relative '../../../spec_helper'
2
+ require 'dm-core/support/ordered_set'
3
+ require_relative '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_behaves_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_behaves_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_behaves_like 'DataMapper::OrderedSet#index when 2 entries are present'
27
+ end
28
+ end
@@ -0,0 +1,32 @@
1
+ require_relative '../../../spec_helper'
2
+ require 'dm-core/support/ordered_set'
3
+ require_relative '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_behaves_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_behaves_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_behaves_like 'DataMapper::OrderedSet#initialize when entries are given and they contain duplicates'
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,36 @@
1
+ require_relative '../../../spec_helper'
2
+ require 'dm-core/support/ordered_set'
3
+ require_relative '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_behaves_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_behaves_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_behaves_like 'DataMapper::OrderedSet#merge when merging a set with not yet present entries'
35
+ end
36
+ end
@@ -0,0 +1,24 @@
1
+ require_relative '../../../../spec_helper'
2
+
3
+ shared_examples 'DataMapper::OrderedSet#<< when appending a not yet included entry' do
4
+ its(:size) { is_expected.to eq 2 }
5
+ its(:entries) { is_expected.to include(entry1) }
6
+ its(:entries) { is_expected.to include(entry2) }
7
+
8
+ it 'does not alter the position of the existing entry' do
9
+ expect(subject.entries.index(entry1)).to eq @old_index
10
+ end
11
+
12
+ it 'appends columns at the end of the set' do
13
+ expect(subject.entries.index(entry2)).to eq @old_index + 1
14
+ end
15
+ end
16
+
17
+ shared_examples 'DataMapper::OrderedSet#<< when updating an already included entry' do
18
+ its(:size) { is_expected.to eq 1 }
19
+ its(:entries) { is_expected.to include(entry2) }
20
+
21
+ it 'does not alter the position of the existing entry' do
22
+ expect(subject.entries.index(entry2)).to eq @old_index
23
+ end
24
+ end
@@ -0,0 +1,9 @@
1
+ require_relative '../../../../spec_helper'
2
+
3
+ shared_examples 'DataMapper::OrderedSet#clear when no entries are present' do
4
+ it { is_expected.to be_empty }
5
+ end
6
+
7
+ shared_examples 'DataMapper::OrderedSet#clear when entries are present' do
8
+ it { is_expected.to be_empty }
9
+ end
@@ -0,0 +1,25 @@
1
+ require_relative '../../../../spec_helper'
2
+
3
+ shared_examples 'DataMapper::OrderedSet#delete when deleting an already included entry' do
4
+ its(:entries) { is_expected.not_to include(entry1) }
5
+ its(:entries) { is_expected.to include(entry2) }
6
+ its(:entries) { is_expected.to include(entry3) }
7
+
8
+ it 'corrects the index' do
9
+ expect(ordered_set.index(entry1)).to be_nil
10
+ expect(ordered_set.index(entry2)).to eq 0
11
+ expect(ordered_set.index(entry3)).to eq 1
12
+ end
13
+ end
14
+
15
+ shared_examples 'DataMapper::OrderedSet#delete when deleting a not yet included entry' do
16
+ its(:entries) { is_expected.to include(entry1) }
17
+ its(:entries) { is_expected.to include(entry2) }
18
+ its(:entries) { is_expected.to include(entry3) }
19
+
20
+ it 'does not alter the index' do
21
+ expect(ordered_set.index(entry1)).to eq 0
22
+ expect(ordered_set.index(entry2)).to eq 1
23
+ expect(ordered_set.index(entry3)).to eq 2
24
+ end
25
+ end
@@ -0,0 +1,17 @@
1
+ require_relative '../../../../spec_helper'
2
+
3
+ shared_examples 'DataMapper::OrderedSet' do
4
+ it { is_expected.to be_kind_of(Enumerable) }
5
+
6
+ it 'case matches Enumerable' do
7
+ expect(subject.is_a?(Enumerable)).to be(true)
8
+ end
9
+ end
10
+
11
+ shared_examples 'DataMapper::OrderedSet#each' do
12
+ it { is_expected.to 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_relative '../../../../spec_helper'
2
+
3
+ shared_examples 'DataMapper::OrderedSet#empty? with no entries in it' do
4
+ it { is_expected.to be(true) }
5
+ end
6
+
7
+ shared_examples 'DataMapper::OrderedSet#empty? with entries in it' do
8
+ it { is_expected.to be(false) }
9
+ end