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,134 @@
1
+ require_relative '../../spec_helper'
2
+
3
+ describe DataMapper::Property::Discriminator do
4
+ before :all do
5
+ module ::Blog
6
+ class Content
7
+ include DataMapper::Resource
8
+
9
+ property :id, Serial
10
+ property :title, String, :required => true
11
+ property :type, Discriminator
12
+ end
13
+
14
+ class Article < Content; end
15
+ class Announcement < Article; end
16
+ class Release < Announcement; end
17
+ end
18
+ DataMapper.finalize
19
+
20
+ @content_model = Blog::Content
21
+ @article_model = Blog::Article
22
+ @announcement_model = Blog::Announcement
23
+ @release_model = Blog::Release
24
+ end
25
+
26
+ describe '.options' do
27
+ subject { described_class.options }
28
+
29
+ it { is_expected.to be_kind_of(Hash) }
30
+ it { is_expected.to include(load_as: Class, required: true) }
31
+ end
32
+
33
+ it 'typecasts to a Model' do
34
+ expect(@article_model.properties[:type].typecast('Blog::Release')).to equal(@release_model)
35
+ end
36
+
37
+ describe 'Model#new' do
38
+ describe 'when provided a String discriminator in the attributes' do
39
+ before :all do
40
+ @resource = @article_model.new(:type => 'Blog::Release')
41
+ end
42
+
43
+ it 'returns a Resource' do
44
+ expect(@resource).to be_kind_of(DataMapper::Resource)
45
+ end
46
+
47
+ it 'is an descendant instance' do
48
+ expect(@resource).to be_instance_of(Blog::Release)
49
+ end
50
+ end
51
+
52
+ describe 'when provided a Class discriminator in the attributes' do
53
+ before :all do
54
+ @resource = @article_model.new(:type => Blog::Release)
55
+ end
56
+
57
+ it 'returns a Resource' do
58
+ expect(@resource).to be_kind_of(DataMapper::Resource)
59
+ end
60
+
61
+ it 'is an descendant instance' do
62
+ expect(@resource).to be_instance_of(Blog::Release)
63
+ end
64
+ end
65
+
66
+ describe 'when not provided a discriminator in the attributes' do
67
+ before :all do
68
+ @resource = @article_model.new
69
+ end
70
+
71
+ it 'returns a Resource' do
72
+ expect(@resource).to be_kind_of(DataMapper::Resource)
73
+ end
74
+
75
+ it 'is a base model instance' do
76
+ expect(@resource).to be_instance_of(@article_model)
77
+ end
78
+ end
79
+ end
80
+
81
+ describe 'Model#descendants' do
82
+ it 'sets the descendants for the grandparent model' do
83
+ expect(@article_model.descendants.to_a).to match([@announcement_model, @release_model])
84
+ end
85
+
86
+ it 'sets the descendants for the parent model' do
87
+ expect(@announcement_model.descendants.to_a).to eq [@release_model]
88
+ end
89
+
90
+ it 'sets the descendants for the child model' do
91
+ expect(@release_model.descendants.to_a).to eq []
92
+ end
93
+ end
94
+
95
+ describe 'Model#default_scope' do
96
+ it 'has no default scope for the top level model' do
97
+ expect(@content_model.default_scope[:type]).to be_nil
98
+ end
99
+
100
+ it 'sets the default scope for the grandparent model' do
101
+ expect(@article_model.default_scope[:type].to_a).to match([@article_model, @announcement_model, @release_model])
102
+ end
103
+
104
+ it 'sets the default scope for the parent model' do
105
+ expect(@announcement_model.default_scope[:type].to_a).to match([@announcement_model, @release_model])
106
+ end
107
+
108
+ it 'sets the default scope for the child model' do
109
+ expect(@release_model.default_scope[:type].to_a).to eq [@release_model]
110
+ end
111
+ end
112
+
113
+ supported_by :all do
114
+ before :all do
115
+ @announcement = @announcement_model.create(:title => 'Announcement')
116
+ end
117
+
118
+ it 'persists the type' do
119
+ expect(@announcement.model.get!(*@announcement.key).type).to equal(@announcement_model)
120
+ end
121
+
122
+ it 'is retrieved as an instance of the correct class' do
123
+ expect(@announcement.model.get!(*@announcement.key)).to be_instance_of(@announcement_model)
124
+ end
125
+
126
+ it 'includes descendants in finders' do
127
+ expect(@article_model.first).to eql(@announcement)
128
+ end
129
+
130
+ it 'does not include ancestors' do
131
+ expect(@release_model.first).to be_nil
132
+ end
133
+ end
134
+ end
@@ -0,0 +1,22 @@
1
+ require_relative '../../spec_helper'
2
+
3
+ describe DataMapper::Property::Float do
4
+ before :all do
5
+ @name = :rating
6
+ @type = described_class
7
+ @load_as = Float
8
+ @dump_as = String
9
+ @value = 0.1
10
+ @other_value = 0.2
11
+ @invalid_value = '1'
12
+ end
13
+
14
+ it_behaves_like 'A public Property'
15
+
16
+ describe '.options' do
17
+ subject { described_class.options }
18
+
19
+ it { is_expected.to be_kind_of(Hash) }
20
+ it { is_expected.to eql(load_as: @load_as, dump_as: @load_as, precision: 10, scale: nil) }
21
+ end
22
+ end
@@ -0,0 +1,22 @@
1
+ require_relative '../../spec_helper'
2
+
3
+ describe DataMapper::Property::Integer do
4
+ before :all do
5
+ @name = :age
6
+ @type = described_class
7
+ @load_as = Integer
8
+ @dump_as = Integer
9
+ @value = 1
10
+ @other_value = 2
11
+ @invalid_value = '1'
12
+ end
13
+
14
+ it_behaves_like 'A public Property'
15
+
16
+ describe '.options' do
17
+ subject { described_class.options }
18
+
19
+ it { is_expected.to be_kind_of(Hash) }
20
+ it { is_expected.to eql(load_as: @load_as, dump_as: @load_as) }
21
+ end
22
+ end
@@ -0,0 +1,117 @@
1
+ require_relative '../../spec_helper'
2
+
3
+ describe DataMapper::Property, 'Object type' do
4
+ before :all do
5
+ module ::Blog
6
+ class Article
7
+ include DataMapper::Resource
8
+
9
+ property :id, Serial
10
+ property :title, String
11
+ property :meta, Object, :required => true
12
+ end
13
+ end
14
+
15
+ DataMapper.finalize
16
+ @model = Blog::Article
17
+ @property = @model.properties[:meta]
18
+ end
19
+
20
+ subject { @property }
21
+
22
+ describe '.options' do
23
+ subject { described_class.options }
24
+
25
+ it { is_expected.to be_kind_of(Hash) }
26
+ it { is_expected.to be_empty }
27
+ end
28
+
29
+ it { is_expected.to respond_to(:typecast) }
30
+
31
+ describe '#typecast' do
32
+ subject { @property.typecast(@value) }
33
+
34
+ before do
35
+ @value = { 'lang' => 'en_CA' }
36
+ end
37
+
38
+ context 'when the value is a primitive' do
39
+ it { is_expected.to equal(@value) }
40
+ end
41
+
42
+ context 'when the value is not a primitive' do
43
+ before do
44
+ # simulate the value not being a primitive
45
+ expect(@property).to receive(:value_loaded?).with(@value).and_return(false)
46
+ end
47
+
48
+ it { is_expected.to equal(@value) }
49
+ end
50
+ end
51
+
52
+ it { is_expected.to respond_to(:dump) }
53
+
54
+ describe '#dump' do
55
+ describe 'with a value' do
56
+ before do
57
+ @value = { 'lang' => 'en_CA' }
58
+ end
59
+
60
+ subject { @property.dump(@value) }
61
+
62
+ it { expect(@property.load(subject)).to eq @value }
63
+ end
64
+
65
+ describe 'with nil' do
66
+ subject { @property.dump(nil) }
67
+
68
+ it { is_expected.to be_nil }
69
+ end
70
+ end
71
+
72
+ it { is_expected.to respond_to(:valid?) }
73
+
74
+ describe '#valid?' do
75
+ describe 'with a valid load_as' do
76
+ subject { @property.valid?('lang' => 'en_CA') }
77
+
78
+ it { is_expected.to be(true) }
79
+ end
80
+
81
+ describe 'with nil and property is not required' do
82
+ before do
83
+ @property = @model.property(:meta, Object, :required => false)
84
+ end
85
+
86
+ subject { @property.valid?(nil) }
87
+
88
+ it { is_expected.to be(true) }
89
+ end
90
+
91
+ describe 'with nil and property is required' do
92
+ subject { @property.valid?(nil) }
93
+
94
+ it { is_expected.to be(false) }
95
+ end
96
+
97
+ describe 'with nil and property is required, but validity is negated' do
98
+ subject { @property.valid?(nil, true) }
99
+
100
+ it { is_expected.to be(true) }
101
+ end
102
+ end
103
+
104
+ describe 'persistable' do
105
+ supported_by :all do
106
+ before :all do
107
+ @resource = @model.create(:title => 'Test', :meta => { 'lang' => 'en_CA' })
108
+ end
109
+
110
+ subject { @resource.reload.meta }
111
+
112
+ it 'loads the correct value' do
113
+ is_expected.to eq({'lang' => 'en_CA'})
114
+ end
115
+ end
116
+ end
117
+ end
@@ -0,0 +1,22 @@
1
+ require_relative '../../spec_helper'
2
+
3
+ describe DataMapper::Property::Serial do
4
+ before :all do
5
+ @name = :id
6
+ @type = described_class
7
+ @load_as = Integer
8
+ @dump_as = Integer
9
+ @value = 1
10
+ @other_value = 2
11
+ @invalid_value = 'foo'
12
+ end
13
+
14
+ it_behaves_like 'A public Property'
15
+
16
+ describe '.options' do
17
+ subject { described_class.options }
18
+
19
+ it { is_expected.to be_kind_of(Hash) }
20
+ it { is_expected.to eql(load_as: @load_as, dump_as: @load_as, min: 1, serial: true) }
21
+ end
22
+ end
@@ -0,0 +1,21 @@
1
+ require_relative '../../spec_helper'
2
+
3
+ describe DataMapper::Property::String do
4
+ before :all do
5
+ @name = :name
6
+ @type = described_class
7
+ @load_as = String
8
+ @value = 'value'
9
+ @other_value = 'return value'
10
+ @invalid_value = 1
11
+ end
12
+
13
+ it_behaves_like 'A public Property'
14
+
15
+ describe '.options' do
16
+ subject { described_class.options }
17
+
18
+ it { is_expected.to be_kind_of(Hash) }
19
+ it { is_expected.to eql(load_as: @load_as, dump_as: @load_as, length: 50) }
20
+ end
21
+ end
@@ -0,0 +1,62 @@
1
+ require_relative '../../spec_helper'
2
+
3
+ describe DataMapper::Property::Text do
4
+ before :all do
5
+ @name = :title
6
+ @type = described_class
7
+ @load_as = String
8
+ @value = 'value'
9
+ @other_value = 'return value'
10
+ @invalid_value = 1
11
+ end
12
+
13
+ it_behaves_like 'A public Property'
14
+
15
+ describe '.options' do
16
+ subject { described_class.options }
17
+
18
+ it { is_expected.to be_kind_of(Hash) }
19
+ it { is_expected.to eql(load_as: @load_as, dump_as: @load_as, length: 65_535, lazy: true) }
20
+ end
21
+
22
+ describe 'migration with an index' do
23
+ supported_by :all do
24
+ before do
25
+ Object.send(:remove_const, :Foo) if Object.const_defined?(:Foo)
26
+ @model = DataMapper::Model.new('Foo') do
27
+ storage_names[:default] = 'anonymous'
28
+
29
+ property :id, DataMapper::Property::Serial
30
+ property :body, DataMapper::Property::Text, :index => true
31
+ end
32
+ end
33
+
34
+ it 'allows a migration' do
35
+ expect {
36
+ @model.auto_migrate!
37
+ }.not_to raise_error
38
+ end
39
+ end
40
+ end if defined?(DataObjects::SyntaxError)
41
+
42
+ describe 'migration with a unique index' do
43
+ supported_by :all do
44
+ before do
45
+
46
+ Object.send(:remove_const, :Foo) if Object.const_defined?(:Foo)
47
+ @model = DataMapper::Model.new('Foo') do
48
+ storage_names[:default] = 'anonymous'
49
+
50
+ property :id, DataMapper::Property::Serial
51
+ property :body, DataMapper::Property::Text, :unique_index => true
52
+ end
53
+ end
54
+
55
+ it 'allows a migration' do
56
+ expect {
57
+ @model.auto_migrate!
58
+ }.not_to raise_error
59
+ end
60
+ end
61
+ end if defined?(DataObjects::SyntaxError)
62
+ end
@@ -0,0 +1,21 @@
1
+ require_relative '../../spec_helper'
2
+
3
+ describe DataMapper::Property::Time do
4
+ before :all do
5
+ @name = :deleted_at
6
+ @type = described_class
7
+ @load_as = Time
8
+ @value = Time.now
9
+ @other_value = Time.now + 15
10
+ @invalid_value = 1
11
+ end
12
+
13
+ it_behaves_like 'A public Property'
14
+
15
+ describe '.options' do
16
+ subject { described_class.options }
17
+
18
+ it { is_expected.to be_kind_of(Hash) }
19
+ it { is_expected.to eql(load_as: @load_as, dump_as: @load_as) }
20
+ end
21
+ end