trafaret 1.5.7 → 1.5.9

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: 6dfda67413190ab691868072c86fe3fe6c58c8e4
4
- data.tar.gz: 3a372f85b3aca6b1229a692ff473645b61dc51ee
3
+ metadata.gz: 1b74d49954330af927d82d0761fa42341afeb8e7
4
+ data.tar.gz: 05b550a4a635b52256fd7f346b2abab7035bef77
5
5
  SHA512:
6
- metadata.gz: a6b3348f3a319282df5b87e6daa52bb79e882fcd27935f6b459a31b5e1259c7b622285ba23f1f41eb483c99c6f39cb853e46cfcf48cc2d95077e931a1fdcebca
7
- data.tar.gz: 9c3f3730bd78f27eeecb71932ec3eb82d2ebd4f2f9f9bbd43674c01f5d63d861fd22d8ce3e2f5711c2b896badf54d29f3239ae15641ca7fd3b56dced6f0431a2
6
+ metadata.gz: 3da2249c3b0e1963fd11badd4c7164151f83c5d2a1f950d6fb831b637ffedae9cac81b8fb032ae66d3a482cd806f1ae36cbe9c71fdd9b634d95ae72860d2610b
7
+ data.tar.gz: bbdd76be5e061c0d002844849ccbb8a30ca2f322c36a511ff12c75015a518685a1287671f4c02e0b2241dd0a48b48926695da169d7c32bba169f7ceee444b44a
data/README.rst CHANGED
@@ -39,7 +39,7 @@ you must return ``Trafaret::Error`` instance with message. Correct message can b
39
39
  Numeric
40
40
  -------
41
41
 
42
- Two trafarets Integer and Float supports common interface. In options this is parameters `lt`, `lte`, `gt`, `gte`.
42
+ Two trafarets ``Integer`` and ``Float`` supports common interface. In options this is parameters ``lt``, ``lte``, ``gt``, ``gte``.
43
43
 
44
44
  Example::
45
45
 
@@ -49,21 +49,21 @@ Example::
49
49
  String
50
50
  ------
51
51
 
52
- Parameters `allow_blank`, `min_length`, `max_length`. And special option `regex`.
52
+ Parameters ``allow_blank``, ``min_length``, ``max_length``. And special option ``regex``.
53
53
 
54
54
  Example::
55
55
 
56
56
  T.string.call('kuku') == 'kuku'
57
57
  T.string(regex: /\Akuku\z/).call('kuku') == 'kuku'
58
58
 
59
- If you use custom converter block, you will get `Match` instead of `String`, so you can use regex result::
59
+ If you use custom converter block, you will get ``Match`` instead of ``String``, so you can use regex result::
60
60
 
61
61
  T.string(regex: /\Ayear=(\d+),month=(\d+),day=(\d+)\z/).to {|m| Date.new(*m.to_a[1..3].map(&:to_i)) }.call('year=2012,month=5,day=4').to_s == '2012-05-04'
62
62
 
63
63
  URI
64
64
  ---
65
65
 
66
- URI parses URI. Parameter `schemes`, by default == ['http', 'https']::
66
+ URI parses URI. Parameter ``schemes``, by default == ['http', 'https']::
67
67
 
68
68
  t = T.uri(schemes: ['ftp'])
69
69
  t.call('ftp://ftp.ueaysuc.co.uk.edu') == 'ftp://ftp.ueaysuc.co.uk.edu'
@@ -80,7 +80,7 @@ Now just checks simple regexp::
80
80
  Array
81
81
  -----
82
82
 
83
- Get one important parameter `validator` that will be applied to every array element::
83
+ Get one important parameter ``validator`` that will be applied to every array element::
84
84
 
85
85
  T.array(validator: :integer).call(['1','2','3']) == [1,2,3]
86
86
 
@@ -96,7 +96,7 @@ You can use Ruby case with trafarets, but this have not much sense::
96
96
  :any
97
97
  end
98
98
 
99
- And you can use `Trafaret::Case` that puts result of trafaret to when clause::
99
+ And you can use ``Trafaret::Case`` that puts result of trafaret to when clause::
100
100
 
101
101
  cs = T.case do |c|
102
102
  c.when(T.integer) { |r| :int }
@@ -108,11 +108,25 @@ Tuple
108
108
  -----
109
109
 
110
110
  Tuple is Array that consists not from any number of similar elements, but from exact number of different ones.
111
- `[1,2,3]` - Array of ints.
112
- `[1, 'a', nil]` - Tuple.
111
+ ``[1,2,3]`` - Array of ints.
112
+ ``[1, 'a', nil]`` - Tuple.
113
113
 
114
114
  Example::
115
115
 
116
116
  t = T.tuple(:integer, :string, :nil)
117
117
  t.call([1, 'a', nil]) == [1, 'a', nil]
118
118
  t.call([1, 'a', 3]).dump == {2 => 'Value must be nil'} # Error dumped to pure structures
119
+
120
+ Hash
121
+ ----
122
+
123
+ Hashes work in pair with ``Key``'s::
124
+
125
+ T::Hash.new(keys: [T.key(:field_name, validator: T.string)])
126
+
127
+ Is not too appeal, but Keys are powerful and we have sugar::
128
+
129
+ T.construct(
130
+ kuku: :integer,
131
+ T.key(:opt_field, optional: true) => T.integer
132
+ )
@@ -5,7 +5,7 @@ require 'trafaret/validator'
5
5
  require 'trafaret/validators'
6
6
  require 'trafaret/numeric'
7
7
  require 'trafaret/uri_email'
8
- require 'trafaret/base'
8
+ require 'trafaret/hash'
9
9
  require 'trafaret/constructor'
10
10
 
11
11
  module Trafaret
@@ -23,13 +23,13 @@ module Trafaret
23
23
  params.each do |k, v|
24
24
  v = Trafaret::Constructor.construct_from v
25
25
  if k.is_a? ::Symbol
26
- keys << Key.new(k, v)
26
+ keys << Key.new(k, validator: v)
27
27
  elsif k.is_a? Trafaret::Key
28
28
  k.set_validator(v)
29
29
  keys << k
30
30
  end
31
31
  end
32
- Trafaret::Base.new keys: keys
32
+ Trafaret::Hash.new keys: keys
33
33
  end
34
34
 
35
35
  def from_array(params)
@@ -13,7 +13,7 @@ module Trafaret
13
13
  def dump
14
14
  case @message
15
15
  when ::Hash
16
- Hash[@message.map { |k, v| [k, v.dump] }]
16
+ ::Hash[@message.map { |k, v| [k, v.dump] }]
17
17
  when ::Array
18
18
  @message.map &:dump
19
19
  else
@@ -1,15 +1,16 @@
1
1
  module Trafaret
2
2
  class Key
3
- def initialize(name, validator, options = {}, &blk)
3
+ def initialize(name, options = {}, &blk)
4
4
  @name = name
5
5
  @sname = name.to_s
6
6
 
7
7
  @optional = options.delete(:optional)
8
8
  @default = options.delete(:default)
9
9
  @to_name = options.delete(:to_name) || name
10
+ validator = options.delete(:validator)
10
11
  @options = options
11
12
 
12
- set_validator(validator, options, &blk)
13
+ set_validator(validator, options, &blk) if validator
13
14
  end
14
15
 
15
16
  def set_validator(validator, options = {}, &blk)
@@ -49,7 +50,7 @@ module Trafaret
49
50
  end
50
51
  end
51
52
 
52
- class Base < Validator
53
+ class Hash < Validator
53
54
  module ClassMethods
54
55
  attr_accessor :keys
55
56
  def inherited(base)
@@ -57,7 +58,7 @@ module Trafaret
57
58
  end
58
59
 
59
60
  def key(name, validator, options = {}, &blk)
60
- @keys << Key.new(name, validator, options, &blk)
61
+ @keys << Key.new(name, options.merge(validator: validator), &blk)
61
62
  end
62
63
  end
63
64
  extend ClassMethods
@@ -70,7 +71,7 @@ module Trafaret
70
71
  end
71
72
 
72
73
  def key(name, validator, options = {}, &blk)
73
- @keys << Key.new(name, validator, options, &blk)
74
+ @keys << Key.new(name, validator, options.merge(validator: validator), &blk)
74
75
  end
75
76
 
76
77
  def validate(data)
@@ -87,9 +88,9 @@ module Trafaret
87
88
  end
88
89
  end
89
90
  if fails.blank?
90
- Hash[res]
91
+ ::Hash[res]
91
92
  else
92
- failure(Hash[fails])
93
+ failure(::Hash[fails])
93
94
  end
94
95
  end
95
96
  end
@@ -2,7 +2,7 @@ class Trafaret::Validator
2
2
  attr_accessor :converters, :options
3
3
 
4
4
  def initialize(*args, &blk)
5
- @options = (args.pop if args.last.is_a? Hash) || {}
5
+ @options = (args.pop if args.last.is_a? ::Hash) || {}
6
6
  @args = args
7
7
  @converters = []
8
8
  @converters << blk if blk
@@ -44,6 +44,19 @@ module Trafaret
44
44
  end
45
45
  end
46
46
 
47
+ class Forward < Validator
48
+ attr_accessor :validator
49
+
50
+ def provide(validator)
51
+ @validator = validator
52
+ end
53
+
54
+ def validate(data)
55
+ raise 'Validator is not provided' unless validator
56
+ validator.validate(data)
57
+ end
58
+ end
59
+
47
60
  class Nil < Validator
48
61
  def validate(data)
49
62
  failure('Value must be nil') unless data.nil?
@@ -140,9 +153,9 @@ module Trafaret
140
153
  end
141
154
  end
142
155
  if fails.blank?
143
- Hash[pairs]
156
+ ::Hash[pairs]
144
157
  else
145
- failure(Hash[fails])
158
+ failure(::Hash[fails])
146
159
  end
147
160
  end
148
161
  end
@@ -1,3 +1,3 @@
1
1
  module Trafaret
2
- VERSION = "1.5.7"
2
+ VERSION = "1.5.9"
3
3
  end
@@ -3,11 +3,11 @@ require 'trafaret'
3
3
 
4
4
  T = Trafaret
5
5
 
6
- class FacebookResponseTrafaret < Trafaret::Base
6
+ class FacebookResponseTrafaret < Trafaret::Hash
7
7
  key :name, T.string(min_length: 2), optional: true
8
8
  key :oa, T.mapping(T.string,
9
9
  T.mapping(T.string,
10
- T.base(keys: [T.key(:url, T.string)])
10
+ T[:hash, keys: [T.key(:url, validator: T.string)]]
11
11
  )
12
12
  ), to_name: :providers do |data| # so we have response that matches our assumptions, then we can convert it
13
13
  data.flat_map { |p_n, accs| accs.map { |uuid, data| data } }
@@ -16,7 +16,7 @@ class FacebookResponseTrafaret < Trafaret::Base
16
16
  key :optional_key, :string, optional: true
17
17
  end
18
18
 
19
- describe Trafaret::Base do
19
+ describe Trafaret::Hash do
20
20
  let :raw do
21
21
  {'name' => 'kuku',
22
22
  'oa' => {
@@ -34,7 +34,7 @@ describe Trafaret::Base do
34
34
  it 'should work with hash' do
35
35
  t = T.construct({
36
36
  kuku: :integer,
37
- T.key(:krkr, nil, to_name: :id) => :string,
37
+ T.key(:krkr, to_name: :id) => :string,
38
38
  hash: {
39
39
  karma: :integer
40
40
  },
@@ -48,6 +48,14 @@ describe Trafaret::Base do
48
48
  res[:hash][:karma].should == 234
49
49
  res[:proc_].should == 123
50
50
  end
51
+
52
+ it 'should work with optional keys' do
53
+ t = T.construct({
54
+ T.key(:abd, optional: true) => :string
55
+ })
56
+ t.call({}).should == {}
57
+ t.call({'abd' => 'abc'}).should == {abd: 'abc'}
58
+ end
51
59
  end
52
60
 
53
61
  describe Trafaret::String do
@@ -116,12 +124,12 @@ end
116
124
 
117
125
  describe Trafaret::Key do
118
126
  it 'should extract and check value' do
119
- T.key(:name, :string).call({name: 'cow'}).should == [:name, 'cow']
120
- T.key(:name, :string, default: 'Elephant').call({}).should == [:name, 'Elephant']
121
- T.key(:name, :string, optional: true).call({}).should == nil
127
+ T.key(:name, validator: :string).call({name: 'cow'}).should == [:name, 'cow']
128
+ T.key(:name, validator: :string, default: 'Elephant').call({}).should == [:name, 'Elephant']
129
+ T.key(:name, validator: :string, optional: true).call({}).should == nil
122
130
  # to name test
123
- T.key(:name, :string, to_name: :id).call({name: '123'}).should == [:id, '123']
124
- T.key(:name, :string, to_name: :id).call({name: 123})[0].should == :name
131
+ T.key(:name, validator: :string, to_name: :id).call({name: '123'}).should == [:id, '123']
132
+ T.key(:name, validator: :string, to_name: :id).call({name: 123})[0].should == :name
125
133
  end
126
134
  end
127
135
 
@@ -197,4 +205,14 @@ describe Trafaret::Email do
197
205
  e = T.email.to { |m| m[:name] }
198
206
  e.call('kuku@gmail.com').should == 'kuku'
199
207
  end
208
+ end
209
+
210
+ describe Trafaret::Forward do
211
+ it 'should provide recursive' do
212
+ fwd = Trafaret.forward
213
+ v = T.construct(T.key(:child, optional: true) => fwd, payload: :string)
214
+ fwd.provide v
215
+ res = v.call({child: {child: {payload: 'kuku'}, payload: '123'}, payload: '321'})
216
+ res[:child][:child][:payload].should == 'kuku'
217
+ end
200
218
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: trafaret
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.7
4
+ version: 1.5.9
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-04-21 00:00:00.000000000 Z
11
+ date: 2014-08-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -67,9 +67,9 @@ files:
67
67
  - README.rst
68
68
  - Rakefile
69
69
  - lib/trafaret.rb
70
- - lib/trafaret/base.rb
71
70
  - lib/trafaret/constructor.rb
72
71
  - lib/trafaret/errors.rb
72
+ - lib/trafaret/hash.rb
73
73
  - lib/trafaret/numeric.rb
74
74
  - lib/trafaret/uri_email.rb
75
75
  - lib/trafaret/validator.rb