kwalify 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,188 @@
1
+ body {
2
+ background-color:#FFFFFF;
3
+ }
4
+
5
+ .mainbody {
6
+ color:#333333;
7
+ line-height:150%;
8
+ margin: 5px 30px 5px 30px;
9
+ }
10
+
11
+ a:link, a:active, a:hover {
12
+ color:#CC6600;
13
+ }
14
+
15
+ a:visited {
16
+ color:#DD9900;
17
+ }
18
+
19
+ p {
20
+ color:#333333;
21
+ line-height:150%;
22
+ }
23
+
24
+ pre {
25
+ width: 100%;
26
+ line-height:130%;
27
+ white-space:pre;
28
+ }
29
+
30
+ .program {
31
+ border-style:solid;
32
+ border-width:1px;
33
+ border-color:#6699FF;
34
+ color:#333333;
35
+ background-color:#DDEEFF;
36
+ padding:8px 9px 8px 9px;
37
+ margin:0px;
38
+ word-break:break-all;
39
+ }
40
+
41
+ .terminal {
42
+ border-style:solid;
43
+ border-width:1;
44
+ border-color:#999999;
45
+ color:#333333;
46
+ background-color:#E0E0E0;
47
+ padding:9px 10px 9px 10px;
48
+ margin:0px;
49
+ word-break:break-all;
50
+ }
51
+
52
+ .output {
53
+ border-style:solid;
54
+ border-width:1px;
55
+ border-color:#CCCCCC;
56
+ color:#333333;
57
+ background-color:#FFFFFF;
58
+ padding:8px 9px 8px 9px;
59
+ margin:0px;
60
+ word-break:break-all;
61
+ }
62
+
63
+
64
+ .program_caption {
65
+ margin-top: 20px;
66
+ }
67
+
68
+ .terminal_caption {
69
+ margin-top: 20px;
70
+ }
71
+
72
+ .output_caption {
73
+ margin-top: 20px;
74
+ }
75
+
76
+
77
+ ul,ol,dl {
78
+ /* margin:0px; */
79
+ /* padding:0px; */
80
+ color:#333333;
81
+ line-height:140%;
82
+ }
83
+
84
+ .dt2, .dt3 {
85
+ font-weight:bold;
86
+ }
87
+
88
+ .table1 {
89
+ padding:2px;
90
+ color:#333333;
91
+ background-color:#DDDDCC;
92
+ line-height:130%;
93
+ /*
94
+ border-width:1px;
95
+ border-style:solid;
96
+ border-color:#FFFFFF;
97
+ */
98
+ margin:5;
99
+ }
100
+
101
+ .th1, .th2 {
102
+ padding:1px;
103
+ color:#333333;
104
+ /* background-color:#DDDDCC; */
105
+ background-color:#CCCCBB;
106
+ line-height:130%;
107
+ }
108
+
109
+ .td1, .th2 {
110
+ padding:1px;
111
+ color:#333333;
112
+ background-color:#EEEEDD;
113
+ line-height:130%;
114
+ }
115
+
116
+ .caption1, .caption2 {
117
+ /* font-size:x-small; */
118
+ color:#333333;
119
+ }
120
+
121
+ .table2 {
122
+ padding:1px;
123
+ color:#333333;
124
+ background-color:#DDDDCC;
125
+ line-height:130%;
126
+ /*
127
+ border-width:1px;
128
+ border-style:solid;
129
+ border-color:#FFFFFF;
130
+ */
131
+ margin:5;
132
+ }
133
+
134
+ h1, .chapter, .doctitle {
135
+ color:#333333;
136
+ font-weight:bold;
137
+ padding:30px 0px 10px 0px;
138
+ }
139
+
140
+ h2, .section {
141
+ color:#333333;
142
+ font-weight:bold;
143
+ border-style:solid;
144
+ border-color:#6699FF;
145
+ border-width:0px 0px 2px 30px;
146
+ padding:10px 20px 0px 5px;
147
+ }
148
+
149
+ h3, .subsection {
150
+ color:#333333;
151
+ font-weight:bold;
152
+ border-style:solid;
153
+ border-color:#6699FF;
154
+ border-width: 0px 0px 0px 15px;
155
+ padding: 10px 20px 0px 5px;
156
+ }
157
+
158
+ .em {
159
+ font-weight:bold;
160
+ }
161
+
162
+ .toc {
163
+ /* font-size:small; */
164
+ /* line-height:100%; */
165
+ }
166
+
167
+ .footnote {
168
+ font-size:small;
169
+ }
170
+
171
+ .note {
172
+ background-color:#FFFFDD;
173
+ border-style:solid;
174
+ border-width:0px 1px 0px 1px;
175
+ border-color:#DDDD66;
176
+ color:#333300;
177
+ /* font-size:small; */
178
+ line-height:120%;
179
+ padding: 5px 20px 5px 20px;
180
+ }
181
+
182
+ .figure {
183
+ /*
184
+ border-width:1px;
185
+ border-color:#DDDD66;
186
+ white-space:pre;
187
+ */
188
+ }
@@ -0,0 +1,706 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
2
+ <html>
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html">
5
+ <title>Kwalify Users' Guide</title>
6
+ <meta name="author" content="makoto kuwata &lt;kwa(at)kuwata-lab.com&gt;">
7
+ <meta name="generator" content="kwaser">
8
+ <meta http-equiv="Content-Style-Type" content="text/css">
9
+ <link rel="stylesheet" href="docstyle.css" type="text/css">
10
+ </head>
11
+ <body>
12
+
13
+ <div class="mainbody">
14
+
15
+ <div align="left"><h1>Kwalify Users' Guide</h1></div>
16
+ <div align="left">
17
+ makoto kuwata &lt;kwa(at)kuwata-lab.com&gt;<br>
18
+ last update: $Date: 2005-08-01 06:48:56 +0900 (Mon, 01 Aug 2005) $<br>
19
+ </div>
20
+
21
+ <a name="preface"></a>
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.
24
+ </p>
25
+ <p>Kwalify is in fact very poor compared to Relax NG or DTD.
26
+ I hope you extend/customize Kwalify for your own way.
27
+ </p>
28
+ Table of Contents:
29
+ <div class="toc">
30
+ <ul>
31
+ <li><a href="#preface">Preface</a>
32
+ </li>
33
+ <li><a href="#usage">Usage of Kwalify</a>
34
+ <ul>
35
+ <li><a href="#usage1">Usage in Command-Line</a>
36
+ </li>
37
+ <li><a href="#usage2">Usage in Ruby Script</a>
38
+ </li>
39
+ </ul>
40
+ </li>
41
+ <li><a href="#schema">Schema Definition</a>
42
+ <ul>
43
+ <li><a href="#schema-seq">Sequence</a>
44
+ </li>
45
+ <li><a href="#schema-map">Mapping</a>
46
+ </li>
47
+ <li><a href="#schema-seq-of-map">Sequence of Mapping</a>
48
+ </li>
49
+ <li><a href="#schema-map-of-seq">Mapping of Sequence</a>
50
+ </li>
51
+ <li><a href="#schema-rules">Rules</a>
52
+ </li>
53
+ <li><a href="#schema-block">Validator with Block</a>
54
+ </li>
55
+ </ul>
56
+ </li>
57
+ <li><a href="#tips">Tips</a>
58
+ <ul>
59
+ <li><a href="#tips-quotes">Enclose Key Names in (Double) Quotes</a>
60
+ </li>
61
+ <li><a href="#tips-anchor">Anchor</a>
62
+ </li>
63
+ </ul>
64
+ </li>
65
+ </ul>
66
+ </div>
67
+ <div class="footnote">
68
+ <dl compact>
69
+ <dt>(<a name="fnref:1" href="#fnlink:1">*1</a>)</dt>
70
+ <dd>Pronounce as 'Qualify'.</dd>
71
+ </dl>
72
+ </div>
73
+ <br>
74
+
75
+
76
+ <a name="usage"></a>
77
+ <h2 class="section1">Usage of Kwalify</h2>
78
+ <a name="usage1"></a>
79
+ <h3 class="section2">Usage in Command-Line</h3>
80
+ <div class="terminal_caption">
81
+ usage1: validate YAML document in command-line</div>
82
+ <pre class="terminal">$ kwalify -f schema.yaml document.yaml [document2.yaml ...]
83
+ </pre>
84
+ <div class="terminal_caption">
85
+ usage2: validate schema definition in command-line</div>
86
+ <pre class="terminal">$ kwalify -m schema.yaml [schema2.yaml ...]
87
+ </pre>
88
+ <p>Command-line options:
89
+ </p>
90
+ <dl class="dl3">
91
+ <dt class="dt3"><strong>
92
+ <code>-h</code>, <code>--help</code></strong></dt>
93
+ <dd class="dd3">
94
+ Print help message.
95
+ </dd>
96
+ <dt class="dt3"><strong>
97
+ <code>-v</code> </strong></dt>
98
+ <dd class="dd3">
99
+ Print version.
100
+ </dd>
101
+ <dt class="dt3"><strong>
102
+ <code>-s</code> </strong></dt>
103
+ <dd class="dd3">
104
+ Silent mode.
105
+ </dd>
106
+ <dt class="dt3"><strong>
107
+ <code>-f <em>schema.yaml</em></code> </strong></dt>
108
+ <dd class="dd3">
109
+ Specify schema definition file.
110
+ </dd>
111
+ <dt class="dt3"><strong>
112
+ <code>-m</code> </strong></dt>
113
+ <dd class="dd3">
114
+ Meta-validation of schema definition.
115
+ </dd>
116
+ <dt class="dt3"><strong>
117
+ <code>-t</code> </strong></dt>
118
+ <dd class="dd3">
119
+ Expand tab characters to spaces automatically.
120
+ </dd>
121
+ </dl>
122
+ <br>
123
+
124
+
125
+ <a name="usage2"></a>
126
+ <h3 class="section2">Usage in Ruby Script</h3>
127
+ <div class="program_caption">
128
+ validate YAML document in Ruby script</div>
129
+ <pre class="program">require 'kwalify'
130
+
131
+ ## parse schema definition and create validator
132
+ str = File.read('schema.yaml')
133
+ schema_def = YAML.load(str)
134
+ validator = Kwalify::Validator.new(schema_def) # raises Kwalify::SchemaError if wrong
135
+
136
+ ## validate YAML document
137
+ str = File.read('document.yaml')
138
+ document = YAML.load(str)
139
+ error_list = validator.validate(document)
140
+ unless error_list.empty?
141
+ error_list.each do |error| # error is Kwalify::ValidationException
142
+ print error.message
143
+ end
144
+ end
145
+ </pre>
146
+ <br>
147
+
148
+
149
+ <br>
150
+
151
+
152
+ <a name="schema"></a>
153
+ <h2 class="section1">Schema Definition</h2>
154
+ <a name="schema-seq"></a>
155
+ <h3 class="section2">Sequence</h3>
156
+ <a name="schema01.yaml"></a>
157
+ <div class="program_caption">
158
+ <code>schema01.yaml</code> : sequence of string</div>
159
+ <pre class="program">type: seq
160
+ sequence:
161
+ - type: string
162
+ </pre>
163
+ <a name="document01a.yaml"></a>
164
+ <div class="program_caption">
165
+ <code>document01a.yaml</code> : valid document example</div>
166
+ <pre class="program">- foo
167
+ - bar
168
+ - baz
169
+ </pre>
170
+ <div class="terminal_caption">
171
+ validate</div>
172
+ <pre class="terminal">$ kwalify -f schema01.yaml document01a.yaml
173
+ document01a.yaml#1: valid.
174
+ </pre>
175
+ <a name="document01b.yaml"></a>
176
+ <div class="program_caption">
177
+ <code>document01b.yaml</code> : invalid document example</div>
178
+ <pre class="program">- foo
179
+ - 123
180
+ - baz
181
+ </pre>
182
+ <div class="terminal_caption">
183
+ validate</div>
184
+ <pre class="terminal">$ kwalify -f schema01.yaml document01b.yaml
185
+ document01b.yaml#1: INVALID
186
+ - [/2] string type expected but got Fixnum.
187
+ </pre>
188
+ <p>Default '<code>type:</code>' is <code>string</code> so you can omit '<code>type: string</code>'.
189
+ </p>
190
+ <br>
191
+
192
+
193
+ <a name="schema-map"></a>
194
+ <h3 class="section2">Mapping</h3>
195
+ <a name="schema02.yaml"></a>
196
+ <div class="program_caption">
197
+ <code>schema02.yaml</code> : mapping of scalar</div>
198
+ <pre class="program">type: map
199
+ mapping:
200
+ name:
201
+ type: string
202
+ required: yes
203
+ email:
204
+ type: string
205
+ pattern: /@/
206
+ age:
207
+ type: integer
208
+ birth:
209
+ type: date
210
+ </pre>
211
+ <a name="document02a.yaml"></a>
212
+ <div class="program_caption">
213
+ <code>document02a.yaml</code> : valid document example</div>
214
+ <pre class="program">name: foo
215
+ email: foo@mail.com
216
+ age: 20
217
+ birth: 1985-01-01
218
+ </pre>
219
+ <div class="terminal_caption">
220
+ validate</div>
221
+ <pre class="terminal">$ kwalify -f schema02.yaml document02a.yaml
222
+ document02a.yaml#1: valid.
223
+ </pre>
224
+ <a name="document02b.yaml"></a>
225
+ <div class="program_caption">
226
+ <code>document02b.yaml</code> : invalid document example</div>
227
+ <pre class="program">name: foo
228
+ email: foo(at)mail.com
229
+ age: twenty
230
+ birth: Jun 01, 1985
231
+ </pre>
232
+ <div class="terminal_caption">
233
+ validate</div>
234
+ <pre class="terminal">$ kwalify -f schema02.yaml document02b.yaml
235
+ document02b.yaml#1: INVALID
236
+ - [/birth] date type expected but got String.
237
+ - [/age] integer type expected but got String.
238
+ - [/email] 'foo(at)mail.com' is not matched to pattern /@/.
239
+ </pre>
240
+ <br>
241
+
242
+
243
+ <a name="schema-seq-of-map"></a>
244
+ <h3 class="section2">Sequence of Mapping</h3>
245
+ <a name="schema03.yaml"></a>
246
+ <div class="program_caption">
247
+ <code>schema03.yaml</code> : sequence of mapping</div>
248
+ <pre class="program">type: seq
249
+ sequence:
250
+ - type: map
251
+ mapping:
252
+ name:
253
+ type: string
254
+ required: true
255
+ email:
256
+ type: string
257
+ </pre>
258
+ <a name="document03a.yaml"></a>
259
+ <div class="program_caption">
260
+ <code>document03a.yaml</code> : valid document example</div>
261
+ <pre class="program">- name: foo
262
+ email: foo@mail.com
263
+ - name: bar
264
+ email: bar@mail.net
265
+ - name: baz
266
+ email: baz@mail.org
267
+ </pre>
268
+ <div class="terminal_caption">
269
+ validate</div>
270
+ <pre class="terminal">$ kwalify -f schema03.yaml document03a.yaml
271
+ document03a.yaml#1: valid.
272
+ </pre>
273
+ <a name="document03b.yaml"></a>
274
+ <div class="program_caption">
275
+ <code>document03b.yaml</code> : invalid document example</div>
276
+ <pre class="program">- name: foo
277
+ email: foo@mail.com
278
+ - naem: bar
279
+ email: bar@mail.net
280
+ - name: baz
281
+ mail: baz@mail.org
282
+ </pre>
283
+ <div class="terminal_caption">
284
+ validate</div>
285
+ <pre class="terminal">$ kwalify -f schema03.yaml document03b.yaml
286
+ document03b.yaml#1: INVALID
287
+ - [/2] key 'name' required but not found.
288
+ - [/2] key 'naem' is not expected.
289
+ - [/3] key 'mail' is not expected.
290
+ </pre>
291
+ <br>
292
+
293
+
294
+ <a name="schema-map-of-seq"></a>
295
+ <h3 class="section2">Mapping of Sequence</h3>
296
+ <a name="schema04.yaml"></a>
297
+ <div class="program_caption">
298
+ <code>schema04.yaml</code> : mapping of sequence of mapping</div>
299
+ <pre class="program">type: map
300
+ mapping:
301
+ company:
302
+ type: text
303
+ required: yes
304
+ email:
305
+ type: text
306
+ employees:
307
+ type: seq
308
+ sequence:
309
+ - type: map
310
+ mapping:
311
+ code:
312
+ type: integer
313
+ required: yes
314
+ name:
315
+ type: string
316
+ required: yes
317
+ email:
318
+ type: string
319
+ </pre>
320
+ <a name="document04a.yaml"></a>
321
+ <div class="program_caption">
322
+ <code>document04a.yaml</code> : valid document example</div>
323
+ <pre class="program">company: Kuwata lab.
324
+ email: webmaster@kuwata-lab.com
325
+ employees:
326
+ - code: 101
327
+ name: foo
328
+ email: foo@kuwata-lab.com
329
+ - code: 102
330
+ name: bar
331
+ email: bar@kuwata-lab.com
332
+ </pre>
333
+ <div class="terminal_caption">
334
+ validate</div>
335
+ <pre class="terminal">$ kwalify -f schema04.yaml document04a.yaml
336
+ document04a.yaml#1: valid.
337
+ </pre>
338
+ <a name="document04b.yaml"></a>
339
+ <div class="program_caption">
340
+ <code>document04b.yaml</code> : invalid document example</div>
341
+ <pre class="program">company: Kuwata Lab.
342
+ email: webmaster@kuwata-lab.com
343
+ employees:
344
+ - code: A101
345
+ name: foo
346
+ email: foo@kuwata-lab.com
347
+ - code: 102
348
+ name: bar
349
+ mail: bar@kuwata-lab.com
350
+ </pre>
351
+ <div class="terminal_caption">
352
+ validate</div>
353
+ <pre class="terminal">$ kwalify -f schema04.yaml document04b.yaml
354
+ document04b.yaml#1: INVALID
355
+ - [/employees/1/code] integer type expected but got String.
356
+ - [/employees/2] key 'mail' is not expected.
357
+ </pre>
358
+ <br>
359
+
360
+
361
+ <a name="schema-rules"></a>
362
+ <h3 class="section2">Rules</h3>
363
+ <dl class="dl3">
364
+ <dt class="dt3"><strong>
365
+ <code>required:</code> </strong></dt>
366
+ <dd class="dd3">
367
+ Value is required (default is false).
368
+ </dd>
369
+ <dt class="dt3"><strong>
370
+ <code>enum:</code> </strong></dt>
371
+ <dd class="dd3">
372
+ List of available values.
373
+ </dd>
374
+ <dt class="dt3"><strong>
375
+ <code>pattern:</code> </strong></dt>
376
+ <dd class="dd3">
377
+ Specifies regular expression pattern of value.
378
+ </dd>
379
+ <dt class="dt3"><strong>
380
+ <code>name:</code> </strong></dt>
381
+ <dd class="dd3">
382
+ Name of schema.
383
+ </dd>
384
+ <dt class="dt3"><strong>
385
+ <code>desc:</code> </strong></dt>
386
+ <dd class="dd3">
387
+ Description. This is not used for validation.
388
+ </dd>
389
+ <dt class="dt3"><strong>
390
+ <code>type:</code> </strong></dt>
391
+ <dd class="dd3">
392
+ Type of value. The followings are available:
393
+ <ul type="circle">
394
+ <li><code>string</code> (default)
395
+ </li>
396
+ <li><code>integer</code>
397
+ </li>
398
+ <li><code>float</code>
399
+ </li>
400
+ <li><code>number</code> (== integer or float)
401
+ </li>
402
+ <li><code>text</code> (== string or number)
403
+ </li>
404
+ <li><code>boolean</code>
405
+ </li>
406
+ <li><code>date</code>
407
+ </li>
408
+ <li><code>time</code>
409
+ </li>
410
+ <li><code>seq</code>
411
+ </li>
412
+ <li><code>map</code>
413
+ </li>
414
+ <li><code>object</code>
415
+ </li>
416
+ </ul>
417
+ </dd>
418
+ </dl>
419
+ <a name="schema05.yaml"></a>
420
+ <div class="program_caption">
421
+ <code>schema05.yaml</code> : rules examples</div>
422
+ <pre class="program">type: seq
423
+ sequence:
424
+ - type: map
425
+ mapping:
426
+ name:
427
+ #type: string # omittable
428
+ required: yes
429
+ email:
430
+ #type: string # omittable
431
+ required: yes
432
+ pattern: /@/
433
+ age:
434
+ type: integer
435
+ blood:
436
+ #type: string # omittable
437
+ enum:
438
+ - A
439
+ - B
440
+ - O
441
+ - AB
442
+ birth:
443
+ type: date
444
+ </pre>
445
+ <a name="document05a.yaml"></a>
446
+ <div class="program_caption">
447
+ <code>document05a.yaml</code> : valid document example</div>
448
+ <pre class="program">- name: foo
449
+ email: foo@mail.com
450
+ age: 20
451
+ blood: A
452
+ birth: 1985-01-01
453
+ - name: bar
454
+ email: bar@mail.net
455
+ age: 25
456
+ blood: AB
457
+ birth: 1980-01-01
458
+ </pre>
459
+ <div class="terminal_caption">
460
+ validate</div>
461
+ <pre class="terminal">$ kwalify -f schema05.yaml document05a.yaml
462
+ document05a.yaml#1: valid.
463
+ </pre>
464
+ <a name="document05b.yaml"></a>
465
+ <div class="program_caption">
466
+ <code>document05b.yaml</code> : invalid document example</div>
467
+ <pre class="program">- name: foo
468
+ email: foo(at)mail.com
469
+ age: twenty
470
+ blood: a
471
+ birth: 1985-01-01
472
+ - given-name: bar
473
+ family-name: Bar
474
+ email: bar@mail.net
475
+ age: 25
476
+ blood: AB
477
+ birth: 1980/01/01
478
+ </pre>
479
+ <div class="terminal_caption">
480
+ validate</div>
481
+ <pre class="terminal">$ kwalify -f schema05.yaml document05b.yaml
482
+ document05b.yaml#1: INVALID
483
+ - [/1/blood] 'a' is invalid enum value.
484
+ - [/1/age] integer type expected but got String.
485
+ - [/1/email] 'foo(at)mail.com' is not matched to pattern /@/.
486
+ - [/2] key 'name' required but not found.
487
+ - [/2] key 'family-name' is not expected.
488
+ - [/2] key 'given-name' is not expected.
489
+ - [/2/birth] date type expected but got String.
490
+ </pre>
491
+ <br>
492
+
493
+
494
+ <a name="schema-block"></a>
495
+ <h3 class="section2">Validator with Block</h3>
496
+ <p><strong>Notice: This is an experimental feature.</strong>
497
+ </p>
498
+ <p><code>Kwalify::Validator.new()</code> method can take a block which is invoked when validation.
499
+ </p>
500
+ <a name="validate06.rb"></a>
501
+ <div class="program_caption">
502
+ <code>validate06.rb</code> : validate script</div>
503
+ <pre class="program">#!/usr/bin/env ruby
504
+
505
+ require 'kwalify'
506
+ require 'yaml'
507
+
508
+ ## load schema definition
509
+ schema_filename = 'schema06.yaml'
510
+ schema_str = File.read(schema_filename)
511
+ schema_hash = YAML.load(schema_str)
512
+
513
+ ## create validator with a block
514
+ validator = Kwalify::Validator.new(schema_hash) <strong>{ |schema, data, errors, path|</strong>
515
+ case <strong>schema.name</strong> ## refer schema name
516
+ when <strong>"USERNAME"</strong>
517
+ username = data
518
+ if username.length &gt; 16
519
+ errors &lt;&lt; Kwalify::ValidationError.new("too long (&gt;16).", path, schema)
520
+ end
521
+ when <strong>"AGE"</strong>
522
+ age = data
523
+ if age &lt; 13
524
+ errors &lt;&lt; Kwalify::ValidationError.new("too young (&lt;13).", path, schema)
525
+ elsif age &gt;= 60
526
+ errors &lt;&lt; Kwalify::ValidationError.new("too old (&gt;=60).", path, schema)
527
+ end
528
+ end
529
+ <strong>}</strong>
530
+
531
+ ## load YAML document
532
+ input = ARGF.read()
533
+ document = YAML.load(input)
534
+
535
+ ## validate
536
+ errors = validator.validate(document)
537
+ if errors.empty?
538
+ puts "Valid."
539
+ else
540
+ puts "*** INVALID!"
541
+ errors.each do |error|
542
+ # error.class == Kwalify::ValidationError
543
+ puts " - #{error.message}"
544
+ end
545
+ end
546
+ </pre>
547
+ <a name="schema06.yaml"></a>
548
+ <div class="program_caption">
549
+ <code>schema06.yaml</code> : 'name:' is important.</div>
550
+ <pre class="program">type: map
551
+ mapping:
552
+ members:
553
+ type: seq
554
+ sequence:
555
+ - type: map
556
+ mapping:
557
+ username:
558
+ required: yes
559
+ <strong>name:</strong> <strong>USERNAME</strong>
560
+ email:
561
+ required: yes
562
+ pattern: /@/
563
+ age:
564
+ type: integer
565
+ <strong>name:</strong> <strong>AGE</strong>
566
+ </pre>
567
+ <a name="document06a.yaml"></a>
568
+ <div class="program_caption">
569
+ <code>document06a.yaml</code> : valid document example</div>
570
+ <pre class="program">members:
571
+ - username: foo
572
+ email: foo@mail.com
573
+ age: 19
574
+ - username: bar
575
+ email: bar@mail.org
576
+ age: 21
577
+ </pre>
578
+ <div class="terminal_caption">
579
+ validate</div>
580
+ <pre class="terminal">$ ruby validate06.rb document06a.yaml
581
+ Valid.
582
+ </pre>
583
+ <a name="document06b.yaml"></a>
584
+ <div class="program_caption">
585
+ <code>document06b.yaml</code> : invalid document example</div>
586
+ <pre class="program">members:
587
+ - username: toooooooloooooong
588
+ email: foo@mail.com
589
+ age: 20
590
+ - username: bar
591
+ email: bar@mail.org
592
+ age: 12
593
+ </pre>
594
+ <div class="terminal_caption">
595
+ validate</div>
596
+ <pre class="terminal">$ ruby validate06.rb document06b.yaml
597
+ *** INVALID!
598
+ - [/members/1/username] too long (&gt;16).
599
+ - [/members/2/age] too young (&lt;13).
600
+ </pre>
601
+ <br>
602
+
603
+
604
+ <br>
605
+
606
+
607
+ <a name="tips"></a>
608
+ <h2 class="section1">Tips</h2>
609
+ <a name="tips-quotes"></a>
610
+ <h3 class="section2">Enclose Key Names in (Double) Quotes</h3>
611
+ <p>It is allowed to enclose key name in quotes (') or double-quotes (") in YAML.
612
+ This tip highlights user-defined key names.
613
+ </p>
614
+ <div class="program_caption">
615
+ <code>schema11a.yaml</code> : enclosing in double-quotes</div>
616
+ <pre class="program">type: map
617
+ mapping:
618
+ "name":
619
+ required: yes
620
+ "email":
621
+ pattern: /@/
622
+ "age":
623
+ type: integer
624
+ "birth":
625
+ type: date
626
+ </pre>
627
+ <p>You may prefer to indent with 1 space and 3 spaces.
628
+ </p>
629
+ <div class="program_caption">
630
+ <code>schema11b.yaml</code> : indent with 1 space and 3 spaces</div>
631
+ <pre class="program">type: map
632
+ mapping:
633
+ "name":
634
+ required: yes
635
+ "email":
636
+ pattern: /@/
637
+ "age":
638
+ type: integer
639
+ "birth":
640
+ type: date
641
+ </pre>
642
+ <br>
643
+
644
+
645
+ <a name="tips-anchor"></a>
646
+ <h3 class="section2">Anchor</h3>
647
+ <p>You can share schemas with YAML anchor.
648
+ </p>
649
+ <a name="schema12.yaml"></a>
650
+ <div class="program_caption">
651
+ <code>schema12.yaml</code> : anchor example</div>
652
+ <pre class="program">type: seq
653
+ sequence:
654
+ - <strong>&amp;employee</strong>
655
+ type: map
656
+ mapping:
657
+ "given-name": <strong>&amp;name</strong>
658
+ type: string
659
+ required: yes
660
+ "family-name": <strong>*name</strong>
661
+ "post":
662
+ enum:
663
+ - exective
664
+ - manager
665
+ - clerk
666
+ "supervisor": <strong>*employee</strong>
667
+ </pre>
668
+ <p>Anchor is also available in YAML document.
669
+ </p>
670
+ <a name="document12a.yaml"></a>
671
+ <div class="program_caption">
672
+ <code>document12a.yaml</code> : valid document example</div>
673
+ <pre class="program">- <strong>&amp;foo</strong>
674
+ given-name: foo
675
+ family-name: Foo
676
+ post: exective
677
+ - <strong>&amp;bar</strong>
678
+ given-name: bar
679
+ family-name: Bar
680
+ post: manager
681
+ supervisor: <strong>*foo</strong>
682
+ - given-name: baz
683
+ family-name: Baz
684
+ post: clerk
685
+ supervisor: <strong>*bar</strong>
686
+ - given-name: zak
687
+ family-name: Zak
688
+ post: clerk
689
+ supervisor: <strong>*bar</strong>
690
+ </pre>
691
+ <div class="terminal_caption">
692
+ validate</div>
693
+ <pre class="terminal">$ kwalify -f schema12.yaml document12a.yaml
694
+ document12a.yaml#1: valid.
695
+ </pre>
696
+ <br>
697
+
698
+
699
+ <br>
700
+
701
+
702
+
703
+ </div>
704
+
705
+ </body>
706
+ </html>