virtus 0.0.5 → 0.0.6
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/.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
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
module Virtus
|
|
2
|
-
module Typecast
|
|
3
|
-
|
|
4
|
-
# Typecast any object to a string
|
|
5
|
-
class String
|
|
6
|
-
|
|
7
|
-
# Typecast value to a string
|
|
8
|
-
#
|
|
9
|
-
# @example
|
|
10
|
-
# Virtus::Typecast::String.call(1) # => "1"
|
|
11
|
-
# Virtus::Typecast::String.call([]) # => "[]"
|
|
12
|
-
#
|
|
13
|
-
# @param [Object] value
|
|
14
|
-
#
|
|
15
|
-
# @return [String]
|
|
16
|
-
#
|
|
17
|
-
# @api public
|
|
18
|
-
def self.call(value)
|
|
19
|
-
value.to_s
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
end # class String
|
|
23
|
-
end # module Typecast
|
|
24
|
-
end # module Virtus
|
data/lib/virtus/typecast/time.rb
DELETED
|
@@ -1,192 +0,0 @@
|
|
|
1
|
-
module Virtus
|
|
2
|
-
module Typecast
|
|
3
|
-
|
|
4
|
-
# Typecast various values into Date, DateTime or Time
|
|
5
|
-
class Time
|
|
6
|
-
SEGMENTS = [ :year, :month, :day, :hour, :min, :sec ].freeze
|
|
7
|
-
|
|
8
|
-
METHOD_TO_CLASS = {
|
|
9
|
-
:to_time => ::Time,
|
|
10
|
-
:to_date => ::Date,
|
|
11
|
-
:to_datetime => ::DateTime
|
|
12
|
-
}.freeze
|
|
13
|
-
|
|
14
|
-
# Typecasts an arbitrary value to a Time
|
|
15
|
-
#
|
|
16
|
-
# Handles both Hashes and Time instances
|
|
17
|
-
#
|
|
18
|
-
# @example
|
|
19
|
-
# Virtus::Typecast::Time.to_time('2011/06/09 12:01')
|
|
20
|
-
# # => Thu Jun 09 12:01:00 +0200 2011
|
|
21
|
-
#
|
|
22
|
-
# @param [#to_hash, #to_s] value
|
|
23
|
-
# value to be typecast
|
|
24
|
-
#
|
|
25
|
-
# @return [Time]
|
|
26
|
-
# Time constructed from value
|
|
27
|
-
#
|
|
28
|
-
# @api public
|
|
29
|
-
def self.to_time(value)
|
|
30
|
-
call(value, :to_time)
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
# Typecasts an arbitrary value to a Date
|
|
34
|
-
#
|
|
35
|
-
# Handles both Hashes and Date instances
|
|
36
|
-
#
|
|
37
|
-
# @example
|
|
38
|
-
# Virtus::Typecast::Time.to_date('2011/06/09')
|
|
39
|
-
# # => #<Date: 4911443/2,0,2299161>
|
|
40
|
-
#
|
|
41
|
-
# @param [#to_hash, #to_s] value
|
|
42
|
-
# value to be typecast
|
|
43
|
-
#
|
|
44
|
-
# @return [Date]
|
|
45
|
-
# Date constructed from value
|
|
46
|
-
#
|
|
47
|
-
# @api public
|
|
48
|
-
def self.to_date(value)
|
|
49
|
-
call(value, :to_date)
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
# Typecasts an arbitrary value to a DateTime
|
|
53
|
-
#
|
|
54
|
-
# Handles both Hashes and DateTime instances
|
|
55
|
-
#
|
|
56
|
-
# @example
|
|
57
|
-
# Virtus::Typecast::Time.to_datetime('2011/06/09 12:01')
|
|
58
|
-
# # => #<DateTime: 3536239681/1440,0,2299161>
|
|
59
|
-
#
|
|
60
|
-
# @param [#to_hash, #to_s] value
|
|
61
|
-
# value to be typecast
|
|
62
|
-
#
|
|
63
|
-
# @return [DateTime]
|
|
64
|
-
# DateTime constructed from value
|
|
65
|
-
#
|
|
66
|
-
# @api public
|
|
67
|
-
def self.to_datetime(value)
|
|
68
|
-
call(value, :to_datetime)
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
# Coerce the value into a Date, Time or DateTime object
|
|
72
|
-
#
|
|
73
|
-
# @param [#to_hash, #to_s] value
|
|
74
|
-
#
|
|
75
|
-
# @param [Symbol] method
|
|
76
|
-
#
|
|
77
|
-
# @return [Object]
|
|
78
|
-
#
|
|
79
|
-
# @api private
|
|
80
|
-
def self.call(value, method)
|
|
81
|
-
return value.send(method) if value.respond_to?(method)
|
|
82
|
-
|
|
83
|
-
begin
|
|
84
|
-
if value.respond_to?(:to_hash)
|
|
85
|
-
from_hash(value.to_hash, method)
|
|
86
|
-
else
|
|
87
|
-
from_string(value.to_s, method)
|
|
88
|
-
end
|
|
89
|
-
rescue ArgumentError
|
|
90
|
-
return value
|
|
91
|
-
end
|
|
92
|
-
end
|
|
93
|
-
|
|
94
|
-
private_class_method :call
|
|
95
|
-
|
|
96
|
-
# Coerce the string into a Date, Time or DateTime object
|
|
97
|
-
#
|
|
98
|
-
# @param [String] value
|
|
99
|
-
#
|
|
100
|
-
# @param [Symbol] method
|
|
101
|
-
#
|
|
102
|
-
# @return [Object]
|
|
103
|
-
#
|
|
104
|
-
# @api private
|
|
105
|
-
def self.from_string(value, method)
|
|
106
|
-
METHOD_TO_CLASS[method].parse(value)
|
|
107
|
-
end
|
|
108
|
-
|
|
109
|
-
private_class_method :from_string
|
|
110
|
-
|
|
111
|
-
# Coerce the Hash into a Date, Time or DateTime object
|
|
112
|
-
#
|
|
113
|
-
# @param [Hash] value
|
|
114
|
-
#
|
|
115
|
-
# @param [Symbol] method
|
|
116
|
-
#
|
|
117
|
-
# @return [Object]
|
|
118
|
-
#
|
|
119
|
-
# @api private
|
|
120
|
-
def self.from_hash(value, method)
|
|
121
|
-
send("hash_#{method}", value)
|
|
122
|
-
end
|
|
123
|
-
|
|
124
|
-
private_class_method :from_hash
|
|
125
|
-
|
|
126
|
-
# Creates a Time instance from a Hash
|
|
127
|
-
#
|
|
128
|
-
# Valid keys are: :year, :month, :day, :hour, :min, :sec
|
|
129
|
-
#
|
|
130
|
-
# @param [Hash] value
|
|
131
|
-
#
|
|
132
|
-
# @return [Time]
|
|
133
|
-
#
|
|
134
|
-
# @api private
|
|
135
|
-
def self.hash_to_time(value)
|
|
136
|
-
::Time.local(*extract(value))
|
|
137
|
-
end
|
|
138
|
-
|
|
139
|
-
private_class_method :hash_to_time
|
|
140
|
-
|
|
141
|
-
# Creates a Date instance from a Hash
|
|
142
|
-
#
|
|
143
|
-
# Valid keys are: :year, :month, :day, :hour
|
|
144
|
-
#
|
|
145
|
-
# @param [Hash] value
|
|
146
|
-
#
|
|
147
|
-
# @return [Date]
|
|
148
|
-
#
|
|
149
|
-
# @api private
|
|
150
|
-
def self.hash_to_date(value)
|
|
151
|
-
::Date.new(*extract(value).first(3))
|
|
152
|
-
end
|
|
153
|
-
|
|
154
|
-
private_class_method :hash_to_date
|
|
155
|
-
|
|
156
|
-
# Creates a DateTime instance from a Hash
|
|
157
|
-
#
|
|
158
|
-
# Valid keys are: :year, :month, :day, :hour, :min, :sec
|
|
159
|
-
#
|
|
160
|
-
# @param [Hash] value
|
|
161
|
-
#
|
|
162
|
-
# @return [DateTime]
|
|
163
|
-
#
|
|
164
|
-
# @api private
|
|
165
|
-
def self.hash_to_datetime(value)
|
|
166
|
-
::DateTime.new(*extract(value))
|
|
167
|
-
end
|
|
168
|
-
|
|
169
|
-
private_class_method :hash_to_datetime
|
|
170
|
-
|
|
171
|
-
# Extracts the given args from a Hash
|
|
172
|
-
#
|
|
173
|
-
# If a value does not exist, it uses the value of Time.now
|
|
174
|
-
#
|
|
175
|
-
# @param [Hash] value
|
|
176
|
-
#
|
|
177
|
-
# @return [Array]
|
|
178
|
-
#
|
|
179
|
-
# @api private
|
|
180
|
-
def self.extract(value)
|
|
181
|
-
now = ::Time.now
|
|
182
|
-
|
|
183
|
-
SEGMENTS.map do |segment|
|
|
184
|
-
Numeric.to_i(value.fetch(segment, now.send(segment)))
|
|
185
|
-
end
|
|
186
|
-
end
|
|
187
|
-
|
|
188
|
-
private_class_method :extract
|
|
189
|
-
|
|
190
|
-
end # class Time
|
|
191
|
-
end # module Typecast
|
|
192
|
-
end # module Virtus
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
shared_examples_for 'Attribute#complex?' do
|
|
2
|
-
let(:attribute) { described_class.new(attribute_name, :complex => complex) }
|
|
3
|
-
|
|
4
|
-
subject { attribute.complex? }
|
|
5
|
-
|
|
6
|
-
context "when set to true" do
|
|
7
|
-
let(:complex) { true }
|
|
8
|
-
it { should be(true) }
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
context "when set to false" do
|
|
12
|
-
let(:complex) { false }
|
|
13
|
-
it { should be(false) }
|
|
14
|
-
end
|
|
15
|
-
end
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
|
|
3
|
-
describe Virtus::Attribute do
|
|
4
|
-
describe '#typecast_to_primitive' do
|
|
5
|
-
let(:attribute) { Virtus::Attribute.new(:name) }
|
|
6
|
-
let(:value) { 'value' }
|
|
7
|
-
|
|
8
|
-
it "returns original value" do
|
|
9
|
-
attribute.typecast_to_primitive(value).should eql(value)
|
|
10
|
-
end
|
|
11
|
-
end
|
|
12
|
-
end
|