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 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