virtus 0.5.5 → 1.0.0.beta3

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 (268) hide show
  1. data/.rspec +1 -1
  2. data/.ruby-gemset +1 -0
  3. data/.ruby-version +1 -0
  4. data/.travis.yml +6 -8
  5. data/Gemfile +8 -2
  6. data/Gemfile.devtools +24 -30
  7. data/Guardfile +17 -6
  8. data/README.md +215 -77
  9. data/TODO.md +6 -0
  10. data/config/flay.yml +2 -2
  11. data/config/flog.yml +1 -1
  12. data/config/mutant.yml +12 -1
  13. data/config/reek.yml +57 -66
  14. data/lib/virtus.rb +126 -42
  15. data/lib/virtus/attribute.rb +52 -240
  16. data/lib/virtus/attribute/accessor.rb +91 -0
  17. data/lib/virtus/attribute/boolean.rb +11 -8
  18. data/lib/virtus/attribute/builder.rb +120 -0
  19. data/lib/virtus/attribute/coercer.rb +51 -0
  20. data/lib/virtus/attribute/coercible.rb +14 -0
  21. data/lib/virtus/attribute/collection.rb +44 -90
  22. data/lib/virtus/attribute/default_value/from_callable.rb +1 -1
  23. data/lib/virtus/attribute/default_value/from_clonable.rb +1 -6
  24. data/lib/virtus/attribute/default_value/from_symbol.rb +3 -3
  25. data/lib/virtus/attribute/embedded_value.rb +37 -28
  26. data/lib/virtus/attribute/hash.rb +69 -71
  27. data/lib/virtus/attribute/lazy_default.rb +18 -0
  28. data/lib/virtus/attribute/strict.rb +16 -0
  29. data/lib/virtus/attribute_set.rb +81 -9
  30. data/lib/virtus/class_inclusions.rb +24 -17
  31. data/lib/virtus/class_methods.rb +13 -31
  32. data/lib/virtus/configuration.rb +77 -0
  33. data/lib/virtus/const_missing_extensions.rb +16 -0
  34. data/lib/virtus/extensions.rb +86 -61
  35. data/lib/virtus/instance_methods.rb +107 -128
  36. data/lib/virtus/model.rb +68 -0
  37. data/lib/virtus/module_builder.rb +184 -0
  38. data/lib/virtus/module_extensions.rb +27 -15
  39. data/lib/virtus/support/equalizer.rb +2 -3
  40. data/lib/virtus/support/type_lookup.rb +1 -1
  41. data/lib/virtus/value_object.rb +24 -31
  42. data/lib/virtus/version.rb +1 -1
  43. data/spec/integration/building_module_spec.rb +68 -0
  44. data/spec/integration/custom_attributes_spec.rb +8 -15
  45. data/spec/integration/custom_collection_attributes_spec.rb +101 -0
  46. data/spec/integration/default_values_spec.rb +9 -2
  47. data/spec/integration/defining_attributes_spec.rb +2 -2
  48. data/spec/integration/using_modules_spec.rb +5 -3
  49. data/spec/shared/freeze_method_behavior.rb +2 -2
  50. data/spec/shared/options_class_method.rb +1 -1
  51. data/spec/spec_helper.rb +25 -5
  52. data/spec/unit/virtus/attribute/boolean/value_coerced_predicate_spec.rb +25 -0
  53. data/spec/unit/virtus/attribute/class_methods/build_spec.rb +115 -22
  54. data/spec/unit/virtus/attribute/class_methods/coerce_spec.rb +32 -0
  55. data/spec/unit/virtus/attribute/coerce_spec.rb +38 -21
  56. data/spec/unit/virtus/attribute/coercible_predicate_spec.rb +20 -0
  57. data/spec/unit/virtus/attribute/collection/class_methods/build_spec.rb +84 -0
  58. data/spec/unit/virtus/attribute/collection/coerce_spec.rb +37 -24
  59. data/spec/unit/virtus/attribute/custom_collection_spec.rb +23 -0
  60. data/spec/unit/virtus/attribute/embedded_value/class_methods/build_spec.rb +37 -0
  61. data/spec/unit/virtus/attribute/embedded_value/coerce_spec.rb +46 -10
  62. data/spec/unit/virtus/attribute/get_spec.rb +15 -63
  63. data/spec/unit/virtus/attribute/hash/class_methods/build_spec.rb +80 -0
  64. data/spec/unit/virtus/attribute/hash/coerce_spec.rb +75 -13
  65. data/spec/unit/virtus/attribute/lazy_predicate_spec.rb +20 -0
  66. data/spec/unit/virtus/attribute/set_default_value_spec.rb +74 -0
  67. data/spec/unit/virtus/attribute/set_spec.rb +16 -36
  68. data/spec/unit/virtus/attribute/value_coerced_predicate_spec.rb +19 -0
  69. data/spec/unit/virtus/attribute_set/append_spec.rb +3 -5
  70. data/spec/unit/virtus/attribute_set/define_reader_method_spec.rb +1 -1
  71. data/spec/unit/virtus/attribute_set/define_writer_method_spec.rb +1 -1
  72. data/spec/unit/virtus/attribute_set/each_spec.rb +3 -3
  73. data/spec/unit/virtus/attribute_set/element_reference_spec.rb +1 -1
  74. data/spec/unit/virtus/attribute_set/element_set_spec.rb +4 -4
  75. data/spec/unit/virtus/attribute_set/merge_spec.rb +10 -16
  76. data/spec/unit/virtus/attribute_set/reset_spec.rb +6 -10
  77. data/spec/unit/virtus/attribute_spec.rb +222 -0
  78. data/spec/unit/virtus/attributes_reader_spec.rb +41 -0
  79. data/spec/unit/virtus/attributes_writer_spec.rb +51 -0
  80. data/spec/unit/virtus/class_methods/new_spec.rb +39 -0
  81. data/spec/unit/virtus/config_spec.rb +13 -0
  82. data/spec/unit/virtus/element_reader_spec.rb +21 -0
  83. data/spec/unit/virtus/element_writer_spec.rb +19 -0
  84. data/spec/unit/virtus/freeze_spec.rb +21 -0
  85. data/spec/unit/virtus/model_spec.rb +134 -0
  86. data/spec/unit/virtus/module_spec.rb +76 -0
  87. data/spec/unit/virtus/set_default_attributes_spec.rb +25 -0
  88. data/spec/unit/virtus/value_object_spec.rb +105 -0
  89. data/virtus.gemspec +4 -2
  90. metadata +82 -191
  91. data/.rvmrc +0 -1
  92. data/TODO +0 -1
  93. data/config/roodi.yml +0 -17
  94. data/lib/virtus/attribute/array.rb +0 -24
  95. data/lib/virtus/attribute/class.rb +0 -21
  96. data/lib/virtus/attribute/date.rb +0 -34
  97. data/lib/virtus/attribute/date_time.rb +0 -36
  98. data/lib/virtus/attribute/decimal.rb +0 -21
  99. data/lib/virtus/attribute/embedded_value/from_open_struct.rb +0 -19
  100. data/lib/virtus/attribute/embedded_value/from_struct.rb +0 -19
  101. data/lib/virtus/attribute/float.rb +0 -30
  102. data/lib/virtus/attribute/integer.rb +0 -27
  103. data/lib/virtus/attribute/numeric.rb +0 -11
  104. data/lib/virtus/attribute/object.rb +0 -11
  105. data/lib/virtus/attribute/set.rb +0 -24
  106. data/lib/virtus/attribute/string.rb +0 -24
  107. data/lib/virtus/attribute/symbol.rb +0 -21
  108. data/lib/virtus/attribute/time.rb +0 -36
  109. data/lib/virtus/coercion.rb +0 -32
  110. data/lib/virtus/coercion/array.rb +0 -23
  111. data/lib/virtus/coercion/date.rb +0 -26
  112. data/lib/virtus/coercion/date_time.rb +0 -26
  113. data/lib/virtus/coercion/decimal.rb +0 -40
  114. data/lib/virtus/coercion/false_class.rb +0 -24
  115. data/lib/virtus/coercion/float.rb +0 -39
  116. data/lib/virtus/coercion/hash.rb +0 -71
  117. data/lib/virtus/coercion/integer.rb +0 -83
  118. data/lib/virtus/coercion/numeric.rb +0 -66
  119. data/lib/virtus/coercion/object.rb +0 -125
  120. data/lib/virtus/coercion/string.rb +0 -218
  121. data/lib/virtus/coercion/symbol.rb +0 -24
  122. data/lib/virtus/coercion/time.rb +0 -40
  123. data/lib/virtus/coercion/time_coercions.rb +0 -86
  124. data/lib/virtus/coercion/true_class.rb +0 -24
  125. data/spec/unit/virtus/attribute/array/coerce_spec.rb +0 -13
  126. data/spec/unit/virtus/attribute/boolean/coerce_spec.rb +0 -85
  127. data/spec/unit/virtus/attribute/boolean/define_reader_method_spec.rb +0 -15
  128. data/spec/unit/virtus/attribute/boolean/value_coerced_spec.rb +0 -97
  129. data/spec/unit/virtus/attribute/boolean_spec.rb +0 -19
  130. data/spec/unit/virtus/attribute/class/coerce_spec.rb +0 -13
  131. data/spec/unit/virtus/attribute/class_methods/accessor_spec.rb +0 -12
  132. data/spec/unit/virtus/attribute/class_methods/coercion_method_spec.rb +0 -9
  133. data/spec/unit/virtus/attribute/class_methods/default_spec.rb +0 -9
  134. data/spec/unit/virtus/attribute/class_methods/determine_type_spec.rb +0 -117
  135. data/spec/unit/virtus/attribute/class_methods/merge_options_spec.rb +0 -11
  136. data/spec/unit/virtus/attribute/class_methods/primitive_spec.rb +0 -9
  137. data/spec/unit/virtus/attribute/class_methods/reader_spec.rb +0 -9
  138. data/spec/unit/virtus/attribute/class_methods/writer_spec.rb +0 -9
  139. data/spec/unit/virtus/attribute/coercion_method_spec.rb +0 -12
  140. data/spec/unit/virtus/attribute/collection/class_methods/merge_options_spec.rb +0 -40
  141. data/spec/unit/virtus/attribute/collection/coerce_and_append_member_spec.rb +0 -16
  142. data/spec/unit/virtus/attribute/collection/member_coercion/coerce_and_append_member_spec.rb +0 -18
  143. data/spec/unit/virtus/attribute/collection/member_type_spec.rb +0 -17
  144. data/spec/unit/virtus/attribute/collection/new_collection_spec.rb +0 -9
  145. data/spec/unit/virtus/attribute/date/coerce_spec.rb +0 -47
  146. data/spec/unit/virtus/attribute/date/value_coerced_spec.rb +0 -46
  147. data/spec/unit/virtus/attribute/date_time/coerce_spec.rb +0 -80
  148. data/spec/unit/virtus/attribute/decimal/coerce_spec.rb +0 -123
  149. data/spec/unit/virtus/attribute/default_spec.rb +0 -28
  150. data/spec/unit/virtus/attribute/default_value/call_spec.rb +0 -21
  151. data/spec/unit/virtus/attribute/default_value/class_methods/build_spec.rb +0 -23
  152. data/spec/unit/virtus/attribute/default_value/class_methods/new_spec.rb +0 -21
  153. data/spec/unit/virtus/attribute/default_value/from_callable/call_spec.rb +0 -19
  154. data/spec/unit/virtus/attribute/default_value/from_callable/class_methods/handle_spec.rb +0 -17
  155. data/spec/unit/virtus/attribute/default_value/from_clonable/call_spec.rb +0 -20
  156. data/spec/unit/virtus/attribute/default_value/from_clonable/class_methods/handle_spec.rb +0 -19
  157. data/spec/unit/virtus/attribute/default_value/from_symbol/call_spec.rb +0 -17
  158. data/spec/unit/virtus/attribute/default_value/from_symbol/class_methods/handle_spec.rb +0 -17
  159. data/spec/unit/virtus/attribute/default_value/value_spec.rb +0 -10
  160. data/spec/unit/virtus/attribute/define_accessor_methods_spec.rb +0 -26
  161. data/spec/unit/virtus/attribute/define_reader_method_spec.rb +0 -24
  162. data/spec/unit/virtus/attribute/define_writer_method_spec.rb +0 -24
  163. data/spec/unit/virtus/attribute/embedded_value/class_methods/determine_type_spec.rb +0 -23
  164. data/spec/unit/virtus/attribute/embedded_value/class_methods/merge_options_spec.rb +0 -17
  165. data/spec/unit/virtus/attribute/embedded_value/from_open_struct/coerce_spec.rb +0 -34
  166. data/spec/unit/virtus/attribute/embedded_value/from_struct/coerce_spec.rb +0 -34
  167. data/spec/unit/virtus/attribute/float/coerce_spec.rb +0 -123
  168. data/spec/unit/virtus/attribute/hash/class_methods/merge_options_spec.rb +0 -33
  169. data/spec/unit/virtus/attribute/hash/key_type_spec.rb +0 -10
  170. data/spec/unit/virtus/attribute/hash/value_type_spec.rb +0 -10
  171. data/spec/unit/virtus/attribute/inspect_spec.rb +0 -27
  172. data/spec/unit/virtus/attribute/integer/coerce_spec.rb +0 -117
  173. data/spec/unit/virtus/attribute/name_spec.rb +0 -12
  174. data/spec/unit/virtus/attribute/numeric/class_methods/descendants_spec.rb +0 -15
  175. data/spec/unit/virtus/attribute/numeric/class_methods/max_spec.rb +0 -9
  176. data/spec/unit/virtus/attribute/numeric/class_methods/min_spec.rb +0 -9
  177. data/spec/unit/virtus/attribute/options_spec.rb +0 -14
  178. data/spec/unit/virtus/attribute/public_reader_spec.rb +0 -24
  179. data/spec/unit/virtus/attribute/public_writer_spec.rb +0 -24
  180. data/spec/unit/virtus/attribute/set/coerce_spec.rb +0 -13
  181. data/spec/unit/virtus/attribute/string/coerce_spec.rb +0 -11
  182. data/spec/unit/virtus/attribute/symbol/coerce_spec.rb +0 -13
  183. data/spec/unit/virtus/attribute/time/coerce_spec.rb +0 -67
  184. data/spec/unit/virtus/attribute/value_coerced_spec.rb +0 -19
  185. data/spec/unit/virtus/class_methods/attribute_set_spec.rb +0 -9
  186. data/spec/unit/virtus/class_methods/attribute_spec.rb +0 -30
  187. data/spec/unit/virtus/class_methods/attributes_spec.rb +0 -22
  188. data/spec/unit/virtus/class_methods/const_missing_spec.rb +0 -27
  189. data/spec/unit/virtus/class_methods/inherited_spec.rb +0 -21
  190. data/spec/unit/virtus/coercion/array/class_methods/to_set_spec.rb +0 -12
  191. data/spec/unit/virtus/coercion/class_methods/element_reference_spec.rb +0 -17
  192. data/spec/unit/virtus/coercion/class_methods/primitive_spec.rb +0 -13
  193. data/spec/unit/virtus/coercion/date/class_methods/to_date_spec.rb +0 -10
  194. data/spec/unit/virtus/coercion/date/class_methods/to_datetime_spec.rb +0 -30
  195. data/spec/unit/virtus/coercion/date/class_methods/to_string_spec.rb +0 -12
  196. data/spec/unit/virtus/coercion/date/class_methods/to_time_spec.rb +0 -12
  197. data/spec/unit/virtus/coercion/date_time/class_methods/to_date_spec.rb +0 -30
  198. data/spec/unit/virtus/coercion/date_time/class_methods/to_datetime_spec.rb +0 -10
  199. data/spec/unit/virtus/coercion/date_time/class_methods/to_string_spec.rb +0 -12
  200. data/spec/unit/virtus/coercion/date_time/class_methods/to_time_spec.rb +0 -30
  201. data/spec/unit/virtus/coercion/decimal/class_methods/to_decimal_spec.rb +0 -9
  202. data/spec/unit/virtus/coercion/decimal/class_methods/to_float_spec.rb +0 -12
  203. data/spec/unit/virtus/coercion/decimal/class_methods/to_integer_spec.rb +0 -12
  204. data/spec/unit/virtus/coercion/decimal/class_methods/to_string_spec.rb +0 -12
  205. data/spec/unit/virtus/coercion/false_class/class_methods/to_string_spec.rb +0 -12
  206. data/spec/unit/virtus/coercion/float/class_methods/to_decimal_spec.rb +0 -12
  207. data/spec/unit/virtus/coercion/float/class_methods/to_float_spec.rb +0 -9
  208. data/spec/unit/virtus/coercion/float/class_methods/to_integer_spec.rb +0 -12
  209. data/spec/unit/virtus/coercion/float/class_methods/to_string_spec.rb +0 -12
  210. data/spec/unit/virtus/coercion/hash/class_methods/to_date_spec.rb +0 -38
  211. data/spec/unit/virtus/coercion/hash/class_methods/to_datetime_spec.rb +0 -38
  212. data/spec/unit/virtus/coercion/hash/class_methods/to_time_spec.rb +0 -38
  213. data/spec/unit/virtus/coercion/integer/class_methods/to_boolean_spec.rb +0 -25
  214. data/spec/unit/virtus/coercion/integer/class_methods/to_decimal_spec.rb +0 -12
  215. data/spec/unit/virtus/coercion/integer/class_methods/to_float_spec.rb +0 -12
  216. data/spec/unit/virtus/coercion/integer/class_methods/to_integer_spec.rb +0 -9
  217. data/spec/unit/virtus/coercion/integer/class_methods/to_string_spec.rb +0 -12
  218. data/spec/unit/virtus/coercion/numeric/class_methods/to_decimal_spec.rb +0 -10
  219. data/spec/unit/virtus/coercion/numeric/class_methods/to_float_spec.rb +0 -10
  220. data/spec/unit/virtus/coercion/numeric/class_methods/to_integer_spec.rb +0 -10
  221. data/spec/unit/virtus/coercion/numeric/class_methods/to_string_spec.rb +0 -12
  222. data/spec/unit/virtus/coercion/object/class_methods/method_missing_spec.rb +0 -33
  223. data/spec/unit/virtus/coercion/object/class_methods/to_array_spec.rb +0 -51
  224. data/spec/unit/virtus/coercion/object/class_methods/to_hash_spec.rb +0 -22
  225. data/spec/unit/virtus/coercion/object/class_methods/to_integer_spec.rb +0 -22
  226. data/spec/unit/virtus/coercion/object/class_methods/to_string_spec.rb +0 -22
  227. data/spec/unit/virtus/coercion/string/class_methods/to_boolean_spec.rb +0 -29
  228. data/spec/unit/virtus/coercion/string/class_methods/to_constant_spec.rb +0 -49
  229. data/spec/unit/virtus/coercion/string/class_methods/to_date_spec.rb +0 -23
  230. data/spec/unit/virtus/coercion/string/class_methods/to_datetime_spec.rb +0 -50
  231. data/spec/unit/virtus/coercion/string/class_methods/to_decimal_spec.rb +0 -47
  232. data/spec/unit/virtus/coercion/string/class_methods/to_float_spec.rb +0 -57
  233. data/spec/unit/virtus/coercion/string/class_methods/to_integer_spec.rb +0 -68
  234. data/spec/unit/virtus/coercion/string/class_methods/to_symbol_spec.rb +0 -9
  235. data/spec/unit/virtus/coercion/string/class_methods/to_time_spec.rb +0 -50
  236. data/spec/unit/virtus/coercion/symbol/class_methods/to_string_spec.rb +0 -12
  237. data/spec/unit/virtus/coercion/time/class_methods/to_integer_spec.rb +0 -10
  238. data/spec/unit/virtus/coercion/time/class_methods/to_time_spec.rb +0 -10
  239. data/spec/unit/virtus/coercion/time_coercions/to_date_spec.rb +0 -33
  240. data/spec/unit/virtus/coercion/time_coercions/to_datetime_spec.rb +0 -33
  241. data/spec/unit/virtus/coercion/time_coercions/to_string_spec.rb +0 -18
  242. data/spec/unit/virtus/coercion/time_coercions/to_time_spec.rb +0 -33
  243. data/spec/unit/virtus/coercion/true_class/class_methods/to_string_spec.rb +0 -12
  244. data/spec/unit/virtus/equalizer/append_spec.rb +0 -82
  245. data/spec/unit/virtus/equalizer/class_method/new_spec.rb +0 -111
  246. data/spec/unit/virtus/equalizer/methods/eql_spec.rb +0 -47
  247. data/spec/unit/virtus/equalizer/methods/equal_value_spec.rb +0 -57
  248. data/spec/unit/virtus/extensions/allowed_writer_methods_spec.rb +0 -25
  249. data/spec/unit/virtus/extensions/attribute_spec.rb +0 -26
  250. data/spec/unit/virtus/instance_methods/attributes_spec.rb +0 -140
  251. data/spec/unit/virtus/instance_methods/element_reference_spec.rb +0 -24
  252. data/spec/unit/virtus/instance_methods/element_set_spec.rb +0 -28
  253. data/spec/unit/virtus/instance_methods/freeze_spec.rb +0 -64
  254. data/spec/unit/virtus/instance_methods/initialize_spec.rb +0 -48
  255. data/spec/unit/virtus/instance_methods/to_hash_spec.rb +0 -23
  256. data/spec/unit/virtus/module_extensions/attribute_spec.rb +0 -31
  257. data/spec/unit/virtus/options/accept_options_spec.rb +0 -37
  258. data/spec/unit/virtus/options/accepted_options_spec.rb +0 -21
  259. data/spec/unit/virtus/options/options_spec.rb +0 -34
  260. data/spec/unit/virtus/type_lookup/class_methods/extended_spec.rb +0 -9
  261. data/spec/unit/virtus/type_lookup/determine_type_spec.rb +0 -81
  262. data/spec/unit/virtus/type_lookup/primitive_spec.rb +0 -9
  263. data/spec/unit/virtus/value_object/class_methods/allowed_writer_methods_spec.rb +0 -15
  264. data/spec/unit/virtus/value_object/class_methods/attribute_spec.rb +0 -50
  265. data/spec/unit/virtus/value_object/class_methods/equalizer_spec.rb +0 -24
  266. data/spec/unit/virtus/value_object/initialize_spec.rb +0 -19
  267. data/spec/unit/virtus/value_object/instance_methods/clone_spec.rb +0 -21
  268. data/spec/unit/virtus/value_object/instance_methods/with_spec.rb +0 -31
@@ -1,64 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Virtus::InstanceMethods, '#freeze' do
4
- subject { object.freeze }
5
-
6
- let(:object) do
7
- described_class.new(attributes)
8
- end
9
-
10
- context 'on class with no defaults' do
11
- let(:described_class) do
12
- Class.new do
13
- include Virtus
14
- attribute :name, String
15
- end
16
- end
17
-
18
- let(:attributes) { { :name => 'John' } }
19
-
20
- it_should_behave_like 'a #freeze method'
21
- end
22
-
23
- context 'on class with literal default' do
24
- let(:described_class) do
25
- Class.new do
26
- include Virtus
27
- attribute :name, String, :default => 'John'
28
- end
29
- end
30
-
31
- context 'when value is provided' do
32
- let(:attributes) { { :name => 'John' } }
33
-
34
- it_should_behave_like 'a #freeze method'
35
- end
36
-
37
- context 'when value is NOT provided' do
38
- let(:attributes) {}
39
-
40
- it_should_behave_like 'a #freeze method'
41
- end
42
- end
43
-
44
- context 'on class with computed default' do
45
- let(:described_class) do
46
- Class.new do
47
- include Virtus
48
- attribute :name, String, :default => proc { 'John' }
49
- end
50
- end
51
-
52
- context 'when value is provided' do
53
- let(:attributes) { { :name => 'John' } }
54
-
55
- it_should_behave_like 'a #freeze method'
56
- end
57
-
58
- context 'when value is NOT provided' do
59
- let(:attributes) {}
60
-
61
- it_should_behave_like 'a #freeze method'
62
- end
63
- end
64
- end
@@ -1,48 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Virtus::InstanceMethods, '#initialize' do
4
- let(:described_class) do
5
- Class.new do
6
- include Virtus
7
- attribute :name, String
8
- end
9
- end
10
-
11
- context 'with no arguments' do
12
- subject { described_class.new }
13
-
14
- it 'does not set attributes' do
15
- subject.name.should be_nil
16
- end
17
- end
18
-
19
- context 'with nil' do
20
- subject { described_class.new(nil) }
21
-
22
- it 'does not set attributes' do
23
- subject.name.should be_nil
24
- end
25
- end
26
-
27
- context 'with an argument that responds to #to_hash' do
28
- subject { described_class.new(attributes) }
29
-
30
- let(:attributes) do
31
- Class.new do
32
- def to_hash
33
- {:name => 'John'}
34
- end
35
- end.new
36
- end
37
-
38
- it 'sets attributes' do
39
- subject.name.should == 'John'
40
- end
41
- end
42
-
43
- context 'with an argument that does not respond to #to_hash' do
44
- subject { described_class.new(Object.new) }
45
-
46
- specify { expect { subject }.to raise_error(NoMethodError) }
47
- end
48
- end
@@ -1,23 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Virtus::InstanceMethods, '#to_hash' do
4
- subject { object.to_hash }
5
-
6
- class Model
7
- include Virtus
8
-
9
- attribute :name, String
10
- attribute :age, Integer
11
- attribute :email, String, :accessor => :private
12
- end
13
-
14
- let(:model) { Model }
15
- let(:object) { model.new(attributes) }
16
- let(:attributes) { { :name => 'john', :age => 28 } }
17
-
18
- it { should be_instance_of(Hash) }
19
-
20
- it 'returns attributes' do
21
- should eql(attributes)
22
- end
23
- end
@@ -1,31 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Virtus::ModuleExtensions, '#attribute' do
4
- subject { object.attribute(name, type, options) }
5
-
6
- let(:object) { Module.new }
7
- let(:name) { :name }
8
- let(:type) { String }
9
- let(:options) { { :default => default } }
10
- let(:default) { 'John Doe'.freeze }
11
-
12
- before do
13
- object.extend(Virtus::ModuleExtensions)
14
- end
15
-
16
- it { should be(object) }
17
-
18
- it 'tracks the attribute for extension' do
19
- subject
20
- instance = Object.new
21
- instance.extend(object)
22
- instance.attributes[name].should eql(default)
23
- end
24
-
25
- it 'tracks the attribute for inclusion' do
26
- subject
27
- klass = Class.new
28
- klass.send(:include, object)
29
- klass.attribute_set[name].should eql(Virtus::Attribute::String.new(name, options))
30
- end
31
- end
@@ -1,37 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Virtus::Options, '#accept_options' do
4
- let!(:object) do
5
- Class.new do
6
- extend DescendantsTracker
7
- extend Virtus::Options
8
- end
9
- end
10
- let!(:object_without_options) { object.dup }
11
- let(:descendant) { Class.new(object) }
12
- let(:new_option) { :width }
13
-
14
- before do
15
- object.accept_options(new_option)
16
- end
17
-
18
- it 'does not have accepted options by default' do
19
- object_without_options.accepted_options.should_not include(new_option)
20
- end
21
-
22
- it 'sets new accepted options on itself' do
23
- object.accepted_options.should include(new_option)
24
- end
25
-
26
- it 'sets new accepted option on its descendants' do
27
- descendant.accepted_options.should include(new_option)
28
- end
29
-
30
- it 'creates option accessors' do
31
- object.should respond_to(new_option)
32
- end
33
-
34
- it 'creates option accessors on descendant' do
35
- descendant.should respond_to(new_option)
36
- end
37
- end
@@ -1,21 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Virtus::Options, '#accepted_options' do
4
- subject { object.accepted_options }
5
-
6
- specify { object.should respond_to(:accepted_options) }
7
-
8
- let(:object) do
9
- Class.new do
10
- extend DescendantsTracker
11
- extend Virtus::Options
12
- end
13
- end
14
-
15
- let(:options) { [ :width, :height ] }
16
-
17
- before { object.accept_options(*options) }
18
-
19
- it { should be_instance_of(Array) }
20
- it { should include(*options) }
21
- end
@@ -1,34 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Virtus::Options, '#options' do
4
- subject { object.options }
5
-
6
- let(:object) do
7
- Class.new do
8
- extend Virtus::Options, DescendantsTracker
9
- end
10
- end
11
-
12
- context 'with an option that has a default value' do
13
- let(:default_value) { stub('default_value') }
14
-
15
- before do
16
- object.accept_options :name
17
- object.name default_value
18
- end
19
-
20
- it { should be_instance_of(Hash) }
21
-
22
- it { should eql(:name => default_value) }
23
- end
24
-
25
- context 'with an option that does not have a default value' do
26
- before do
27
- object.accept_options :name
28
- end
29
-
30
- it { should be_instance_of(Hash) }
31
-
32
- it { should be_empty }
33
- end
34
- end
@@ -1,9 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Virtus::TypeLookup, '.extended' do
4
- let(:type) { Class.new { extend Virtus::TypeLookup } }
5
-
6
- it 'sets type_lookup_catch ivar' do
7
- type.instance_variable_get('@type_lookup_cache').should eql({})
8
- end
9
- end
@@ -1,81 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Virtus::TypeLookup, '#determine_type' do
4
- subject { object.determine_type(class_or_name) }
5
-
6
- let!(:object) do
7
- Class.new do
8
- extend DescendantsTracker
9
- extend Virtus::TypeLookup
10
- end
11
- end
12
-
13
- let!(:default) do
14
- object.const_set :Object, Class.new(object) {
15
- def self.primitive() ::Object end
16
- }
17
- end
18
-
19
- let!(:descendant) do
20
- object.const_set :String, Class.new(default) {
21
- def self.primitive() ::String end
22
- }
23
- end
24
-
25
- # add a default subclass to the top of the stack
26
- let!(:extra) { Class.new(default) }
27
-
28
- # assert the classes are subclassed in a specific order that will trigger
29
- # the bug that this commit fixes. Do not remove or change the order below.
30
- it 'has the descendants in the expected order' do
31
- object.descendants.should == [ extra, descendant, default ]
32
- end
33
-
34
- context 'with a TypeLookup class' do
35
- context 'when the argument is a descendant of the object' do
36
- let(:class_or_name) { descendant }
37
-
38
- it { should equal(descendant) }
39
- end
40
-
41
- context 'when the argument is the same object' do
42
- let(:class_or_name) { object }
43
-
44
- it { should be_nil }
45
- end
46
- end
47
-
48
- context 'with a class' do
49
- context 'when the argument is a known primitive' do
50
- let(:class_or_name) { ::String }
51
-
52
- it { should equal(descendant) }
53
- end
54
-
55
- context 'when the argument is an unknown class' do
56
- let(:class_or_name) { Class.new }
57
-
58
- it { should equal(default) }
59
- end
60
- end
61
-
62
- context 'with an instance' do
63
- context 'when the argument is the name of a known constant' do
64
- let(:class_or_name) { 'String' }
65
-
66
- it { should equal(descendant) }
67
- end
68
-
69
- context 'when the argument does not stringify to a valid constant name' do
70
- let(:class_or_name) { Object.new }
71
-
72
- it { should be_nil }
73
- end
74
-
75
- context 'when the argument is not the name of a known constant' do
76
- let(:class_or_name) { 'Unknown' }
77
-
78
- it { should be_nil }
79
- end
80
- end
81
- end
@@ -1,9 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Virtus::TypeLookup, '#primitive' do
4
- subject { object.primitive }
5
-
6
- let(:object) { Class.new { extend Virtus::TypeLookup } }
7
-
8
- specify { expect { subject }.to raise_error(NotImplementedError, "#{object}.primitive must be implemented") }
9
- end
@@ -1,15 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Virtus::ValueObject::ClassMethods, '#allowed_writer_methods' do
4
- subject { object.allowed_writer_methods }
5
-
6
- let(:object) do
7
- Class.new do
8
- include Virtus::ValueObject
9
- attribute :virtus_attribute, String
10
- end
11
- end
12
-
13
- it { should include('virtus_attribute=') }
14
- it { should be_frozen }
15
- end
@@ -1,50 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Virtus::ValueObject, '.attribute' do
4
- let(:object) { Class.new { include Virtus::ValueObject } }
5
- let(:name) { :latitude }
6
- let(:type) { Float }
7
- let(:attribute) { object.attribute_set[name] }
8
-
9
- context 'without options' do
10
- subject { object.attribute(name, type) }
11
-
12
- it { should be(object) }
13
-
14
- it 'adds the attribute to the equalizer' do
15
- object.new.inspect.should_not match(/\b#{name}=\b/)
16
- subject
17
- object.new.inspect.should match(/\b#{name}=\b/)
18
- end
19
-
20
- it 'sets the writer to be private' do
21
- subject
22
- attribute.options[:writer].should be(:private)
23
- end
24
- end
25
-
26
- context 'with options' do
27
- subject { object.attribute(name, type, options) }
28
-
29
- let(:options) { { :default => default } }
30
- let(:default) { 1.0 }
31
-
32
- it { should be(object) }
33
-
34
- it 'adds the attribute to the equalizer' do
35
- object.new.inspect.should_not match(/\b#{name}=\b/)
36
- subject
37
- object.new.inspect.should match(/\b#{name}=\b/)
38
- end
39
-
40
- it 'sets the writer to be private' do
41
- subject
42
- attribute.options[:writer].should be(:private)
43
- end
44
-
45
- it 'sets the default' do
46
- subject
47
- attribute.default.value.should eql(1.0)
48
- end
49
- end
50
- end
@@ -1,24 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Virtus::ValueObject, '.equalizer' do
4
- subject { described_class.equalizer }
5
-
6
- let(:described_class) do
7
- Class.new do
8
- include Virtus::ValueObject
9
-
10
- attribute :first_name, String
11
- end
12
- end
13
-
14
- specify { subject.should be_instance_of(Virtus::Equalizer) }
15
- specify { described_class.included_modules.should include(subject) }
16
-
17
- context 'when equalizer is already initialized' do
18
- before { subject; described_class.equalizer }
19
-
20
- let(:equalizer) { subject }
21
-
22
- specify { subject.should be(equalizer) }
23
- end
24
- end