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.
- data/.rspec +1 -1
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/.travis.yml +6 -8
- data/Gemfile +8 -2
- data/Gemfile.devtools +24 -30
- data/Guardfile +17 -6
- data/README.md +215 -77
- data/TODO.md +6 -0
- data/config/flay.yml +2 -2
- data/config/flog.yml +1 -1
- data/config/mutant.yml +12 -1
- data/config/reek.yml +57 -66
- data/lib/virtus.rb +126 -42
- data/lib/virtus/attribute.rb +52 -240
- data/lib/virtus/attribute/accessor.rb +91 -0
- data/lib/virtus/attribute/boolean.rb +11 -8
- data/lib/virtus/attribute/builder.rb +120 -0
- data/lib/virtus/attribute/coercer.rb +51 -0
- data/lib/virtus/attribute/coercible.rb +14 -0
- data/lib/virtus/attribute/collection.rb +44 -90
- data/lib/virtus/attribute/default_value/from_callable.rb +1 -1
- data/lib/virtus/attribute/default_value/from_clonable.rb +1 -6
- data/lib/virtus/attribute/default_value/from_symbol.rb +3 -3
- data/lib/virtus/attribute/embedded_value.rb +37 -28
- data/lib/virtus/attribute/hash.rb +69 -71
- data/lib/virtus/attribute/lazy_default.rb +18 -0
- data/lib/virtus/attribute/strict.rb +16 -0
- data/lib/virtus/attribute_set.rb +81 -9
- data/lib/virtus/class_inclusions.rb +24 -17
- data/lib/virtus/class_methods.rb +13 -31
- data/lib/virtus/configuration.rb +77 -0
- data/lib/virtus/const_missing_extensions.rb +16 -0
- data/lib/virtus/extensions.rb +86 -61
- data/lib/virtus/instance_methods.rb +107 -128
- data/lib/virtus/model.rb +68 -0
- data/lib/virtus/module_builder.rb +184 -0
- data/lib/virtus/module_extensions.rb +27 -15
- data/lib/virtus/support/equalizer.rb +2 -3
- data/lib/virtus/support/type_lookup.rb +1 -1
- data/lib/virtus/value_object.rb +24 -31
- data/lib/virtus/version.rb +1 -1
- data/spec/integration/building_module_spec.rb +68 -0
- data/spec/integration/custom_attributes_spec.rb +8 -15
- data/spec/integration/custom_collection_attributes_spec.rb +101 -0
- data/spec/integration/default_values_spec.rb +9 -2
- data/spec/integration/defining_attributes_spec.rb +2 -2
- data/spec/integration/using_modules_spec.rb +5 -3
- data/spec/shared/freeze_method_behavior.rb +2 -2
- data/spec/shared/options_class_method.rb +1 -1
- data/spec/spec_helper.rb +25 -5
- data/spec/unit/virtus/attribute/boolean/value_coerced_predicate_spec.rb +25 -0
- data/spec/unit/virtus/attribute/class_methods/build_spec.rb +115 -22
- data/spec/unit/virtus/attribute/class_methods/coerce_spec.rb +32 -0
- data/spec/unit/virtus/attribute/coerce_spec.rb +38 -21
- data/spec/unit/virtus/attribute/coercible_predicate_spec.rb +20 -0
- data/spec/unit/virtus/attribute/collection/class_methods/build_spec.rb +84 -0
- data/spec/unit/virtus/attribute/collection/coerce_spec.rb +37 -24
- data/spec/unit/virtus/attribute/custom_collection_spec.rb +23 -0
- data/spec/unit/virtus/attribute/embedded_value/class_methods/build_spec.rb +37 -0
- data/spec/unit/virtus/attribute/embedded_value/coerce_spec.rb +46 -10
- data/spec/unit/virtus/attribute/get_spec.rb +15 -63
- data/spec/unit/virtus/attribute/hash/class_methods/build_spec.rb +80 -0
- data/spec/unit/virtus/attribute/hash/coerce_spec.rb +75 -13
- data/spec/unit/virtus/attribute/lazy_predicate_spec.rb +20 -0
- data/spec/unit/virtus/attribute/set_default_value_spec.rb +74 -0
- data/spec/unit/virtus/attribute/set_spec.rb +16 -36
- data/spec/unit/virtus/attribute/value_coerced_predicate_spec.rb +19 -0
- data/spec/unit/virtus/attribute_set/append_spec.rb +3 -5
- data/spec/unit/virtus/attribute_set/define_reader_method_spec.rb +1 -1
- data/spec/unit/virtus/attribute_set/define_writer_method_spec.rb +1 -1
- data/spec/unit/virtus/attribute_set/each_spec.rb +3 -3
- data/spec/unit/virtus/attribute_set/element_reference_spec.rb +1 -1
- data/spec/unit/virtus/attribute_set/element_set_spec.rb +4 -4
- data/spec/unit/virtus/attribute_set/merge_spec.rb +10 -16
- data/spec/unit/virtus/attribute_set/reset_spec.rb +6 -10
- data/spec/unit/virtus/attribute_spec.rb +222 -0
- data/spec/unit/virtus/attributes_reader_spec.rb +41 -0
- data/spec/unit/virtus/attributes_writer_spec.rb +51 -0
- data/spec/unit/virtus/class_methods/new_spec.rb +39 -0
- data/spec/unit/virtus/config_spec.rb +13 -0
- data/spec/unit/virtus/element_reader_spec.rb +21 -0
- data/spec/unit/virtus/element_writer_spec.rb +19 -0
- data/spec/unit/virtus/freeze_spec.rb +21 -0
- data/spec/unit/virtus/model_spec.rb +134 -0
- data/spec/unit/virtus/module_spec.rb +76 -0
- data/spec/unit/virtus/set_default_attributes_spec.rb +25 -0
- data/spec/unit/virtus/value_object_spec.rb +105 -0
- data/virtus.gemspec +4 -2
- metadata +82 -191
- data/.rvmrc +0 -1
- data/TODO +0 -1
- data/config/roodi.yml +0 -17
- data/lib/virtus/attribute/array.rb +0 -24
- data/lib/virtus/attribute/class.rb +0 -21
- data/lib/virtus/attribute/date.rb +0 -34
- data/lib/virtus/attribute/date_time.rb +0 -36
- data/lib/virtus/attribute/decimal.rb +0 -21
- data/lib/virtus/attribute/embedded_value/from_open_struct.rb +0 -19
- data/lib/virtus/attribute/embedded_value/from_struct.rb +0 -19
- data/lib/virtus/attribute/float.rb +0 -30
- data/lib/virtus/attribute/integer.rb +0 -27
- data/lib/virtus/attribute/numeric.rb +0 -11
- data/lib/virtus/attribute/object.rb +0 -11
- data/lib/virtus/attribute/set.rb +0 -24
- data/lib/virtus/attribute/string.rb +0 -24
- data/lib/virtus/attribute/symbol.rb +0 -21
- data/lib/virtus/attribute/time.rb +0 -36
- data/lib/virtus/coercion.rb +0 -32
- data/lib/virtus/coercion/array.rb +0 -23
- data/lib/virtus/coercion/date.rb +0 -26
- data/lib/virtus/coercion/date_time.rb +0 -26
- data/lib/virtus/coercion/decimal.rb +0 -40
- data/lib/virtus/coercion/false_class.rb +0 -24
- data/lib/virtus/coercion/float.rb +0 -39
- data/lib/virtus/coercion/hash.rb +0 -71
- data/lib/virtus/coercion/integer.rb +0 -83
- data/lib/virtus/coercion/numeric.rb +0 -66
- data/lib/virtus/coercion/object.rb +0 -125
- data/lib/virtus/coercion/string.rb +0 -218
- data/lib/virtus/coercion/symbol.rb +0 -24
- data/lib/virtus/coercion/time.rb +0 -40
- data/lib/virtus/coercion/time_coercions.rb +0 -86
- data/lib/virtus/coercion/true_class.rb +0 -24
- data/spec/unit/virtus/attribute/array/coerce_spec.rb +0 -13
- data/spec/unit/virtus/attribute/boolean/coerce_spec.rb +0 -85
- data/spec/unit/virtus/attribute/boolean/define_reader_method_spec.rb +0 -15
- data/spec/unit/virtus/attribute/boolean/value_coerced_spec.rb +0 -97
- data/spec/unit/virtus/attribute/boolean_spec.rb +0 -19
- data/spec/unit/virtus/attribute/class/coerce_spec.rb +0 -13
- data/spec/unit/virtus/attribute/class_methods/accessor_spec.rb +0 -12
- data/spec/unit/virtus/attribute/class_methods/coercion_method_spec.rb +0 -9
- data/spec/unit/virtus/attribute/class_methods/default_spec.rb +0 -9
- data/spec/unit/virtus/attribute/class_methods/determine_type_spec.rb +0 -117
- data/spec/unit/virtus/attribute/class_methods/merge_options_spec.rb +0 -11
- data/spec/unit/virtus/attribute/class_methods/primitive_spec.rb +0 -9
- data/spec/unit/virtus/attribute/class_methods/reader_spec.rb +0 -9
- data/spec/unit/virtus/attribute/class_methods/writer_spec.rb +0 -9
- data/spec/unit/virtus/attribute/coercion_method_spec.rb +0 -12
- data/spec/unit/virtus/attribute/collection/class_methods/merge_options_spec.rb +0 -40
- data/spec/unit/virtus/attribute/collection/coerce_and_append_member_spec.rb +0 -16
- data/spec/unit/virtus/attribute/collection/member_coercion/coerce_and_append_member_spec.rb +0 -18
- data/spec/unit/virtus/attribute/collection/member_type_spec.rb +0 -17
- data/spec/unit/virtus/attribute/collection/new_collection_spec.rb +0 -9
- data/spec/unit/virtus/attribute/date/coerce_spec.rb +0 -47
- data/spec/unit/virtus/attribute/date/value_coerced_spec.rb +0 -46
- data/spec/unit/virtus/attribute/date_time/coerce_spec.rb +0 -80
- data/spec/unit/virtus/attribute/decimal/coerce_spec.rb +0 -123
- data/spec/unit/virtus/attribute/default_spec.rb +0 -28
- data/spec/unit/virtus/attribute/default_value/call_spec.rb +0 -21
- data/spec/unit/virtus/attribute/default_value/class_methods/build_spec.rb +0 -23
- data/spec/unit/virtus/attribute/default_value/class_methods/new_spec.rb +0 -21
- data/spec/unit/virtus/attribute/default_value/from_callable/call_spec.rb +0 -19
- data/spec/unit/virtus/attribute/default_value/from_callable/class_methods/handle_spec.rb +0 -17
- data/spec/unit/virtus/attribute/default_value/from_clonable/call_spec.rb +0 -20
- data/spec/unit/virtus/attribute/default_value/from_clonable/class_methods/handle_spec.rb +0 -19
- data/spec/unit/virtus/attribute/default_value/from_symbol/call_spec.rb +0 -17
- data/spec/unit/virtus/attribute/default_value/from_symbol/class_methods/handle_spec.rb +0 -17
- data/spec/unit/virtus/attribute/default_value/value_spec.rb +0 -10
- data/spec/unit/virtus/attribute/define_accessor_methods_spec.rb +0 -26
- data/spec/unit/virtus/attribute/define_reader_method_spec.rb +0 -24
- data/spec/unit/virtus/attribute/define_writer_method_spec.rb +0 -24
- data/spec/unit/virtus/attribute/embedded_value/class_methods/determine_type_spec.rb +0 -23
- data/spec/unit/virtus/attribute/embedded_value/class_methods/merge_options_spec.rb +0 -17
- data/spec/unit/virtus/attribute/embedded_value/from_open_struct/coerce_spec.rb +0 -34
- data/spec/unit/virtus/attribute/embedded_value/from_struct/coerce_spec.rb +0 -34
- data/spec/unit/virtus/attribute/float/coerce_spec.rb +0 -123
- data/spec/unit/virtus/attribute/hash/class_methods/merge_options_spec.rb +0 -33
- data/spec/unit/virtus/attribute/hash/key_type_spec.rb +0 -10
- data/spec/unit/virtus/attribute/hash/value_type_spec.rb +0 -10
- data/spec/unit/virtus/attribute/inspect_spec.rb +0 -27
- data/spec/unit/virtus/attribute/integer/coerce_spec.rb +0 -117
- data/spec/unit/virtus/attribute/name_spec.rb +0 -12
- data/spec/unit/virtus/attribute/numeric/class_methods/descendants_spec.rb +0 -15
- data/spec/unit/virtus/attribute/numeric/class_methods/max_spec.rb +0 -9
- data/spec/unit/virtus/attribute/numeric/class_methods/min_spec.rb +0 -9
- data/spec/unit/virtus/attribute/options_spec.rb +0 -14
- data/spec/unit/virtus/attribute/public_reader_spec.rb +0 -24
- data/spec/unit/virtus/attribute/public_writer_spec.rb +0 -24
- data/spec/unit/virtus/attribute/set/coerce_spec.rb +0 -13
- data/spec/unit/virtus/attribute/string/coerce_spec.rb +0 -11
- data/spec/unit/virtus/attribute/symbol/coerce_spec.rb +0 -13
- data/spec/unit/virtus/attribute/time/coerce_spec.rb +0 -67
- data/spec/unit/virtus/attribute/value_coerced_spec.rb +0 -19
- data/spec/unit/virtus/class_methods/attribute_set_spec.rb +0 -9
- data/spec/unit/virtus/class_methods/attribute_spec.rb +0 -30
- data/spec/unit/virtus/class_methods/attributes_spec.rb +0 -22
- data/spec/unit/virtus/class_methods/const_missing_spec.rb +0 -27
- data/spec/unit/virtus/class_methods/inherited_spec.rb +0 -21
- data/spec/unit/virtus/coercion/array/class_methods/to_set_spec.rb +0 -12
- data/spec/unit/virtus/coercion/class_methods/element_reference_spec.rb +0 -17
- data/spec/unit/virtus/coercion/class_methods/primitive_spec.rb +0 -13
- data/spec/unit/virtus/coercion/date/class_methods/to_date_spec.rb +0 -10
- data/spec/unit/virtus/coercion/date/class_methods/to_datetime_spec.rb +0 -30
- data/spec/unit/virtus/coercion/date/class_methods/to_string_spec.rb +0 -12
- data/spec/unit/virtus/coercion/date/class_methods/to_time_spec.rb +0 -12
- data/spec/unit/virtus/coercion/date_time/class_methods/to_date_spec.rb +0 -30
- data/spec/unit/virtus/coercion/date_time/class_methods/to_datetime_spec.rb +0 -10
- data/spec/unit/virtus/coercion/date_time/class_methods/to_string_spec.rb +0 -12
- data/spec/unit/virtus/coercion/date_time/class_methods/to_time_spec.rb +0 -30
- data/spec/unit/virtus/coercion/decimal/class_methods/to_decimal_spec.rb +0 -9
- data/spec/unit/virtus/coercion/decimal/class_methods/to_float_spec.rb +0 -12
- data/spec/unit/virtus/coercion/decimal/class_methods/to_integer_spec.rb +0 -12
- data/spec/unit/virtus/coercion/decimal/class_methods/to_string_spec.rb +0 -12
- data/spec/unit/virtus/coercion/false_class/class_methods/to_string_spec.rb +0 -12
- data/spec/unit/virtus/coercion/float/class_methods/to_decimal_spec.rb +0 -12
- data/spec/unit/virtus/coercion/float/class_methods/to_float_spec.rb +0 -9
- data/spec/unit/virtus/coercion/float/class_methods/to_integer_spec.rb +0 -12
- data/spec/unit/virtus/coercion/float/class_methods/to_string_spec.rb +0 -12
- data/spec/unit/virtus/coercion/hash/class_methods/to_date_spec.rb +0 -38
- data/spec/unit/virtus/coercion/hash/class_methods/to_datetime_spec.rb +0 -38
- data/spec/unit/virtus/coercion/hash/class_methods/to_time_spec.rb +0 -38
- data/spec/unit/virtus/coercion/integer/class_methods/to_boolean_spec.rb +0 -25
- data/spec/unit/virtus/coercion/integer/class_methods/to_decimal_spec.rb +0 -12
- data/spec/unit/virtus/coercion/integer/class_methods/to_float_spec.rb +0 -12
- data/spec/unit/virtus/coercion/integer/class_methods/to_integer_spec.rb +0 -9
- data/spec/unit/virtus/coercion/integer/class_methods/to_string_spec.rb +0 -12
- data/spec/unit/virtus/coercion/numeric/class_methods/to_decimal_spec.rb +0 -10
- data/spec/unit/virtus/coercion/numeric/class_methods/to_float_spec.rb +0 -10
- data/spec/unit/virtus/coercion/numeric/class_methods/to_integer_spec.rb +0 -10
- data/spec/unit/virtus/coercion/numeric/class_methods/to_string_spec.rb +0 -12
- data/spec/unit/virtus/coercion/object/class_methods/method_missing_spec.rb +0 -33
- data/spec/unit/virtus/coercion/object/class_methods/to_array_spec.rb +0 -51
- data/spec/unit/virtus/coercion/object/class_methods/to_hash_spec.rb +0 -22
- data/spec/unit/virtus/coercion/object/class_methods/to_integer_spec.rb +0 -22
- data/spec/unit/virtus/coercion/object/class_methods/to_string_spec.rb +0 -22
- data/spec/unit/virtus/coercion/string/class_methods/to_boolean_spec.rb +0 -29
- data/spec/unit/virtus/coercion/string/class_methods/to_constant_spec.rb +0 -49
- data/spec/unit/virtus/coercion/string/class_methods/to_date_spec.rb +0 -23
- data/spec/unit/virtus/coercion/string/class_methods/to_datetime_spec.rb +0 -50
- data/spec/unit/virtus/coercion/string/class_methods/to_decimal_spec.rb +0 -47
- data/spec/unit/virtus/coercion/string/class_methods/to_float_spec.rb +0 -57
- data/spec/unit/virtus/coercion/string/class_methods/to_integer_spec.rb +0 -68
- data/spec/unit/virtus/coercion/string/class_methods/to_symbol_spec.rb +0 -9
- data/spec/unit/virtus/coercion/string/class_methods/to_time_spec.rb +0 -50
- data/spec/unit/virtus/coercion/symbol/class_methods/to_string_spec.rb +0 -12
- data/spec/unit/virtus/coercion/time/class_methods/to_integer_spec.rb +0 -10
- data/spec/unit/virtus/coercion/time/class_methods/to_time_spec.rb +0 -10
- data/spec/unit/virtus/coercion/time_coercions/to_date_spec.rb +0 -33
- data/spec/unit/virtus/coercion/time_coercions/to_datetime_spec.rb +0 -33
- data/spec/unit/virtus/coercion/time_coercions/to_string_spec.rb +0 -18
- data/spec/unit/virtus/coercion/time_coercions/to_time_spec.rb +0 -33
- data/spec/unit/virtus/coercion/true_class/class_methods/to_string_spec.rb +0 -12
- data/spec/unit/virtus/equalizer/append_spec.rb +0 -82
- data/spec/unit/virtus/equalizer/class_method/new_spec.rb +0 -111
- data/spec/unit/virtus/equalizer/methods/eql_spec.rb +0 -47
- data/spec/unit/virtus/equalizer/methods/equal_value_spec.rb +0 -57
- data/spec/unit/virtus/extensions/allowed_writer_methods_spec.rb +0 -25
- data/spec/unit/virtus/extensions/attribute_spec.rb +0 -26
- data/spec/unit/virtus/instance_methods/attributes_spec.rb +0 -140
- data/spec/unit/virtus/instance_methods/element_reference_spec.rb +0 -24
- data/spec/unit/virtus/instance_methods/element_set_spec.rb +0 -28
- data/spec/unit/virtus/instance_methods/freeze_spec.rb +0 -64
- data/spec/unit/virtus/instance_methods/initialize_spec.rb +0 -48
- data/spec/unit/virtus/instance_methods/to_hash_spec.rb +0 -23
- data/spec/unit/virtus/module_extensions/attribute_spec.rb +0 -31
- data/spec/unit/virtus/options/accept_options_spec.rb +0 -37
- data/spec/unit/virtus/options/accepted_options_spec.rb +0 -21
- data/spec/unit/virtus/options/options_spec.rb +0 -34
- data/spec/unit/virtus/type_lookup/class_methods/extended_spec.rb +0 -9
- data/spec/unit/virtus/type_lookup/determine_type_spec.rb +0 -81
- data/spec/unit/virtus/type_lookup/primitive_spec.rb +0 -9
- data/spec/unit/virtus/value_object/class_methods/allowed_writer_methods_spec.rb +0 -15
- data/spec/unit/virtus/value_object/class_methods/attribute_spec.rb +0 -50
- data/spec/unit/virtus/value_object/class_methods/equalizer_spec.rb +0 -24
- data/spec/unit/virtus/value_object/initialize_spec.rb +0 -19
- data/spec/unit/virtus/value_object/instance_methods/clone_spec.rb +0 -21
- 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,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
|