trafaret 1.1.0 → 1.5.1

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
  SHA1:
3
- metadata.gz: bc7865262c4ddd22e53d71b22cb53aa70b53f403
4
- data.tar.gz: f5fe1c37f11b712d536e3fdb6de0c0189f0fa31e
3
+ metadata.gz: d3da287d80b08ce05b13b14cc3a273319a73dd20
4
+ data.tar.gz: 8dbec245e7f84988b0c6686182b7039ac4fb5e72
5
5
  SHA512:
6
- metadata.gz: d3021461ace4f7c6df04852525cdd60a8fb161f1915d641b6493cc3da3253e4fba8d21e6e3271e9e5cdbfcce4cb353f99c71b7c269366950100116e292063b1d
7
- data.tar.gz: d9cca1a58733a9d30c4b8917e0e0f6b01666f3f8b82611957a727b365949992b59510c17e149725c64a6d84eb86a7fcadd315129ceda85bb3aa77a9bd0ecf75e
6
+ metadata.gz: dece3132f430f9f0bf9a7d70fc903033bbacd78566bf7eb4465ea3fe4fdc8aeef89d46888102810e8a865810837c08ff71e58a91857e8e481edae9f33249f722
7
+ data.tar.gz: 2d639254921bca95796de8d776b54bc713d637a5076b85643a5eb70c81442a8104c86894c35e29ac5470b3c9ae2894bd6429cf9812e7a1465ccf335890a13937
data/lib/trafaret.rb CHANGED
@@ -3,35 +3,56 @@ require 'trafaret/version'
3
3
  require 'trafaret/errors'
4
4
  require 'trafaret/validator'
5
5
  require 'trafaret/validators'
6
+ require 'trafaret/numeric'
6
7
  require 'trafaret/base'
8
+ require 'trafaret/constructor'
7
9
 
8
10
  module Trafaret
9
- def self.get_validator(validator)
10
- if validator.is_a? Symbol
11
- class_name = validator.to_s.classify
12
- validator = Trafaret.const_get(class_name) rescue nil
13
- validator ||= Kernel.const_get(class_name)
14
- else
15
- validator
16
- end
11
+ module NoValue
17
12
  end
18
13
 
19
- def self.get_instantiated_validator(validator, options = {})
20
- val = self.get_validator(validator)
21
- val = val.new(options) if val.is_a? Class
22
- val
23
- end
14
+ class << self
15
+ def get_validator(validator)
16
+ if validator.is_a? ::Symbol
17
+ class_name = validator.to_s.classify
18
+ validator = Trafaret.const_get(class_name) rescue nil
19
+ validator ||= Kernel.const_get(class_name)
20
+ else
21
+ validator
22
+ end
23
+ end
24
24
 
25
- def self.[](validator, options = {})
26
- return self.get_instantiated_validator(validator, options)
27
- end
25
+ def get_instantiated_validator(validator, options = {})
26
+ val = self.get_validator(validator)
27
+ val = val.new(options) if val.is_a? Class
28
+ val
29
+ end
30
+
31
+ def [](validator, options = {})
32
+ return self.get_instantiated_validator(validator, options)
33
+ end
28
34
 
29
- def self.method_missing(meth, *args, &blk)
30
- cls = self.get_validator(meth)
31
- if cls
32
- cls.new(*args, &blk)
33
- else
34
- super
35
+ def method_missing(meth, *args, &blk)
36
+ cls = self.get_validator(meth)
37
+ if cls
38
+ cls.new(*args, &blk)
39
+ else
40
+ super
41
+ end
35
42
  end
43
+
44
+ def proc(*args, &blk)
45
+ Trafaret::Proc.new *args, &blk
46
+ end
47
+
48
+ def failure(msg)
49
+ Trafaret::Error.new msg
50
+ end
51
+
52
+ def construct(from)
53
+ Trafaret::Constructor.construct_from(from)
54
+ end
55
+
56
+ alias :f :failure
36
57
  end
37
58
  end
data/lib/trafaret/base.rb CHANGED
@@ -2,69 +2,95 @@ module Trafaret
2
2
  class Key
3
3
  def initialize(name, validator, options = {}, &blk)
4
4
  @name = name
5
- @validator = validator.new(options)
5
+ @sname = name.to_s
6
+
7
+ @optional = options.delete(:optional)
8
+ @default = options.delete(:default)
9
+ @to_name = options.delete(:to_name) || name
6
10
  @options = options
7
- @blk = blk
8
- end
9
11
 
10
- def get(obj, extractors = {})
11
- return @blk.call obj if @blk
12
- data = begin
13
- extractors[@name].call(obj) if extractors[@name]
14
- rescue NoMethodError
15
- nil
16
- end
17
- data ||= begin
18
- obj.send(@name)
19
- rescue NameError
20
- nil
21
- end
22
- data ||= begin
23
- obj[@name] || obj[@name.to_s]
24
- rescue NoMethodError, TypeError
25
- nil
26
- end
12
+ set_validator(validator, options, &blk)
27
13
  end
28
14
 
29
- def call(data, extractors = {})
30
- [@name, @validator.call(get(data, extractors), &@blk)]
15
+ def set_validator(validator, options = {}, &blk)
16
+ validator = Trafaret.get_validator(validator)
17
+ @validator = if validator.is_a?(Class) then validator.new(options) else validator end
18
+ @validator.add(blk) if blk
31
19
  end
32
- end
33
20
 
34
- class Extractor
35
- def initialize(&blk)
36
- @blk = blk
21
+ def get(obj)
22
+ # data = obj.send(@name) if data.respond_to? @name
23
+ if obj.include? @name
24
+ obj[@name]
25
+ elsif obj.include? @sname
26
+ obj[@sname]
27
+ else
28
+ NoValue
29
+ end
37
30
  end
38
31
 
39
32
  def call(data)
40
- @blk.call data
33
+ value = get(data)
34
+ if value == NoValue
35
+ if @default
36
+ value = @default
37
+ elsif @optional
38
+ return
39
+ else
40
+ return [@name, Trafaret::Error.new("#{@name} is required")]
41
+ end
42
+ end
43
+ value = @validator.call(value, &@blk)
44
+ if value.is_a? Trafaret::Error
45
+ [@name, value]
46
+ else
47
+ [@to_name, value]
48
+ end
41
49
  end
42
50
  end
43
51
 
44
52
  class Base < Validator
45
53
  module ClassMethods
46
- attr_accessor :keys, :extractors
54
+ attr_accessor :keys
47
55
  def inherited(base)
48
56
  base.keys = (keys || []).dup
49
- base.extractors = (extractors || {}).dup
50
57
  end
51
58
 
52
59
  def key(name, validator, options = {}, &blk)
53
- @keys << Key.new(name, Trafaret.get_validator(validator), options, &blk)
54
- end
55
-
56
- def extract(name, &blk)
57
- @extractors[name] = Extractor.new(&blk)
60
+ @keys << Key.new(name, validator, options, &blk)
58
61
  end
59
62
  end
60
63
  extend ClassMethods
61
64
 
65
+ attr_accessor :keys
66
+
67
+ def prepare
68
+ @keys = @options[:keys] || []
69
+ @keys.concat(self.class.keys || [])
70
+ end
71
+
72
+ def key(name, validator, options = {}, &blk)
73
+ @keys << Key.new(name, validator, options, &blk)
74
+ end
75
+
62
76
  def validate(data)
77
+ return failure('Not a Hash') unless data.is_a?(::Hash)
63
78
  res = []
64
- self.class.keys.each do |key|
65
- res << key.call(data, extractors = self.class.extractors)
79
+ fails = []
80
+ @keys.each do |key|
81
+ vdata = key.call(data)
82
+ next unless vdata
83
+ if vdata[1].is_a? Trafaret::Error
84
+ fails << vdata
85
+ else
86
+ res << vdata
87
+ end
88
+ end
89
+ if fails.blank?
90
+ Hash[res]
91
+ else
92
+ failure(Hash[fails])
66
93
  end
67
- Hash[res]
68
94
  end
69
95
  end
70
96
  end
@@ -0,0 +1,39 @@
1
+ module Trafaret
2
+ class Constructor
3
+ class << self
4
+ def construct_from(from)
5
+ case from
6
+ when ::Hash
7
+ from_hash(from)
8
+ when ::Array
9
+ from_array(from)
10
+ when ::Symbol
11
+ Trafaret.get_validator from
12
+ when Trafaret::Validator
13
+ from
14
+ else
15
+ raise 'Wrong parameter'
16
+ end
17
+ end
18
+
19
+ def from_hash(params)
20
+ keys = []
21
+ params.each do |k, v|
22
+ v = Trafaret::Constructor.construct_from v
23
+ if k.is_a? ::Symbol
24
+ keys << Key.new(k, v)
25
+ elsif k.is_a? Trafaret::Key
26
+ k.set_validator(v)
27
+ keys << k
28
+ end
29
+ end
30
+ Trafaret::Base.new keys: keys
31
+ end
32
+
33
+ def from_array(params)
34
+ raise 'Wrong argument for array construction' if params.size != 1
35
+ Trafaret::Array.new validator: Trafaret::Constructor.construct_from(params[0])
36
+ end
37
+ end
38
+ end
39
+ end
@@ -5,5 +5,9 @@ module Trafaret
5
5
  def initialize(message)
6
6
  @message = message
7
7
  end
8
+
9
+ def inspect
10
+ "#<Trafaret::Error(#{message.inspect})>"
11
+ end
8
12
  end
9
13
  end
@@ -0,0 +1,45 @@
1
+ module Trafaret
2
+ class Numeric < Validator
3
+ UNDEFINED = 'Undefined'.freeze
4
+ INTEGER = 'Integer'.freeze
5
+ FLOAT = 'Float'.freeze
6
+
7
+ def try_convert(arg)
8
+ raise 'type method need to be implemented'
9
+ end
10
+
11
+ def num_class_name
12
+ UNDEFINED
13
+ end
14
+
15
+ def validate(data)
16
+ val = try_convert(data)
17
+ return failure("Not an #{num_class_name}") unless val
18
+ return failure('Too big') if @options[:lt] && val >= @options[:lt]
19
+ return failure('Too big') if @options[:lte] && val > @options[:lte]
20
+ return failure('Too small') if @options[:gt] && val <= @options[:gt]
21
+ return failure('Too small') if @options[:gte] && val < @options[:gte]
22
+ data
23
+ end
24
+ end
25
+
26
+ class Integer < Numeric
27
+ def try_convert(arg)
28
+ Integer(arg) rescue nil
29
+ end
30
+
31
+ def num_class_name
32
+ INTEGER
33
+ end
34
+ end
35
+
36
+ class Float < Numeric
37
+ def try_convert(arg)
38
+ Float(arg) rescue nil
39
+ end
40
+
41
+ def num_class_name
42
+ FLOAT
43
+ end
44
+ end
45
+ end
@@ -1,6 +1,14 @@
1
1
  class Trafaret::Validator
2
- def initialize(options = {})
3
- @options = options
2
+ def initialize(*args, &blk)
3
+ @options = (args.pop if args.last.is_a? Hash) || {}
4
+ @args = args
5
+ @converters = []
6
+ @converters << blk if blk
7
+
8
+ prepare
9
+ end
10
+
11
+ def prepare
4
12
  end
5
13
 
6
14
  def validate(data)
@@ -11,21 +19,41 @@ class Trafaret::Validator
11
19
  data
12
20
  end
13
21
 
22
+ def perform_convert(data)
23
+ if @converters.blank?
24
+ convert(data)
25
+ else
26
+ @converters.each do |c|
27
+ data = c.call(data)
28
+ break if data.is_a? Trafaret::Error
29
+ end
30
+ data
31
+ end
32
+ end
33
+
14
34
  def call(data)
15
35
  val = validate(data)
16
36
  return val if val.is_a? Trafaret::Error
17
37
  if block_given?
18
38
  yield val
19
39
  else
20
- convert(val)
40
+ perform_convert(val)
21
41
  end
22
42
  end
23
43
 
44
+ def add(blk)
45
+ @converters << blk
46
+ end
47
+
24
48
  # ADT
25
49
  def |(other)
26
50
  Trafaret::Or.new(self, other)
27
51
  end
28
52
 
53
+ def &(other)
54
+ Trafaret::Chain.new(self, other)
55
+ end
56
+
29
57
  # Helpers
30
58
  def failure(msg)
31
59
  Trafaret::Error.new msg
@@ -2,14 +2,16 @@ module Trafaret
2
2
  class Any < Validator
3
3
  end
4
4
 
5
- class Or < Validator
5
+ class ADT < Validator
6
6
  attr_reader :validators
7
7
 
8
8
  def initialize(*args)
9
9
  args = args.first if args.first.is_a? ::Array
10
10
  @validators = args.map { |v| Trafaret.get_instantiated_validator(v) }
11
11
  end
12
+ end
12
13
 
14
+ class Or < ADT
13
15
  def validate(data)
14
16
  errors = []
15
17
  @validators.each do |v|
@@ -28,6 +30,26 @@ module Trafaret
28
30
  end
29
31
  end
30
32
 
33
+ class Chain < ADT
34
+ def validate(data)
35
+ @validators.each do |v|
36
+ data = v.call(data)
37
+ return data if data.is_a? Trafaret::Error
38
+ end
39
+ data
40
+ end
41
+
42
+ def &(other)
43
+ Trafaret::Chain.new(*validators, other)
44
+ end
45
+ end
46
+
47
+ class Nil < Validator
48
+ def validate(data)
49
+ failure('Value must be nil') unless data.nil?
50
+ end
51
+ end
52
+
31
53
  class String < Validator
32
54
  def validate(data)
33
55
  return failure('Not a String') unless data.is_a? ::String
@@ -41,25 +63,99 @@ module Trafaret
41
63
  end
42
64
  data
43
65
  end
66
+
67
+ def convert(data)
68
+ if data.is_a? MatchData
69
+ data.string
70
+ else
71
+ data
72
+ end
73
+ end
44
74
  end
45
75
 
46
- class Integer < Validator
76
+ class Symbol < Validator
77
+ def prepare
78
+ @sym = @args.first.to_sym
79
+ @str = @args.first.to_s.freeze
80
+ end
81
+
47
82
  def validate(data)
48
- data.to_i
83
+ case data
84
+ when ::String
85
+ @str == data ? @sym : failure('Not equal')
86
+ when ::Symbol
87
+ @sym == data ? @sym : failure('Not equal')
88
+ else
89
+ failure('Not a String or a Symbol')
90
+ end
49
91
  end
50
92
  end
51
93
 
52
94
  class Array < Validator
95
+ def prepare
96
+ val = Trafaret.get_validator(@options[:validator])
97
+ if val.is_a? ::Class
98
+ @cls = Trafaret.get_validator(@options[:validator]).new @options
99
+ else
100
+ @cls = val
101
+ end
102
+ end
103
+
53
104
  def self.[](validator, options = {})
54
105
  self.new(options.merge(validator: validator))
55
106
  end
56
107
 
57
108
  def validate(data)
58
109
  return failure('Not an Array') unless data.is_a? ::Array
59
- cls = Trafaret.get_validator(@options[:validator]).new @options
60
- data.map do |elem|
61
- cls.call elem
110
+ fails = {}
111
+ res = data.map.with_index do |elem, index|
112
+ val = @cls.call elem
113
+ fails[index] = val if val.is_a? Trafaret::Error
114
+ val
115
+ end
116
+ if fails.blank?
117
+ return res
118
+ else
119
+ return failure(fails)
120
+ end
121
+ end
122
+ end
123
+
124
+ class Mapping < Validator
125
+ def prepare
126
+ @key_validator = @args.first
127
+ @value_validator = @args[1]
128
+ end
129
+
130
+ def validate(data)
131
+ return failure('Not a Hash') unless data.is_a? ::Hash
132
+ fails = []
133
+ pairs = []
134
+ data.each do |k, v|
135
+ kv = @key_validator.call(k)
136
+ vv = @value_validator.call(v)
137
+ if (kv.is_a? Trafaret::Error) || (vv.is_a? Trafaret::Error)
138
+ fails << [k, [kv, vv]]
139
+ else
140
+ pairs << [kv, vv]
141
+ end
62
142
  end
143
+ if fails.blank?
144
+ Hash[pairs]
145
+ else
146
+ failure(Hash[fails])
147
+ end
148
+ end
149
+ end
150
+
151
+ class Proc < Validator
152
+ def prepare
153
+ raise 'Need to call with block' if @converters.blank?
154
+ @blk = @converters.pop
155
+ end
156
+
157
+ def validate(data)
158
+ @blk.call(data)
63
159
  end
64
160
  end
65
161
  end
@@ -1,3 +1,3 @@
1
1
  module Trafaret
2
- VERSION = "1.1.0"
2
+ VERSION = "1.5.1"
3
3
  end
@@ -1,18 +1,19 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  require 'trafaret'
3
3
 
4
- class ProviderTrafaret < Trafaret::Base
5
- key :url, Trafaret::String, min_length: 3, max_length: 50
6
- end
4
+ T = Trafaret
7
5
 
8
6
  class FacebookResponseTrafaret < Trafaret::Base
9
- key :name, :string, optional: true, min_length: 2
10
- extract :providers do |data|
11
- data['oa'].flat_map do |prov_name, accs|
12
- accs.map { |uuid, data| data }
13
- end
7
+ key :name, T.string(min_length: 2), optional: true
8
+ key :oa, T.mapping(T.string,
9
+ T.mapping(T.string,
10
+ T.base(keys: [T.key(:url, T.string)])
11
+ )
12
+ ), to_name: :providers do |data| # so we have response that matches our assumptions, then we can convert it
13
+ data.flat_map { |p_n, accs| accs.map { |uuid, data| data } }
14
14
  end
15
- key :providers, :array, validator: :provider_trafaret
15
+ key :dwarf, :string, default: 'Sniffer'
16
+ key :optional_key, :string, optional: true
16
17
  end
17
18
 
18
19
  describe Trafaret::Base do
@@ -27,35 +28,115 @@ describe Trafaret::Base do
27
28
  }
28
29
  end
29
30
  it 'should work' do
30
- FacebookResponseTrafaret.new.call(raw).should == ({name: "kuku", providers: [{url: "http://ya.ru"}, {url: "http://www.ru"}]})
31
+ FacebookResponseTrafaret.new.call(raw).should == ({name: "kuku", providers: [{url: "http://ya.ru"}, {url: "http://www.ru"}], dwarf: 'Sniffer'})
32
+ end
33
+
34
+ it 'should work with hash' do
35
+ t = T.construct({
36
+ kuku: :integer,
37
+ T.key(:krkr, nil, to_name: :id) => :string,
38
+ argh: {
39
+ karma: :integer
40
+ },
41
+ arr: [{id: :integer}]
42
+ })
43
+ res = t.call({kuku: 123, krkr: 'karma', argh: {karma: 234}, arr: [{id: 123}, {id: 234}]})
44
+ res[:id].should == 'karma'
45
+ res[:argh][:karma].should == 234
31
46
  end
32
47
  end
33
48
 
34
49
  describe Trafaret::String do
35
50
  it 'should check errors' do
36
- Trafaret.string.call('').message.should == 'Should not be blank'
37
- Trafaret.string(min_length: 10).call('abc').message.should == 'Too short'
38
- Trafaret.string(max_length: 1).call('abc').message.should == 'Too long'
39
- Trafaret.string(regex: /abc/).call('bca').message.should == 'Does not match'
51
+ T.string.call('').message.should == 'Should not be blank'
52
+ T.string(min_length: 10).call('abc').message.should == 'Too short'
53
+ T.string(max_length: 1).call('abc').message.should == 'Too long'
54
+ T.string(regex: /abc/).call('bca').message.should == 'Does not match'
55
+ end
56
+ end
57
+
58
+ describe Trafaret::Integer do
59
+ it 'should check errors' do
60
+ T.integer.call('blabla').message.should == 'Not an Integer'
61
+ T.integer(lt: 5).call(5).message.should == 'Too big'
62
+ T.integer(lte: 5).call(6).message.should == 'Too big'
63
+ T.integer(gt: 5).call(5).message.should == 'Too small'
64
+ T.integer(gte: 5).call(4).message.should == 'Too small'
65
+ end
66
+ end
67
+
68
+ describe Trafaret::Validator do
69
+ it 'should work with block' do
70
+ blk = proc { |data| if data.present? then data else T::Error.new('Empty data') end }
71
+ T::Validator.new(&blk).call('argh').should == 'argh'
72
+ T::Validator.new(&blk).call('').message.should == 'Empty data'
73
+ T.proc(&blk).call('').message.should == 'Empty data'
40
74
  end
41
75
  end
42
76
 
43
77
  describe Trafaret::Array do
44
78
  it 'should check' do
45
- Trafaret::Array[:string].call(['a', 'b', 'c']).should == ['a', 'b', 'c']
79
+ T::Array[:string].call(['a', 'b', 'c']).should == ['a', 'b', 'c']
80
+ T::Array[:string].call(['a', 'b', nil]).should.is_a? Trafaret::Error
46
81
  end
47
82
  end
48
83
 
49
84
  describe Trafaret::Or do
50
85
  it 'should return value' do
51
- Trafaret[:or, [:string, :integer]].call('krukatuka').should == 'krukatuka'
86
+ T[:or, [:string, :integer]].call('krukatuka').should == 'krukatuka'
52
87
 
53
- (Trafaret[:string] | Trafaret[:integer]).call('krukatuka').should == 'krukatuka'
88
+ (T[:string] | T[:integer]).call('krukatuka').should == 'krukatuka'
54
89
 
55
- (Trafaret.string | Trafaret.integer).call('krukatuka').should == 'krukatuka'
90
+ (T.string | T.integer).call('krukatuka').should == 'krukatuka'
56
91
  end
57
92
 
58
93
  it 'should return errors' do
59
- Trafaret[:or, Trafaret[:array, validator: :string]].call('krukatuka').message.first.message.should == 'Not an Array'
94
+ T[:or, T[:array, validator: :string]].call('krukatuka').message.first.message.should == 'Not an Array'
95
+ end
96
+
97
+ it 'should properly chained' do
98
+ (T.string(min_length: 100) | T.integer | T.string(regex: /aaa/)).call('aaa').should == 'aaa'
99
+ end
100
+ end
101
+
102
+ describe Trafaret::Chain do
103
+ it 'should work with callables' do
104
+ trafaret = T.integer & proc { |d| d == 123? d : T.f('not equal') }
105
+ trafaret.call(123).should == 123
106
+ trafaret.call(321).message.should == 'not equal'
107
+ trafaret = T.integer & proc { |d| d }
108
+ trafaret.call('abc').message.should == 'Not an Integer'
109
+ end
110
+ end
111
+
112
+
113
+ describe Trafaret::Key do
114
+ it 'should extract and check value' do
115
+ T.key(:name, :string).call({name: 'cow'}).should == [:name, 'cow']
116
+ T.key(:name, :string, default: 'Elephant').call({}).should == [:name, 'Elephant']
117
+ T.key(:name, :string, optional: true).call({}).should == nil
118
+ # to name test
119
+ T.key(:name, :string, to_name: :id).call({name: '123'}).should == [:id, '123']
120
+ T.key(:name, :string, to_name: :id).call({name: 123})[0].should == :name
121
+ end
122
+ end
123
+
124
+ describe Trafaret::Symbol do
125
+ it 'should check equality' do
126
+ T.symbol(:name).call('name').should == :name
127
+ T.symbol(:name).call(:name).should == :name
128
+ end
129
+
130
+ it 'should fail' do
131
+ T.symbol(:name).call('pame').message.should == 'Not equal'
132
+ T.symbol(:name).call(123).message.should == 'Not a String or a Symbol'
133
+ end
134
+ end
135
+
136
+ describe Trafaret::Nil do
137
+ it 'should check for nil' do
138
+ n = T::Nil.new
139
+ n.call(123).message.should == 'Value must be nil'
140
+ n.call(nil).should == nil
60
141
  end
61
142
  end
metadata CHANGED
@@ -1,41 +1,41 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: trafaret
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mikhail Krivushin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-03-26 00:00:00.000000000 Z
11
+ date: 2014-04-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: '1.5'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.5'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '>='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '>='
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  description: |-
@@ -47,14 +47,16 @@ executables: []
47
47
  extensions: []
48
48
  extra_rdoc_files: []
49
49
  files:
50
- - .gitignore
50
+ - ".gitignore"
51
51
  - Gemfile
52
52
  - LICENSE.txt
53
53
  - README.md
54
54
  - Rakefile
55
55
  - lib/trafaret.rb
56
56
  - lib/trafaret/base.rb
57
+ - lib/trafaret/constructor.rb
57
58
  - lib/trafaret/errors.rb
59
+ - lib/trafaret/numeric.rb
58
60
  - lib/trafaret/validator.rb
59
61
  - lib/trafaret/validators.rb
60
62
  - lib/trafaret/version.rb
@@ -70,17 +72,17 @@ require_paths:
70
72
  - lib
71
73
  required_ruby_version: !ruby/object:Gem::Requirement
72
74
  requirements:
73
- - - '>='
75
+ - - ">="
74
76
  - !ruby/object:Gem::Version
75
77
  version: '0'
76
78
  required_rubygems_version: !ruby/object:Gem::Requirement
77
79
  requirements:
78
- - - '>='
80
+ - - ">="
79
81
  - !ruby/object:Gem::Version
80
82
  version: '0'
81
83
  requirements: []
82
84
  rubyforge_project:
83
- rubygems_version: 2.0.3
85
+ rubygems_version: 2.2.2
84
86
  signing_key:
85
87
  specification_version: 4
86
88
  summary: Convert data structures. Like a RABL.