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,110 @@
1
+ require_relative '../spec_helper'
2
+
3
+ # run the specs once with a loaded collection and once not
4
+ [ false, true ].each do |loaded|
5
+ describe DataMapper::Collection do
6
+ extend DataMapper::Spec::CollectionHelpers::GroupMethods
7
+
8
+ self.loaded = loaded
9
+
10
+ before :all do
11
+ module ::Blog
12
+ class Article
13
+ include DataMapper::Resource
14
+
15
+ property :id, Serial
16
+ property :title, String
17
+ property :content, Text
18
+ property :subtitle, String
19
+ end
20
+ end
21
+
22
+ @article_model = Blog::Article
23
+ end
24
+
25
+ supported_by :all do
26
+ before :all do
27
+ @article_repository = @repository
28
+ @articles_query = DataMapper::Query.new(@article_repository, @article_model, :title => 'Sample Article')
29
+
30
+ @article = @article_model.create(:title => 'Sample Article', :content => 'Sample')
31
+
32
+ @articles = @article_model.all(@articles_query)
33
+
34
+ @articles.entries if loaded
35
+ end
36
+
37
+ it { expect(DataMapper::Collection).to respond_to(:new) }
38
+
39
+ describe '.new' do
40
+ describe 'with resources' do
41
+ before :all do
42
+ @return = @collection = DataMapper::Collection.new(@articles_query, [ @article ])
43
+ end
44
+
45
+ it 'returns a Collection' do
46
+ expect(@return).to be_kind_of(DataMapper::Collection)
47
+ end
48
+
49
+ it 'is loaded' do
50
+ expect(@return).to be_loaded
51
+ end
52
+
53
+ it 'contains the article' do
54
+ expect(@collection).to eq [ @article ]
55
+ end
56
+ end
57
+
58
+ describe 'with no resources' do
59
+ before :all do
60
+ @return = @collection = DataMapper::Collection.new(@articles_query)
61
+ end
62
+
63
+ it 'returns a Collection' do
64
+ expect(@return).to be_kind_of(DataMapper::Collection)
65
+ end
66
+
67
+ it 'is not loaded' do
68
+ expect(@return).not_to be_loaded
69
+ end
70
+
71
+ it 'contains the article' do
72
+ expect(@collection).to eq [ @article ]
73
+ end
74
+ end
75
+ end
76
+
77
+ it { expect(@articles).to respond_to(:query) }
78
+
79
+ describe '#query' do
80
+ before :all do
81
+ @return = @articles.query
82
+ end
83
+
84
+ it 'returns a Query' do
85
+ expect(@return).to be_kind_of(DataMapper::Query)
86
+ end
87
+
88
+ it 'returns expected Query' do
89
+ expect(@return).to eql(@articles_query)
90
+ end
91
+ end
92
+
93
+ it { expect(@articles).to respond_to(:repository) }
94
+
95
+ describe '#repository' do
96
+ before :all do
97
+ @return = @repository = @articles.repository
98
+ end
99
+
100
+ it 'returns a Repository' do
101
+ expect(@return).to be_kind_of(DataMapper::Repository)
102
+ end
103
+
104
+ it 'is expected Repository' do
105
+ expect(@repository).to eq @article_repository
106
+ end
107
+ end
108
+ end
109
+ end
110
+ end
@@ -0,0 +1,96 @@
1
+ require_relative '../spec_helper'
2
+
3
+ describe DataMapper::Model do
4
+
5
+ it { is_expected.to respond_to(:append_inclusions) }
6
+
7
+ describe '.append_inclusions' do
8
+ module ::Inclusions
9
+ def new_method
10
+ end
11
+ end
12
+
13
+ describe 'before the model is defined' do
14
+ before :all do
15
+ DataMapper::Model.append_inclusions(Inclusions)
16
+
17
+ class ::User
18
+ include DataMapper::Resource
19
+ property :id, Serial
20
+ end
21
+ end
22
+
23
+ it 'responds to :new_method' do
24
+ expect(User.new).to respond_to(:new_method)
25
+ end
26
+
27
+ after :all do
28
+ DataMapper::Model.extra_inclusions.delete(Inclusions)
29
+ end
30
+ end
31
+
32
+ describe 'after the model is defined' do
33
+ before :all do
34
+ class ::User
35
+ include DataMapper::Resource
36
+ property :id, Serial
37
+ end
38
+ DataMapper::Model.append_inclusions(Inclusions)
39
+ end
40
+
41
+ it 'responds to :new_method' do
42
+ expect(User.new).to respond_to(:new_method)
43
+ end
44
+
45
+ after :all do
46
+ DataMapper::Model.extra_inclusions.delete(Inclusions)
47
+ end
48
+ end
49
+ end
50
+
51
+ it { is_expected.to respond_to(:append_extensions) }
52
+
53
+ describe '.append_extensions' do
54
+ module ::Extensions
55
+ def new_method
56
+ end
57
+ end
58
+
59
+ describe 'before the model is defined' do
60
+ before :all do
61
+ DataMapper::Model.append_extensions(Extensions)
62
+
63
+ class ::User
64
+ include DataMapper::Resource
65
+ property :id, Serial
66
+ end
67
+ end
68
+
69
+ it 'responds to :new_method' do
70
+ expect(User).to respond_to(:new_method)
71
+ end
72
+
73
+ after :all do
74
+ DataMapper::Model.extra_extensions.delete(Extensions)
75
+ end
76
+ end
77
+
78
+ describe 'after the model is defined' do
79
+ before :all do
80
+ class ::User
81
+ include DataMapper::Resource
82
+ property :id, Serial
83
+ end
84
+ DataMapper::Model.append_extensions(Extensions)
85
+ end
86
+
87
+ it 'responds to :new_method' do
88
+ expect(User).to respond_to(:new_method)
89
+ end
90
+
91
+ after :all do
92
+ DataMapper::Model.extra_extensions.delete(Extensions)
93
+ end
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,13 @@
1
+ require_relative '../../spec_helper'
2
+
3
+ describe DataMapper::Property::Binary do
4
+ before :all do
5
+ @name = :title
6
+ @type = described_class
7
+ @value = 'value'
8
+ @other_value = 'return value'
9
+ @invalid_value = 1
10
+ end
11
+
12
+ it_behaves_like 'A semipublic Property'
13
+ end
@@ -0,0 +1,47 @@
1
+ require_relative '../../spec_helper'
2
+
3
+ describe DataMapper::Property::Boolean do
4
+ before :all do
5
+ @name = :active
6
+ @type = described_class
7
+ @value = true
8
+ @other_value = false
9
+ @invalid_value = 1
10
+ end
11
+
12
+ it_behaves_like 'A semipublic Property'
13
+
14
+ describe '#valid?' do
15
+ [ true, false ].each do |value|
16
+ it "returns true when value is #{value.inspect}" do
17
+ expect(@property.valid?(value)).to be(true)
18
+ end
19
+ end
20
+
21
+ [ 'true', 'TRUE', '1', 1, 't', 'T', 'false', 'FALSE', '0', 0, 'f', 'F' ].each do |value|
22
+ it "returns false for #{value.inspect}" do
23
+ expect(@property.valid?(value)).to be(false)
24
+ end
25
+ end
26
+ end
27
+
28
+ describe '#typecast_to_primitive' do
29
+ [ true, 'true', 'TRUE', '1', 1, 't', 'T' ].each do |value|
30
+ it "returns true when value is #{value.inspect}" do
31
+ expect(@property.typecast(value)).to be(true)
32
+ end
33
+ end
34
+
35
+ [ false, 'false', 'FALSE', '0', 0, 'f', 'F' ].each do |value|
36
+ it "returns false when value is #{value.inspect}" do
37
+ expect(@property.typecast(value)).to be(false)
38
+ end
39
+ end
40
+
41
+ [ 'string', 2, 1.0, BigDecimal('1.0'), DateTime.now, Time.now, Date.today, Class, Object.new, ].each do |value|
42
+ it "does not typecast value #{value.inspect}" do
43
+ expect(@property.typecast(value)).to equal(value)
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,33 @@
1
+ require_relative '../../spec_helper'
2
+
3
+ describe DataMapper::Property::Class do
4
+ before :all do
5
+ Object.send(:remove_const, :Foo) if defined?(Foo)
6
+ Object.send(:remove_const, :Bar) if defined?(Bar)
7
+
8
+ class ::Foo; end
9
+ class ::Bar; end
10
+
11
+ @name = :type
12
+ @type = described_class
13
+ @value = Foo
14
+ @other_value = Bar
15
+ @invalid_value = 1
16
+ end
17
+
18
+ it_behaves_like 'A semipublic Property'
19
+
20
+ describe '#typecast_to_primitive' do
21
+ it 'returns same value if a class' do
22
+ expect(@property.typecast(@model)).to equal(@model)
23
+ end
24
+
25
+ it 'returns the class if found' do
26
+ expect(@property.typecast(@model.name)).to eql(@model)
27
+ end
28
+
29
+ it 'does not typecast non-class values' do
30
+ expect(@property.typecast('NoClass')).to eql('NoClass')
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,43 @@
1
+ require_relative '../../spec_helper'
2
+
3
+ describe DataMapper::Property::Date do
4
+ before :all do
5
+ @name = :created_on
6
+ @type = described_class
7
+ @value = Date.today
8
+ @other_value = Date.today + 1
9
+ @invalid_value = 1
10
+ end
11
+
12
+ it_behaves_like 'A semipublic Property'
13
+
14
+ describe '#typecast_to_primitive' do
15
+ describe 'and value given as a hash with keys like :year, :month, etc' do
16
+ it 'builds a Date instance from hash values' do
17
+ result = @property.typecast(
18
+ 'year' => '2007',
19
+ 'month' => '3',
20
+ 'day' => '25'
21
+ )
22
+
23
+ expect(result).to be_kind_of(Date)
24
+ expect(result.year).to eql(2007)
25
+ expect(result.month).to eql(3)
26
+ expect(result.day).to eql(25)
27
+ end
28
+ end
29
+
30
+ describe 'and value is a string' do
31
+ it 'parses the string' do
32
+ result = @property.typecast('Dec 20th, 2006')
33
+ expect(result.month).to eq 12
34
+ expect(result.day).to eq 20
35
+ expect(result.year).to eq 2006
36
+ end
37
+ end
38
+
39
+ it 'does not typecast non-date values' do
40
+ expect(@property.typecast('not-date')).to eql('not-date')
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,46 @@
1
+ require_relative '../../spec_helper'
2
+
3
+ describe DataMapper::Property::DateTime do
4
+ before :all do
5
+ @name = :created_at
6
+ @type = described_class
7
+ @value = DateTime.now
8
+ @other_value = DateTime.now + 15
9
+ @invalid_value = 1
10
+ end
11
+
12
+ it_behaves_like 'A semipublic Property'
13
+
14
+ describe '#typecast_to_primitive' do
15
+ describe 'and value given as a hash with keys like :year, :month, etc' do
16
+ it 'builds a DateTime instance from hash values' do
17
+ result = @property.typecast(
18
+ 'year' => '2006',
19
+ 'month' => '11',
20
+ 'day' => '23',
21
+ 'hour' => '12',
22
+ 'min' => '0',
23
+ 'sec' => '0'
24
+ )
25
+
26
+ expect(result).to be_kind_of(DateTime)
27
+ expect(result.year).to eql(2006)
28
+ expect(result.month).to eql(11)
29
+ expect(result.day).to eql(23)
30
+ expect(result.hour).to eql(12)
31
+ expect(result.min).to eql(0)
32
+ expect(result.sec).to eql(0)
33
+ end
34
+ end
35
+
36
+ describe 'and value is a string' do
37
+ it 'parses the string' do
38
+ expect(@property.typecast('Dec, 2006').month).to eq 12
39
+ end
40
+ end
41
+
42
+ it 'does not typecast non-datetime values' do
43
+ expect(@property.typecast('not-datetime')).to eql('not-datetime')
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,83 @@
1
+ require_relative '../../spec_helper'
2
+
3
+ describe DataMapper::Property::Decimal do
4
+ before :all do
5
+ @name = :rate
6
+ @type = described_class
7
+ @options = { :precision => 5, :scale => 2 }
8
+ @value = BigDecimal('1.0')
9
+ @other_value = BigDecimal('2.0')
10
+ @invalid_value = true
11
+ end
12
+
13
+ it_behaves_like 'A semipublic Property'
14
+
15
+ describe '#typecast_to_primitive' do
16
+ it 'returns same value if a decimal' do
17
+ @value = BigDecimal('24.0')
18
+ expect(@property.typecast(@value)).to equal(@value)
19
+ end
20
+
21
+ it 'returns decimal representation of a zero string integer' do
22
+ expect(@property.typecast('0')).to eql(BigDecimal('0.0'))
23
+ end
24
+
25
+ it 'returns decimal representation of a positive string integer' do
26
+ expect(@property.typecast('24')).to eql(BigDecimal('24.0'))
27
+ end
28
+
29
+ it 'returns decimal representation of a negative string integer' do
30
+ expect(@property.typecast('-24')).to eql(BigDecimal('-24.0'))
31
+ end
32
+
33
+ it 'returns decimal representation of a zero string float' do
34
+ expect(@property.typecast('0.0')).to eql(BigDecimal('0.0'))
35
+ end
36
+
37
+ it 'returns decimal representation of a positive string float' do
38
+ expect(@property.typecast('24.35')).to eql(BigDecimal('24.35'))
39
+ end
40
+
41
+ it 'returns decimal representation of a negative string float' do
42
+ expect(@property.typecast('-24.35')).to eql(BigDecimal('-24.35'))
43
+ end
44
+
45
+ it 'returns decimal representation of a zero string float, with no leading digits' do
46
+ expect(@property.typecast('.0')).to eql(BigDecimal('0.0'))
47
+ end
48
+
49
+ it 'returns decimal representation of a positive string float, with no leading digits' do
50
+ expect(@property.typecast('.41')).to eql(BigDecimal('0.41'))
51
+ end
52
+
53
+ it 'returns decimal representation of a zero integer' do
54
+ expect(@property.typecast(0)).to eql(BigDecimal('0.0'))
55
+ end
56
+
57
+ it 'returns decimal representation of a positive integer' do
58
+ expect(@property.typecast(24)).to eql(BigDecimal('24.0'))
59
+ end
60
+
61
+ it 'returns decimal representation of a negative integer' do
62
+ expect(@property.typecast(-24)).to eql(BigDecimal('-24.0'))
63
+ end
64
+
65
+ it 'returns decimal representation of a zero float' do
66
+ expect(@property.typecast(0.0)).to eql(BigDecimal('0.0'))
67
+ end
68
+
69
+ it 'returns decimal representation of a positive float' do
70
+ expect(@property.typecast(24.35)).to eql(BigDecimal('24.35'))
71
+ end
72
+
73
+ it 'returns decimal representation of a negative float' do
74
+ expect(@property.typecast(-24.35)).to eql(BigDecimal('-24.35'))
75
+ end
76
+
77
+ [ Object.new, true, '00.0', '0.', '-.0', 'string' ].each do |value|
78
+ it "does not typecast non-numeric value #{value.inspect}" do
79
+ expect(@property.typecast(value)).to equal(value)
80
+ end
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,19 @@
1
+ require_relative '../../spec_helper'
2
+
3
+ describe DataMapper::Property::Discriminator do
4
+ before :all do
5
+ Object.send(:remove_const, :Foo) if defined?(Foo)
6
+ Object.send(:remove_const, :Bar) if defined?(Bar)
7
+
8
+ class ::Foo; end
9
+ class ::Bar; end
10
+
11
+ @name = :type
12
+ @type = described_class
13
+ @value = Foo
14
+ @other_value = Bar
15
+ @invalid_value = 1
16
+ end
17
+
18
+ it_behaves_like 'A semipublic Property'
19
+ end
@@ -0,0 +1,82 @@
1
+ require_relative '../../spec_helper'
2
+
3
+ describe DataMapper::Property::Float do
4
+ before :all do
5
+ @name = :rating
6
+ @type = described_class
7
+ @value = 0.1
8
+ @other_value = 0.2
9
+ @invalid_value = '1'
10
+ end
11
+
12
+ it_behaves_like 'A semipublic Property'
13
+
14
+ describe '#typecast_to_primitive' do
15
+ it 'returns same value if a float' do
16
+ @value = 24.0
17
+ expect(@property.typecast(@value)).to equal(@value)
18
+ end
19
+
20
+ it 'returns float representation of a zero string integer' do
21
+ expect(@property.typecast('0')).to eql(0.0)
22
+ end
23
+
24
+ it 'returns float representation of a positive string integer' do
25
+ expect(@property.typecast('24')).to eql(24.0)
26
+ end
27
+
28
+ it 'returns float representation of a negative string integer' do
29
+ expect(@property.typecast('-24')).to eql(-24.0)
30
+ end
31
+
32
+ it 'returns float representation of a zero string float' do
33
+ expect(@property.typecast('0.0')).to eql(0.0)
34
+ end
35
+
36
+ it 'returns float representation of a positive string float' do
37
+ expect(@property.typecast('24.35')).to eql(24.35)
38
+ end
39
+
40
+ it 'returns float representation of a negative string float' do
41
+ expect(@property.typecast('-24.35')).to eql(-24.35)
42
+ end
43
+
44
+ it 'returns float representation of a zero string float, with no leading digits' do
45
+ expect(@property.typecast('.0')).to eql(0.0)
46
+ end
47
+
48
+ it 'returns float representation of a positive string float, with no leading digits' do
49
+ expect(@property.typecast('.41')).to eql(0.41)
50
+ end
51
+
52
+ it 'returns float representation of a zero integer' do
53
+ expect(@property.typecast(0)).to eql(0.0)
54
+ end
55
+
56
+ it 'returns float representation of a positive integer' do
57
+ expect(@property.typecast(24)).to eql(24.0)
58
+ end
59
+
60
+ it 'returns float representation of a negative integer' do
61
+ expect(@property.typecast(-24)).to eql(-24.0)
62
+ end
63
+
64
+ it 'returns float representation of a zero decimal' do
65
+ expect(@property.typecast(BigDecimal('0.0'))).to eql(0.0)
66
+ end
67
+
68
+ it 'returns float representation of a positive decimal' do
69
+ expect(@property.typecast(BigDecimal('24.35'))).to eql(24.35)
70
+ end
71
+
72
+ it 'returns float representation of a negative decimal' do
73
+ expect(@property.typecast(BigDecimal('-24.35'))).to eql(-24.35)
74
+ end
75
+
76
+ [ Object.new, true, '00.0', '0.', '-.0', 'string' ].each do |value|
77
+ it "does not typecast non-numeric value #{value.inspect}" do
78
+ expect(@property.typecast(value)).to equal(value)
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,82 @@
1
+ require_relative '../../spec_helper'
2
+
3
+ describe DataMapper::Property::Integer do
4
+ before :all do
5
+ @name = :age
6
+ @type = described_class
7
+ @value = 1
8
+ @other_value = 2
9
+ @invalid_value = '1'
10
+ end
11
+
12
+ it_behaves_like 'A semipublic Property'
13
+
14
+ describe '#typecast_to_primitive' do
15
+ it 'returns same value if an integer' do
16
+ @value = 24
17
+ expect(@property.typecast(@value)).to equal(@value)
18
+ end
19
+
20
+ it 'returns integer representation of a zero string integer' do
21
+ expect(@property.typecast('0')).to eql(0)
22
+ end
23
+
24
+ it 'returns integer representation of a positive string integer' do
25
+ expect(@property.typecast('24')).to eql(24)
26
+ end
27
+
28
+ it 'returns integer representation of a negative string integer' do
29
+ expect(@property.typecast('-24')).to eql(-24)
30
+ end
31
+
32
+ it 'returns integer representation of a zero string float' do
33
+ expect(@property.typecast('0.0')).to eql(0)
34
+ end
35
+
36
+ it 'returns integer representation of a positive string float' do
37
+ expect(@property.typecast('24.35')).to eql(24)
38
+ end
39
+
40
+ it 'returns integer representation of a negative string float' do
41
+ expect(@property.typecast('-24.35')).to eql(-24)
42
+ end
43
+
44
+ it 'returns integer representation of a zero string float, with no leading digits' do
45
+ expect(@property.typecast('.0')).to eql(0)
46
+ end
47
+
48
+ it 'returns integer representation of a positive string float, with no leading digits' do
49
+ expect(@property.typecast('.41')).to eql(0)
50
+ end
51
+
52
+ it 'returns integer representation of a zero float' do
53
+ expect(@property.typecast(0.0)).to eql(0)
54
+ end
55
+
56
+ it 'returns integer representation of a positive float' do
57
+ expect(@property.typecast(24.35)).to eql(24)
58
+ end
59
+
60
+ it 'returns integer representation of a negative float' do
61
+ expect(@property.typecast(-24.35)).to eql(-24)
62
+ end
63
+
64
+ it 'returns integer representation of a zero decimal' do
65
+ expect(@property.typecast(BigDecimal('0.0'))).to eql(0)
66
+ end
67
+
68
+ it 'returns integer representation of a positive decimal' do
69
+ expect(@property.typecast(BigDecimal('24.35'))).to eql(24)
70
+ end
71
+
72
+ it 'returns integer representation of a negative decimal' do
73
+ expect(@property.typecast(BigDecimal('-24.35'))).to eql(-24)
74
+ end
75
+
76
+ [ Object.new, true, '00.0', '0.', '-.0', 'string' ].each do |value|
77
+ it "does not typecast non-numeric value #{value.inspect}" do
78
+ expect(@property.typecast(value)).equal(value)
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,29 @@
1
+ require_relative '../../spec_helper'
2
+ require 'dm-core/property/lookup'
3
+
4
+ describe DataMapper::Property::Lookup do
5
+ supported_by :all do
6
+ before :all do
7
+ Object.send(:remove_const, :Foo) if defined?(Foo)
8
+ @klass = Class.new { extend DataMapper::Model }
9
+
10
+ module Foo
11
+ class OtherProperty < DataMapper::Property::String; end
12
+ end
13
+ end
14
+
15
+ it 'provides access to Property classes' do
16
+ expect(@klass::Serial).to eq DataMapper::Property::Serial
17
+ end
18
+
19
+ it 'provides access to Property classes from outside of the Property namespace' do
20
+ expect(@klass::OtherProperty).to be(Foo::OtherProperty)
21
+ end
22
+
23
+ it 'does not provide access to unknown Property classes' do
24
+ expect {
25
+ @klass::Bla
26
+ }.to raise_error(NameError)
27
+ end
28
+ end
29
+ end