trafaret 1.5.5 → 1.5.6

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
  SHA1:
3
- metadata.gz: 705d3489ea9f5859edca572044700d365e8a6db4
4
- data.tar.gz: d0644a20d15ca0e535540f9368af10ee98d3b135
3
+ metadata.gz: a287cdfb38aa84321f68a1989564a6491277ea01
4
+ data.tar.gz: 66fe38066bd25cc4ebfd96136b93d7199a4200ec
5
5
  SHA512:
6
- metadata.gz: 75c2f71ea8c22759ca1d7e54b6036891b0ef3515404a57f4e9a5bd0239ac3b44502e493c40c008379e6abba6bea740356263b2f9022d5ca7ee5d4c3287613938
7
- data.tar.gz: 3980d87341dd76854286494eacf7795dc1ece42eda01168f3873128ed7dd9bf36d895532f6a51b151038a80bb411a06dcc25a892c4ff15f72bd13e52d6f90bb7
6
+ metadata.gz: ff3884c959180136768c903dd9a15051054596af68324e4086862a9527ee90116115898c08559f1bb1642a8fc9a7f0924477dc2c6c99553d548af7b1169fb338
7
+ data.tar.gz: 777a037a908f5da2d94c5663be10acd750440016a4554ef43b2bc5f1e8a3a0c56180229911aa1172a613aa56b4a48a397c0583ff437881a60320804526eb1464
data/README.rst CHANGED
@@ -65,4 +65,37 @@ Array
65
65
 
66
66
  Get one important parameter `validator` that will be applied to every array element::
67
67
 
68
- T.array(validator: :integer).call(['1','2','3']) == [1,2,3]
68
+ T.array(validator: :integer).call(['1','2','3']) == [1,2,3]
69
+
70
+ Case
71
+ ----
72
+
73
+ You can use Ruby case with trafarets, but this have not much sense::
74
+
75
+ case 123
76
+ when T.integer
77
+ :integer
78
+ else
79
+ :any
80
+ end
81
+
82
+ And you can use `Trafaret::Case` that puts result of trafaret to when clause::
83
+
84
+ cs = T.case do |c|
85
+ c.when(T.integer) { |r| :int }
86
+ c.when(T.string) { |r| :string }
87
+ c.when(T.nil) { |r| :nil }
88
+ end
89
+
90
+ Tuple
91
+ -----
92
+
93
+ Tuple is Array that consists not from any number of similar elements, but from exact number of different ones.
94
+ `[1,2,3]` - Array of ints.
95
+ `[1, 'a', nil]` - Tuple.
96
+
97
+ Example::
98
+
99
+ t = T.tuple(:integer, :string, :nil)
100
+ t.call([1, 'a', nil]) == [1, 'a', nil]
101
+ t.call([1, 'a', 3]).dump == {2 => 'Value must be nil'} # Error dumped to pure structures
@@ -19,11 +19,11 @@ module Trafaret
19
19
  return failure('Too big') if @options[:lte] && val > @options[:lte]
20
20
  return failure('Too small') if @options[:gt] && val <= @options[:gt]
21
21
  return failure('Too small') if @options[:gte] && val < @options[:gte]
22
- data
23
- end
24
-
25
- def convert(data)
26
- try_convert(data)
22
+ if @converters.empty?
23
+ val
24
+ else
25
+ data
26
+ end
27
27
  end
28
28
  end
29
29
 
@@ -50,6 +50,10 @@ class Trafaret::Validator
50
50
  self
51
51
  end
52
52
 
53
+ def ===(data)
54
+ !validate(data).is_a?(Trafaret::Error)
55
+ end
56
+
53
57
  # ADT
54
58
  def |(other)
55
59
  Trafaret::Or.new(self, other)
@@ -153,4 +153,49 @@ module Trafaret
153
153
  @blk.call(data)
154
154
  end
155
155
  end
156
+
157
+ class Case < Validator
158
+ def prepare
159
+ @whens = []
160
+ @converters.shift.call(self)
161
+ end
162
+
163
+ def when(trafaret, &blk)
164
+ @whens << [Trafaret::Constructor.construct_from(trafaret), blk]
165
+ end
166
+
167
+ def call(data)
168
+ @whens.each do |trafaret, blk|
169
+ val = trafaret.call(data)
170
+ unless val.is_a?(Trafaret::Error)
171
+ return blk.call(val)
172
+ end
173
+ end
174
+ failure('Case does not match')
175
+ end
176
+ end
177
+
178
+ class Tuple < Validator
179
+ def prepare
180
+ @validators = @args.map { |arg| Trafaret.get_instantiated_validator(arg) }
181
+ @size = @validators.size
182
+ end
183
+
184
+ def call(data)
185
+ return failure('Too many elements') if data.size > @size# && !@extra
186
+ return failure('Not enough elements') if data.size < @size
187
+ failures = {}
188
+ result = []
189
+ data[0..@size].each.with_index do |el, index|
190
+ val = @validators[index].call(el)
191
+ result << val
192
+ failures[index] = val if val.is_a? Trafaret::Error
193
+ end
194
+ if failures.empty?
195
+ result
196
+ else
197
+ failure(failures)
198
+ end
199
+ end
200
+ end
156
201
  end
@@ -1,3 +1,3 @@
1
1
  module Trafaret
2
- VERSION = "1.5.5"
2
+ VERSION = "1.5.6"
3
3
  end
@@ -142,4 +142,44 @@ describe Trafaret::Nil do
142
142
  n.call(123).message.should == 'Value must be nil'
143
143
  n.call(nil).should == nil
144
144
  end
145
+ end
146
+
147
+ describe Trafaret::Validator do
148
+ it 'must work with case' do
149
+ caser = proc do |a|
150
+ case a
151
+ when T.integer
152
+ :int
153
+ when T.symbol(:k)
154
+ :symbol
155
+ else
156
+ :any
157
+ end
158
+ end
159
+ caser.call(123).should == :int
160
+ caser.call(:k).should == :symbol
161
+ caser.call('asd').should == :any
162
+ end
163
+ end
164
+
165
+ describe Trafaret::Case do
166
+ it 'must work' do
167
+ cs = T.case do |c|
168
+ c.when(T.integer) { |r| :int }
169
+ c.when(T.string) { |r| :string }
170
+ c.when(T.nil) { |r| :nil }
171
+ end
172
+ cs.call(123).should == :int
173
+ cs.call('123').should == :int
174
+ cs.call('abs').should == :string
175
+ cs.call(nil).should == :nil
176
+ end
177
+ end
178
+
179
+ describe Trafaret::Tuple do
180
+ it 'must work' do
181
+ t = T.tuple(:integer, :string, :nil)
182
+ t.call([1, 'a', nil]).should == [1, 'a', nil]
183
+ t.call([1, 'a', 3]).dump.should == {2 => 'Value must be nil'}
184
+ end
145
185
  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.5
4
+ version: 1.5.6
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-19 00:00:00.000000000 Z
11
+ date: 2014-04-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport