typero 0.3.6 → 0.4.0
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.
- 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
|