virtus 0.0.5 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +9 -2
- data/.yardopts +1 -0
- data/History.md +51 -0
- data/{README.markdown → README.md} +63 -7
- data/TODO +2 -4
- data/VERSION +1 -1
- data/config/flay.yml +2 -2
- data/config/flog.yml +1 -1
- data/config/roodi.yml +5 -6
- data/config/site.reek +3 -3
- data/examples/custom_coercion_spec.rb +50 -0
- data/examples/default_values_spec.rb +21 -0
- data/lib/virtus.rb +21 -6
- data/lib/virtus/attribute.rb +113 -253
- data/lib/virtus/attribute/array.rb +6 -3
- data/lib/virtus/attribute/boolean.rb +9 -28
- data/lib/virtus/attribute/date.rb +9 -12
- data/lib/virtus/attribute/date_time.rb +10 -12
- data/lib/virtus/attribute/decimal.rb +4 -11
- data/lib/virtus/attribute/float.rb +4 -11
- data/lib/virtus/attribute/hash.rb +5 -3
- data/lib/virtus/attribute/integer.rb +4 -11
- data/lib/virtus/attribute/numeric.rb +1 -0
- data/lib/virtus/attribute/object.rb +1 -0
- data/lib/virtus/attribute/string.rb +4 -11
- data/lib/virtus/attribute/time.rb +9 -16
- data/lib/virtus/class_methods.rb +42 -7
- data/lib/virtus/coercion.rb +32 -0
- data/lib/virtus/coercion/date.rb +26 -0
- data/lib/virtus/coercion/date_time.rb +26 -0
- data/lib/virtus/coercion/decimal.rb +40 -0
- data/lib/virtus/coercion/false_class.rb +24 -0
- data/lib/virtus/coercion/float.rb +24 -0
- data/lib/virtus/coercion/hash.rb +82 -0
- data/lib/virtus/coercion/integer.rb +60 -0
- data/lib/virtus/coercion/numeric.rb +66 -0
- data/lib/virtus/coercion/object.rb +25 -0
- data/lib/virtus/coercion/string.rb +155 -0
- data/lib/virtus/coercion/symbol.rb +24 -0
- data/lib/virtus/coercion/time.rb +26 -0
- data/lib/virtus/coercion/time_coercions.rb +85 -0
- data/lib/virtus/coercion/true_class.rb +24 -0
- data/lib/virtus/instance_methods.rb +7 -0
- data/lib/virtus/support/descendants_tracker.rb +1 -1
- data/lib/virtus/support/options.rb +114 -0
- data/lib/virtus/support/type_lookup.rb +95 -0
- data/spec/integration/virtus/attributes/attribute/{typecast_spec.rb → set_spec.rb} +7 -7
- data/spec/unit/shared/attribute.rb +3 -3
- data/spec/unit/shared/attribute/accept_options.rb +0 -18
- data/spec/unit/shared/attribute/accepted_options.rb +0 -6
- data/spec/unit/shared/attribute/get.rb +32 -17
- data/spec/unit/shared/attribute/inspect.rb +7 -0
- data/spec/unit/shared/attribute/primitive.rb +15 -0
- data/spec/unit/shared/attribute/set.rb +16 -21
- data/spec/unit/virtus/attribute/array_spec.rb +18 -3
- data/spec/unit/virtus/attribute/boolean_spec.rb +8 -6
- data/spec/unit/virtus/attribute/date_spec.rb +8 -6
- data/spec/unit/virtus/attribute/date_time_spec.rb +8 -6
- data/spec/unit/virtus/attribute/decimal_spec.rb +18 -6
- data/spec/unit/virtus/attribute/float_spec.rb +19 -7
- data/spec/unit/virtus/attribute/hash_spec.rb +5 -3
- data/spec/unit/virtus/attribute/integer_spec.rb +10 -8
- data/spec/unit/virtus/attribute/string_spec.rb +10 -8
- data/spec/unit/virtus/attribute/time_spec.rb +8 -6
- data/spec/unit/virtus/class_methods/attributes_spec.rb +11 -0
- data/spec/unit/virtus/coercion/class_name_reference_spec.rb +17 -0
- data/spec/unit/virtus/coercion/date/class_methods/to_datetime_spec.rb +30 -0
- data/spec/unit/virtus/coercion/date/class_methods/to_string_spec.rb +12 -0
- data/spec/unit/virtus/coercion/date/class_methods/to_time_spec.rb +12 -0
- data/spec/unit/virtus/coercion/date_time/class_methods/to_date_spec.rb +30 -0
- data/spec/unit/virtus/coercion/date_time/class_methods/to_string_spec.rb +12 -0
- data/spec/unit/virtus/coercion/date_time/class_methods/to_time_spec.rb +30 -0
- data/spec/unit/virtus/coercion/decimal/class_methods/to_float_spec.rb +12 -0
- data/spec/unit/virtus/coercion/decimal/class_methods/to_integer_spec.rb +12 -0
- data/spec/unit/virtus/coercion/decimal/class_methods/to_string_spec.rb +12 -0
- data/spec/unit/virtus/coercion/false_class/class_methods/to_string_spec.rb +12 -0
- data/spec/unit/virtus/coercion/float/class_methods/to_decimal_spec.rb +12 -0
- data/spec/unit/virtus/coercion/float/class_methods/to_integer_spec.rb +12 -0
- data/spec/unit/virtus/coercion/float/class_methods/to_string_spec.rb +12 -0
- data/spec/unit/virtus/coercion/hash/class_methods/to_array_spec.rb +12 -0
- data/spec/unit/virtus/coercion/hash/class_methods/to_date_spec.rb +31 -0
- data/spec/unit/virtus/coercion/hash/class_methods/to_datetime_spec.rb +31 -0
- data/spec/unit/virtus/coercion/hash/class_methods/to_time_spec.rb +31 -0
- data/spec/unit/virtus/coercion/integer/class_methods/to_boolean_spec.rb +25 -0
- data/spec/unit/virtus/coercion/integer/class_methods/to_decimal_spec.rb +12 -0
- data/spec/unit/virtus/coercion/integer/class_methods/to_float_spec.rb +12 -0
- data/spec/unit/virtus/coercion/integer/class_methods/to_string_spec.rb +12 -0
- data/spec/unit/virtus/coercion/object/class_methods/method_missing_spec.rb +33 -0
- data/spec/unit/virtus/coercion/string/class_methods/to_boolean_spec.rb +29 -0
- data/spec/unit/virtus/coercion/string/class_methods/to_date_spec.rb +23 -0
- data/spec/unit/virtus/coercion/string/class_methods/to_datetime_spec.rb +50 -0
- data/spec/unit/virtus/coercion/string/class_methods/to_decimal_spec.rb +23 -0
- data/spec/unit/virtus/coercion/string/class_methods/to_float_spec.rb +21 -0
- data/spec/unit/virtus/coercion/string/class_methods/to_integer_spec.rb +21 -0
- data/spec/unit/virtus/coercion/string/class_methods/to_time_spec.rb +50 -0
- data/spec/unit/virtus/coercion/symbol/class_methods/to_string_spec.rb +12 -0
- data/spec/unit/virtus/coercion/true_class/class_methods/to_string_spec.rb +12 -0
- data/spec/unit/virtus/instance_methods/attributes_spec.rb +7 -0
- data/spec/unit/virtus/options/accept_options_spec.rb +38 -0
- data/spec/unit/virtus/options/accepted_options_spec.rb +21 -0
- data/spec/unit/virtus/options/options_spec.rb +11 -0
- data/spec/unit/virtus/type_lookup/determine_type_spec.rb +68 -0
- data/spec/unit/virtus/type_lookup/primitive_spec.rb +9 -0
- data/virtus.gemspec +70 -17
- metadata +78 -27
- data/History.txt +0 -38
- data/lib/virtus/typecast/boolean.rb +0 -29
- data/lib/virtus/typecast/numeric.rb +0 -87
- data/lib/virtus/typecast/string.rb +0 -24
- data/lib/virtus/typecast/time.rb +0 -192
- data/spec/unit/shared/attribute/complex.rb +0 -15
- data/spec/unit/shared/attribute/options.rb +0 -7
- data/spec/unit/virtus/attribute/attribute_spec.rb +0 -12
@@ -2,29 +2,11 @@ shared_examples_for 'Attribute.accept_options' do
|
|
2
2
|
let(:sub_attribute) { Class.new(described_class) }
|
3
3
|
let(:new_option) { :width }
|
4
4
|
|
5
|
-
specify { described_class.should respond_to(:accept_options) }
|
6
|
-
|
7
5
|
before :all do
|
8
6
|
described_class.accepted_options.should_not include(new_option)
|
9
7
|
described_class.accept_options(new_option)
|
10
8
|
end
|
11
9
|
|
12
|
-
it "sets new accepted options on itself" do
|
13
|
-
described_class.accepted_options.should include(new_option)
|
14
|
-
end
|
15
|
-
|
16
|
-
it "sets new accepted option on its descendants" do
|
17
|
-
sub_attribute.accepted_options.should include(new_option)
|
18
|
-
end
|
19
|
-
|
20
|
-
it "creates option accessors" do
|
21
|
-
described_class.should respond_to(new_option)
|
22
|
-
end
|
23
|
-
|
24
|
-
it "creates option accessors on descendants" do
|
25
|
-
sub_attribute.should respond_to(new_option)
|
26
|
-
end
|
27
|
-
|
28
10
|
context 'with default option value' do
|
29
11
|
let(:option) { :height }
|
30
12
|
let(:value) { 10 }
|
@@ -1,10 +1,4 @@
|
|
1
1
|
shared_examples_for 'Attribute.accepted_options' do
|
2
|
-
specify { described_class.should respond_to(:accepted_options) }
|
3
|
-
|
4
|
-
it "returns an array of accepted options" do
|
5
|
-
described_class.accepted_options.should be_instance_of(Array)
|
6
|
-
end
|
7
|
-
|
8
2
|
it "includes base options" do
|
9
3
|
described_class.accepted_options.should include(*Virtus::Attribute::OPTIONS)
|
10
4
|
end
|
@@ -1,29 +1,44 @@
|
|
1
1
|
shared_examples_for 'Attribute#get' do
|
2
|
-
|
3
|
-
Class.new { include Virtus }
|
4
|
-
end
|
2
|
+
subject { attribute.get(instance) }
|
5
3
|
|
6
|
-
let(:
|
7
|
-
|
8
|
-
end
|
4
|
+
let(:model) { Class.new }
|
5
|
+
let(:instance) { model.new }
|
9
6
|
|
10
|
-
|
11
|
-
|
12
|
-
end
|
7
|
+
context 'without default value' do
|
8
|
+
let(:attribute) { described_class.new(attribute_name) }
|
13
9
|
|
14
|
-
|
15
|
-
before { attribute.set(object, attribute_value) }
|
10
|
+
before { attribute.set(instance, value) }
|
16
11
|
|
17
|
-
|
12
|
+
context "when a non-nil value is set" do
|
13
|
+
let(:value) { attribute_value }
|
14
|
+
it { should eql(attribute_value) }
|
15
|
+
end
|
18
16
|
|
19
|
-
|
17
|
+
context "when nil is set" do
|
18
|
+
let(:value) { nil }
|
19
|
+
it { should be(value) }
|
20
|
+
end
|
20
21
|
end
|
21
22
|
|
22
|
-
context
|
23
|
-
|
23
|
+
context 'with default value' do
|
24
|
+
context 'set to proc' do
|
25
|
+
let(:attribute) do
|
26
|
+
described_class.new(attribute_name, :default => attribute_default_proc)
|
27
|
+
end
|
28
|
+
|
29
|
+
let(:evaluated_proc_value) do
|
30
|
+
attribute.default.call(instance, attribute)
|
31
|
+
end
|
32
|
+
|
33
|
+
it { should == evaluated_proc_value }
|
34
|
+
end
|
24
35
|
|
25
|
-
|
36
|
+
context 'not set to proc' do
|
37
|
+
let(:attribute) do
|
38
|
+
described_class.new(attribute_name, :default => attribute_default)
|
39
|
+
end
|
26
40
|
|
27
|
-
|
41
|
+
it { should == attribute_default }
|
42
|
+
end
|
28
43
|
end
|
29
44
|
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
shared_examples_for 'Attribute.primitive?' do
|
2
|
+
subject { described_class.primitive?(value) }
|
3
|
+
|
4
|
+
let(:attribute) { described_class.new(attribute_name) }
|
5
|
+
|
6
|
+
context 'with a primitive value' do
|
7
|
+
let(:value) { attribute_value }
|
8
|
+
it { should be(true) }
|
9
|
+
end
|
10
|
+
|
11
|
+
context 'with a non-primitive value' do
|
12
|
+
let(:value) { nil }
|
13
|
+
it { should be(false) }
|
14
|
+
end
|
15
|
+
end
|
@@ -1,42 +1,37 @@
|
|
1
1
|
shared_examples_for 'Attribute#set' do
|
2
|
-
|
3
|
-
Class.new { include Virtus }
|
4
|
-
end
|
2
|
+
subject { attribute.set(instance, value) }
|
5
3
|
|
6
|
-
let(:attribute)
|
7
|
-
|
8
|
-
|
4
|
+
let(:attribute) { described_class.new(attribute_name) }
|
5
|
+
let(:model) { Class.new }
|
6
|
+
let(:instance) { model.new }
|
9
7
|
|
10
|
-
|
11
|
-
model.new
|
12
|
-
end
|
8
|
+
before { subject }
|
13
9
|
|
14
10
|
context "with nil" do
|
15
|
-
|
11
|
+
let(:value) { nil }
|
16
12
|
|
17
|
-
it
|
18
|
-
subject
|
19
|
-
object.instance_variable_defined?(attribute.instance_variable_name).should be(false)
|
20
|
-
end
|
13
|
+
it { should be(nil) }
|
21
14
|
|
22
|
-
it "
|
23
|
-
|
15
|
+
it "sets the value in an ivar" do
|
16
|
+
instance.instance_variable_get(attribute.instance_variable_name).should be(nil)
|
24
17
|
end
|
25
18
|
end
|
26
19
|
|
27
20
|
context "with a primitive value" do
|
28
|
-
|
21
|
+
let(:value) { attribute_value }
|
22
|
+
|
23
|
+
it { should == attribute_value }
|
29
24
|
|
30
25
|
it "sets the value in an ivar" do
|
31
|
-
|
26
|
+
instance.instance_variable_get(attribute.instance_variable_name).should eql(attribute_value)
|
32
27
|
end
|
33
28
|
end
|
34
29
|
|
35
30
|
context "with a non-primitive value" do
|
36
|
-
|
31
|
+
let(:value) { attribute_value_other }
|
37
32
|
|
38
|
-
it "sets the value in an ivar
|
39
|
-
|
33
|
+
it "sets the value in an ivar coerced to the primitive type" do
|
34
|
+
instance.instance_variable_get(attribute.instance_variable_name).should be_kind_of(described_class.primitive)
|
40
35
|
end
|
41
36
|
end
|
42
37
|
end
|
@@ -2,8 +2,23 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Virtus::Attribute::Array do
|
4
4
|
it_should_behave_like 'Attribute' do
|
5
|
-
let(:attribute_name)
|
6
|
-
let(:attribute_value)
|
7
|
-
let(:attribute_value_other)
|
5
|
+
let(:attribute_name) { :colors }
|
6
|
+
let(:attribute_value) { [ 'red', 'green', 'blue' ] }
|
7
|
+
let(:attribute_value_other) { [ 'orange', 'yellow', 'gray' ] }
|
8
|
+
let(:attribute_default) { [] }
|
9
|
+
let(:attribute_default_proc) { lambda { |instance, attribute| attribute.name == :colors } }
|
8
10
|
end
|
11
|
+
|
12
|
+
describe '#coerce' do
|
13
|
+
let(:attribute) { described_class.new(:colors) }
|
14
|
+
|
15
|
+
subject { attribute.coerce(value) }
|
16
|
+
|
17
|
+
context 'with a Hash' do
|
18
|
+
let(:value) { { :foo => 'bar' } }
|
19
|
+
|
20
|
+
it { should == [ [:foo, 'bar'] ] }
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
9
24
|
end
|
@@ -2,9 +2,11 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Virtus::Attribute::Boolean do
|
4
4
|
it_should_behave_like 'Attribute' do
|
5
|
-
let(:attribute_name)
|
6
|
-
let(:attribute_value)
|
7
|
-
let(:attribute_value_other)
|
5
|
+
let(:attribute_name) { :is_admin }
|
6
|
+
let(:attribute_value) { true }
|
7
|
+
let(:attribute_value_other) { '1' }
|
8
|
+
let(:attribute_default) { true }
|
9
|
+
let(:attribute_default_proc) { lambda { |instance, attribute| attribute.name == :is_admin } }
|
8
10
|
end
|
9
11
|
|
10
12
|
describe "accessor names" do
|
@@ -23,10 +25,10 @@ describe Virtus::Attribute::Boolean do
|
|
23
25
|
end
|
24
26
|
end
|
25
27
|
|
26
|
-
describe '#
|
27
|
-
let(:attribute) {
|
28
|
+
describe '#coerce' do
|
29
|
+
let(:attribute) { described_class.new(:is_admin) }
|
28
30
|
|
29
|
-
subject { attribute.
|
31
|
+
subject { attribute.coerce(value) }
|
30
32
|
|
31
33
|
context "with 1" do
|
32
34
|
let(:value) { 1 }
|
@@ -2,19 +2,21 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Virtus::Attribute::Date do
|
4
4
|
it_should_behave_like 'Attribute' do
|
5
|
-
let(:attribute_name)
|
6
|
-
let(:attribute_value)
|
7
|
-
let(:attribute_value_other)
|
5
|
+
let(:attribute_name) { :created_on }
|
6
|
+
let(:attribute_value) { Date.today }
|
7
|
+
let(:attribute_value_other) { (Date.today+1).to_s }
|
8
|
+
let(:attribute_default) { Date.today-1 }
|
9
|
+
let(:attribute_default_proc) { lambda { |instance, attribute| attribute.name == :created_on } }
|
8
10
|
end
|
9
11
|
|
10
|
-
describe '#
|
11
|
-
let(:attribute) {
|
12
|
+
describe '#coerce' do
|
13
|
+
let(:attribute) { described_class.new(:bday) }
|
12
14
|
|
13
15
|
let(:year) { 2011 }
|
14
16
|
let(:month) { 4 }
|
15
17
|
let(:day) { 7 }
|
16
18
|
|
17
|
-
subject { attribute.
|
19
|
+
subject { attribute.coerce(value) }
|
18
20
|
|
19
21
|
shared_examples_for "a correct date" do
|
20
22
|
it { should be_kind_of(Date) }
|
@@ -2,13 +2,15 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Virtus::Attribute::DateTime do
|
4
4
|
it_should_behave_like 'Attribute' do
|
5
|
-
let(:attribute_name)
|
6
|
-
let(:attribute_value)
|
7
|
-
let(:attribute_value_other)
|
5
|
+
let(:attribute_name) { :created_at }
|
6
|
+
let(:attribute_value) { DateTime.now }
|
7
|
+
let(:attribute_value_other) { DateTime.now.to_s }
|
8
|
+
let(:attribute_default) { DateTime.now-1 }
|
9
|
+
let(:attribute_default_proc) { lambda { |instance, attribute| attribute.name == :created_at } }
|
8
10
|
end
|
9
11
|
|
10
|
-
describe '#
|
11
|
-
let(:attribute) {
|
12
|
+
describe '#coerce' do
|
13
|
+
let(:attribute) { described_class.new(:bday) }
|
12
14
|
|
13
15
|
let(:year) { 2011 }
|
14
16
|
let(:month) { 4 }
|
@@ -17,7 +19,7 @@ describe Virtus::Attribute::DateTime do
|
|
17
19
|
let(:min) { 26 }
|
18
20
|
let(:sec) { 49 }
|
19
21
|
|
20
|
-
subject { attribute.
|
22
|
+
subject { attribute.coerce(value) }
|
21
23
|
|
22
24
|
shared_examples_for "a correct date time" do
|
23
25
|
it { should be_kind_of(DateTime) }
|
@@ -2,15 +2,17 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Virtus::Attribute::Decimal do
|
4
4
|
it_should_behave_like 'Attribute' do
|
5
|
-
let(:attribute_name)
|
6
|
-
let(:attribute_value)
|
7
|
-
let(:attribute_value_other)
|
5
|
+
let(:attribute_name) { :price }
|
6
|
+
let(:attribute_value) { BigDecimal("12.3456789") }
|
7
|
+
let(:attribute_value_other) { "12.3456789" }
|
8
|
+
let(:attribute_default) { BigDecimal('0') }
|
9
|
+
let(:attribute_default_proc) { lambda { |instance, attribute| attribute.name == :price } }
|
8
10
|
end
|
9
11
|
|
10
|
-
describe '#
|
11
|
-
let(:attribute) {
|
12
|
+
describe '#coerce' do
|
13
|
+
let(:attribute) { described_class.new(:price) }
|
12
14
|
|
13
|
-
subject { attribute.
|
15
|
+
subject { attribute.coerce(value) }
|
14
16
|
|
15
17
|
context "with 24.0 big decimal" do
|
16
18
|
let(:value) { BigDecimal('24.0') }
|
@@ -72,6 +74,16 @@ describe Virtus::Attribute::Decimal do
|
|
72
74
|
it { should eql(BigDecimal('-24.0')) }
|
73
75
|
end
|
74
76
|
|
77
|
+
context 'with a positive bignum' do
|
78
|
+
let(:value) { 1311936052 }
|
79
|
+
it { should eql(BigDecimal('1311936052.0')) }
|
80
|
+
end
|
81
|
+
|
82
|
+
context 'with a negative bignum' do
|
83
|
+
let(:value) { -1311936052 }
|
84
|
+
it { should eql(BigDecimal('-1311936052.0')) }
|
85
|
+
end
|
86
|
+
|
75
87
|
context 'with a zero float' do
|
76
88
|
let(:value) { 0.0 }
|
77
89
|
it { should eql(BigDecimal('0.0')) }
|
@@ -2,15 +2,17 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Virtus::Attribute::Float do
|
4
4
|
it_should_behave_like 'Attribute' do
|
5
|
-
let(:attribute_name)
|
6
|
-
let(:attribute_value)
|
7
|
-
let(:attribute_value_other)
|
5
|
+
let(:attribute_name) { :score }
|
6
|
+
let(:attribute_value) { 12.34 }
|
7
|
+
let(:attribute_value_other) { "12.34" }
|
8
|
+
let(:attribute_default) { 0.0 }
|
9
|
+
let(:attribute_default_proc) { lambda { |instance, attribute| attribute.name == :score } }
|
8
10
|
end
|
9
11
|
|
10
|
-
describe '#
|
11
|
-
let(:attribute) {
|
12
|
+
describe '#coerce' do
|
13
|
+
let(:attribute) { described_class.new(:score) }
|
12
14
|
|
13
|
-
subject { attribute.
|
15
|
+
subject { attribute.coerce(value) }
|
14
16
|
|
15
17
|
context "with a float" do
|
16
18
|
let(:value) { 24.0 }
|
@@ -72,6 +74,16 @@ describe Virtus::Attribute::Float do
|
|
72
74
|
it { should eql(-24.0) }
|
73
75
|
end
|
74
76
|
|
77
|
+
context 'with a positive bignum' do
|
78
|
+
let(:value) { 1311935550 }
|
79
|
+
it { should eql(1311935550.0) }
|
80
|
+
end
|
81
|
+
|
82
|
+
context 'with a negative bignum' do
|
83
|
+
let(:value) { -1311935550 }
|
84
|
+
it { should eql(-1311935550.0) }
|
85
|
+
end
|
86
|
+
|
75
87
|
context 'with a zero decimal' do
|
76
88
|
let(:value) { BigDecimal('0.0') }
|
77
89
|
it { should eql(0.0) }
|
@@ -88,7 +100,7 @@ describe Virtus::Attribute::Float do
|
|
88
100
|
end
|
89
101
|
|
90
102
|
[ Object.new, true, '00.0', '0.', '-.0', 'string' ].each do |non_num_value|
|
91
|
-
context "does not
|
103
|
+
context "does not coerce non-numeric value #{non_num_value.inspect}" do
|
92
104
|
let(:value) { non_num_value }
|
93
105
|
it { should equal(non_num_value) }
|
94
106
|
end
|
@@ -2,8 +2,10 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Virtus::Attribute::Hash do
|
4
4
|
it_should_behave_like 'Attribute' do
|
5
|
-
let(:attribute_name)
|
6
|
-
let(:attribute_value)
|
7
|
-
let(:attribute_value_other)
|
5
|
+
let(:attribute_name) { :settings }
|
6
|
+
let(:attribute_value) { Hash[:one => 1] }
|
7
|
+
let(:attribute_value_other) { Hash[:two => 2] }
|
8
|
+
let(:attribute_default) { Hash.new }
|
9
|
+
let(:attribute_default_proc) { lambda { |instance, attribute| attribute.name == :settings } }
|
8
10
|
end
|
9
11
|
end
|
@@ -2,15 +2,17 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Virtus::Attribute::Integer do
|
4
4
|
it_should_behave_like 'Attribute' do
|
5
|
-
let(:attribute_name)
|
6
|
-
let(:attribute_value)
|
7
|
-
let(:attribute_value_other)
|
5
|
+
let(:attribute_name) { :age }
|
6
|
+
let(:attribute_value) { 28 }
|
7
|
+
let(:attribute_value_other) { "28" }
|
8
|
+
let(:attribute_default) { 0 }
|
9
|
+
let(:attribute_default_proc) { lambda { |instance, attribute| attribute.name == :age } }
|
8
10
|
end
|
9
11
|
|
10
|
-
describe '#
|
11
|
-
let(:attribute) {
|
12
|
+
describe '#coerce' do
|
13
|
+
let(:attribute) { described_class.new(:age) }
|
12
14
|
|
13
|
-
subject { attribute.
|
15
|
+
subject { attribute.coerce(value) }
|
14
16
|
|
15
17
|
context "with an integer" do
|
16
18
|
let(:value) { 24 }
|
@@ -87,8 +89,8 @@ describe Virtus::Attribute::Integer do
|
|
87
89
|
it { should eql(-24) }
|
88
90
|
end
|
89
91
|
|
90
|
-
[ Object.new, true, '00.0', '0.', '-.0', 'string' ].each do |non_num_value|
|
91
|
-
context "does not
|
92
|
+
[ Object.new, true, false, '00.0', '0.', '-.0', 'string' ].each do |non_num_value|
|
93
|
+
context "does not coerce non-numeric value #{non_num_value.inspect}" do
|
92
94
|
let(:value) { non_num_value }
|
93
95
|
it { should equal(non_num_value) }
|
94
96
|
end
|