rov 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA512:
3
+ data.tar.gz: 5c17f73e68aca3537540c8ab0c7d75beebeff0150041b96c2e8a70741614d30d22fde5135ea86a0ff4b005f674074c72d40443090560538170db29c951d83f80
4
+ metadata.gz: 8285b132b2ed8e9f35ca24d9a919889ab94bf288f54834bd83642e5a266cddf4ff42d1dadf6139943d2a35edd8b8c4bfc12ed44fe1bafcfcf6b0f9cc9a4c1021
5
+ SHA1:
6
+ data.tar.gz: 909b6429fbdc9baf33b949866a8008a425fa6a7e
7
+ metadata.gz: 7ad2c1c95ab319ac10e0e85c5f779bcc89b2adf9
data/README.md ADDED
@@ -0,0 +1,217 @@
1
+ Robject-Validator
2
+ =================
3
+
4
+ ## Description
5
+ Robject-Validator(Rov) is a object validator for Ruby. Usually there are many
6
+ different data objetcts in your system, and you have to ensure the
7
+ accuracy of the data objects. It's terrible to write validation code for
8
+ each object. It will confuse your system and has high risk for bug.
9
+
10
+ Rov provides a general mechanism to validate all data objects. All you need is
11
+ defining template for each object, and then Rov will validate them.
12
+
13
+
14
+ ## Requires
15
+ Rov has no dependencies, unless your objects need other gem packages.
16
+
17
+ However, your Ruby version can not be less than 1.8.7.
18
+
19
+ ## Install
20
+ From rubygems.org:
21
+
22
+ $ gem install rov
23
+
24
+ Or install Rov from the git repo:
25
+
26
+ $ gem build rov.gemspec
27
+ $ gem install rov-{version}.gem
28
+
29
+ ## Basic usage
30
+ First all, you need to define a template for object. The template is a class
31
+ inherited from `Rov::Template`, and your object is defined in the instance variable
32
+ `@template` of the template class.
33
+
34
+ For example, a hash object that contains several properties, name, sex, age, email:
35
+
36
+ ```ruby
37
+ class Person < Rov::Template
38
+ @template = {
39
+ :name => kind_of(String),
40
+ :age => kind_of(Fixnum),
41
+ :sex => any_of([:male, :female]),
42
+ :email => kind_of(String),
43
+ }
44
+ end
45
+ ```
46
+
47
+ `kind_of` and `any_of` are class methods of Rov::Template.
48
+
49
+ `kind_of()` takes one argument which is a class. It means the data must be a object
50
+ of String(or its child class).
51
+
52
+ `any_of()` aslo takes one argument which is an array. It means the data must be a
53
+ element of the array. The element of the array can be any type, symbol, string,
54
+ class, or event a template class(yes, templates can be nested with each other).
55
+
56
+ After defined, Rov could validate the specific data. Suppose the specific data
57
+ `data`:
58
+
59
+ ```ruby
60
+ data = {
61
+ :name => "Scarlet",
62
+ :age => 30,
63
+ :sex => :female,
64
+ :email => "scarlet@email.com",
65
+ }
66
+ validator = Rov::Validate.new(Person)
67
+ status, error_msg = validator.do_validate(data)
68
+ end
69
+ ```
70
+
71
+ `do_validate` method return two value: the first is the result if validated or not, and
72
+ the second one is error massage if validation fails.
73
+
74
+ ## Advanced Usage
75
+
76
+ ### Required Keys
77
+ If your hash object must contain several specified keys, you can use instance variable
78
+ `@required`. `@required` must be given an array, element in which must present in
79
+ specific data, or validation will fail. By default, `@required` is an empty array. that
80
+ is, the specific data can an empty hash.
81
+
82
+ For Example:
83
+
84
+ ```ruby
85
+ class Person < Rov::Template
86
+ @template = {
87
+ :name => kind_of(String),
88
+ :age => kind_of(Fixnum),
89
+ :sex => any_of([:male, :female]),
90
+ :email => kind_of(String),
91
+ }
92
+ @required = [:name, :age]
93
+ end
94
+ ```
95
+
96
+ As definition, the specific `Person` data must contain `:name` and `:age`.
97
+
98
+
99
+ ### Ordered Array
100
+ If the template is given an array, then the specific data must be included in the array.
101
+ By default, there is no restriction on the order of the elements. But you can want to
102
+ do it, there is a instance variable `@ordered`. If `@ordered` will be set `true`, Rov
103
+ will validate the specific array with the order which defined in template.
104
+
105
+
106
+ ### List of Template Methods
107
+ There are five available template methods:
108
+
109
+ + `any_of()`
110
+
111
+ As you known, `any_of()` means the specific data should be included in the given
112
+ array. `any_of()` can be used anywhere, such as hash's key:
113
+
114
+ ```ruby
115
+ class People < Rov::Template
116
+ @template = {
117
+ any_of(names) => Person,
118
+ }
119
+ end
120
+ ```
121
+
122
+ Suppose the argument of `any_of()` `names` is an array which contains many names.
123
+
124
+ Besides, this example shows how to nested template in other template.
125
+
126
+ + `kind_of()`
127
+
128
+ + `instance_of()`
129
+
130
+ The difference with `kind_of()` is that `instance_of()` can not be an instance of
131
+ the class's child class.
132
+
133
+ + `in_range()`
134
+
135
+ This method takes an object of `Range`, and the specific data should be included
136
+ in it.
137
+
138
+ + `anything()`
139
+
140
+ This function does not accept any arguments. Any specific data will be validated
141
+ if the template data is defined with `anything()`.
142
+
143
+
144
+ ### Custom Template Method
145
+ You can define new template method. Template method should return a class inherited
146
+ from Rov::Template, like defining template class. In the class, two things must be
147
+ presented, `@template` and `validate_method()`.
148
+
149
+ `@template` is same as `@template` in the template class. And `validate_method()`
150
+ returns a method by which Rov validates the specific data.
151
+
152
+ For example, it defines a method `email()` to validate specific data must be a
153
+ email address.
154
+
155
+ ```ruby
156
+ def email()
157
+ email_cls = Class.new(Rov::Template) do
158
+ # @template =
159
+ def validate_method
160
+ m = lambda do |actual_value|
161
+ if actual_value.is_a?(String) and
162
+ (actual_value =~ /^[a-zA-Z0-9_.+\-]+@[a-zA-Z0-9\-]+\.[a-zA-Z0-9\-.]+$/) == 0
163
+ [true, ""]
164
+ else
165
+ raise_validation_error(:invalid_email)
166
+ end
167
+ end
168
+ return m
169
+ end
170
+ end
171
+ return email_cls
172
+ end
173
+ ```
174
+
175
+ Because the format of email address is unchanged, the template should be a constant(
176
+ the regex), so there is only `validate_method()` in `email()`. The method that returned
177
+ by `validate_method()` return two value(status and an empty string) if validation succeed.
178
+ If validation fails, just call `raise_validation_error()` with a symbol.
179
+
180
+
181
+ ### Custom Validation Method
182
+ Sometimes, you may have some special requirements. Rov provides you a way to define
183
+ your custom validation method.
184
+
185
+ ```ruby
186
+ class Person < Rov::Template
187
+ @template = {
188
+ # ...
189
+ :email => kind_of(String),
190
+ :address => kind_of(String),
191
+ :zip_code => kind_of(Fixnum),
192
+ }
193
+
194
+ def validate(actual_value)
195
+ r = [actual_value[:address], actual_value[:zip_code]]
196
+ return ((not r.any?) or r.all?)
197
+ end
198
+ end
199
+ ```
200
+
201
+ You can define `Rov::Template#validate` method to implement your custom method.
202
+
203
+ `Rov::Template#validate()` takes one argument `actual_value` which is specific
204
+ data. The example above means the keys `:address` and `:zip_code` are either both
205
+ presented, or both not.
206
+
207
+
208
+ ### Simple Way Defining Template
209
+ Rov provides a simple way to define a templete, if the template is not complicated.
210
+ With `Rov::Template.create_template()`, you don't need to define a class for each
211
+ template.
212
+
213
+ ```ruby
214
+ person_cls = Rov::Template.create_template({:name => kind_of(String), :age => kind_of(Fixnum)})
215
+ validator = Rov::Validate.new(person_cls)
216
+ validator.do_validate(specific_data)
217
+ ```
data/lib/rov.rb ADDED
@@ -0,0 +1,10 @@
1
+ # -*- coding : utf-8 -*-
2
+
3
+ module Rov
4
+ end
5
+
6
+ require 'rov/common'
7
+ require 'rov/raise_error'
8
+ require 'rov/do_validate'
9
+ require 'rov/template'
10
+ require 'rov/validate'
data/lib/rov/common.rb ADDED
@@ -0,0 +1,54 @@
1
+ # -*- coding : utf-8 -*-
2
+
3
+ module Rov
4
+ module Common
5
+ def self.template_cls?(template)
6
+ return (template.class == Class and template.superclass == Template)
7
+ end
8
+
9
+ def self.string_hash_key(hash)
10
+ r = hash.map do |k, v|
11
+ if k.is_a?(Symbol)
12
+ [k.to_s, v]
13
+ else
14
+ [k, v]
15
+ end
16
+ end
17
+ return Hash[r]
18
+ end
19
+
20
+ def self.string_array_element(array)
21
+ r = array.map do |e|
22
+ if e.is_a?(Symbol)
23
+ e.to_s
24
+ else
25
+ e
26
+ end
27
+ end
28
+ return r
29
+ end
30
+
31
+ def self.with_symbol_access(hash)
32
+ return HashWithSymbolAccess[hash.entries]
33
+ end
34
+
35
+ end
36
+ end
37
+
38
+ class HashWithSymbolAccess < Hash
39
+ def [](key)
40
+ if self.keys.include?(key)
41
+ return super(key)
42
+ elsif key.is_a?(Symbol) and self.keys.include?(key.to_s)
43
+ return super(key.to_s)
44
+ end
45
+ end
46
+
47
+ def []=(key, value)
48
+ if self.keys.include?(key)
49
+ super(key, value)
50
+ elsif key.is_a?(Symbol) and self.keys.include?(key.to_s)
51
+ super(key.to_s, value)
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,89 @@
1
+ # -*- coding : utf-8 -*-
2
+ module Rov
3
+ class DoValidate
4
+
5
+ include RaiseError
6
+
7
+ def initialize(template)
8
+ if Common.template_cls?(template)
9
+ @template_obj = template.new(self)
10
+ else
11
+ @template_obj = Template.new(self)
12
+ @template_obj.set_template_value(template)
13
+ end
14
+
15
+ @template_value = @template_obj.get_template_value_for_validation
16
+ @validate_method = @template_obj.validate_method
17
+
18
+ if @template_value.class == self.class.superclass
19
+ clone_self(@template_value)
20
+ end
21
+ end
22
+
23
+ def clone_self(template_obj)
24
+ @template_value = template_obj.get_template_value
25
+ @validate_method = template_obj.get_validate_method
26
+ @template_obj = template_obj.get_template_obj
27
+ end
28
+
29
+ def get_template_value
30
+ return @template_value
31
+ end
32
+
33
+ def get_validate_method
34
+ return @validate_method
35
+ end
36
+
37
+ def get_template_obj
38
+ return @template_obj
39
+ end
40
+
41
+ def validate(actual_value)
42
+ set_value_hash({
43
+ :actual_value => actual_value,
44
+ :template_value => @template_obj.get_template_value,
45
+ :template_value_cls => @template_obj.class,
46
+ })
47
+ status, msg = @validate_method[actual_value]
48
+ if not status
49
+ raise RaiseError::InvalidConfig, msg
50
+ else
51
+ if not custom_validate(actual_value)
52
+ raise_validation_error(:self_validate_fail)
53
+ end
54
+ return true, ""
55
+ end
56
+ end
57
+
58
+ def do_validate(actual_value)
59
+ begin
60
+ status, msg = validate(actual_value)
61
+ rescue RaiseError::InvalidConfig => ex
62
+ status = false
63
+
64
+ # it can `raise` a array when ruby version less 1.9.3. # or the array will be inspected.
65
+ # so, pass the message to eval() when it is a string.
66
+ if ex.message.is_a?(String)
67
+ msg = eval(ex.message)
68
+ else
69
+ msg = ex.message
70
+ end
71
+ end
72
+ return status, msg
73
+ end
74
+
75
+ def custom_validate(actual_value)
76
+ return get_template_obj.do_custom_validate(actual_value)
77
+ end
78
+
79
+ def get_option
80
+ return {}
81
+ end
82
+
83
+ def set_value_hash(hash={})
84
+ @value_hash ||= {}
85
+ @value_hash.merge!(hash)
86
+ end
87
+
88
+ end
89
+ end
@@ -0,0 +1,30 @@
1
+ # -*- coding : utf-8 -*-
2
+ module Rov
3
+ module RaiseError
4
+ class InvalidConfig < StandardError
5
+ end
6
+
7
+ def raise_validation_error(error_type)
8
+ raise InvalidConfig, [error_type, get_error_str(error_type)]
9
+ end
10
+
11
+ def get_error_str(error_type)
12
+ template_value = @value_hash[:template_value]
13
+ actual_value = @value_hash[:actual_value]
14
+
15
+ types = {
16
+ :not_include => "#{actual_value.inspect} not in `#{template_value.inspect}`",
17
+ :type_error => "type of `#{actual_value.inspect}`(#{actual_value.class}) should be #{template_value.class}",
18
+ :invalid_key => "invalid key `#{@value_hash[:actual_hash_key].inspect}` in `#{actual_value.inspect}`",
19
+ :surplus_element => "surplus element `#{@value_hash[:actual_array_element].inspect}` in `#{actual_value.inspect}`",
20
+ :invalid_element => "invalid element in `#{actual_value.inspect}`",
21
+ :not_in_range => "`#{actual_value.inspect}` not in range of `#{template_value}`",
22
+ :not_eq => "`#{actual_value.inspect}` not equal to `#{template_value}`",
23
+ :not_required => "no required key: `#{@value_hash[:required_key].inspect}` in `#{actual_value.inspect}`",
24
+ :self_validate_fail => "`#{@value_hash[:template_value_cls].inspect}` custom validate method failed",
25
+ }
26
+ return types[error_type] || "#{error_type}: #{actual_value.inspect}"
27
+ end
28
+
29
+ end
30
+ end
@@ -0,0 +1,313 @@
1
+ # -*- coding : utf-8 -*-
2
+ module Rov
3
+ class Template
4
+ @required = []
5
+ @ordered = false
6
+
7
+ def self.create_template(template_value)
8
+ template_cls = Class.new(self) do
9
+ @template = template_value
10
+ end
11
+ return template_cls
12
+ end
13
+
14
+ def self.template
15
+ return @template
16
+ end
17
+
18
+ def self.template=(value)
19
+ @template = value
20
+ end
21
+
22
+ def self.required
23
+ return @required.to_a
24
+ end
25
+
26
+ def self.ordered?
27
+ return @ordered
28
+ end
29
+
30
+ def initialize(validate_obj)
31
+ @validate_obj = validate_obj
32
+ @raw_template_value = self.class.template
33
+ @required = self.class.required
34
+ end
35
+
36
+ def get_validate_option
37
+ return @validate_obj.get_option()
38
+ end
39
+
40
+ def set_template_value(value)
41
+ @raw_template_value = value
42
+ end
43
+
44
+ def get_template_value
45
+ if @template_value
46
+ return @template_value
47
+ end
48
+ value = @raw_template_value
49
+ validate_option = get_validate_option()
50
+
51
+ if validate_option[:json]
52
+ if value.is_a?(Hash)
53
+ value = Common.string_hash_key(value)
54
+ value = Common.with_symbol_access(value)
55
+ elsif value.is_a?(Array)
56
+ value = Common.string_array_element(value)
57
+ elsif value.is_a?(Symbol)
58
+ value = value.to_s
59
+ elsif value == Symbol
60
+ value = String
61
+ end
62
+ end
63
+
64
+ @template_value = value
65
+ return @template_value
66
+ end
67
+
68
+ def get_template_value_for_validation
69
+ if @template_value_for_validation
70
+ return @template_value_for_validation
71
+ end
72
+ value = get_template_value()
73
+ case
74
+ when value.is_a?(Hash)
75
+ value = Hash[
76
+ value.map do |k, v|
77
+ if Common.template_cls?(k)
78
+ k = @validate_obj.class.new(k)
79
+ end
80
+ [k, @validate_obj.class.new(v)]
81
+ end
82
+ ]
83
+ when value.is_a?(Array)
84
+ value = value.map {|a| @validate_obj.class.new(a)}
85
+ # else
86
+ # if value.class == @validate_obj.class.superclass
87
+ # # clone_self(value)
88
+ # value = value
89
+ # else
90
+ # # @template_value = value
91
+ # value = value
92
+ # end
93
+ end
94
+ @template_value_for_validation = value
95
+ return @template_value_for_validation
96
+ end
97
+
98
+ def validate_method
99
+ value = get_template_value_for_validation
100
+ case
101
+ when value.is_a?(Hash)
102
+ m = method(:validate_hash)
103
+ when value.is_a?(Array)
104
+ m = method(:validate_array)
105
+ else
106
+ if value.is_a?(Class) and value.superclass == self.class.superclass
107
+ m = value.new(@validate_obj).validate_method
108
+ else
109
+ m = method(:validate_other)
110
+ end
111
+ end
112
+
113
+ return m
114
+ end
115
+
116
+ def validate_required(array)
117
+ self.required.each do |key|
118
+ if not @validate_obj.class.new(array).do_validate([key])[0]
119
+ @validate_obj.set_value_hash(:required_key => key)
120
+ @validate_obj.raise_validation_error(:not_required)
121
+ end
122
+ end
123
+ end
124
+
125
+ def validate_hash(actual_hash)
126
+ _template_value = get_template_value_for_validation
127
+ if actual_hash.class != _template_value.class
128
+ @validate_obj.raise_validation_error(:type_error)
129
+ end
130
+ actual_hash.each_pair do |k, v|
131
+ @validate_obj.set_value_hash(:actual_hash_key => k)
132
+ if _template_value.keys.include?(k)
133
+ _template_value[k].validate(v)
134
+ else
135
+ is_exist = false
136
+ (_template_value.keys.find_all {|p| p.class == @validate_obj.class.superclass or p.class == @validate_obj.class}).each do |d|
137
+ if d.do_validate(k)[0]
138
+ _template_value[d].validate(v)
139
+ is_exist = true
140
+ end
141
+ end
142
+ if not is_exist
143
+ @validate_obj.raise_validation_error(:invalid_key)
144
+ end
145
+ end
146
+ end
147
+
148
+ self.validate_required(actual_hash.keys)
149
+
150
+ return [true, ""]
151
+ end
152
+
153
+ def validate_array(actual_array)
154
+ _template_value = get_template_value_for_validation
155
+ if actual_array.class != _template_value.class
156
+ @validate_obj.raise_validation_error(:type_error)
157
+ end
158
+
159
+ if self.ordered?
160
+ actual_array.zip(_template_value).each do |real_element, template_element|
161
+ if template_element.nil?
162
+ @validate_obj.set_value_hash(:actual_array_element => real_element)
163
+ @validate_obj.raise_validation_error(:surplus_element)
164
+ end
165
+ template_element.validate(real_element)
166
+ end
167
+ else
168
+ actual_array.each do |re|
169
+ if _template_value.map {|te| te.do_validate(re)[0]}.none?
170
+ @validate_obj.raise_validation_error(:invalid_element)
171
+ end
172
+ end
173
+ self.validate_required(actual_array)
174
+ end
175
+
176
+ return [true, ""]
177
+ end
178
+
179
+ def validate_other(actual_value)
180
+ _template_value = get_template_value_for_validation
181
+ if not _template_value == actual_value
182
+ @validate_obj.raise_validation_error(:not_eq)
183
+ end
184
+ return [true, ""]
185
+ end
186
+
187
+ def required
188
+ _required = @required
189
+ if get_validate_option[:json]
190
+ case
191
+ when _required.is_a?(Hash)
192
+ _required = Common.string_hash_key(_required)
193
+ when _required.is_a?(Array)
194
+ _required = Common.string_array_element(_required)
195
+ when _required.is_a?(Symbol)
196
+ _required = _required.to_s
197
+ end
198
+ end
199
+ return _required
200
+ end
201
+
202
+ def ordered?
203
+ return self.class.ordered?
204
+ end
205
+
206
+ def do_custom_validate(actual_value)
207
+ if get_validate_option[:json]
208
+ case
209
+ when actual_value.is_a?(Hash)
210
+ actual_value = Common.with_symbol_access(actual_value)
211
+ when actual_value.is_a?(Array)
212
+ actual_value = Common.string_array_element(actual_value)
213
+ when actual_value.is_a?(Symbol)
214
+ actual_value = actual_value.to_s
215
+ end
216
+ end
217
+
218
+ return self.validate(actual_value)
219
+ end
220
+
221
+ def validate(actual_value)
222
+ return true
223
+ end
224
+
225
+ def raise_validation_error(error_type)
226
+ return @validate_obj.raise_validation_error(error_type)
227
+ end
228
+
229
+ # ---------------------------------------------------
230
+ def self.any_of(lst)
231
+ any_of_cls = Class.new(Rov::Template) do
232
+ @template = AnyOfArray.new(lst)
233
+ def validate_method
234
+ m = lambda do |actual_value|
235
+ is_exist = false
236
+ self.get_template_value_for_validation.each do |_template_value|
237
+ if _template_value.do_validate(actual_value)[0]
238
+ is_exist = true
239
+ break
240
+ end
241
+ end
242
+ if not is_exist
243
+ @validate_obj.raise_validation_error(:not_include)
244
+ end
245
+ [true, ""]
246
+ end
247
+ return m
248
+ end
249
+ end
250
+ return any_of_cls
251
+ end
252
+
253
+ def self.instance_of(cls)
254
+ instance_of_cls = Class.new(Rov::Template) do
255
+ @template = cls
256
+
257
+ def validate_method
258
+ m = lambda do |actual_value|
259
+ if not actual_value.instance_of?(self.get_template_value)
260
+ @validate_obj.raise_validation_error(:type_error)
261
+ end
262
+ [true, ""]
263
+ end
264
+ return m
265
+ end
266
+ end
267
+ return instance_of_cls
268
+ end
269
+
270
+ def self.kind_of(cls)
271
+ kind_of_cls = Class.new(Rov::Template) do
272
+ @template = cls
273
+
274
+ def validate_method
275
+ m = lambda do |actual_value|
276
+ if not actual_value.is_a?(self.get_template_value)
277
+ @validate_obj.raise_validation_error(:type_error)
278
+ end
279
+ [true, ""]
280
+ end
281
+ return m
282
+ end
283
+ end
284
+ return kind_of_cls
285
+ end
286
+
287
+ def self.in_range(_range)
288
+ in_range_cls = Class.new(Rov::Template) do
289
+ @template = _range
290
+
291
+ def validate_method
292
+ m = lambda do |actual_value|
293
+ if not self.get_template_value.include?(actual_value)
294
+ @validate_obj.raise_validation_error(:not_in_range)
295
+ end
296
+ [true, ""]
297
+ end
298
+ return m
299
+ end
300
+ end
301
+ return in_range_cls
302
+ end
303
+
304
+ def self.anything
305
+ return kind_of(Object)
306
+ end
307
+
308
+ # ---------------------------------------------------
309
+ end
310
+ end
311
+
312
+ class AnyOfArray < Array
313
+ end
@@ -0,0 +1,30 @@
1
+ # -*- coding : utf-8 -*-
2
+ module Rov
3
+ class Validate
4
+ def self.validate(template, actual_value, option={})
5
+ v = self.new(template)
6
+ return v.do_validate(actual_value, option)
7
+ end
8
+
9
+ def initialize(template)
10
+ @template = template
11
+ end
12
+
13
+ def do_validate(actual_value, option={})
14
+ validate_cls = Class.new(DoValidate) do
15
+ @option = option
16
+
17
+ def self.get_option
18
+ return @option
19
+ end
20
+
21
+ def get_option
22
+ return self.class.get_option
23
+ end
24
+ end
25
+
26
+ validate_obj = validate_cls.new(@template)
27
+ validate_obj.do_validate(actual_value)
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,3 @@
1
+ module Rov
2
+ VERSION = '0.0.1'
3
+ end
metadata ADDED
@@ -0,0 +1,61 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rov
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Handsome Cheung
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2014-11-01 00:00:00 Z
13
+ dependencies: []
14
+
15
+ description: rov provides a general mechanism to validate all objects. All you need is defining template for each object, and then rov will validate them.
16
+ email:
17
+ - handsomecheung@gmail.com
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files: []
23
+
24
+ files:
25
+ - README.md
26
+ - lib/rov.rb
27
+ - lib/rov/common.rb
28
+ - lib/rov/do_validate.rb
29
+ - lib/rov/raise_error.rb
30
+ - lib/rov/template.rb
31
+ - lib/rov/validate.rb
32
+ - lib/rov/version.rb
33
+ homepage: https://github.com/handsomecheung/Robject-Validator
34
+ licenses:
35
+ - GPL-3.0
36
+ metadata: {}
37
+
38
+ post_install_message:
39
+ rdoc_options: []
40
+
41
+ require_paths:
42
+ - lib
43
+ required_ruby_version: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: 1.8.7
48
+ required_rubygems_version: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: "0"
53
+ requirements: []
54
+
55
+ rubyforge_project:
56
+ rubygems_version: 2.4.2
57
+ signing_key:
58
+ specification_version: 4
59
+ summary: rov(Robject Validator) is a object validator for Ruby
60
+ test_files: []
61
+