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,111 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Virtus::Equalizer, '.new' do
4
- let(:object) { described_class }
5
- let(:name) { 'User' }
6
-
7
- let(:klass) do
8
- klass = ::Class.new
9
- klass.send(:include, subject)
10
- klass
11
- end
12
-
13
- context 'with a name' do
14
- subject { object.new(name) }
15
-
16
- let(:instance) { klass.new }
17
-
18
- it { should be_instance_of(object) }
19
-
20
- describe '#eql?' do
21
- context 'when the objects are similar' do
22
- let(:other) { instance.dup }
23
-
24
- it { instance.eql?(other).should be(true) }
25
- end
26
-
27
- context 'when the objects are different' do
28
- let(:other) { stub('other') }
29
-
30
- it { instance.eql?(other).should be(false) }
31
- end
32
- end
33
-
34
- describe '#==' do
35
- context 'when the objects are similar' do
36
- let(:other) { instance.dup }
37
-
38
- it { (instance == other).should be(true) }
39
- end
40
-
41
- context 'when the objects are different' do
42
- let(:other) { stub('other') }
43
-
44
- it { (instance == other).should be(false) }
45
- end
46
- end
47
-
48
- describe '#hash' do
49
- it { instance.hash.should eql(klass.hash) }
50
- end
51
-
52
- describe '#inspect' do
53
- it { instance.inspect.should eql('#<User>') }
54
- end
55
- end
56
-
57
- context 'with a name and keys' do
58
- subject { object.new(name, keys) }
59
-
60
- let(:keys) { [ :first_name ].freeze }
61
- let(:first_name) { 'John' }
62
-
63
- let(:instance) do
64
- instance = klass.new
65
- instance.first_name = first_name
66
- instance
67
- end
68
-
69
- before do
70
- klass.send(:attr_accessor, *keys)
71
- end
72
-
73
- it { should be_instance_of(object) }
74
-
75
- describe '#eql?' do
76
- context 'when the objects are similar' do
77
- let(:other) { instance.dup }
78
-
79
- it { instance.eql?(other).should be(true) }
80
- end
81
-
82
- context 'when the objects are different' do
83
- let(:other) { stub('other') }
84
-
85
- it { instance.eql?(other).should be(false) }
86
- end
87
- end
88
-
89
- describe '#==' do
90
- context 'when the objects are similar' do
91
- let(:other) { instance.dup }
92
-
93
- it { (instance == other).should be(true) }
94
- end
95
-
96
- context 'when the objects are different' do
97
- let(:other) { stub('other') }
98
-
99
- it { (instance == other).should be(false) }
100
- end
101
- end
102
-
103
- describe '#hash' do
104
- it { instance.hash.should eql(klass.hash ^ first_name.hash) }
105
- end
106
-
107
- describe '#inspect' do
108
- it { instance.inspect.should eql('#<User first_name="John">') }
109
- end
110
- end
111
- end
@@ -1,47 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Virtus::Equalizer::Methods, '#eql?' do
4
- subject { object.eql?(other) }
5
-
6
- let(:object) { described_class.new }
7
-
8
- let(:described_class) do
9
- Class.new do
10
- include Virtus::Equalizer::Methods
11
-
12
- def cmp?(comparator, other)
13
- !!(comparator and other)
14
- end
15
- end
16
- end
17
-
18
- context 'with the same object' do
19
- let(:other) { object }
20
-
21
- it { should be(true) }
22
-
23
- it 'is symmetric' do
24
- should eql(other.eql?(object))
25
- end
26
- end
27
-
28
- context 'with an equivalent object' do
29
- let(:other) { object.dup }
30
-
31
- it { should be(true) }
32
-
33
- it 'is symmetric' do
34
- should eql(other.eql?(object))
35
- end
36
- end
37
-
38
- context 'with an equivalent object of a subclass' do
39
- let(:other) { Class.new(described_class).new }
40
-
41
- it { should be(false) }
42
-
43
- it 'is symmetric' do
44
- should eql(other.eql?(object))
45
- end
46
- end
47
- end
@@ -1,57 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Virtus::Equalizer::Methods, '#==' do
4
- subject { object == other }
5
-
6
- let(:object) { described_class.new }
7
-
8
- let(:described_class) do
9
- Class.new do
10
- include Virtus::Equalizer::Methods
11
-
12
- def cmp?(comparator, other)
13
- !!(comparator and other)
14
- end
15
- end
16
- end
17
-
18
- context 'with the same object' do
19
- let(:other) { object }
20
-
21
- it { should be(true) }
22
-
23
- it 'is symmetric' do
24
- should eql(other == object)
25
- end
26
- end
27
-
28
- context 'with an equivalent object' do
29
- let(:other) { object.dup }
30
-
31
- it { should be(true) }
32
-
33
- it 'is symmetric' do
34
- should eql(other == object)
35
- end
36
- end
37
-
38
- context 'with an equivalent object of a subclass' do
39
- let(:other) { Class.new(described_class).new }
40
-
41
- it { should be(true) }
42
-
43
- it 'is symmetric' do
44
- should eql(other == object)
45
- end
46
- end
47
-
48
- context 'with an object of another class' do
49
- let(:other) { Class.new.new }
50
-
51
- it { should be(false) }
52
-
53
- it 'is symmetric' do
54
- should eql(other == object)
55
- end
56
- end
57
- end
@@ -1,25 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Virtus::Extensions, '#allowed_writer_methods' do
4
- subject { object.allowed_writer_methods }
5
-
6
- let(:object) do
7
- Class.new do
8
- include Virtus
9
- attribute :virtus_attribute, String
10
- attr_accessor :some_other_attribute
11
- private
12
- attr_accessor :private_attribute
13
- end
14
- end
15
-
16
- it { should include('virtus_attribute=') }
17
- it { should include('some_other_attribute=') }
18
- it { should_not include('private_attribute=') }
19
-
20
- %w[ == != === []= attributes= ].each do |invalid_method|
21
- it { should_not include(invalid_method) }
22
- end
23
-
24
- it { should be_frozen }
25
- end
@@ -1,26 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Virtus::Extensions, '#attribute' do
4
- subject { object.attribute(name, type) }
5
-
6
- let(:object) { Class.new { extend Virtus::Extensions } }
7
- let(:descendant) { Class.new(object) }
8
- let(:name) { :name }
9
- let(:type) { Virtus::Attribute::String }
10
-
11
- def assert_attribute_added(klass, name, attribute_class)
12
- klass.should_not be_public_method_defined(name)
13
- subject
14
- klass.should_not be_public_method_defined(name)
15
- end
16
-
17
- it { should be(object) }
18
-
19
- it 'adds the attribute to the class' do
20
- assert_attribute_added(object, name, type)
21
- end
22
-
23
- it 'adds the attribute to the descendant' do
24
- assert_attribute_added(descendant, name, type)
25
- end
26
- end
@@ -1,140 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Virtus::InstanceMethods do
4
- let(:model) do
5
- Class.new do
6
- include Virtus
7
-
8
- attribute :name, String
9
- attribute :age, Integer
10
- attribute :email, String, :accessor => :private
11
-
12
- attr_accessor :non_attribute
13
-
14
- def private_non_attribute_reader
15
- @private_non_attribute
16
- end
17
-
18
- private
19
-
20
- attr_accessor :private_non_attribute
21
- end
22
- end
23
-
24
- let(:hash_object) do
25
- Class.new do
26
- def to_hash
27
- {:age => 5}
28
- end
29
- end.new
30
- end
31
-
32
- let(:attributes) { { :name => 'john', :age => 28 } }
33
-
34
- describe '#attributes' do
35
- subject { object.attributes }
36
-
37
- let(:object) { model.new(attributes) }
38
-
39
- it { should be_instance_of(Hash) }
40
-
41
- it { should eql(attributes) }
42
- end
43
-
44
- describe '#attributes=' do
45
- subject { object.attributes = attribute_values }
46
-
47
- let(:object) { model.new }
48
-
49
- context 'when given values for publicly writable attributes' do
50
- let(:attribute_values) { attributes }
51
-
52
- it { should be(attribute_values) }
53
-
54
- it 'sets all provided attribute values' do
55
- object.attributes.should eql(:age => nil, :name => nil)
56
- subject
57
- object.attributes.should eql(attributes)
58
- end
59
- end
60
-
61
- context 'when given string keys for attributes' do
62
- let(:attribute_values) { { 'name' => 'john', 'age' => 28 } }
63
-
64
- it { should be(attribute_values) }
65
-
66
- it 'sets values for publicly accessible attributes' do
67
- object.attributes.should eql(:age => nil, :name => nil)
68
- subject
69
- object.attributes.should eql(attributes)
70
- end
71
- end
72
-
73
- context 'when given values for privately writable attributes' do
74
- let(:attribute_values) { attributes.merge(:email => 'john@domain.tld') }
75
-
76
- it { should be(attribute_values) }
77
-
78
- it 'only sets values for publicly accessible attributes' do
79
- object.attributes.should eql(:age => nil, :name => nil)
80
- subject
81
- object.attributes.should eql(attributes)
82
- end
83
- end
84
-
85
- context 'when given values for non-attribute setters' do
86
- let(:attribute_values) { attributes.merge(:non_attribute => 'foobar') }
87
-
88
- it { should be(attribute_values) }
89
-
90
- it 'sets values for publicly accessible attributes' do
91
- object.attributes.should eql(:age => nil, :name => nil)
92
- subject
93
- object.attributes.should eql(attributes)
94
- end
95
-
96
- it 'sets publicly accessible non-Virtus attributes' do
97
- expect { subject }.to change { object.non_attribute }
98
- end
99
-
100
- it 'silently ignores private non-Virtus attributes' do
101
- expect { subject }.to_not change { object.private_non_attribute_reader }
102
- end
103
- end
104
-
105
- context "when given values that don't correspond to attributes" do
106
- let(:attribute_values) { attributes.merge(:quux => 'foobar') }
107
-
108
- it { should be(attribute_values) }
109
-
110
- it 'sets values for publicly accessible attributes' do
111
- object.attributes.should eql(:age => nil, :name => nil)
112
- subject
113
- object.attributes.should eql(attributes)
114
- end
115
-
116
- it 'silently ignores non-attribute keys' do
117
- expect { subject }.to_not raise_exception
118
- end
119
- end
120
-
121
- context "when given values respond_to?(:to_hash)" do
122
- let(:attribute_values) { hash_object }
123
-
124
- it 'sets attributes' do
125
- subject
126
- object.age.should == 5
127
- end
128
- end
129
-
130
- context "when given values does not respond_to?(:to_hash)" do
131
- let(:attribute_values) { '' }
132
-
133
- it 'raises an exception' do
134
- expect {
135
- subject
136
- }.to raise_error(NoMethodError, 'Expected "" to respond to #to_hash')
137
- end
138
- end
139
- end
140
- end
@@ -1,24 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Virtus::InstanceMethods, '#[]' do
4
- subject { object[:name] }
5
-
6
- let(:described_class) do
7
- Class.new do
8
- include Virtus
9
- attribute :name, String
10
- end
11
- end
12
-
13
- let(:object) do
14
- described_class.new(:name => value)
15
- end
16
-
17
- let(:value) do
18
- 'john'
19
- end
20
-
21
- it 'returns the value of an attribute' do
22
- should eql(value)
23
- end
24
- end
@@ -1,28 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Virtus::InstanceMethods, '#[]=' do
4
- subject { object[:name] = value }
5
-
6
- let(:described_class) do
7
- Class.new do
8
- include Virtus
9
- attribute :name, String
10
- end
11
- end
12
-
13
- let(:object) do
14
- described_class.new
15
- end
16
-
17
- let(:value) do
18
- 'john'
19
- end
20
-
21
- it 'returns the value' do
22
- should eql(value)
23
- end
24
-
25
- it 'sets value of an attribute' do
26
- expect { subject }.to change { object.name }.from(nil).to(value)
27
- end
28
- end