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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f1c86d82e552055ef4caf2fcd72dcbfb040431d44f37dba36016ff93e4785ccf
4
- data.tar.gz: d9e2dda55e722b7c7b2e6d54b87e363e7b1491c903007be100512cf22e0798f9
3
+ metadata.gz: 2abbf2baf5e54e738a8144eba2aa35218d88faaf1f26032a041474df61ebc393
4
+ data.tar.gz: 5d0eed00df648f251b43148b185dab5f05b07068ed225d831584e5a831d41b8a
5
5
  SHA512:
6
- metadata.gz: ff912277d4fe41e6d18637ee208f2f91d066be02e4ef2b3fba26ce69684b13dcd5a9a8a1078d09b7e241b8c6196dccacdda6d06f1a2e08bc310c2f52d5ce9e6d
7
- data.tar.gz: 5aa99ee889b1524727f43a76bf5c2cfd8b8d8f85a634081607248680f81dc0b004781bc1dff936b0a17d2a17e31bbe46536e52a569a7fc3f4cd2ea2c55d80cc4
6
+ metadata.gz: 78c673d3df0f2a968f44f9fab440c11831de686684d505ac3224ac937a470b0a773c1353a4c37eeb703fdf00fa13dab0a799f59e5ff5596ef75ab32860c0a9b4
7
+ data.tar.gz: 735f2eea8437315bf330e9d31f7e3fd9b910b3da8b7c9a3792e9b06f4628789798a4aeef089064baac2db412a0fefbeb948908c50bccb4ee6fdfba9497c8f0d4
data/.version CHANGED
@@ -1 +1 @@
1
- 0.3.6
1
+ 0.4.0
@@ -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 value, type, opts={}
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
- klass = 'Typero::%sType' % type.to_s.gsub(/[^\w]/,'').classify
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
- # convert
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
- allowed_names = [:req, :uniq, :protected, :type, :min, :max, :array_type, :default, :downcase, :desc]
85
- opts.keys.each do |key|
86
- raise ArgumentError.new('%s is not allowed as typero option' % key) unless allowed_names.index(key)
87
- end
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 = 'Typero::%sType' % opts[:type].to_s.gsub(/[^\w]/,'').classify
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
- field_name = field.to_s.sub(/_id$/,'').humanize
113
- @errors[field] = '%s %s' % [field_name, msg]
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[:req]
144
- msg = opts[:req].class == TrueClass ? 'is required' : opts[:req]
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
@@ -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
@@ -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(el, type) { |msg|
17
- raise TypeError.new "'%s' %s (value in list)" % [el, msg]
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, 'Min array lenght is %s elements' % @opts[:min] if @opts[:min] && @value.length < @opts[:min]
28
- raise TypeError, 'Max array lenght is %s elements' % @opts[:max] if @opts[:max] && @value.length > @opts[:max]
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
 
@@ -5,9 +5,16 @@ class Typero::EmailType < Typero::Type
5
5
  end
6
6
 
7
7
  def validate
8
- raise TypeError, 'is not having at least 8 characters' unless @value.to_s.length > 7
9
- raise TypeError, 'is missing @' unless @value.include?('@')
10
- # raise TypeError, "[#{@value}] is in wrong format" unless @value =~ /^[\+\w\-\.]+\@[\w\-\.]+$/i
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
@@ -5,8 +5,16 @@ class Typero::FloatType < Typero::Type
5
5
  end
6
6
 
7
7
  def validate
8
- raise TypeError, "min lenght is #{@opts[:min]}" if @opts[:min] && value < @opts[:min]
9
- raise TypeError, "max lenght is #{@opts[:max]}" if @opts[:max] && value > @opts[:max]
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
@@ -4,7 +4,11 @@ class Typero::HashType < Typero::Type
4
4
  end
5
5
 
6
6
  def validate
7
- raise TypeError, 'Value is not hash type' unless @value.is_a?(Hash)
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
 
@@ -4,8 +4,16 @@ class Typero::IntegerType < Typero::Type
4
4
  end
5
5
 
6
6
  def validate
7
- raise TypeError, 'min is %s, got %s' % [@opts[:min], @value] if @opts[:min] && @value < @opts[:min]
8
- raise TypeError, 'max is %s, got %s' % [@opts[:max], @value] if @opts[:max] && @value > @opts[:max]
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
 
@@ -4,6 +4,10 @@ class Typero::LabelType < Typero::Type
4
4
  end
5
5
 
6
6
  def validate
7
- raise TypeError, "Label is having unallowed characters" unless @value =~ /^[\w\-]+$/
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
@@ -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 if (oib =~ /\d{11}/) != 0
6
- return false if oib.length != 11
6
+ return false unless oib.match(/^[0-9]{11}$/)
7
7
 
8
- a = 10
9
- (0..9).each do |i|
10
- a = (a + oib[i,1].to_i) % 10
11
- a = 10 if a == 0
12
- a = (a * 2) % 11
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
- kontrolna = 11 - a
16
- kontrolna = 0 if kontrolna == 10
16
+ control_sum = 11 - control_sum
17
+ control_sum = 0 if control_sum == 10
17
18
 
18
- kontrolna == oib[10,1].to_i
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('Not an OIB') unless check?(@value)
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
 
@@ -5,8 +5,18 @@ class Typero::StringType < Typero::Type
5
5
  end
6
6
 
7
7
  def validate
8
- raise TypeError, 'min lenght is %s, you have %s' % [@opts[:min], @value.length] if @opts[:min] && @value.length < @opts[:min]
9
- raise TypeError, 'max lenght is %s, you have %s' % [@opts[:max], @value.length] if @opts[:max] && @value.length > @opts[:max]
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
 
@@ -4,7 +4,11 @@ class Typero::UrlType < Typero::Type
4
4
  end
5
5
 
6
6
  def validate
7
- raise TypeError, 'URL is not starting with http' unless @value =~ /^https?:\/\/./
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.3.6
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-03-06 00:00:00.000000000 Z
11
+ date: 2018-07-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fast_blank