typero 0.3.6 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.version +1 -1
- data/lib/typero.rb +29 -21
- data/lib/typero/type.rb +11 -0
- data/lib/typero/type/array.rb +16 -4
- data/lib/typero/type/email.rb +10 -3
- data/lib/typero/type/float.rb +10 -2
- data/lib/typero/type/hash.rb +5 -1
- data/lib/typero/type/integer.rb +10 -2
- data/lib/typero/type/label.rb +5 -1
- data/lib/typero/type/oib.rb +16 -11
- data/lib/typero/type/string.rb +12 -2
- data/lib/typero/type/url.rb +5 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2abbf2baf5e54e738a8144eba2aa35218d88faaf1f26032a041474df61ebc393
|
4
|
+
data.tar.gz: 5d0eed00df648f251b43148b185dab5f05b07068ed225d831584e5a831d41b8a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 78c673d3df0f2a968f44f9fab440c11831de686684d505ac3224ac937a470b0a773c1353a4c37eeb703fdf00fa13dab0a799f59e5ff5596ef75ab32860c0a9b4
|
7
|
+
data.tar.gz: 735f2eea8437315bf330e9d31f7e3fd9b910b3da8b7c9a3792e9b06f4628789798a4aeef089064baac2db412a0fefbeb948908c50bccb4ee6fdfba9497c8f0d4
|
data/.version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.4.0
|
data/lib/typero.rb
CHANGED
@@ -4,6 +4,14 @@
|
|
4
4
|
# set :skills, [:email], min: 2
|
5
5
|
# end
|
6
6
|
#
|
7
|
+
# or
|
8
|
+
#
|
9
|
+
# rules = Typero.new do
|
10
|
+
# string :name, req: true
|
11
|
+
# email :email, req: true
|
12
|
+
# email [:skills], min: 2
|
13
|
+
# end
|
14
|
+
#
|
7
15
|
# errors = rules.validate @object
|
8
16
|
# rules.valid?
|
9
17
|
# rules.validate(@object) { |errors| ... }
|
@@ -15,7 +23,7 @@ class Typero
|
|
15
23
|
|
16
24
|
class << self
|
17
25
|
# validate single value in type
|
18
|
-
def validate
|
26
|
+
def validate type, value, opts={}
|
19
27
|
field = type.to_s.tableize.singularize.to_sym
|
20
28
|
|
21
29
|
# we need to have pointer to hash, so value can be changed (coerced) if needed
|
@@ -31,16 +39,12 @@ class Typero
|
|
31
39
|
h[field]
|
32
40
|
end
|
33
41
|
|
42
|
+
# check and coerce value
|
34
43
|
# Typero.set(:label, 'Foo bar') -> "foo-bar"
|
35
44
|
def set type, value, opts={}
|
36
|
-
|
37
|
-
check = klass.constantize.new value, opts
|
45
|
+
check = Typero::Type.load(type).new value, opts
|
38
46
|
check.set
|
39
47
|
end
|
40
|
-
|
41
|
-
def cache
|
42
|
-
@@cache ||= {}
|
43
|
-
end
|
44
48
|
end
|
45
49
|
|
46
50
|
###
|
@@ -52,9 +56,7 @@ class Typero
|
|
52
56
|
instance_exec &block if block
|
53
57
|
end
|
54
58
|
|
55
|
-
#
|
56
|
-
# integer :age
|
57
|
-
# set :age, type: :integer
|
59
|
+
# set :age, type: :integer -> integer :age
|
58
60
|
# email :email
|
59
61
|
# set :email, [:emails]
|
60
62
|
# email [:emails]
|
@@ -81,10 +83,14 @@ class Typero
|
|
81
83
|
|
82
84
|
opts[:type] = opts[:type].to_s.downcase
|
83
85
|
|
84
|
-
|
85
|
-
opts
|
86
|
-
|
87
|
-
|
86
|
+
opts[:required] = opts[:req] unless opts[:req].nil?
|
87
|
+
opts[:unique] = opts[:uniq] unless opts[:uniq].nil?
|
88
|
+
opts[:description] = opts[:desc] unless opts[:desc].nil?
|
89
|
+
|
90
|
+
# allowed_names = [:req, :uniq, :protected, :type, :min, :max, :array_type, :default, :downcase, :desc, :label]
|
91
|
+
# opts.keys.each do |key|
|
92
|
+
# raise ArgumentError.new('%s is not allowed as typero option' % key) unless allowed_names.index(key)
|
93
|
+
# end
|
88
94
|
|
89
95
|
opts
|
90
96
|
end
|
@@ -94,9 +100,7 @@ class Typero
|
|
94
100
|
opts = type.is_a?(Hash) ? type : opts.merge(type: type)
|
95
101
|
|
96
102
|
opts[:type] ||= :string
|
97
|
-
klass =
|
98
|
-
klass.constantize
|
99
|
-
|
103
|
+
klass = Typero::Type.load opts[:type]
|
100
104
|
@rules[field] = parse_option opts
|
101
105
|
end
|
102
106
|
|
@@ -109,8 +113,12 @@ class Typero
|
|
109
113
|
if @errors[field]
|
110
114
|
@errors[field] += ', %s' % msg
|
111
115
|
else
|
112
|
-
|
113
|
-
|
116
|
+
if msg[0,1].downcase == msg[0,1]
|
117
|
+
field_name = field.to_s.sub(/_id$/,'').humanize
|
118
|
+
msg = '%s %s' % [field_name, msg]
|
119
|
+
end
|
120
|
+
|
121
|
+
@errors[field] = msg
|
114
122
|
end
|
115
123
|
end
|
116
124
|
|
@@ -140,8 +148,8 @@ class Typero
|
|
140
148
|
add_error field, e.message
|
141
149
|
end
|
142
150
|
end
|
143
|
-
elsif opts[:
|
144
|
-
msg = opts[:
|
151
|
+
elsif opts[:required]
|
152
|
+
msg = opts[:required].class == TrueClass ? 'is required' : opts[:req]
|
145
153
|
add_error field, msg
|
146
154
|
end
|
147
155
|
end
|
data/lib/typero/type.rb
CHANGED
@@ -2,6 +2,13 @@ class Typero::Type
|
|
2
2
|
attr_accessor :opts
|
3
3
|
attr_accessor :value
|
4
4
|
|
5
|
+
def self.load name
|
6
|
+
klass = 'Typero::%sType' % name.to_s.gsub(/[^\w]/,'').classify
|
7
|
+
klass.constantize
|
8
|
+
end
|
9
|
+
|
10
|
+
###
|
11
|
+
|
5
12
|
def initialize(value, opts={})
|
6
13
|
@value = value
|
7
14
|
@opts = opts
|
@@ -12,6 +19,10 @@ class Typero::Type
|
|
12
19
|
true
|
13
20
|
end
|
14
21
|
|
22
|
+
def error_for name
|
23
|
+
@opts[name] || send(name)
|
24
|
+
end
|
25
|
+
|
15
26
|
def get
|
16
27
|
@value
|
17
28
|
end
|
data/lib/typero/type/array.rb
CHANGED
@@ -13,8 +13,8 @@ class Typero::ArrayType < Typero::Type
|
|
13
13
|
|
14
14
|
if type = @opts[:array_type]
|
15
15
|
@value.map! { |el|
|
16
|
-
Typero.validate(
|
17
|
-
raise TypeError.new "'%s' %s (
|
16
|
+
Typero.validate(type, el) { |msg|
|
17
|
+
raise TypeError.new "'%s' %s (%s)" % [el, msg, value_in_list_error]
|
18
18
|
}
|
19
19
|
}
|
20
20
|
end
|
@@ -24,9 +24,21 @@ class Typero::ArrayType < Typero::Type
|
|
24
24
|
end
|
25
25
|
|
26
26
|
def validate
|
27
|
-
raise TypeError,
|
28
|
-
raise TypeError,
|
27
|
+
raise TypeError, error_for(:min_length) % @opts[:min] if @opts[:min] && @value.length < @opts[:min]
|
28
|
+
raise TypeError, error_for(:max_length) % @opts[:max] if @opts[:max] && @value.length > @opts[:max]
|
29
29
|
true
|
30
30
|
end
|
31
|
+
|
32
|
+
def min_error
|
33
|
+
'min array lenght is %s elements'
|
34
|
+
end
|
35
|
+
|
36
|
+
def max_error
|
37
|
+
'max array lenght is %s elements'
|
38
|
+
end
|
39
|
+
|
40
|
+
def value_in_list_error
|
41
|
+
'value in list'
|
42
|
+
end
|
31
43
|
end
|
32
44
|
|
data/lib/typero/type/email.rb
CHANGED
@@ -5,9 +5,16 @@ class Typero::EmailType < Typero::Type
|
|
5
5
|
end
|
6
6
|
|
7
7
|
def validate
|
8
|
-
raise TypeError,
|
9
|
-
raise TypeError,
|
10
|
-
|
8
|
+
raise TypeError, error_for(:not_8_chars_error) unless @value.to_s.length > 7
|
9
|
+
raise TypeError, error_for(:missing_monkey_error) unless @value.include?('@')
|
10
|
+
end
|
11
|
+
|
12
|
+
def not_8_chars_error
|
13
|
+
'is not having at least 8 characters'
|
14
|
+
end
|
15
|
+
|
16
|
+
def missing_monkey_error
|
17
|
+
'is missing @'
|
11
18
|
end
|
12
19
|
|
13
20
|
end
|
data/lib/typero/type/float.rb
CHANGED
@@ -5,8 +5,16 @@ class Typero::FloatType < Typero::Type
|
|
5
5
|
end
|
6
6
|
|
7
7
|
def validate
|
8
|
-
raise TypeError,
|
9
|
-
raise TypeError,
|
8
|
+
raise TypeError, error_for(:min_length_error) % @opts[:min] if @opts[:min] && value < @opts[:min]
|
9
|
+
raise TypeError, error_for(:max_length_error) % @opts[:max] if @opts[:max] && value > @opts[:max]
|
10
|
+
end
|
11
|
+
|
12
|
+
def min_length_error
|
13
|
+
"min lenght is %s"
|
14
|
+
end
|
15
|
+
|
16
|
+
def max_length_error
|
17
|
+
"max lenght is %s"
|
10
18
|
end
|
11
19
|
|
12
20
|
end
|
data/lib/typero/type/hash.rb
CHANGED
@@ -4,7 +4,11 @@ class Typero::HashType < Typero::Type
|
|
4
4
|
end
|
5
5
|
|
6
6
|
def validate
|
7
|
-
raise TypeError,
|
7
|
+
raise TypeError, error_for(:not_hash_type_error) unless @value.is_a?(Hash)
|
8
|
+
end
|
9
|
+
|
10
|
+
def not_hash_type_error
|
11
|
+
'value is not hash type'
|
8
12
|
end
|
9
13
|
end
|
10
14
|
|
data/lib/typero/type/integer.rb
CHANGED
@@ -4,8 +4,16 @@ class Typero::IntegerType < Typero::Type
|
|
4
4
|
end
|
5
5
|
|
6
6
|
def validate
|
7
|
-
raise TypeError,
|
8
|
-
raise TypeError,
|
7
|
+
raise TypeError, error_for(:min_value_error) % [@opts[:min], @value] if @opts[:min] && @value < @opts[:min]
|
8
|
+
raise TypeError, error_for(:max_value_error) % [@opts[:max], @value] if @opts[:max] && @value > @opts[:max]
|
9
|
+
end
|
10
|
+
|
11
|
+
def min_value_error
|
12
|
+
'min is %s, got %s'
|
13
|
+
end
|
14
|
+
|
15
|
+
def max_value_error
|
16
|
+
'max is %s, got %s'
|
9
17
|
end
|
10
18
|
end
|
11
19
|
|
data/lib/typero/type/label.rb
CHANGED
@@ -4,6 +4,10 @@ class Typero::LabelType < Typero::Type
|
|
4
4
|
end
|
5
5
|
|
6
6
|
def validate
|
7
|
-
raise TypeError,
|
7
|
+
raise TypeError, error_for(:unallowed_characters_error) unless @value =~ /^[\w\-]+$/
|
8
|
+
end
|
9
|
+
|
10
|
+
def unallowed_characters_error
|
11
|
+
'label is having unallowed characters'
|
8
12
|
end
|
9
13
|
end
|
data/lib/typero/type/oib.rb
CHANGED
@@ -1,21 +1,22 @@
|
|
1
1
|
class Typero::OibType < Typero::Type
|
2
|
+
# http://domagoj.eu/oib/
|
2
3
|
def check? oib
|
3
4
|
oib = oib.to_s
|
4
5
|
|
5
|
-
return false
|
6
|
-
return false if oib.length != 11
|
6
|
+
return false unless oib.match(/^[0-9]{11}$/)
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
8
|
+
control_sum = (0..9).inject(10) do |middle, position|
|
9
|
+
middle += oib.at(position).to_i
|
10
|
+
middle %= 10
|
11
|
+
middle = 10 if middle == 0
|
12
|
+
middle *= 2
|
13
|
+
middle %= 11
|
13
14
|
end
|
14
15
|
|
15
|
-
|
16
|
-
|
16
|
+
control_sum = 11 - control_sum
|
17
|
+
control_sum = 0 if control_sum == 10
|
17
18
|
|
18
|
-
|
19
|
+
return control_sum == oib.at(10).to_i
|
19
20
|
end
|
20
21
|
|
21
22
|
def set
|
@@ -23,7 +24,11 @@ class Typero::OibType < Typero::Type
|
|
23
24
|
end
|
24
25
|
|
25
26
|
def validate
|
26
|
-
raise TypeError.new(
|
27
|
+
raise TypeError.new(error_for(:not_an_oib_error)) unless check?(@value)
|
28
|
+
end
|
29
|
+
|
30
|
+
def not_an_oib_error
|
31
|
+
'not in an OIB format'
|
27
32
|
end
|
28
33
|
end
|
29
34
|
|
data/lib/typero/type/string.rb
CHANGED
@@ -5,8 +5,18 @@ class Typero::StringType < Typero::Type
|
|
5
5
|
end
|
6
6
|
|
7
7
|
def validate
|
8
|
-
raise TypeError,
|
9
|
-
raise TypeError,
|
8
|
+
raise TypeError, error_for(:min_length_error) % [@opts[:min], @value.length] if @opts[:min] && @value.length < @opts[:min]
|
9
|
+
raise TypeError, error_for(:max_length_error) % [@opts[:max], @value.length] if @opts[:max] && @value.length > @opts[:max]
|
10
|
+
end
|
11
|
+
|
12
|
+
# ready for localization
|
13
|
+
|
14
|
+
def min_length_error
|
15
|
+
'min lenght is %s, you have %s'
|
16
|
+
end
|
17
|
+
|
18
|
+
def max_length_error
|
19
|
+
'max lenght is %s, you have %s'
|
10
20
|
end
|
11
21
|
end
|
12
22
|
|
data/lib/typero/type/url.rb
CHANGED
@@ -4,7 +4,11 @@ class Typero::UrlType < Typero::Type
|
|
4
4
|
end
|
5
5
|
|
6
6
|
def validate
|
7
|
-
raise TypeError,
|
7
|
+
raise TypeError, error_for(:not_starting_error) unless @value =~ /^https?:\/\/./
|
8
|
+
end
|
9
|
+
|
10
|
+
def not_starting_error
|
11
|
+
'URL is not starting with http'
|
8
12
|
end
|
9
13
|
end
|
10
14
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: typero
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dino Reic
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-07-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: fast_blank
|