kwalify 0.5.1 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (109) hide show
  1. data/ChangeLog +24 -19
  2. data/README.txt +51 -51
  3. data/bin/kwalify +2 -2
  4. data/contrib/inline-require +151 -0
  5. data/contrib/kwalify +2850 -0
  6. data/doc-api/classes/CommandOptionError.html +184 -0
  7. data/doc-api/classes/CommandOptionParser.html +325 -0
  8. data/doc-api/classes/Kwalify.html +270 -0
  9. data/doc-api/classes/Kwalify/AssertionError.html +148 -0
  10. data/doc-api/classes/Kwalify/BaseError.html +296 -0
  11. data/doc-api/classes/Kwalify/CommandOptionError.html +168 -0
  12. data/doc-api/classes/Kwalify/ErrorHelper.html +218 -0
  13. data/doc-api/classes/Kwalify/HashInterface.html +240 -0
  14. data/doc-api/classes/Kwalify/KwalifyError.html +111 -0
  15. data/doc-api/classes/Kwalify/Main.html +336 -0
  16. data/doc-api/classes/Kwalify/MetaValidator.html +432 -0
  17. data/doc-api/classes/Kwalify/Parser.html +155 -0
  18. data/doc-api/classes/Kwalify/PlainYamlParser.html +520 -0
  19. data/doc-api/classes/Kwalify/PlainYamlParser/Alias.html +165 -0
  20. data/doc-api/classes/Kwalify/Rule.html +411 -0
  21. data/doc-api/classes/Kwalify/SchemaError.html +148 -0
  22. data/doc-api/classes/Kwalify/Types.html +301 -0
  23. data/doc-api/classes/Kwalify/ValidationError.html +148 -0
  24. data/doc-api/classes/Kwalify/Validator.html +311 -0
  25. data/doc-api/classes/Kwalify/YamlParser.html +535 -0
  26. data/doc-api/classes/Kwalify/YamlSyntaxError.html +168 -0
  27. data/doc-api/classes/Test.html +107 -0
  28. data/doc-api/classes/Test/Unit.html +101 -0
  29. data/doc-api/classes/YamlHelper.html +259 -0
  30. data/doc-api/created.rid +1 -0
  31. data/doc-api/files/__/README_txt.html +179 -0
  32. data/doc-api/files/kwalify/errors_rb.html +114 -0
  33. data/doc-api/files/kwalify/main_rb.html +117 -0
  34. data/doc-api/files/kwalify/messages_rb.html +107 -0
  35. data/doc-api/files/kwalify/meta-validator_rb.html +117 -0
  36. data/doc-api/files/kwalify/rule_rb.html +116 -0
  37. data/doc-api/files/kwalify/types_rb.html +114 -0
  38. data/doc-api/files/kwalify/util/assert-text-equal_rb.html +115 -0
  39. data/doc-api/files/kwalify/util/hash-interface_rb.html +107 -0
  40. data/doc-api/files/kwalify/util/option-parser_rb.html +107 -0
  41. data/doc-api/files/kwalify/util/testcase-helper_rb.html +115 -0
  42. data/doc-api/files/kwalify/util/yaml-helper_rb.html +114 -0
  43. data/doc-api/files/kwalify/validator_rb.html +117 -0
  44. data/doc-api/files/kwalify/yaml-parser_rb.html +117 -0
  45. data/doc-api/files/kwalify_rb.html +120 -0
  46. data/doc-api/fr_class_index.html +50 -0
  47. data/doc-api/fr_file_index.html +41 -0
  48. data/doc-api/fr_method_index.html +109 -0
  49. data/doc-api/index.html +24 -0
  50. data/doc-api/rdoc-style.css +208 -0
  51. data/doc/users-guide.html +693 -193
  52. data/examples/address-book/Makefile +5 -0
  53. data/examples/address-book/address-book.schema.yaml +2 -1
  54. data/examples/invoice/Makefile +5 -0
  55. data/examples/invoice/invoice.schema.yaml +3 -2
  56. data/examples/tapkit/Makefile +5 -0
  57. data/examples/tapkit/main.rb +7 -0
  58. data/examples/tapkit/tapkit.schema.yaml +6 -1
  59. data/lib/kwalify.rb +3 -3
  60. data/lib/kwalify/errors.rb +2 -2
  61. data/lib/kwalify/main.rb +161 -84
  62. data/lib/kwalify/messages.rb +17 -11
  63. data/lib/kwalify/meta-validator.rb +11 -2
  64. data/lib/kwalify/rule.rb +13 -3
  65. data/lib/kwalify/templates/genclass-java.eruby +195 -0
  66. data/lib/kwalify/templates/genclass-ruby.eruby +84 -0
  67. data/lib/kwalify/types.rb +18 -18
  68. data/lib/kwalify/util/assert-text-equal.rb +44 -0
  69. data/lib/kwalify/util/hash-interface.rb +37 -0
  70. data/lib/kwalify/util/option-parser.rb +2 -2
  71. data/lib/kwalify/util/testcase-helper.rb +112 -0
  72. data/lib/kwalify/util/yaml-helper.rb +2 -2
  73. data/lib/kwalify/validator.rb +2 -2
  74. data/lib/kwalify/yaml-parser.rb +12 -9
  75. data/test/test-main.rb +77 -78
  76. data/test/test-main.yaml +543 -769
  77. data/test/test-metavalidator.rb +27 -47
  78. data/test/test-metavalidator.yaml +21 -2
  79. data/test/test-rule.rb +6 -39
  80. data/test/test-rule.yaml +2 -2
  81. data/test/test-validator.rb +36 -869
  82. data/test/test-validator.yaml +28 -20
  83. data/test/test-yamlparser.rb +30 -1248
  84. data/test/test-yamlparser.yaml +138 -110
  85. data/test/test.rb +33 -13
  86. data/test/tmp.dir/Context.java +40 -0
  87. data/test/tmp.dir/Group.java +33 -0
  88. data/test/tmp.dir/User.java +43 -0
  89. data/test/tmp.dir/action1.document +18 -0
  90. data/test/tmp.dir/action1.schema +32 -0
  91. data/test/tmp.dir/action2.document +18 -0
  92. data/test/tmp.dir/action2.schema +32 -0
  93. data/test/tmp.dir/emacs.document +6 -0
  94. data/test/tmp.dir/emacs.schema +6 -0
  95. data/test/tmp.dir/meta1.document +0 -0
  96. data/test/tmp.dir/meta1.schema +3 -0
  97. data/test/tmp.dir/meta2.document +0 -0
  98. data/test/tmp.dir/meta2.schema +3 -0
  99. data/test/tmp.dir/silent1.document +3 -0
  100. data/test/tmp.dir/silent1.schema +3 -0
  101. data/test/tmp.dir/silent2.document +7 -0
  102. data/test/tmp.dir/silent2.schema +3 -0
  103. data/test/tmp.dir/stream.invalid +8 -0
  104. data/test/tmp.dir/stream.schema +3 -0
  105. data/test/tmp.dir/stream.valid +8 -0
  106. data/test/tmp.dir/untabify.document +5 -0
  107. data/test/tmp.dir/untabify.schema +10 -0
  108. metadata +98 -12
  109. data/lib/kwalify/util/assert-diff.rb +0 -44
@@ -0,0 +1,208 @@
1
+
2
+ body {
3
+ font-family: Verdana,Arial,Helvetica,sans-serif;
4
+ font-size: 90%;
5
+ margin: 0;
6
+ margin-left: 40px;
7
+ padding: 0;
8
+ background: white;
9
+ }
10
+
11
+ h1,h2,h3,h4 { margin: 0; color: #efefef; background: transparent; }
12
+ h1 { font-size: 150%; }
13
+ h2,h3,h4 { margin-top: 1em; }
14
+
15
+ a { background: #eef; color: #039; text-decoration: none; }
16
+ a:hover { background: #039; color: #eef; }
17
+
18
+ /* Override the base stylesheet's Anchor inside a table cell */
19
+ td > a {
20
+ background: transparent;
21
+ color: #039;
22
+ text-decoration: none;
23
+ }
24
+
25
+ /* and inside a section title */
26
+ .section-title > a {
27
+ background: transparent;
28
+ color: #eee;
29
+ text-decoration: none;
30
+ }
31
+
32
+ /* === Structural elements =================================== */
33
+
34
+ div#index {
35
+ margin: 0;
36
+ margin-left: -40px;
37
+ padding: 0;
38
+ font-size: 90%;
39
+ }
40
+
41
+
42
+ div#index a {
43
+ margin-left: 0.7em;
44
+ }
45
+
46
+ div#index .section-bar {
47
+ margin-left: 0px;
48
+ padding-left: 0.7em;
49
+ background: #ccc;
50
+ font-size: small;
51
+ }
52
+
53
+
54
+ div#classHeader, div#fileHeader {
55
+ width: auto;
56
+ color: white;
57
+ padding: 0.5em 1.5em 0.5em 1.5em;
58
+ margin: 0;
59
+ margin-left: -40px;
60
+ border-bottom: 3px solid #006;
61
+ }
62
+
63
+ div#classHeader a, div#fileHeader a {
64
+ background: inherit;
65
+ color: white;
66
+ }
67
+
68
+ div#classHeader td, div#fileHeader td {
69
+ background: inherit;
70
+ color: white;
71
+ }
72
+
73
+
74
+ div#fileHeader {
75
+ background: #057;
76
+ }
77
+
78
+ div#classHeader {
79
+ background: #048;
80
+ }
81
+
82
+
83
+ .class-name-in-header {
84
+ font-size: 180%;
85
+ font-weight: bold;
86
+ }
87
+
88
+
89
+ div#bodyContent {
90
+ padding: 0 1.5em 0 1.5em;
91
+ }
92
+
93
+ div#description {
94
+ padding: 0.5em 1.5em;
95
+ background: #efefef;
96
+ border: 1px dotted #999;
97
+ }
98
+
99
+ div#description h1,h2,h3,h4,h5,h6 {
100
+ color: #125;;
101
+ background: transparent;
102
+ }
103
+
104
+ div#validator-badges {
105
+ text-align: center;
106
+ }
107
+ div#validator-badges img { border: 0; }
108
+
109
+ div#copyright {
110
+ color: #333;
111
+ background: #efefef;
112
+ font: 0.75em sans-serif;
113
+ margin-top: 5em;
114
+ margin-bottom: 0;
115
+ padding: 0.5em 2em;
116
+ }
117
+
118
+
119
+ /* === Classes =================================== */
120
+
121
+ table.header-table {
122
+ color: white;
123
+ font-size: small;
124
+ }
125
+
126
+ .type-note {
127
+ font-size: small;
128
+ color: #DEDEDE;
129
+ }
130
+
131
+ .xxsection-bar {
132
+ background: #eee;
133
+ color: #333;
134
+ padding: 3px;
135
+ }
136
+
137
+ .section-bar {
138
+ color: #333;
139
+ border-bottom: 1px solid #999;
140
+ margin-left: -20px;
141
+ }
142
+
143
+
144
+ .section-title {
145
+ background: #79a;
146
+ color: #eee;
147
+ padding: 3px;
148
+ margin-top: 2em;
149
+ margin-left: -30px;
150
+ border: 1px solid #999;
151
+ }
152
+
153
+ .top-aligned-row { vertical-align: top }
154
+ .bottom-aligned-row { vertical-align: bottom }
155
+
156
+ /* --- Context section classes ----------------------- */
157
+
158
+ .context-row { }
159
+ .context-item-name { font-family: monospace; font-weight: bold; color: black; }
160
+ .context-item-value { font-size: small; color: #448; }
161
+ .context-item-desc { color: #333; padding-left: 2em; }
162
+
163
+ /* --- Method classes -------------------------- */
164
+ .method-detail {
165
+ background: #efefef;
166
+ padding: 0;
167
+ margin-top: 0.5em;
168
+ margin-bottom: 1em;
169
+ border: 1px dotted #ccc;
170
+ }
171
+ .method-heading {
172
+ color: black;
173
+ background: #ccc;
174
+ border-bottom: 1px solid #666;
175
+ padding: 0.2em 0.5em 0 0.5em;
176
+ }
177
+ .method-signature { color: black; background: inherit; }
178
+ .method-name { font-weight: bold; }
179
+ .method-args { font-style: italic; }
180
+ .method-description { padding: 0 0.5em 0 0.5em; }
181
+
182
+ /* --- Source code sections -------------------- */
183
+
184
+ a.source-toggle { font-size: 90%; }
185
+ div.method-source-code {
186
+ background: #262626;
187
+ color: #ffdead;
188
+ margin: 1em;
189
+ padding: 0.5em;
190
+ border: 1px dashed #999;
191
+ overflow: hidden;
192
+ }
193
+
194
+ div.method-source-code pre { color: #ffdead; overflow: hidden; }
195
+
196
+ /* --- Ruby keyword styles --------------------- */
197
+
198
+ .standalone-code { background: #221111; color: #ffdead; overflow: hidden; }
199
+
200
+ .ruby-constant { color: #7fffd4; background: transparent; }
201
+ .ruby-keyword { color: #00ffff; background: transparent; }
202
+ .ruby-ivar { color: #eedd82; background: transparent; }
203
+ .ruby-operator { color: #00ffee; background: transparent; }
204
+ .ruby-identifier { color: #ffdead; background: transparent; }
205
+ .ruby-node { color: #ffa07a; background: transparent; }
206
+ .ruby-comment { color: #b22222; font-weight: bold; background: transparent; }
207
+ .ruby-regexp { color: #ffa07a; background: transparent; }
208
+ .ruby-value { color: #7fffd4; background: transparent; }
@@ -15,7 +15,7 @@
15
15
  <div align="left"><h1>Kwalify Users' Guide (for Ruby and Java)</h1></div>
16
16
  <div align="left">
17
17
  makoto kuwata &lt;kwa(at)kuwata-lab.com&gt;<br>
18
- last update: $Date: 2005-12-20 12:50:56 +0900 (Tue, 20 Dec 2005) $<br>
18
+ last update: $Date: 2006-05-14 13:57:07 +0900 (Sun, 14 May 2006) $<br>
19
19
  </div>
20
20
 
21
21
  <a name="preface"></a>
@@ -57,16 +57,18 @@ This rule is more aggressive and cost-effective than Pareto Law. The rule is nam
57
57
  <p>Kwalify is small and in fact poorer than RelaxNG or XML Schema.
58
58
  I hope you extend/customize Kwalify for your own way.
59
59
  </p>
60
- Table of Contents:
61
- <div class="toc">
60
+ <div class="footnote">
61
+ <dl compact>
62
+ <dt>(<a name="fnref:1" href="#fnlink:1">*1</a>)</dt>
63
+ <dd>Pronounce as 'Qualify'.</dd>
64
+ </dl>
65
+ </div>
66
+ <a name="toc"></a>
67
+ <h3 class="section2">Table of Contents</h3>
62
68
  <ul>
63
69
  <li><a href="#preface">Preface</a>
64
- </li>
65
- <li><a href="#usage">Usage of Kwalify</a>
66
70
  <ul>
67
- <li><a href="#usage1">Usage in Command-Line</a>
68
- </li>
69
- <li><a href="#usage2">Usage in Ruby Script</a>
71
+ <li><a href="#toc">Table of Contents</a>
70
72
  </li>
71
73
  </ul>
72
74
  </li>
@@ -104,171 +106,29 @@ Table of Contents:
104
106
  </li>
105
107
  </ul>
106
108
  </li>
109
+ <li><a href="#actions">Actions</a>
110
+ <ul>
111
+ <li><a href="#action-genclass">Class Definition Generation</a>
112
+ <ul>
113
+ <li><a href="#action-genclass-ruby">Ruby Class Definition</a>
114
+ </li>
115
+ <li><a href="#action-genclass-java">Java Class Definition</a>
116
+ </li>
117
+ </ul>
118
+ </li>
119
+ </ul>
120
+ </li>
121
+ <li><a href="#usage">Usage of Kwalify</a>
122
+ <ul>
123
+ <li><a href="#usage1">Usage in Command-Line</a>
124
+ </li>
125
+ <li><a href="#usage-ruby">Usage in Ruby Script</a>
126
+ </li>
127
+ <li><a href="#usage-java">Usage in Java Program</a>
128
+ </li>
129
+ </ul>
130
+ </li>
107
131
  </ul>
108
- </div>
109
- <div class="footnote">
110
- <dl compact>
111
- <dt>(<a name="fnref:1" href="#fnlink:1">*1</a>)</dt>
112
- <dd>Pronounce as 'Qualify'.</dd>
113
- </dl>
114
- </div>
115
- <br>
116
-
117
-
118
- <a name="usage"></a>
119
- <h2 class="section1">Usage of Kwalify</h2>
120
- <a name="usage1"></a>
121
- <h3 class="section2">Usage in Command-Line</h3>
122
- <div class="terminal_caption">
123
- usage1: validate YAML document in command-line</div>
124
- <pre class="terminal">### kwalify-ruby
125
- $ kwalify -f schema.yaml document.yaml [document2.yaml ...]
126
-
127
- ### kwalify-java
128
- $ java -classpath kwalify.jar kwalify.Main -f schema.yaml document.yaml [document2.yaml ...]
129
- </pre>
130
- <div class="terminal_caption">
131
- usage2: validate schema definition in command-line</div>
132
- <pre class="terminal">### kwalify-ruby
133
- $ kwalify -m schema.yaml [schema2.yaml ...]
134
-
135
- ### kwalify-java
136
- $ java -classpath kwalify.jar kwalify.Main -m schema.yaml [schema2.yaml ...]
137
- </pre>
138
- <p>Command-line options:
139
- </p>
140
- <dl class="dl3">
141
- <dt class="dt3"><strong>
142
- <code>-h</code>, <code>--help</code> </strong></dt>
143
- <dd class="dd3">
144
- Print help message.
145
- </dd>
146
- <dt class="dt3"><strong>
147
- <code>-v</code> </strong></dt>
148
- <dd class="dd3">
149
- Print version.
150
- </dd>
151
- <dt class="dt3"><strong>
152
- <code>-s</code> </strong></dt>
153
- <dd class="dd3">
154
- Silent mode.
155
- </dd>
156
- <dt class="dt3"><strong>
157
- <code>-f <em>schema.yaml</em></code> </strong></dt>
158
- <dd class="dd3">
159
- Specify schema definition file.
160
- </dd>
161
- <dt class="dt3"><strong>
162
- <code>-m</code> </strong></dt>
163
- <dd class="dd3">
164
- Meta-validation of schema definition.
165
- </dd>
166
- <dt class="dt3"><strong>
167
- <code>-t</code> </strong></dt>
168
- <dd class="dd3">
169
- Expand tab characters to spaces automatically.
170
- </dd>
171
- <dt class="dt3"><strong>
172
- <code>-l</code> </strong></dt>
173
- <dd class="dd3">
174
- Show linenumber on which error found.
175
- </dd>
176
- <dt class="dt3"><strong>
177
- <code>-E</code> </strong></dt>
178
- <dd class="dd3">
179
- Show errors in Emacs-compatible style (implies '-l' option).
180
- </dd>
181
- </dl>
182
- <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.
183
- </p>
184
- <p>If you are an Emacs user, try <code>-E</code> option that show errors in format which Emacs can parse and jump to errors.
185
- You can use <code>C-x `</code> (next-error) to jump into errors.
186
- </p>
187
- <br>
188
-
189
-
190
- <a name="usage2"></a>
191
- <h3 class="section2">Usage in Ruby Script</h3>
192
- <p>The followings are example scripts for Ruby.
193
- </p>
194
- <div class="program_caption">
195
- validate YAML document in Ruby script</div>
196
- <pre class="program">require 'kwalify'
197
-
198
- ## parse schema definition and create validator
199
- schema = YAML.load_file('schema.yaml')
200
- validator = Kwalify::Validator.new(schema) # raises Kwalify::SchemaError if wrong
201
-
202
- ## validate YAML document
203
- document = YAML.load_file('document.yaml')
204
- error_list = validator.validate(document)
205
- unless error_list.empty?
206
- error_list.each do |error| # error is instance of Kwalify::ValidationError
207
- puts "[#{error.path}] #{error.message}"
208
- end
209
- end
210
- </pre>
211
- <div class="program_caption">
212
- validate YAML document and show linenumber on where error is found.</div>
213
- <pre class="program">require 'kwalify'
214
-
215
- ## parse schema definition and create validator
216
- schema = YAML.load_file('schema.yaml')
217
- validator = Kwalify::Validator.new(schema) # raises Kwalify::SchemaError if wrong
218
-
219
- ## parse YAML document with Kwalify's parser
220
- str = File.read('document.yaml')
221
- parser = Kwalify::Parser.new(str)
222
- document = parser.parse()
223
-
224
- ## validate document and show errors
225
- error_list = validator.validate(document)
226
- unless error_list.empty?
227
- parser.set_errors_linenum(error_list) # set linenum on error
228
- error_list.sort.each do |error|
229
- puts "(line %d)[%s] %s" % [error.linenum, error.path, error.message]
230
- end
231
- end
232
- </pre>
233
- <p>Kwalify's YAML parser is experimental. You should notice that Kwalify's YAML parser is limited only for basic syntax of YAML.
234
- </p>
235
- <p>The followings are example programs of Java.
236
- </p>
237
- <div class="program_caption">
238
- validate YAML document and show linenumber on where error is found.</div>
239
- <pre class="program">import kwalify.*;
240
-
241
- public class Test {
242
-
243
- public static void main(String[] args) throws Exception {
244
- // read schema
245
- String schema_str = Util.readFile("schema.yaml");
246
- Object schema = new YamlParser(schema_str).parse();
247
-
248
- // read document file
249
- String document_str = Util.readFile("document.yaml");
250
- YamlParser parser = new YamlParser(document_str);
251
- Object document = parser.parse();
252
-
253
- // create validator and validate
254
- Validator validator = new Validator(schema);
255
- List errors = validator.validate(document);
256
-
257
- // show errors
258
- if (errors != null &amp;&amp; errors.size() &gt; 0) {
259
- parser.setErrorsLineNumber(errors);
260
- Collections.sort(errors);
261
- for (Iterator it = errors.iterator(); it.hasNext(); ) {
262
- ValidationException error = (ValidationException)it.next();
263
- int linenum = error.getLineNumber();
264
- String path = error.getPath();
265
- String mesg = error.getMessage();
266
- System.out.println("- " + linenum + ": [" + path + "] " + mesg);
267
- }
268
- }
269
- }
270
- }
271
- </pre>
272
132
  <br>
273
133
 
274
134
 
@@ -293,6 +153,7 @@ sequence:
293
153
  - bar
294
154
  - baz
295
155
  </pre>
156
+ <a name="valid01.expected"></a>
296
157
  <div class="terminal_caption">
297
158
  validate</div>
298
159
  <pre class="terminal">$ kwalify -lf schema01.yaml document01a.yaml
@@ -305,6 +166,7 @@ document01a.yaml#0: valid.
305
166
  - 123
306
167
  - baz
307
168
  </pre>
169
+ <a name="invalid01.expected"></a>
308
170
  <div class="terminal_caption">
309
171
  validate</div>
310
172
  <pre class="terminal">$ kwalify -lf schema01.yaml document01b.yaml
@@ -342,6 +204,7 @@ email: foo@mail.com
342
204
  age: 20
343
205
  birth: 1985-01-01
344
206
  </pre>
207
+ <a name="valid02.expected"></a>
345
208
  <div class="terminal_caption">
346
209
  validate</div>
347
210
  <pre class="terminal">$ kwalify -lf schema02.yaml document02a.yaml
@@ -355,6 +218,7 @@ email: foo(at)mail.com
355
218
  age: twenty
356
219
  birth: Jun 01, 1985
357
220
  </pre>
221
+ <a name="invalid02.expected"></a>
358
222
  <div class="terminal_caption">
359
223
  validate</div>
360
224
  <pre class="terminal">$ kwalify -lf schema02.yaml document02b.yaml
@@ -391,6 +255,7 @@ sequence:
391
255
  - name: baz
392
256
  email: baz@mail.org
393
257
  </pre>
258
+ <a name="valid03.expected"></a>
394
259
  <div class="terminal_caption">
395
260
  validate</div>
396
261
  <pre class="terminal">$ kwalify -lf schema03.yaml document03a.yaml
@@ -406,6 +271,7 @@ document03a.yaml#0: valid.
406
271
  - name: baz
407
272
  mail: baz@mail.org
408
273
  </pre>
274
+ <a name="invalid03.expected"></a>
409
275
  <div class="terminal_caption">
410
276
  validate</div>
411
277
  <pre class="terminal">$ kwalify -lf schema03.yaml document03b.yaml
@@ -456,6 +322,7 @@ employees:
456
322
  name: bar
457
323
  email: bar@kuwata-lab.com
458
324
  </pre>
325
+ <a name="valid04.expected"></a>
459
326
  <div class="terminal_caption">
460
327
  validate</div>
461
328
  <pre class="terminal">$ kwalify -lf schema04.yaml document04a.yaml
@@ -474,6 +341,7 @@ employees:
474
341
  name: bar
475
342
  mail: bar@kuwata-lab.com
476
343
  </pre>
344
+ <a name="invalid04.expected"></a>
477
345
  <div class="terminal_caption">
478
346
  validate</div>
479
347
  <pre class="terminal">$ kwalify -lf schema04.yaml document04b.yaml
@@ -585,6 +453,11 @@ document04b.yaml#0: INVALID
585
453
  <dd class="dd3">
586
454
  Description. This is not used for validation.
587
455
  </dd>
456
+ <dt class="dt3"><strong>
457
+ <code>classname:</code> </strong></dt>
458
+ <dd class="dd3">
459
+ Class name. This is available only with type 'map' and used with 'genclass' action. See '<a href="#actions">Actions</a>' section for details.
460
+ </dd>
588
461
  </dl>
589
462
  <p>Rule contains 'type:' entry. 'sequence:' entry takes a list of rule. 'mapping:' entry takes a hash which values are rules.
590
463
  </p>
@@ -637,6 +510,7 @@ sequence:
637
510
  blood: AB
638
511
  birth: 1980-01-01
639
512
  </pre>
513
+ <a name="valid05.expected"></a>
640
514
  <div class="terminal_caption">
641
515
  validate</div>
642
516
  <pre class="terminal">$ kwalify -lf schema05.yaml document05a.yaml
@@ -658,6 +532,7 @@ document05a.yaml#0: valid.
658
532
  blood: AB
659
533
  birth: 1980/01/01
660
534
  </pre>
535
+ <a name="invalid05.expected"></a>
661
536
  <div class="terminal_caption">
662
537
  validate</div>
663
538
  <pre class="terminal">$ kwalify -lf schema05.yaml document05b.yaml
@@ -722,6 +597,7 @@ sequence:
722
597
  groups:
723
598
  - users
724
599
  </pre>
600
+ <a name="valid06.expected"></a>
725
601
  <div class="terminal_caption">
726
602
  validate</div>
727
603
  <pre class="terminal">$ kwalify -lf schema06.yaml document06a.yaml
@@ -747,6 +623,7 @@ document06a.yaml#0: valid.
747
623
  groups:
748
624
  - users
749
625
  </pre>
626
+ <a name="invalid06.expected"></a>
750
627
  <div class="terminal_caption">
751
628
  validate</div>
752
629
  <pre class="terminal">$ kwalify -lf schema06.yaml document06b.yaml
@@ -852,6 +729,7 @@ end
852
729
  answer: bad
853
730
  reason: I don't like this style.
854
731
  </pre>
732
+ <a name="valid07.expected"></a>
855
733
  <div class="terminal_caption">
856
734
  validate</div>
857
735
  <pre class="terminal">$ ruby answers-validator.rb document07a.yaml
@@ -868,6 +746,7 @@ Valid.
868
746
  - name: Baz
869
747
  answer: not bad
870
748
  </pre>
749
+ <a name="invalid07.expected"></a>
871
750
  <div class="terminal_caption">
872
751
  validate</div>
873
752
  <pre class="terminal">$ ruby answers-validator.rb document07b.yaml
@@ -989,6 +868,7 @@ public class AnswersValidator extends Validator {
989
868
  }
990
869
  }
991
870
  </pre>
871
+ <a name="AnswersValidator.expected"></a>
992
872
  <div class="terminal_caption">
993
873
  validate</div>
994
874
  <pre class="terminal">$ java -classpath kwalify.jar AnswersValidator document07a.yaml
@@ -1002,7 +882,7 @@ $ java -classpath kwalify.jar AnswersValidator document07b.yaml
1002
882
 
1003
883
  <a name="schema-block"></a>
1004
884
  <h3 class="section2">Validator with Block</h3>
1005
- <p><strong>Notice: This is an experimental feature.</strong>
885
+ <p><strong>Notice: This feature has been obsolete. Use Kwalify::Validator#validate_hook() method instead.</strong>
1006
886
  </p>
1007
887
  <p><code>Kwalify::Validator.new()</code> method can take a block which is invoked when validation.
1008
888
  </p>
@@ -1047,11 +927,13 @@ else
1047
927
  end
1048
928
  end
1049
929
  </pre>
930
+ <a name="valid08.expected"></a>
1050
931
  <div class="terminal_caption">
1051
932
  validate</div>
1052
933
  <pre class="terminal">$ ruby validate08.rb document07a.yaml
1053
934
  Valid.
1054
935
  </pre>
936
+ <a name="valid08.expected"></a>
1055
937
  <div class="terminal_caption">
1056
938
  validate</div>
1057
939
  <pre class="terminal">$ ruby validate08.rb document07b.yaml
@@ -1113,26 +995,15 @@ JSON can be considered as a subset of YAML. It means that YAML parser can parse
1113
995
  <pre class="program">{ "type": "map",
1114
996
  "required": true,
1115
997
  "mapping": {
1116
- "name": {
1117
- "type": "str",
1118
- "required": true
1119
- },
1120
- "email": {
1121
- "type": "str"
1122
- },
1123
- "age": {
1124
- "type": "int"
1125
- },
1126
- "gender": {
1127
- "type": "str",
1128
- "enum": ["M", "F"]
1129
- },
1130
- "favorite": {
1131
- "type": "seq",
1132
- "sequence": [
1133
- { "type": "str" }
1134
- ]
1135
- }
998
+ "name": { "type": "str", "required": true },
999
+ "email": { "type": "str" },
1000
+ "age": { "type": "int" },
1001
+ "gender": { "type": "str", "enum": ["M", "F"] },
1002
+ "favorite": { "type": "seq",
1003
+ "sequence": [
1004
+ { "type": "str" }
1005
+ ]
1006
+ }
1136
1007
  }
1137
1008
  }
1138
1009
  </pre>
@@ -1150,6 +1021,7 @@ JSON can be considered as a subset of YAML. It means that YAML parser can parse
1150
1021
  ]
1151
1022
  }
1152
1023
  </pre>
1024
+ <a name="valid12.expected"></a>
1153
1025
  <div class="terminal_caption">
1154
1026
  validate</div>
1155
1027
  <pre class="terminal">$ kwalify -lf schema12.yaml document12a.yaml
@@ -1165,6 +1037,7 @@ document12a.yaml#0: valid.
1165
1037
  "favorite": [ 123, 456 ]
1166
1038
  }
1167
1039
  </pre>
1040
+ <a name="invalid12.yaml"></a>
1168
1041
  <div class="terminal_caption">
1169
1042
  validate</div>
1170
1043
  <pre class="terminal">$ kwalify -lf schema12.yaml document12b.yaml
@@ -1225,6 +1098,7 @@ sequence:
1225
1098
  post: clerk
1226
1099
  supervisor: <strong>*bar</strong>
1227
1100
  </pre>
1101
+ <a name="valid13.expected"></a>
1228
1102
  <div class="terminal_caption">
1229
1103
  validate</div>
1230
1104
  <pre class="terminal">$ kwalify -lf schema13.yaml document13a.yaml
@@ -1268,6 +1142,7 @@ mapping:
1268
1142
  value2: 0.5
1269
1143
  value3: -0.9
1270
1144
  </pre>
1145
+ <a name="valid14.expected"></a>
1271
1146
  <div class="terminal_caption">
1272
1147
  validate</div>
1273
1148
  <pre class="terminal">$ kwalify -lf schema14.yaml document14a.yaml
@@ -1280,6 +1155,7 @@ document14a.yaml#0: valid.
1280
1155
  value2: 1.1
1281
1156
  value3: -2.0
1282
1157
  </pre>
1158
+ <a name="invalid14.expected"></a>
1283
1159
  <div class="terminal_caption">
1284
1160
  validate</div>
1285
1161
  <pre class="terminal">$ kwalify -lf schema14.yaml document14b.yaml
@@ -1346,6 +1222,7 @@ user:
1346
1222
  name: bar
1347
1223
  email: bar@mail.com
1348
1224
  </pre>
1225
+ <a name="valid15.expected"></a>
1349
1226
  <div class="terminal_caption">
1350
1227
  validate</div>
1351
1228
  <pre class="terminal">$ kwalify -lf schema15.yaml document15a.yaml
@@ -1360,6 +1237,7 @@ document15a.yaml#0: valid.
1360
1237
  user:
1361
1238
  name: toooooo-looooong-name
1362
1239
  </pre>
1240
+ <a name="invalid15.expected"></a>
1363
1241
  <div class="terminal_caption">
1364
1242
  validate</div>
1365
1243
  <pre class="terminal">$ kwalify -lf schema15.yaml document15b.yaml
@@ -1370,6 +1248,628 @@ document15b.yaml#0: INVALID
1370
1248
  <br>
1371
1249
 
1372
1250
 
1251
+ <br>
1252
+
1253
+
1254
+ <a name="actions"></a>
1255
+ <h2 class="section1">Actions</h2>
1256
+ <p>Kwalify has the command-line '-a <em>action</em>' which perform a certain action to schema definition.
1257
+ Currently only the following action is supported.
1258
+ </p>
1259
+ <dl class="dl3">
1260
+ <dt class="dt3"><strong>
1261
+ genclass-ruby </strong></dt>
1262
+ <dd class="dd3">
1263
+ Generate class definitions in Ruby.
1264
+ </dd>
1265
+ <dt class="dt3"><strong>
1266
+ genclass-java </strong></dt>
1267
+ <dd class="dd3">
1268
+ Generate class definitions in Java.
1269
+ </dd>
1270
+ </dl>
1271
+ <p>In fact action name represents template filename.
1272
+ For example, action 'genclass-ruby' invokes template file 'kwalify/templates/genclass-ruby.eruby'.
1273
+ </p>
1274
+ <p>Each action can accept some command-line properties.
1275
+ For example, action 'genclass-ruby' can accept the command-line properties '--module=<em>name</em>', '--parent=<em>name</em>', and so on.
1276
+ Type 'kwalify -h -a <em>action</em>' to show the list of command-line properties the action can accept.
1277
+ </p>
1278
+ <a name="action-genclass"></a>
1279
+ <h3 class="section2">Class Definition Generation</h3>
1280
+ <p>Command-line option '-a genclass-ruby' or '-a genclass-java' generates class definition
1281
+ automatically from schema definition in Ruby or Java.
1282
+ </p>
1283
+ <p>Assume the following data file and schema definition.
1284
+ </p>
1285
+ <a name="address-book.yaml"></a>
1286
+ <div class="program_caption">
1287
+ <code>address-book.yaml</code> : data file</div>
1288
+ <pre class="program">groups:
1289
+
1290
+ - name: family
1291
+ desc: my family
1292
+
1293
+ - name: friend
1294
+ desc: my friends
1295
+
1296
+ - name: business
1297
+ desc: those who works together
1298
+
1299
+ persons:
1300
+
1301
+ - name: Sumire
1302
+ group: family
1303
+ birth: 2000-01-01
1304
+ blood: A
1305
+
1306
+ - name: Shiina
1307
+ group: friend
1308
+ birth: 1995-01-01
1309
+ email: shiina@mail.org
1310
+
1311
+ - name: Sakura
1312
+ group: business
1313
+ email: cherry@mail.net
1314
+ phone: 012-345-6789
1315
+ </pre>
1316
+ <a name="address-book.schema.yaml"></a>
1317
+ <div class="program_caption">
1318
+ <code>address-book.schema.yaml</code> : schema definition file</div>
1319
+ <pre class="program">type: map
1320
+ <strong>classname: AddressBook</strong>
1321
+ desc: address-book class
1322
+ mapping:
1323
+ "groups":
1324
+ type: seq
1325
+ sequence:
1326
+ - type: map
1327
+ <strong>classname: Group</strong>
1328
+ desc: group class
1329
+ mapping:
1330
+ "name": { type: str, required: yes }
1331
+ "desc": { type: str }
1332
+ "persons":
1333
+ type: seq
1334
+ sequence:
1335
+ - type: map
1336
+ <strong>classname: Person</strong>
1337
+ desc: person class
1338
+ mapping:
1339
+ "name": { type: str, required: yes }
1340
+ "desc": { type: str }
1341
+ "group": { type: str }
1342
+ "email": { type: str, pattern: '/@/' }
1343
+ "phone": { type: str }
1344
+ "birth": { type: date }
1345
+ "blood": { type: str, enum: [A, B, O, AB] }
1346
+ </pre>
1347
+ <a name="action-genclass-ruby"></a>
1348
+ <h4 class="section3">Ruby Class Definition</h4>
1349
+ <div class="terminal_caption">
1350
+ generate class definition</div>
1351
+ <pre class="terminal">$ kwalify <strong>-a genclass-ruby</strong> -tf address-book.schema.yaml &gt; address-book.rb
1352
+ </pre>
1353
+ <a name="address-book.rb"></a>
1354
+ <div class="program_caption">
1355
+ <code>address-book.rb</code> : generated class definition</div>
1356
+ <pre class="program">## address-book class
1357
+ class AddressBook
1358
+ def initialize(hash)
1359
+ @persons = (v=hash['persons']) ? v.map!{|e| e.is_a?(Person) ? e : Person.new(e)} : v
1360
+ @groups = (v=hash['groups']) ? v.map!{|e| e.is_a?(Group) ? e : Group.new(e)} : v
1361
+ end
1362
+ attr_accessor :persons # seq
1363
+ attr_accessor :groups # seq
1364
+ end
1365
+
1366
+ ## person class
1367
+ class Person
1368
+ def initialize(hash)
1369
+ @name = hash['name']
1370
+ @desc = hash['desc']
1371
+ @phone = hash['phone']
1372
+ @blood = hash['blood']
1373
+ @group = hash['group']
1374
+ @birth = hash['birth']
1375
+ @email = hash['email']
1376
+ end
1377
+ attr_accessor :name # str
1378
+ attr_accessor :desc # str
1379
+ attr_accessor :phone # str
1380
+ attr_accessor :blood # str
1381
+ attr_accessor :group # str
1382
+ attr_accessor :birth # date
1383
+ attr_accessor :email # str
1384
+ end
1385
+
1386
+ ## group class
1387
+ class Group
1388
+ def initialize(hash)
1389
+ @name = hash['name']
1390
+ @desc = hash['desc']
1391
+ end
1392
+ attr_accessor :name # str
1393
+ attr_accessor :desc # str
1394
+ end
1395
+
1396
+ </pre>
1397
+ <a name="example-address-book.rb"></a>
1398
+ <div class="program_caption">
1399
+ <code>example-address-book.rb</code> : example code of using address-book.rb</div>
1400
+ <pre class="program">require 'address-book'
1401
+ require 'yaml'
1402
+ require 'pp'
1403
+
1404
+ str = File.read('address-book.yaml')
1405
+ ydoc = YAML.load(str)
1406
+ <strong>addrbook = AddressBook.new(ydoc)</strong>
1407
+
1408
+ pp <strong>addrbook.groups</strong>
1409
+ pp <strong>addrbook.persons</strong>
1410
+ </pre>
1411
+ <a name="example-address-book.expected"></a>
1412
+ <div class="terminal_caption">
1413
+ result</div>
1414
+ <pre class="terminal">$ ruby example-address-book.rb
1415
+ [#&lt;Group:0xddf24 @desc="my family", @name="family"&gt;,
1416
+ #&lt;Group:0xddf10 @desc="my friends", @name="friend"&gt;,
1417
+ #&lt;Group:0xdde84 @desc="those who works together", @name="business"&gt;]
1418
+ [#&lt;Person:0xdefdc
1419
+ @birth=#&lt;Date: 4903089/2,0,2299161&gt;,
1420
+ @blood="A",
1421
+ @desc=nil,
1422
+ @email=nil,
1423
+ @group="family",
1424
+ @name="Sumire",
1425
+ @phone=nil&gt;,
1426
+ #&lt;Person:0xdee9c
1427
+ @birth=#&lt;Date: 4899437/2,0,2299161&gt;,
1428
+ @blood=nil,
1429
+ @desc=nil,
1430
+ @email="shiina@mail.org",
1431
+ @group="friend",
1432
+ @name="Shiina",
1433
+ @phone=nil&gt;,
1434
+ #&lt;Person:0xde8e8
1435
+ @birth=nil,
1436
+ @blood=nil,
1437
+ @desc=nil,
1438
+ @email="cherry@mail.net",
1439
+ @group="business",
1440
+ @name="Sakura",
1441
+ @phone="012-345-6789"&gt;]
1442
+ </pre>
1443
+ <p>Command-line option '<code>-h -a genclass-ruby</code>' shows the commpand-line properties that template can accept.
1444
+ </p>
1445
+ <a name="option_ha.expected"></a>
1446
+ <div class="terminal_caption">
1447
+ show command-line properties</div>
1448
+ <pre class="terminal">$ kwalify -ha genclass-ruby
1449
+ --module=name : module name in which class defined
1450
+ --parent=name : parent class name
1451
+ --include=name : module name which all classes include
1452
+ </pre>
1453
+ <div class="terminal_caption">
1454
+ example of command-line properties</div>
1455
+ <pre class="terminal">$ kwalify -a genclass-ruby --module=My --include=Kwalify::HashInterface
1456
+ </pre>
1457
+ <p>'Kwalify::HashInterface' is a module which make object accessible like as Hash.
1458
+ It is defined in 'kwalify/util/hash-interface.rb'
1459
+ </p>
1460
+ <br>
1461
+
1462
+ <a name="action-genclass-java"></a>
1463
+ <h4 class="section3">Java Class Definition</h4>
1464
+ <a name="genclass_java.expected"></a>
1465
+ <div class="terminal_caption">
1466
+ generate java class definition</div>
1467
+ <pre class="terminal">$ kwalify <strong>-a genclass-java</strong> -tf address-book.schema.yaml
1468
+ generating ./AddressBook.java...done.
1469
+ generating ./Person.java...done.
1470
+ generating ./Group.java...done.
1471
+ </pre>
1472
+ <a name="AddressBook.java.expected"></a>
1473
+ <div class="program_caption">
1474
+ <code>AddressBook.java</code> : generated class definition</div>
1475
+ <pre class="program">// generated by kwalify from address-book.schema.yaml
1476
+
1477
+ import java.util.*;
1478
+
1479
+ /**
1480
+ * address-book class
1481
+ */
1482
+ public class AddressBook {
1483
+
1484
+ private List _persons;
1485
+ private List _groups;
1486
+
1487
+ public AddressBook() {}
1488
+
1489
+ public AddressBook(Map map) {
1490
+ List seq;
1491
+ Object obj;
1492
+ if ((seq = (List)map.get("persons")) != null) {
1493
+ for (int i = 0; i &lt; seq.size(); i++) {
1494
+ if ((obj = seq.get(i)) instanceof Map) {
1495
+ seq.set(i, new Person((Map)obj));
1496
+ }
1497
+ }
1498
+ }
1499
+ _persons = seq;
1500
+ if ((seq = (List)map.get("groups")) != null) {
1501
+ for (int i = 0; i &lt; seq.size(); i++) {
1502
+ if ((obj = seq.get(i)) instanceof Map) {
1503
+ seq.set(i, new Group((Map)obj));
1504
+ }
1505
+ }
1506
+ }
1507
+ _groups = seq;
1508
+ }
1509
+
1510
+ public List getPersons() { return _persons; }
1511
+ public void setPersons(List persons_) { _persons = persons_; }
1512
+ public List getGroups() { return _groups; }
1513
+ public void setGroups(List groups_) { _groups = groups_; }
1514
+ }
1515
+ </pre>
1516
+ <a name="Group.java.expected"></a>
1517
+ <div class="program_caption">
1518
+ <code>Group.java</code> : generated class definition</div>
1519
+ <pre class="program">// generated by kwalify from address-book.schema.yaml
1520
+
1521
+ import java.util.*;
1522
+
1523
+ /**
1524
+ * group class
1525
+ */
1526
+ public class Group {
1527
+
1528
+ private String _name;
1529
+ private String _desc;
1530
+
1531
+ public Group() {}
1532
+
1533
+ public Group(Map map) {
1534
+ _name = (String)map.get("name");
1535
+ _desc = (String)map.get("desc");
1536
+ }
1537
+
1538
+ public String getName() { return _name; }
1539
+ public void setName(String name_) { _name = name_; }
1540
+ public String getDesc() { return _desc; }
1541
+ public void setDesc(String desc_) { _desc = desc_; }
1542
+ }
1543
+ </pre>
1544
+ <a name="Person.java.expected"></a>
1545
+ <div class="program_caption">
1546
+ <code>Person.java</code> : generated class definition</div>
1547
+ <pre class="program">// generated by kwalify from address-book.schema.yaml
1548
+
1549
+ import java.util.*;
1550
+
1551
+ /**
1552
+ * person class
1553
+ */
1554
+ public class Person {
1555
+
1556
+ private String _name;
1557
+ private String _desc;
1558
+ private String _phone;
1559
+ private String _blood;
1560
+ private String _group;
1561
+ private Date _birth;
1562
+ private String _email;
1563
+
1564
+ public Person() {}
1565
+
1566
+ public Person(Map map) {
1567
+ _name = (String)map.get("name");
1568
+ _desc = (String)map.get("desc");
1569
+ _phone = (String)map.get("phone");
1570
+ _blood = (String)map.get("blood");
1571
+ _group = (String)map.get("group");
1572
+ _birth = (Date)map.get("birth");
1573
+ _email = (String)map.get("email");
1574
+ }
1575
+
1576
+ public String getName() { return _name; }
1577
+ public void setName(String name_) { _name = name_; }
1578
+ public String getDesc() { return _desc; }
1579
+ public void setDesc(String desc_) { _desc = desc_; }
1580
+ public String getPhone() { return _phone; }
1581
+ public void setPhone(String phone_) { _phone = phone_; }
1582
+ public String getBlood() { return _blood; }
1583
+ public void setBlood(String blood_) { _blood = blood_; }
1584
+ public String getGroup() { return _group; }
1585
+ public void setGroup(String group_) { _group = group_; }
1586
+ public Date getBirth() { return _birth; }
1587
+ public void setBirth(Date birth_) { _birth = birth_; }
1588
+ public String getEmail() { return _email; }
1589
+ public void setEmail(String email_) { _email = email_; }
1590
+ }
1591
+ </pre>
1592
+ <a name="ExampleAddressBook.java"></a>
1593
+ <div class="program_caption">
1594
+ <code>ExampleAddressBook.java</code> : example code of using *.java</div>
1595
+ <pre class="program">import java.util.*;
1596
+ import kwalify.*;
1597
+
1598
+ public class ExampleAddressBook {
1599
+ public static void main(String args[]) throws Exception {
1600
+ // read schema
1601
+ String schema_str = Util.readFile("address-book.schema.yaml");
1602
+ schema_str = Util.untabify(schema_str);
1603
+ Object schema = new YamlParser(schema_str).parse();
1604
+
1605
+ // read document file
1606
+ String document_str = Util.readFile("address-book.yaml");
1607
+ document_str = Util.untabify(document_str);
1608
+ YamlParser parser = new YamlParser(document_str);
1609
+ Object document = parser.parse();
1610
+
1611
+ // create address book object
1612
+ AddressBook addrbook = new AddressBook((Map)document);
1613
+
1614
+ // show groups
1615
+ List groups = addrbook.getGroups();
1616
+ if (groups != null) {
1617
+ for (Iterator it = groups.iterator(); it.hasNext(); ) {
1618
+ Group group = (Group)it.next();
1619
+ System.out.println("group name: " + group.getName());
1620
+ System.out.println("group desc: " + group.getDesc());
1621
+ System.out.println();
1622
+ }
1623
+ }
1624
+
1625
+ // show persons
1626
+ List persons = addrbook.getPersons();
1627
+ if (persons != null) {
1628
+ for (Iterator it = persons.iterator(); it.hasNext(); ) {
1629
+ Person person = (Person)it.next();
1630
+ System.out.println("person name: " + person.getName());
1631
+ System.out.println("person group: " + person.getGroup());
1632
+ System.out.println("person email: " + person.getEmail());
1633
+ System.out.println("person phone: " + person.getPhone());
1634
+ System.out.println("person blood: " + person.getBlood());
1635
+ System.out.println("person birth: " + person.getBirth());
1636
+ System.out.println();
1637
+ }
1638
+ }
1639
+ }
1640
+
1641
+ }
1642
+ </pre>
1643
+ <a name="example-address-book-java.expected"></a>
1644
+ <div class="terminal_caption">
1645
+ result</div>
1646
+ <pre class="terminal">$ javac -classpath '.:kwalify.jar' *.java
1647
+ $ java -classpath '.:kwalify.jar' ExampleAddressBook
1648
+ group name: family
1649
+ group desc: my family
1650
+
1651
+ group name: friend
1652
+ group desc: my friends
1653
+
1654
+ group name: business
1655
+ group desc: those who works together
1656
+
1657
+ person name: Sumire
1658
+ person group: family
1659
+ person email: null
1660
+ person phone: null
1661
+ person blood: A
1662
+ person birth: Tue Feb 01 00:00:00 JST 2000
1663
+
1664
+ person name: Shiina
1665
+ person group: friend
1666
+ person email: shiina@mail.org
1667
+ person phone: null
1668
+ person blood: null
1669
+ person birth: Wed Feb 01 00:00:00 JST 1995
1670
+
1671
+ person name: Sakura
1672
+ person group: business
1673
+ person email: cherry@mail.net
1674
+ person phone: 012-345-6789
1675
+ person blood: null
1676
+ person birth: null
1677
+
1678
+ </pre>
1679
+ <p>Command-line option '<code>-h -a genclass-java</code>' shows the commpand-line properties that template can accept.
1680
+ </p>
1681
+ <a name="option_ha_genclass_java.expected"></a>
1682
+ <div class="terminal_caption">
1683
+ show command-line properties</div>
1684
+ <pre class="terminal">$ kwalify -ha genclass-java
1685
+ --package=name : package name
1686
+ --extends=name : class name to extend
1687
+ --implements=name,... : interface names to implement
1688
+ --dir=path : directory to locate output file
1689
+ --basedir=path : base directory to locate output file
1690
+ </pre>
1691
+ <div class="terminal_caption">
1692
+ example of command-line properties</div>
1693
+ <pre class="terminal">$ kwalify -a genclass-java --package=com.example.my --implements=Serializable --basedir=src
1694
+ </pre>
1695
+ <br>
1696
+
1697
+ <br>
1698
+
1699
+
1700
+ <br>
1701
+
1702
+
1703
+ <a name="usage"></a>
1704
+ <h2 class="section1">Usage of Kwalify</h2>
1705
+ <a name="usage1"></a>
1706
+ <h3 class="section2">Usage in Command-Line</h3>
1707
+ <div class="terminal_caption">
1708
+ usage1: validate YAML document in command-line</div>
1709
+ <pre class="terminal">### kwalify-ruby
1710
+ $ kwalify -f schema.yaml document.yaml [document2.yaml ...]
1711
+
1712
+ ### kwalify-java
1713
+ $ java -classpath kwalify.jar kwalify.Main -f schema.yaml document.yaml [document2.yaml ...]
1714
+ </pre>
1715
+ <div class="terminal_caption">
1716
+ usage2: validate schema definition in command-line</div>
1717
+ <pre class="terminal">### kwalify-ruby
1718
+ $ kwalify -m schema.yaml [schema2.yaml ...]
1719
+
1720
+ ### kwalify-java
1721
+ $ java -classpath kwalify.jar kwalify.Main -m schema.yaml [schema2.yaml ...]
1722
+ </pre>
1723
+ <p>Command-line options:
1724
+ </p>
1725
+ <dl class="dl3">
1726
+ <dt class="dt3"><strong>
1727
+ <code>-h</code>, <code>--help</code> </strong></dt>
1728
+ <dd class="dd3">
1729
+ Print help message.
1730
+ </dd>
1731
+ <dt class="dt3"><strong>
1732
+ <code>-v</code> </strong></dt>
1733
+ <dd class="dd3">
1734
+ Print version.
1735
+ </dd>
1736
+ <dt class="dt3"><strong>
1737
+ <code>-s</code> </strong></dt>
1738
+ <dd class="dd3">
1739
+ Silent mode.
1740
+ </dd>
1741
+ <dt class="dt3"><strong>
1742
+ <code>-f <em>schema.yaml</em></code> </strong></dt>
1743
+ <dd class="dd3">
1744
+ Specify schema definition file.
1745
+ </dd>
1746
+ <dt class="dt3"><strong>
1747
+ <code>-m</code> </strong></dt>
1748
+ <dd class="dd3">
1749
+ Meta-validation of schema definition.
1750
+ </dd>
1751
+ <dt class="dt3"><strong>
1752
+ <code>-t</code> </strong></dt>
1753
+ <dd class="dd3">
1754
+ Expand tab characters to spaces automatically.
1755
+ </dd>
1756
+ <dt class="dt3"><strong>
1757
+ <code>-l</code> </strong></dt>
1758
+ <dd class="dd3">
1759
+ Show linenumber on which error found.
1760
+ </dd>
1761
+ <dt class="dt3"><strong>
1762
+ <code>-E</code> </strong></dt>
1763
+ <dd class="dd3">
1764
+ Show errors in Emacs-compatible style (implies '-l' option).
1765
+ </dd>
1766
+ <dt class="dt3"><strong>
1767
+ <code>-a action</code> </strong></dt>
1768
+ <dd class="dd3">
1769
+ Do action. Currently supported action is 'genclass-ruby' and 'genclass-java'.
1770
+ Try '-ha action' to get help about the action.
1771
+ </dd>
1772
+ </dl>
1773
+ <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.
1774
+ </p>
1775
+ <p>If you are an Emacs user, try <code>-E</code> option that show errors in format which Emacs can parse and jump to errors.
1776
+ You can use <code>C-x `</code> (next-error) to jump into errors.
1777
+ </p>
1778
+ <br>
1779
+
1780
+
1781
+ <a name="usage-ruby"></a>
1782
+ <h3 class="section2">Usage in Ruby Script</h3>
1783
+ <p>The followings are example scripts for Ruby.
1784
+ </p>
1785
+ <div class="program_caption">
1786
+ validate YAML document in Ruby script</div>
1787
+ <pre class="program">require 'kwalify'
1788
+
1789
+ ## parse schema definition and create validator
1790
+ schema = YAML.load_file('schema.yaml')
1791
+ validator = Kwalify::Validator.new(schema) # raises Kwalify::SchemaError if wrong
1792
+
1793
+ ## validate YAML document
1794
+ document = YAML.load_file('document.yaml')
1795
+ error_list = validator.validate(document)
1796
+ unless error_list.empty?
1797
+ error_list.each do |error| # error is instance of Kwalify::ValidationError
1798
+ puts "[#{error.path}] #{error.message}"
1799
+ end
1800
+ end
1801
+ </pre>
1802
+ <div class="program_caption">
1803
+ validate YAML document and show linenumber on where error is found.</div>
1804
+ <pre class="program">require 'kwalify'
1805
+
1806
+ ## parse schema definition and create validator
1807
+ schema = YAML.load_file('schema.yaml')
1808
+ validator = Kwalify::Validator.new(schema) # raises Kwalify::SchemaError if wrong
1809
+
1810
+ ## parse YAML document with Kwalify's parser
1811
+ str = File.read('document.yaml')
1812
+ parser = Kwalify::Parser.new(str)
1813
+ document = parser.parse()
1814
+
1815
+ ## validate document and show errors
1816
+ error_list = validator.validate(document)
1817
+ unless error_list.empty?
1818
+ parser.set_errors_linenum(error_list) # set linenum on error
1819
+ error_list.sort.each do |error|
1820
+ puts "(line %d)[%s] %s" % [error.linenum, error.path, error.message]
1821
+ end
1822
+ end
1823
+ </pre>
1824
+ <p>Kwalify's YAML parser is experimental. You should notice that Kwalify's YAML parser is limited only for basic syntax of YAML.
1825
+ </p>
1826
+ <br>
1827
+
1828
+
1829
+ <a name="usage-java"></a>
1830
+ <h3 class="section2">Usage in Java Program</h3>
1831
+ <p>The followings are example programs of Java.
1832
+ </p>
1833
+ <div class="program_caption">
1834
+ validate YAML document and show linenumber on where error is found.</div>
1835
+ <pre class="program">import kwalify.*;
1836
+
1837
+ public class Test {
1838
+
1839
+ public static void main(String[] args) throws Exception {
1840
+ // read schema
1841
+ String schema_str = Util.readFile("schema.yaml");
1842
+ schema_str = Util.untabify(schema_str);
1843
+ Object schema = new YamlParser(schema_str).parse();
1844
+
1845
+ // read document file
1846
+ String document_str = Util.readFile("document.yaml");
1847
+ document_str = Util.untabify(document_str);
1848
+ YamlParser parser = new YamlParser(document_str);
1849
+ Object document = parser.parse();
1850
+
1851
+ // create validator and validate
1852
+ Validator validator = new Validator(schema);
1853
+ List errors = validator.validate(document);
1854
+
1855
+ // show errors
1856
+ if (errors != null &amp;&amp; errors.size() &gt; 0) {
1857
+ parser.setErrorsLineNumber(errors);
1858
+ Collections.sort(errors);
1859
+ for (Iterator it = errors.iterator(); it.hasNext(); ) {
1860
+ ValidationException error = (ValidationException)it.next();
1861
+ int linenum = error.getLineNumber();
1862
+ String path = error.getPath();
1863
+ String mesg = error.getMessage();
1864
+ System.out.println("- " + linenum + ": [" + path + "] " + mesg);
1865
+ }
1866
+ }
1867
+ }
1868
+ }
1869
+ </pre>
1870
+ <br>
1871
+
1872
+
1373
1873
  <br>
1374
1874
 
1375
1875