ohm-contrib 0.0.7 → 0.0.8
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/lib/ohm/contrib.rb +1 -1
- data/lib/ohm/contrib/typecast.rb +22 -12
- data/ohm-contrib.gemspec +1 -1
- data/test/test_ohm_typecast.rb +12 -12
- metadata +2 -2
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.8
|
data/lib/ohm/contrib.rb
CHANGED
data/lib/ohm/contrib/typecast.rb
CHANGED
@@ -11,6 +11,8 @@ module Ohm
|
|
11
11
|
end
|
12
12
|
|
13
13
|
class Time < ::Time
|
14
|
+
ASSERTION = :assert_type_time
|
15
|
+
|
14
16
|
def self.[](value)
|
15
17
|
return value if value.to_s.empty?
|
16
18
|
|
@@ -20,6 +22,8 @@ module Ohm
|
|
20
22
|
end
|
21
23
|
|
22
24
|
class Date < ::Date
|
25
|
+
ASSERTION = :assert_type_date
|
26
|
+
|
23
27
|
def self.[](value)
|
24
28
|
return value if value.to_s.empty?
|
25
29
|
|
@@ -30,6 +34,7 @@ module Ohm
|
|
30
34
|
end
|
31
35
|
|
32
36
|
class Decimal < BigDecimal
|
37
|
+
ASSERTION = :assert_type_decimal
|
33
38
|
CANONICAL = /^(\d+)?(\.\d+)?(E[+\-]\d+)?$/
|
34
39
|
|
35
40
|
def self.[](value)
|
@@ -44,6 +49,8 @@ module Ohm
|
|
44
49
|
end
|
45
50
|
|
46
51
|
class Float < ::Float
|
52
|
+
ASSERTION = :assert_type_float
|
53
|
+
|
47
54
|
def self.[](value)
|
48
55
|
return value if value.to_s.empty?
|
49
56
|
|
@@ -54,6 +61,8 @@ module Ohm
|
|
54
61
|
end
|
55
62
|
|
56
63
|
class Integer < ::Integer
|
64
|
+
ASSERTION = :assert_type_integer
|
65
|
+
|
57
66
|
def self.[](value)
|
58
67
|
return value if value.to_s.empty?
|
59
68
|
|
@@ -92,21 +101,16 @@ module Ohm
|
|
92
101
|
class MissingValidation < StandardError
|
93
102
|
MESSAGE = "%s :%s is required in your #validate method"
|
94
103
|
|
95
|
-
attr :type
|
96
104
|
attr :field
|
105
|
+
attr :assertion
|
97
106
|
|
98
|
-
def initialize(
|
99
|
-
@
|
107
|
+
def initialize(field, assertion)
|
108
|
+
@field, @assertion = field, assertion
|
100
109
|
end
|
101
110
|
|
102
111
|
def message
|
103
112
|
MESSAGE % [assertion, field]
|
104
113
|
end
|
105
|
-
|
106
|
-
protected
|
107
|
-
def assertion
|
108
|
-
'assert_type_%s' % type.name.split('::').last.downcase
|
109
|
-
end
|
110
114
|
end
|
111
115
|
|
112
116
|
include Types
|
@@ -117,7 +121,7 @@ module Ohm
|
|
117
121
|
end
|
118
122
|
|
119
123
|
module ClassMethods
|
120
|
-
def attribute(name, type = Ohm::Types::String)
|
124
|
+
def attribute(name, type = Ohm::Types::String, assertion = defined?(type::ASSERTION) ? type::ASSERTION : nil)
|
121
125
|
define_method(name) do
|
122
126
|
type[read_local(name)]
|
123
127
|
end
|
@@ -131,7 +135,7 @@ module Ohm
|
|
131
135
|
end
|
132
136
|
|
133
137
|
attributes << name unless attributes.include?(name)
|
134
|
-
types[name] = type unless types.has_key?(name)
|
138
|
+
types[name] = [type, assertion] unless types.has_key?(name)
|
135
139
|
end
|
136
140
|
|
137
141
|
def types
|
@@ -142,13 +146,19 @@ module Ohm
|
|
142
146
|
def valid?
|
143
147
|
return unless super
|
144
148
|
|
145
|
-
self.class.types.each do |field, type|
|
149
|
+
self.class.types.each do |field, (type, assertion)|
|
146
150
|
value = send(field)
|
147
151
|
|
148
152
|
unless value.kind_of?(type)
|
149
|
-
raise MissingValidation.new(
|
153
|
+
raise MissingValidation.new(field, assertion)
|
150
154
|
end
|
151
155
|
end
|
152
156
|
end
|
157
|
+
|
158
|
+
def validate
|
159
|
+
self.class.types.each do |field, (type, assertion)|
|
160
|
+
send assertion, field if assertion
|
161
|
+
end
|
162
|
+
end
|
153
163
|
end
|
154
164
|
end
|
data/ohm-contrib.gemspec
CHANGED
data/test/test_ohm_typecast.rb
CHANGED
@@ -6,6 +6,10 @@ class TestOhmTypecast < Test::Unit::TestCase
|
|
6
6
|
include Ohm::Typecast
|
7
7
|
|
8
8
|
attribute :price, Decimal
|
9
|
+
|
10
|
+
# override validate and purposely forget super
|
11
|
+
def validate
|
12
|
+
end
|
9
13
|
end
|
10
14
|
|
11
15
|
should "properly preserve the right precision" do
|
@@ -41,12 +45,6 @@ class TestOhmTypecast < Test::Unit::TestCase
|
|
41
45
|
include Ohm::Typecast
|
42
46
|
|
43
47
|
attribute :price, Decimal
|
44
|
-
|
45
|
-
def validate
|
46
|
-
super
|
47
|
-
|
48
|
-
assert_type_decimal :price
|
49
|
-
end
|
50
48
|
end
|
51
49
|
|
52
50
|
should "be invalid and have an error on the field" do
|
@@ -63,6 +61,10 @@ class TestOhmTypecast < Test::Unit::TestCase
|
|
63
61
|
include Ohm::Typecast
|
64
62
|
|
65
63
|
attribute :start_of_sale, Time
|
64
|
+
|
65
|
+
# we override validate and purposely forget to call super
|
66
|
+
def validate
|
67
|
+
end
|
66
68
|
end
|
67
69
|
|
68
70
|
test "read / write" do
|
@@ -107,12 +109,6 @@ class TestOhmTypecast < Test::Unit::TestCase
|
|
107
109
|
include Ohm::Typecast
|
108
110
|
|
109
111
|
attribute :start_of_sale, Time
|
110
|
-
|
111
|
-
def validate
|
112
|
-
super
|
113
|
-
|
114
|
-
assert_type_time :start_of_sale
|
115
|
-
end
|
116
112
|
end
|
117
113
|
|
118
114
|
should "be valid given invalid time value" do
|
@@ -127,6 +123,10 @@ class TestOhmTypecast < Test::Unit::TestCase
|
|
127
123
|
include Ohm::Typecast
|
128
124
|
|
129
125
|
attribute :date_bought, Date
|
126
|
+
|
127
|
+
# override validate and purposely forget super
|
128
|
+
def validate
|
129
|
+
end
|
130
130
|
end
|
131
131
|
|
132
132
|
test "read / write" do
|