kwalify 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +6 -1
- data/README.txt +1 -1
- data/bin/kwalify +1 -1
- data/doc/users-guide.html +328 -62
- data/examples/address-book/Makefile +2 -2
- data/examples/address-book/address-book.schema.yaml +1 -1
- data/examples/invoice/Makefile +2 -2
- data/examples/invoice/invoice.schema.yaml +1 -1
- data/examples/tapkit/Makefile +2 -2
- data/examples/tapkit/tapkit.schema.yaml +1 -1
- data/lib/kwalify.rb +4 -3
- data/lib/kwalify/errors.rb +13 -3
- data/lib/kwalify/main-program.rb +60 -21
- data/lib/kwalify/messages.rb +1 -1
- data/lib/kwalify/meta-validator.rb +7 -7
- data/lib/kwalify/parser.rb +759 -0
- data/lib/kwalify/rule.rb +13 -7
- data/lib/kwalify/types.rb +12 -11
- data/lib/kwalify/util/assert-diff.rb +1 -1
- data/lib/kwalify/util/option-parser.rb +1 -1
- data/lib/kwalify/util/yaml-helper.rb +1 -1
- data/lib/kwalify/validator.rb +55 -47
- data/test/test-metavalidator.rb +16 -11
- data/test/test-parser.rb +1276 -0
- data/test/test-validator.rb +172 -87
- data/test/test.rb +13 -16
- data/todo.txt +1 -1
- metadata +57 -50
- data/test/test-metavalidator.rb.error +0 -490
data/ChangeLog
CHANGED
@@ -1,8 +1,13 @@
|
|
1
1
|
.=title: ChangeLog
|
2
|
-
.?release: $Release: 0.
|
2
|
+
.?release: $Release: 0.4.0 $
|
3
3
|
.?lastupdate: $Date$
|
4
4
|
.?version: $Rev$
|
5
5
|
|
6
|
+
.: 2005-10-25 (release 0.4.0)
|
7
|
+
.* Enhances:
|
8
|
+
.- New command-line option '-l' prints error line numbers.
|
9
|
+
.- Supports default rule of mapping.
|
10
|
+
|
6
11
|
.: 2005-09-30 (release 0.3.0)
|
7
12
|
.* Enhances:
|
8
13
|
.- Support 'max-ex' and 'min-ex' (max/min exclusive) support with 'range:'
|
data/README.txt
CHANGED
data/bin/kwalify
CHANGED
data/doc/users-guide.html
CHANGED
@@ -15,12 +15,12 @@
|
|
15
15
|
<div align="left"><h1>Kwalify Users' Guide</h1></div>
|
16
16
|
<div align="left">
|
17
17
|
makoto kuwata <kwa(at)kuwata-lab.com><br>
|
18
|
-
last update: $Date: 2005-10-
|
18
|
+
last update: $Date: 2005-10-25 08:01:14 +0900 (Tue, 25 Oct 2005) $<br>
|
19
19
|
</div>
|
20
20
|
|
21
21
|
<a name="preface"></a>
|
22
22
|
<h2 class="section1">Preface</h2>
|
23
|
-
<p>Kwalify<sup>(<a href="#fnref:1" name="fnlink:1">*1</a>)</sup> is a tiny schema validator for YAML document.
|
23
|
+
<p>Kwalify<sup>(<a href="#fnref:1" name="fnlink:1">*1</a>)</sup> is a tiny schema validator for YAML and JSON document.
|
24
24
|
</p>
|
25
25
|
<p>Do you know "80-20 rule" known as Pareto Law? This rule suggests that 20% of the population owns 80% of the wealth.
|
26
26
|
Kwalify is based on a new "50-5 rule" which suggests that 5% of the population owns 50 of the wealth.
|
@@ -36,9 +36,9 @@ This rule is more aggressive and cost-effective than Pareto Law. The rule is nam
|
|
36
36
|
</tr>
|
37
37
|
<tr class="tr1">
|
38
38
|
<td class="td1">XML Schema</td>
|
39
|
-
<td class="td1">
|
40
|
-
<td class="td1">
|
41
|
-
<td class="td1">
|
39
|
+
<td class="td1">95%</td>
|
40
|
+
<td class="td1">100%</td>
|
41
|
+
<td class="td1">0.95 (= 95/100)</td>
|
42
42
|
</tr>
|
43
43
|
<tr class="tr1">
|
44
44
|
<td class="td1">RelaxNG</td>
|
@@ -80,7 +80,7 @@ Table of Contents:
|
|
80
80
|
</li>
|
81
81
|
<li><a href="#schema-map-of-seq">Mapping of Sequence</a>
|
82
82
|
</li>
|
83
|
-
<li><a href="#schema-rules">
|
83
|
+
<li><a href="#schema-rules">Rule and Constraint</a>
|
84
84
|
</li>
|
85
85
|
<li><a href="#schema-unique">Unique constraint</a>
|
86
86
|
</li>
|
@@ -94,8 +94,14 @@ Table of Contents:
|
|
94
94
|
<ul>
|
95
95
|
<li><a href="#tips-quotes">Enclose Key Names in (Double) Quotes</a>
|
96
96
|
</li>
|
97
|
+
<li><a href="#tips-json">JSON</a>
|
98
|
+
</li>
|
97
99
|
<li><a href="#tips-anchor">Anchor</a>
|
98
100
|
</li>
|
101
|
+
<li><a href="#tips-default">Default of Mapping</a>
|
102
|
+
</li>
|
103
|
+
<li><a href="#tips-merge">Merging Mappings</a>
|
104
|
+
</li>
|
99
105
|
</ul>
|
100
106
|
</li>
|
101
107
|
</ul>
|
@@ -154,7 +160,14 @@ usage2: validate schema definition in command-line</div>
|
|
154
160
|
<dd class="dd3">
|
155
161
|
Expand tab characters to spaces automatically.
|
156
162
|
</dd>
|
163
|
+
<dt class="dt3"><strong>
|
164
|
+
<code>-l</code> </strong></dt>
|
165
|
+
<dd class="dd3">
|
166
|
+
Show linenumber on which error found.
|
167
|
+
</dd>
|
157
168
|
</dl>
|
169
|
+
<p>Notice that the command-line option <code>-l</code> is an experimental feature, for kwalify command use original YAML parser instead of Syck parser when this option is specified.
|
170
|
+
</p>
|
158
171
|
<br>
|
159
172
|
|
160
173
|
|
@@ -177,6 +190,30 @@ unless error_list.empty?
|
|
177
190
|
end
|
178
191
|
end
|
179
192
|
</pre>
|
193
|
+
<div class="program_caption">
|
194
|
+
validate YAML document and show linenumber on where error is found.</div>
|
195
|
+
<pre class="program">require 'kwalify'
|
196
|
+
|
197
|
+
## parse schema definition and create validator
|
198
|
+
schema = YAML.load_file('schema.yaml')
|
199
|
+
validator = Kwalify::Validator.new(schema) # raises Kwalify::SchemaError if wrong
|
200
|
+
|
201
|
+
## parse YAML document with Kwalify's parser
|
202
|
+
str = File.read('document.yaml')
|
203
|
+
parser = Kwalify::Parser.new(str)
|
204
|
+
document = parser.parse()
|
205
|
+
|
206
|
+
## validate document and show errors
|
207
|
+
error_list = validator.validate(document)
|
208
|
+
unless error_list.empty?
|
209
|
+
parser.set_error_linenums(error_list) # set linenum on error
|
210
|
+
error_list.sort { |e1, e2| e1.linenum <=> e2.linenum }.each do |error|
|
211
|
+
puts "(line %d)[%s] %s" % [error.linenum, error.path, error.message]
|
212
|
+
end
|
213
|
+
end
|
214
|
+
</pre>
|
215
|
+
<p>Kwalify's YAML parser is experimental. You should notice that Kwalify's YAML parser is limited only for basic syntax of YAML.
|
216
|
+
</p>
|
180
217
|
<br>
|
181
218
|
|
182
219
|
|
@@ -203,7 +240,7 @@ sequence:
|
|
203
240
|
</pre>
|
204
241
|
<div class="terminal_caption">
|
205
242
|
validate</div>
|
206
|
-
<pre class="terminal">$ kwalify -
|
243
|
+
<pre class="terminal">$ kwalify -lf schema01.yaml document01a.yaml
|
207
244
|
document01a.yaml#0: valid.
|
208
245
|
</pre>
|
209
246
|
<a name="document01b.yaml"></a>
|
@@ -215,9 +252,9 @@ document01a.yaml#0: valid.
|
|
215
252
|
</pre>
|
216
253
|
<div class="terminal_caption">
|
217
254
|
validate</div>
|
218
|
-
<pre class="terminal">$ kwalify -
|
255
|
+
<pre class="terminal">$ kwalify -lf schema01.yaml document01b.yaml
|
219
256
|
document01b.yaml#0: INVALID
|
220
|
-
- [/1] '123': not a string.
|
257
|
+
- (line 2) [/1] '123': not a string.
|
221
258
|
</pre>
|
222
259
|
<p>Default '<code>type:</code>' is <code>str</code> so you can omit '<code>type: str</code>'.
|
223
260
|
</p>
|
@@ -252,7 +289,7 @@ birth: 1985-01-01
|
|
252
289
|
</pre>
|
253
290
|
<div class="terminal_caption">
|
254
291
|
validate</div>
|
255
|
-
<pre class="terminal">$ kwalify -
|
292
|
+
<pre class="terminal">$ kwalify -lf schema02.yaml document02a.yaml
|
256
293
|
document02a.yaml#0: valid.
|
257
294
|
</pre>
|
258
295
|
<a name="document02b.yaml"></a>
|
@@ -265,11 +302,11 @@ birth: Jun 01, 1985
|
|
265
302
|
</pre>
|
266
303
|
<div class="terminal_caption">
|
267
304
|
validate</div>
|
268
|
-
<pre class="terminal">$ kwalify -
|
305
|
+
<pre class="terminal">$ kwalify -lf schema02.yaml document02b.yaml
|
269
306
|
document02b.yaml#0: INVALID
|
270
|
-
- [/
|
271
|
-
- [/age] 'twenty': not a integer.
|
272
|
-
- [/
|
307
|
+
- (line 2) [/email] 'foo(at)mail.com': not matched to pattern /@/.
|
308
|
+
- (line 3) [/age] 'twenty': not a integer.
|
309
|
+
- (line 4) [/birth] 'Jun 01, 1985': not a date.
|
273
310
|
</pre>
|
274
311
|
<br>
|
275
312
|
|
@@ -301,7 +338,7 @@ sequence:
|
|
301
338
|
</pre>
|
302
339
|
<div class="terminal_caption">
|
303
340
|
validate</div>
|
304
|
-
<pre class="terminal">$ kwalify -
|
341
|
+
<pre class="terminal">$ kwalify -lf schema03.yaml document03a.yaml
|
305
342
|
document03a.yaml#0: valid.
|
306
343
|
</pre>
|
307
344
|
<a name="document03b.yaml"></a>
|
@@ -316,11 +353,11 @@ document03a.yaml#0: valid.
|
|
316
353
|
</pre>
|
317
354
|
<div class="terminal_caption">
|
318
355
|
validate</div>
|
319
|
-
<pre class="terminal">$ kwalify -
|
356
|
+
<pre class="terminal">$ kwalify -lf schema03.yaml document03b.yaml
|
320
357
|
document03b.yaml#0: INVALID
|
321
|
-
- [/1] key 'name:' is required.
|
322
|
-
- [/1] key 'naem:' is undefined.
|
323
|
-
- [/2] key 'mail:' is undefined.
|
358
|
+
- (line 3) [/1] key 'name:' is required.
|
359
|
+
- (line 3) [/1] key 'naem:' is undefined.
|
360
|
+
- (line 5) [/2] key 'mail:' is undefined.
|
324
361
|
</pre>
|
325
362
|
<br>
|
326
363
|
|
@@ -366,7 +403,7 @@ employees:
|
|
366
403
|
</pre>
|
367
404
|
<div class="terminal_caption">
|
368
405
|
validate</div>
|
369
|
-
<pre class="terminal">$ kwalify -
|
406
|
+
<pre class="terminal">$ kwalify -lf schema04.yaml document04a.yaml
|
370
407
|
document04a.yaml#0: valid.
|
371
408
|
</pre>
|
372
409
|
<a name="document04b.yaml"></a>
|
@@ -384,16 +421,18 @@ employees:
|
|
384
421
|
</pre>
|
385
422
|
<div class="terminal_caption">
|
386
423
|
validate</div>
|
387
|
-
<pre class="terminal">$ kwalify -
|
424
|
+
<pre class="terminal">$ kwalify -lf schema04.yaml document04b.yaml
|
388
425
|
document04b.yaml#0: INVALID
|
389
|
-
- [/employees/0/code] 'A101': not a integer.
|
390
|
-
- [/employees/1] key 'mail:' is undefined.
|
426
|
+
- (line 4) [/employees/0/code] 'A101': not a integer.
|
427
|
+
- (line 7) [/employees/1] key 'mail:' is undefined.
|
391
428
|
</pre>
|
392
429
|
<br>
|
393
430
|
|
394
431
|
|
395
432
|
<a name="schema-rules"></a>
|
396
|
-
<h3 class="section2">
|
433
|
+
<h3 class="section2">Rule and Constraint</h3>
|
434
|
+
<p>The followings are constraints.
|
435
|
+
</p>
|
397
436
|
<dl class="dl3">
|
398
437
|
<dt class="dt3"><strong>
|
399
438
|
<code>required:</code> </strong></dt>
|
@@ -456,12 +495,23 @@ document04b.yaml#0: INVALID
|
|
456
495
|
<dt class="dt3"><strong>
|
457
496
|
<code>range:</code> </strong></dt>
|
458
497
|
<dd class="dd3">
|
459
|
-
Range of value between max and min.
|
498
|
+
Range of value between max/max-ex and min/min-ex.
|
499
|
+
<ul type="circle">
|
500
|
+
<li>'max' means 'max-inclusive'.
|
501
|
+
</li>
|
502
|
+
<li>'min' means 'min-inclusive'.
|
503
|
+
</li>
|
504
|
+
<li>'max-ex' means 'max-exclusive'.
|
505
|
+
</li>
|
506
|
+
<li>'min-ex' means 'min-exclusive'.
|
507
|
+
</li>
|
508
|
+
</ul>
|
509
|
+
Type <code>seq</code>, <code>map</code>, <code>bool</code> and <code>any</code> are not available with <code>range:</code>.
|
460
510
|
</dd>
|
461
511
|
<dt class="dt3"><strong>
|
462
512
|
<code>length:</code> </strong></dt>
|
463
513
|
<dd class="dd3">
|
464
|
-
Range of length of value between max and min. Only type <code>str</code> and <code>text</code> are available with <code>length:</code>.
|
514
|
+
Range of length of value between max/max-ex and min/min-ex. Only type <code>str</code> and <code>text</code> are available with <code>length:</code>.
|
465
515
|
</dd>
|
466
516
|
<dt class="dt3"><strong>
|
467
517
|
<code>assert:</code> </strong></dt>
|
@@ -475,6 +525,8 @@ document04b.yaml#0: INVALID
|
|
475
525
|
Value is unique for mapping or sequence. See the next subsection for detail.
|
476
526
|
</dd>
|
477
527
|
</dl>
|
528
|
+
<p>A group of constraints is called "rule". For example, constraints which are element value of 'sequence:' or 'mapping:' are rules.
|
529
|
+
</p>
|
478
530
|
<a name="schema05.yaml"></a>
|
479
531
|
<div class="program_caption">
|
480
532
|
<code>schema05.yaml</code> : rules examples</div>
|
@@ -495,7 +547,7 @@ sequence:
|
|
495
547
|
age:
|
496
548
|
type: int
|
497
549
|
range: { max: 30, min: 18 }
|
498
|
-
# or assert:
|
550
|
+
# or assert: 18 <= val && val <= 30
|
499
551
|
blood:
|
500
552
|
type: str
|
501
553
|
enum:
|
@@ -525,7 +577,7 @@ sequence:
|
|
525
577
|
</pre>
|
526
578
|
<div class="terminal_caption">
|
527
579
|
validate</div>
|
528
|
-
<pre class="terminal">$ kwalify -
|
580
|
+
<pre class="terminal">$ kwalify -lf schema05.yaml document05a.yaml
|
529
581
|
document05a.yaml#0: valid.
|
530
582
|
</pre>
|
531
583
|
<a name="document05b.yaml"></a>
|
@@ -546,17 +598,17 @@ document05a.yaml#0: valid.
|
|
546
598
|
</pre>
|
547
599
|
<div class="terminal_caption">
|
548
600
|
validate</div>
|
549
|
-
<pre class="terminal">$ kwalify -
|
601
|
+
<pre class="terminal">$ kwalify -lf schema05.yaml document05b.yaml
|
550
602
|
document05b.yaml#0: INVALID
|
551
|
-
- [/0/
|
552
|
-
- [/0/
|
553
|
-
- [/0/
|
554
|
-
- [/0/
|
555
|
-
- [/1] key 'name:' is
|
556
|
-
- [/1] key 'family-name:' is undefined.
|
557
|
-
- [/1] key '
|
558
|
-
- [/1/
|
559
|
-
- [/1/
|
603
|
+
- (line 2) [/0/email] 'foo(at)mail.com': not matched to pattern /@/.
|
604
|
+
- (line 3) [/0/password] 'xxx123': too short (length 6 < min 8).
|
605
|
+
- (line 4) [/0/age] 'twenty': not a integer.
|
606
|
+
- (line 5) [/0/blood] 'a': invalid blood value.
|
607
|
+
- (line 7) [/1] key 'given-name:' is undefined.
|
608
|
+
- (line 7) [/1] key 'family-name:' is undefined.
|
609
|
+
- (line 7) [/1] key 'name:' is required.
|
610
|
+
- (line 10) [/1/age] '15': too small (< min 18).
|
611
|
+
- (line 12) [/1/birth] '1980/01/01': not a date.
|
560
612
|
</pre>
|
561
613
|
<br>
|
562
614
|
|
@@ -566,12 +618,12 @@ document05b.yaml#0: INVALID
|
|
566
618
|
<p>'<code>unique:</code>' constraint is available with elements of sequence or mapping.
|
567
619
|
This is equivalent to unique key or primary key of RDBMS.
|
568
620
|
</p>
|
569
|
-
<p>Type of a rule which has '<code>unique:</code>' constraint
|
570
|
-
Type of parent rule
|
621
|
+
<p>Type of a rule which has '<code>unique:</code>' constraint must be scalar (str, int, float, ...).
|
622
|
+
Type of parent rule must be sequence or mapping.
|
571
623
|
</p>
|
572
624
|
<a name="schema06.yaml"></a>
|
573
625
|
<div class="program_caption">
|
574
|
-
<code>schema06.yaml</code> : unique constraint with mapping</div>
|
626
|
+
<code>schema06.yaml</code> : unique constraint with mapping and sequence</div>
|
575
627
|
<pre class="program">type: seq
|
576
628
|
sequence:
|
577
629
|
- type: map
|
@@ -610,7 +662,7 @@ sequence:
|
|
610
662
|
</pre>
|
611
663
|
<div class="terminal_caption">
|
612
664
|
validate</div>
|
613
|
-
<pre class="terminal">$ kwalify -
|
665
|
+
<pre class="terminal">$ kwalify -lf schema06.yaml document06a.yaml
|
614
666
|
document06a.yaml#0: valid.
|
615
667
|
</pre>
|
616
668
|
<a name="document06b.yaml"></a>
|
@@ -635,10 +687,10 @@ document06a.yaml#0: valid.
|
|
635
687
|
</pre>
|
636
688
|
<div class="terminal_caption">
|
637
689
|
validate</div>
|
638
|
-
<pre class="terminal">$ kwalify -
|
690
|
+
<pre class="terminal">$ kwalify -lf schema06.yaml document06b.yaml
|
639
691
|
document06b.yaml#0: INVALID
|
640
|
-
- [/0/groups/3] 'foo': is already used at '/0/groups/0'.
|
641
|
-
- [/2/name] 'bar': is already used at '/1/name'.
|
692
|
+
- (line 7) [/0/groups/3] 'foo': is already used at '/0/groups/0'.
|
693
|
+
- (line 13) [/2/name] 'bar': is already used at '/1/name'.
|
642
694
|
</pre>
|
643
695
|
<br>
|
644
696
|
|
@@ -653,11 +705,11 @@ This method is called by Kwalify::Validator#validate().
|
|
653
705
|
schema07.yaml : 'name:' is important.</div>
|
654
706
|
<pre class="program">type: map
|
655
707
|
mapping:
|
656
|
-
|
708
|
+
answers:
|
657
709
|
type: seq
|
658
710
|
sequence:
|
659
711
|
- type: map
|
660
|
-
<strong>name:
|
712
|
+
<strong>name: Answer</strong>
|
661
713
|
mapping:
|
662
714
|
name:
|
663
715
|
type: str
|
@@ -680,8 +732,8 @@ validate07.rb : validate script</div>
|
|
680
732
|
require 'kwalify'
|
681
733
|
require 'yaml'
|
682
734
|
|
683
|
-
## validator class for
|
684
|
-
class
|
735
|
+
## validator class for answers
|
736
|
+
class AnswersValidator < Kwalify::Validator
|
685
737
|
|
686
738
|
## load schema definition
|
687
739
|
@@schema = YAML.load_file('schema07.yaml')
|
@@ -693,7 +745,7 @@ class QuestionnairesValidator < Kwalify::Validator
|
|
693
745
|
## hook method called by Validator#validate()
|
694
746
|
<strong>def validate_hook(value, rule, path, errors)</strong>
|
695
747
|
<strong>case rule.name</strong>
|
696
|
-
<strong>when '
|
748
|
+
<strong>when 'Answer'</strong>
|
697
749
|
if value['answer'] == 'bad'
|
698
750
|
reason = value['reason']
|
699
751
|
if !reason || reason.empty?
|
@@ -707,7 +759,7 @@ class QuestionnairesValidator < Kwalify::Validator
|
|
707
759
|
end
|
708
760
|
|
709
761
|
## create validator
|
710
|
-
validator =
|
762
|
+
validator = AnswersValidator.new
|
711
763
|
|
712
764
|
## load YAML document
|
713
765
|
input = ARGF.read()
|
@@ -728,7 +780,7 @@ end
|
|
728
780
|
<a name="document07a.yaml"></a>
|
729
781
|
<div class="program_caption">
|
730
782
|
<code>document07a.yaml</code> : valid document example</div>
|
731
|
-
<pre class="program">
|
783
|
+
<pre class="program">answers:
|
732
784
|
- name: Foo
|
733
785
|
answer: good
|
734
786
|
reason: I like this style.
|
@@ -746,7 +798,7 @@ Valid.
|
|
746
798
|
<a name="document07b.yaml"></a>
|
747
799
|
<div class="program_caption">
|
748
800
|
<code>document07b.yaml</code> : invalid document example</div>
|
749
|
-
<pre class="program">
|
801
|
+
<pre class="program">answers:
|
750
802
|
- name: Foo
|
751
803
|
answer: good
|
752
804
|
- name: Bar
|
@@ -758,7 +810,7 @@ Valid.
|
|
758
810
|
validate</div>
|
759
811
|
<pre class="terminal">$ ruby validate07.rb document07b.yaml
|
760
812
|
*** INVALID!
|
761
|
-
- [/
|
813
|
+
- [/answers/1] : reason is required when answer is 'bad'.
|
762
814
|
</pre>
|
763
815
|
<br>
|
764
816
|
|
@@ -780,10 +832,10 @@ require 'yaml'
|
|
780
832
|
## load schema definition
|
781
833
|
schema = YAML.load_file('schema06.yaml')
|
782
834
|
|
783
|
-
## create validator for
|
835
|
+
## create validator for answers
|
784
836
|
validator = Kwalify::Validator.new(schema) <strong>{ |value, rule, path, errors|</strong>
|
785
837
|
<strong>case rule.name</strong>
|
786
|
-
<strong>when '
|
838
|
+
<strong>when 'Answer'</strong>
|
787
839
|
if value['answer'] == 'bad'
|
788
840
|
reason = value['reason']
|
789
841
|
if !reason || reason.empty?
|
@@ -866,13 +918,90 @@ mapping:
|
|
866
918
|
<br>
|
867
919
|
|
868
920
|
|
921
|
+
<a name="tips-json"></a>
|
922
|
+
<h3 class="section2">JSON</h3>
|
923
|
+
<p><a href="http://www.json.org">JSON</a> is a lightweight data-interchange format, especially useful for JavaScript.
|
924
|
+
JSON can be considered as a subset of YAML. It means that YAML parser can parse JSON and Kwalify can validate JSON document.
|
925
|
+
</p>
|
926
|
+
<a name="schema12.yaml"></a>
|
927
|
+
<div class="program_caption">
|
928
|
+
<code>schema12.yaml</code> : an example schema written in JSON format</div>
|
929
|
+
<pre class="program">{ "type": "map",
|
930
|
+
"required": true,
|
931
|
+
"mapping": {
|
932
|
+
"name": {
|
933
|
+
"type": "str",
|
934
|
+
"required": true
|
935
|
+
},
|
936
|
+
"email": {
|
937
|
+
"type": "str"
|
938
|
+
},
|
939
|
+
"age": {
|
940
|
+
"type": "int"
|
941
|
+
},
|
942
|
+
"gender": {
|
943
|
+
"type": "str",
|
944
|
+
"enum": ["M", "F"]
|
945
|
+
},
|
946
|
+
"favorite": {
|
947
|
+
"type": "seq",
|
948
|
+
"sequence": [
|
949
|
+
{ "type": "str" }
|
950
|
+
]
|
951
|
+
}
|
952
|
+
}
|
953
|
+
}
|
954
|
+
</pre>
|
955
|
+
<a name="document12a.yaml"></a>
|
956
|
+
<div class="program_caption">
|
957
|
+
<code>document12a.yaml</code> : valid JSON document example</div>
|
958
|
+
<pre class="program">{ "name": "Foo",
|
959
|
+
"email": "foo@mail.com",
|
960
|
+
"age": 20,
|
961
|
+
"gender": "F",
|
962
|
+
"favorite": [
|
963
|
+
"football",
|
964
|
+
"basketball",
|
965
|
+
"baseball"
|
966
|
+
]
|
967
|
+
}
|
968
|
+
</pre>
|
969
|
+
<div class="terminal_caption">
|
970
|
+
validate</div>
|
971
|
+
<pre class="terminal">$ kwalify -lf schema12.yaml document12a.yaml
|
972
|
+
document12a.yaml#0: valid.
|
973
|
+
</pre>
|
974
|
+
<a name="document12b.yaml"></a>
|
975
|
+
<div class="program_caption">
|
976
|
+
<code>document12b.yaml</code> : invalid JSON document example</div>
|
977
|
+
<pre class="program">{
|
978
|
+
"mail": "foo@mail.com",
|
979
|
+
"age": twenty,
|
980
|
+
"gender": "X",
|
981
|
+
"favorite": [ 123, 456 ]
|
982
|
+
}
|
983
|
+
</pre>
|
984
|
+
<div class="terminal_caption">
|
985
|
+
validate</div>
|
986
|
+
<pre class="terminal">$ kwalify -lf schema12.yaml document12b.yaml
|
987
|
+
document12b.yaml#0: INVALID
|
988
|
+
- (line 1) [/] key 'name:' is required.
|
989
|
+
- (line 1) [/] key 'mail:' is undefined.
|
990
|
+
- (line 3) [/age] 'twenty': not a integer.
|
991
|
+
- (line 4) [/gender] 'X': invalid gender value.
|
992
|
+
- (line 5) [/favorite/0] '123': not a string.
|
993
|
+
- (line 5) [/favorite/1] '456': not a string.
|
994
|
+
</pre>
|
995
|
+
<br>
|
996
|
+
|
997
|
+
|
869
998
|
<a name="tips-anchor"></a>
|
870
999
|
<h3 class="section2">Anchor</h3>
|
871
1000
|
<p>You can share schemas with YAML anchor.
|
872
1001
|
</p>
|
873
|
-
<a name="
|
1002
|
+
<a name="schema13.yaml"></a>
|
874
1003
|
<div class="program_caption">
|
875
|
-
<code>
|
1004
|
+
<code>schema13.yaml</code> : anchor example</div>
|
876
1005
|
<pre class="program">type: seq
|
877
1006
|
sequence:
|
878
1007
|
- <strong>&employee</strong>
|
@@ -891,9 +1020,9 @@ sequence:
|
|
891
1020
|
</pre>
|
892
1021
|
<p>Anchor is also available in YAML document.
|
893
1022
|
</p>
|
894
|
-
<a name="
|
1023
|
+
<a name="document13a.yaml"></a>
|
895
1024
|
<div class="program_caption">
|
896
|
-
<code>
|
1025
|
+
<code>document13a.yaml</code> : valid document example</div>
|
897
1026
|
<pre class="program">- <strong>&foo</strong>
|
898
1027
|
given-name: foo
|
899
1028
|
family-name: Foo
|
@@ -914,8 +1043,145 @@ sequence:
|
|
914
1043
|
</pre>
|
915
1044
|
<div class="terminal_caption">
|
916
1045
|
validate</div>
|
917
|
-
<pre class="terminal">$ kwalify -
|
918
|
-
|
1046
|
+
<pre class="terminal">$ kwalify -lf schema13.yaml document13a.yaml
|
1047
|
+
document13a.yaml#0: valid.
|
1048
|
+
</pre>
|
1049
|
+
<br>
|
1050
|
+
|
1051
|
+
|
1052
|
+
<a name="tips-default"></a>
|
1053
|
+
<h3 class="section2">Default of Mapping</h3>
|
1054
|
+
<p>YAML allows user to specify default value of mapping.
|
1055
|
+
</p>
|
1056
|
+
<p>For example, the following YAML document uses default value of mapping.
|
1057
|
+
</p>
|
1058
|
+
<pre class="program">A: 10
|
1059
|
+
B: 20
|
1060
|
+
<strong>=: -1</strong> # default value
|
1061
|
+
</pre>
|
1062
|
+
<p>This is equal to the following Ruby code.
|
1063
|
+
</p>
|
1064
|
+
<pre class="program">map = ["A"=>10, "B"=>20]
|
1065
|
+
map.default = -1
|
1066
|
+
map
|
1067
|
+
</pre>
|
1068
|
+
<p>Kwalify allows user to specify default rule using default value of mapping.
|
1069
|
+
It is useful when key names are unknown.
|
1070
|
+
</p>
|
1071
|
+
<a name="schema14.yaml"></a>
|
1072
|
+
<div class="program_caption">
|
1073
|
+
<code>schema14.yaml</code> : default rule example</div>
|
1074
|
+
<pre class="program">type: map
|
1075
|
+
mapping:
|
1076
|
+
<strong>=:</strong> # default rule
|
1077
|
+
type: number
|
1078
|
+
range: { max: 1, min: -1 }
|
1079
|
+
</pre>
|
1080
|
+
<a name="document14a.yaml"></a>
|
1081
|
+
<div class="program_caption">
|
1082
|
+
<code>document14a.yaml</code> : valid document example</div>
|
1083
|
+
<pre class="program">value1: 0
|
1084
|
+
value2: 0.5
|
1085
|
+
value3: -0.9
|
1086
|
+
</pre>
|
1087
|
+
<div class="terminal_caption">
|
1088
|
+
validate</div>
|
1089
|
+
<pre class="terminal">$ kwalify -lf schema14.yaml document14a.yaml
|
1090
|
+
document14a.yaml#0: valid.
|
1091
|
+
</pre>
|
1092
|
+
<a name="document14b.yaml"></a>
|
1093
|
+
<div class="program_caption">
|
1094
|
+
<code>document14b.yaml</code> : invalid document example</div>
|
1095
|
+
<pre class="program">value1: 0
|
1096
|
+
value2: 1.1
|
1097
|
+
value3: -2.0
|
1098
|
+
</pre>
|
1099
|
+
<div class="terminal_caption">
|
1100
|
+
validate</div>
|
1101
|
+
<pre class="terminal">$ kwalify -lf schema14.yaml document14b.yaml
|
1102
|
+
document14b.yaml#0: INVALID
|
1103
|
+
- (line 2) [/value2] '1.1': too large (> max 1).
|
1104
|
+
- (line 3) [/value3] '-2.0': too small (< min -1).
|
1105
|
+
</pre>
|
1106
|
+
<br>
|
1107
|
+
|
1108
|
+
|
1109
|
+
<a name="tips-merge"></a>
|
1110
|
+
<h3 class="section2">Merging Mappings</h3>
|
1111
|
+
<p>YAML allows user to merge mappings.
|
1112
|
+
</p>
|
1113
|
+
<pre class="program">- <strong>&a1</strong>
|
1114
|
+
A: 10
|
1115
|
+
B: 20
|
1116
|
+
- <strong><<: *a1</strong> # merge
|
1117
|
+
A: 15 # override
|
1118
|
+
C: 30 # add
|
1119
|
+
</pre>
|
1120
|
+
<p>This is equal to the following Ruby code.
|
1121
|
+
</p>
|
1122
|
+
<pre class="program">a1 = {"A"=>10, "B"=>20}
|
1123
|
+
tmp = {}
|
1124
|
+
tmp.update(a1) # merge
|
1125
|
+
tmp["A"] = 15 # override
|
1126
|
+
tmp["C"] = 30 # add
|
1127
|
+
</pre>
|
1128
|
+
<p>This feature allows Kwalify to merge rules.
|
1129
|
+
</p>
|
1130
|
+
<a name="schema15.yaml"></a>
|
1131
|
+
<div class="program_caption">
|
1132
|
+
<code>schema15.yaml</code> : default rule example</div>
|
1133
|
+
<pre class="program">type: map
|
1134
|
+
mapping:
|
1135
|
+
"group":
|
1136
|
+
type: map
|
1137
|
+
mapping:
|
1138
|
+
"name": <strong>&name</strong>
|
1139
|
+
type: str
|
1140
|
+
required: yes
|
1141
|
+
"email": <strong>&email</strong>
|
1142
|
+
type: str
|
1143
|
+
pattern: /@/
|
1144
|
+
required: no
|
1145
|
+
"user":
|
1146
|
+
type: map
|
1147
|
+
mapping:
|
1148
|
+
"name":
|
1149
|
+
<strong><<: *name # merge</strong>
|
1150
|
+
<strong>length: { max: 16 } # override</strong>
|
1151
|
+
"email":
|
1152
|
+
<strong><<: *email # merge</strong>
|
1153
|
+
<strong>required: yes # add</strong>
|
1154
|
+
</pre>
|
1155
|
+
<a name="document15a.yaml"></a>
|
1156
|
+
<div class="program_caption">
|
1157
|
+
<code>document15a.yaml</code> : valid document example</div>
|
1158
|
+
<pre class="program">group:
|
1159
|
+
name: foo
|
1160
|
+
email: foo@mail.com
|
1161
|
+
user:
|
1162
|
+
name: bar
|
1163
|
+
email: bar@mail.com
|
1164
|
+
</pre>
|
1165
|
+
<div class="terminal_caption">
|
1166
|
+
validate</div>
|
1167
|
+
<pre class="terminal">$ kwalify -lf schema15.yaml document15a.yaml
|
1168
|
+
document15a.yaml#0: valid.
|
1169
|
+
</pre>
|
1170
|
+
<a name="document15b.yaml"></a>
|
1171
|
+
<div class="program_caption">
|
1172
|
+
<code>document15b.yaml</code> : invalid document example</div>
|
1173
|
+
<pre class="program">group:
|
1174
|
+
name: foo
|
1175
|
+
email: foo@mail.com
|
1176
|
+
user:
|
1177
|
+
name: toooooo-looooong-name
|
1178
|
+
</pre>
|
1179
|
+
<div class="terminal_caption">
|
1180
|
+
validate</div>
|
1181
|
+
<pre class="terminal">$ kwalify -lf schema15.yaml document15b.yaml
|
1182
|
+
document15b.yaml#0: INVALID
|
1183
|
+
- (line 4) [/user] key 'email:' is required.
|
1184
|
+
- (line 5) [/user/name] 'toooooo-looooong-name': too long (length 21 > max 16).
|
919
1185
|
</pre>
|
920
1186
|
<br>
|
921
1187
|
|