kwalify 0.6.1 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (219) hide show
  1. data/CHANGES.txt +232 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.txt +16 -19
  4. data/bin/kwalify +3 -3
  5. data/contrib/inline-require +6 -4
  6. data/contrib/kwalify +3719 -2427
  7. data/doc-api/classes/CommandOptionError.html +17 -17
  8. data/doc-api/classes/CommandOptionParser.html +63 -63
  9. data/doc-api/classes/Kwalify.html +29 -7
  10. data/doc-api/classes/Kwalify/AssertionError.html +9 -9
  11. data/doc-api/classes/Kwalify/BaseError.html +72 -71
  12. data/doc-api/classes/Kwalify/BaseParser.html +461 -0
  13. data/doc-api/classes/Kwalify/CommandOptionError.html +11 -11
  14. data/doc-api/classes/Kwalify/ErrorHelper.html +51 -46
  15. data/doc-api/classes/Kwalify/HashInterface.html +13 -135
  16. data/doc-api/classes/Kwalify/Json.html +105 -0
  17. data/doc-api/classes/Kwalify/Main.html +129 -126
  18. data/doc-api/classes/Kwalify/MetaValidator.html +248 -232
  19. data/doc-api/classes/Kwalify/Parser.html +12 -12
  20. data/doc-api/classes/Kwalify/PlainYamlParser.html +166 -163
  21. data/doc-api/classes/Kwalify/PlainYamlParser/Alias.html +11 -11
  22. data/doc-api/classes/Kwalify/Rule.html +152 -130
  23. data/doc-api/classes/Kwalify/SchemaError.html +10 -10
  24. data/doc-api/classes/Kwalify/SyntaxError.html +185 -0
  25. data/doc-api/classes/Kwalify/Types.html +26 -25
  26. data/doc-api/classes/Kwalify/Util.html +389 -0
  27. data/doc-api/classes/Kwalify/Util/HashLike.html +246 -0
  28. data/doc-api/classes/Kwalify/Util/OrderedHash.html +330 -0
  29. data/doc-api/classes/Kwalify/ValidationError.html +10 -10
  30. data/doc-api/classes/Kwalify/Validator.html +153 -86
  31. data/doc-api/classes/Kwalify/Yaml.html +181 -0
  32. data/doc-api/classes/Kwalify/Yaml/Parser.html +1538 -0
  33. data/doc-api/classes/Kwalify/YamlParser.html +190 -183
  34. data/doc-api/classes/Kwalify/YamlSyntaxError.html +8 -57
  35. data/doc-api/created.rid +1 -1
  36. data/doc-api/files/__/README_txt.html +17 -22
  37. data/doc-api/files/kwalify/errors_rb.html +2 -2
  38. data/doc-api/files/kwalify/main_rb.html +4 -3
  39. data/doc-api/files/kwalify/messages_rb.html +2 -2
  40. data/doc-api/files/kwalify/meta-validator_rb.html +3 -3
  41. data/doc-api/files/kwalify/{util/yaml-helper_rb.html → parser/base_rb.html} +8 -6
  42. data/doc-api/files/kwalify/parser/yaml_rb.html +117 -0
  43. data/doc-api/files/kwalify/rule_rb.html +2 -2
  44. data/doc-api/files/kwalify/types_rb.html +2 -2
  45. data/doc-api/files/kwalify/util/assert-text-equal_rb.html +2 -2
  46. data/doc-api/files/kwalify/util/hash-interface_rb.html +9 -2
  47. data/doc-api/files/kwalify/util/hashlike_rb.html +107 -0
  48. data/doc-api/files/kwalify/util/option-parser_rb.html +2 -2
  49. data/doc-api/files/kwalify/util/ordered-hash_rb.html +107 -0
  50. data/doc-api/files/kwalify/util/testcase-helper_rb.html +2 -2
  51. data/doc-api/files/kwalify/util_rb.html +107 -0
  52. data/doc-api/files/kwalify/validator_rb.html +2 -2
  53. data/doc-api/files/kwalify/yaml-parser_rb.html +2 -2
  54. data/doc-api/files/kwalify_rb.html +3 -2
  55. data/doc-api/fr_class_index.html +8 -1
  56. data/doc-api/fr_file_index.html +5 -1
  57. data/doc-api/fr_method_index.html +128 -69
  58. data/doc/img/fig01.png +0 -0
  59. data/doc/users-guide.html +882 -717
  60. data/examples/address-book/address-book.schema.yaml +2 -2
  61. data/examples/data-binding/BABEL.data.yaml +63 -0
  62. data/examples/data-binding/BABEL.schema.yaml +31 -0
  63. data/examples/data-binding/Makefile +8 -0
  64. data/examples/data-binding/Rakefile +13 -0
  65. data/examples/data-binding/main.rb +27 -0
  66. data/examples/invoice/invoice.schema.yaml +3 -3
  67. data/examples/tapkit/tapkit.schema.yaml +2 -2
  68. data/lib/kwalify.rb +41 -4
  69. data/lib/kwalify/errors.rb +118 -96
  70. data/lib/kwalify/kwalify.schema.yaml +58 -0
  71. data/lib/kwalify/main.rb +384 -377
  72. data/lib/kwalify/messages.rb +41 -27
  73. data/lib/kwalify/meta-validator.rb +251 -331
  74. data/lib/kwalify/parser/base.rb +127 -0
  75. data/lib/kwalify/parser/yaml.rb +837 -0
  76. data/lib/kwalify/rule.rb +545 -487
  77. data/lib/kwalify/templates/genclass-java.eruby +189 -162
  78. data/lib/kwalify/templates/genclass-php.eruby +104 -0
  79. data/lib/kwalify/templates/genclass-ruby.eruby +95 -66
  80. data/lib/kwalify/types.rb +107 -106
  81. data/lib/kwalify/util.rb +157 -0
  82. data/lib/kwalify/util/assert-text-equal.rb +33 -31
  83. data/lib/kwalify/util/hash-interface.rb +11 -30
  84. data/lib/kwalify/util/hashlike.rb +51 -0
  85. data/lib/kwalify/util/option-parser.rb +144 -144
  86. data/lib/kwalify/util/ordered-hash.rb +57 -0
  87. data/lib/kwalify/util/testcase-helper.rb +3 -3
  88. data/lib/kwalify/validator.rb +267 -212
  89. data/lib/kwalify/yaml-parser.rb +822 -768
  90. data/setup.rb +861 -607
  91. data/test/Rookbook.yaml +10 -0
  92. data/test/{tmp.dir/Context.java → data/users-guide/AddressBook.java.expected} +11 -11
  93. data/test/data/users-guide/BABEL.data.yaml +24 -0
  94. data/test/data/users-guide/BABEL.schema.yaml +30 -0
  95. data/test/data/users-guide/ExampleAddressBook.java +47 -0
  96. data/test/{tmp.dir/Group.java → data/users-guide/Group.java.expected} +2 -11
  97. data/test/data/users-guide/Person.java.expected +44 -0
  98. data/test/data/users-guide/address_book.rb +52 -0
  99. data/test/data/users-guide/address_book.schema.yaml +28 -0
  100. data/test/data/users-guide/address_book.yaml +27 -0
  101. data/test/data/users-guide/answers-schema.yaml +12 -0
  102. data/test/data/users-guide/answers-validator.rb +52 -0
  103. data/test/data/users-guide/babel_genclass.result +26 -0
  104. data/test/data/users-guide/config.schema.yaml +7 -0
  105. data/test/data/users-guide/config.yaml +4 -0
  106. data/test/{tmp.dir/silent1.document → data/users-guide/document01a.yaml} +0 -0
  107. data/test/data/users-guide/document01b.yaml +3 -0
  108. data/test/data/users-guide/document02a.yaml +4 -0
  109. data/test/data/users-guide/document02b.yaml +4 -0
  110. data/test/data/users-guide/document03a.yaml +6 -0
  111. data/test/data/users-guide/document03b.yaml +6 -0
  112. data/test/data/users-guide/document04a.yaml +9 -0
  113. data/test/data/users-guide/document04b.yaml +9 -0
  114. data/test/data/users-guide/document05a.yaml +11 -0
  115. data/test/data/users-guide/document05b.yaml +12 -0
  116. data/test/data/users-guide/document06a.yaml +15 -0
  117. data/test/data/users-guide/document06b.yaml +16 -0
  118. data/test/data/users-guide/document07a.yaml +9 -0
  119. data/test/data/users-guide/document07b.yaml +7 -0
  120. data/test/data/users-guide/document12a.json +10 -0
  121. data/test/data/users-guide/document12b.json +6 -0
  122. data/test/data/users-guide/document13a.yaml +17 -0
  123. data/test/data/users-guide/document14a.yaml +3 -0
  124. data/test/data/users-guide/document14b.yaml +3 -0
  125. data/test/data/users-guide/document15a.yaml +6 -0
  126. data/test/data/users-guide/document15b.yaml +5 -0
  127. data/test/data/users-guide/example_address_book.rb +10 -0
  128. data/test/data/users-guide/example_address_book_java.result +32 -0
  129. data/test/data/users-guide/example_address_book_ruby.result +31 -0
  130. data/test/data/users-guide/genclass_java.result +4 -0
  131. data/test/data/users-guide/howto-validation-with-parsing.rb +28 -0
  132. data/test/data/users-guide/howto-validation.rb +25 -0
  133. data/test/data/users-guide/howto3.rb +6 -0
  134. data/test/data/users-guide/howto3.result +5 -0
  135. data/test/data/users-guide/howto3.yaml +8 -0
  136. data/test/data/users-guide/howto5_databinding.result +111 -0
  137. data/test/data/users-guide/invalid01.result +3 -0
  138. data/test/data/users-guide/invalid02.result +5 -0
  139. data/test/data/users-guide/invalid03.result +5 -0
  140. data/test/data/users-guide/invalid04.result +4 -0
  141. data/test/data/users-guide/invalid05.result +11 -0
  142. data/test/data/users-guide/invalid06.result +4 -0
  143. data/test/data/users-guide/invalid07.result +3 -0
  144. data/test/data/users-guide/invalid08.result +3 -0
  145. data/test/data/users-guide/invalid12.json +8 -0
  146. data/test/data/users-guide/invalid14.result +4 -0
  147. data/test/data/users-guide/invalid15.result +4 -0
  148. data/test/data/users-guide/loadbabel.rb +27 -0
  149. data/test/data/users-guide/loadconfig.rb +15 -0
  150. data/test/data/users-guide/loadconfig.result +2 -0
  151. data/test/data/users-guide/models.rb +22 -0
  152. data/test/data/users-guide/option_ha.result +6 -0
  153. data/test/data/users-guide/option_ha_genclass_java.result +7 -0
  154. data/test/{tmp.dir/meta1.schema → data/users-guide/schema01.yaml} +0 -0
  155. data/test/data/users-guide/schema02.yaml +12 -0
  156. data/test/data/users-guide/schema03.yaml +9 -0
  157. data/test/data/users-guide/schema04.yaml +20 -0
  158. data/test/data/users-guide/schema05.yaml +29 -0
  159. data/test/data/users-guide/schema06.yaml +11 -0
  160. data/test/data/users-guide/schema12.json +12 -0
  161. data/test/data/users-guide/schema13.yaml +13 -0
  162. data/test/data/users-guide/schema14.yaml +5 -0
  163. data/test/data/users-guide/schema15.yaml +21 -0
  164. data/test/data/users-guide/valid01.result +2 -0
  165. data/test/data/users-guide/valid02.result +2 -0
  166. data/test/data/users-guide/valid03.result +2 -0
  167. data/test/data/users-guide/valid04.result +2 -0
  168. data/test/data/users-guide/valid05.result +2 -0
  169. data/test/data/users-guide/valid06.result +2 -0
  170. data/test/data/users-guide/valid07.result +2 -0
  171. data/test/data/users-guide/valid08.result +2 -0
  172. data/test/data/users-guide/valid12.result +2 -0
  173. data/test/data/users-guide/valid13.result +2 -0
  174. data/test/data/users-guide/valid14.result +2 -0
  175. data/test/data/users-guide/valid15.result +2 -0
  176. data/test/data/users-guide/validate08.rb +37 -0
  177. data/test/test-action.rb +78 -0
  178. data/test/test-action.yaml +738 -0
  179. data/test/test-databinding.rb +80 -0
  180. data/test/test-databinding.yaml +301 -0
  181. data/test/test-main.rb +129 -150
  182. data/test/test-main.yaml +126 -321
  183. data/test/test-metavalidator.rb +47 -47
  184. data/test/test-metavalidator.yaml +77 -21
  185. data/test/test-parser-yaml.rb +57 -0
  186. data/test/test-parser-yaml.yaml +1749 -0
  187. data/test/test-rule.rb +14 -15
  188. data/test/test-rule.yaml +6 -3
  189. data/test/test-users-guide.rb +75 -0
  190. data/test/test-validator.rb +77 -52
  191. data/test/test-validator.yaml +168 -6
  192. data/test/test-yaml-parser.rb +47 -0
  193. data/test/{test-yamlparser.yaml → test-yaml-parser.yaml} +159 -52
  194. data/test/test.rb +37 -21
  195. metadata +136 -37
  196. data/COPYING +0 -340
  197. data/ChangeLog +0 -70
  198. data/doc-api/classes/YamlHelper.html +0 -259
  199. data/lib/kwalify/util/yaml-helper.rb +0 -82
  200. data/test/test-yamlparser.rb +0 -58
  201. data/test/tmp.dir/User.java +0 -43
  202. data/test/tmp.dir/action1.document +0 -18
  203. data/test/tmp.dir/action1.schema +0 -32
  204. data/test/tmp.dir/action2.document +0 -18
  205. data/test/tmp.dir/action2.schema +0 -32
  206. data/test/tmp.dir/emacs.document +0 -6
  207. data/test/tmp.dir/emacs.schema +0 -6
  208. data/test/tmp.dir/meta1.document +0 -0
  209. data/test/tmp.dir/meta2.document +0 -0
  210. data/test/tmp.dir/meta2.schema +0 -3
  211. data/test/tmp.dir/silent1.schema +0 -3
  212. data/test/tmp.dir/silent2.document +0 -7
  213. data/test/tmp.dir/silent2.schema +0 -3
  214. data/test/tmp.dir/stream.invalid +0 -8
  215. data/test/tmp.dir/stream.schema +0 -3
  216. data/test/tmp.dir/stream.valid +0 -8
  217. data/test/tmp.dir/untabify.document +0 -5
  218. data/test/tmp.dir/untabify.schema +0 -10
  219. data/todo.txt +0 -34
@@ -56,7 +56,7 @@
56
56
  </tr>
57
57
  <tr class="top-aligned-row">
58
58
  <td><strong>Last Update:</strong></td>
59
- <td>Tue May 30 13:32:07 JST 2006</td>
59
+ <td>Thu Jan 17 21:21:16 +0900 2008</td>
60
60
  </tr>
61
61
  </table>
62
62
  </div>
@@ -70,7 +70,7 @@
70
70
 
71
71
  <div id="description">
72
72
  <p>
73
- $Rev: 51 $ $Release: 0.6.1 $ copyright(c) 2005 kuwata-lab all rights reserved.
73
+ $Rev: 81 $ $Release: 0.7.0 $ copyright(c) 2005-2008 kuwata-lab all rights reserved.
74
74
  </p>
75
75
 
76
76
  </div>
@@ -56,7 +56,7 @@
56
56
  </tr>
57
57
  <tr class="top-aligned-row">
58
58
  <td><strong>Last Update:</strong></td>
59
- <td>Sun May 14 13:59:04 JST 2006</td>
59
+ <td>Sun Jan 27 22:49:22 +0900 2008</td>
60
60
  </tr>
61
61
  </table>
62
62
  </div>
@@ -70,7 +70,8 @@
70
70
 
71
71
  <div id="description">
72
72
  <p>
73
- $Rev: 48 $ $Release: 0.6.1 $ copyright(c) 2005 kuwata-lab all rights reserved.
73
+ $Rev: 95 $ $Release: 0.7.0 $ copyright(c) 2006 kuwata-lab.com all rights
74
+ reserved.
74
75
  </p>
75
76
 
76
77
  </div>
@@ -25,9 +25,11 @@
25
25
  <a href="classes/Kwalify.html">Kwalify</a><br />
26
26
  <a href="classes/Kwalify/AssertionError.html">Kwalify::AssertionError</a><br />
27
27
  <a href="classes/Kwalify/BaseError.html">Kwalify::BaseError</a><br />
28
+ <a href="classes/Kwalify/BaseParser.html">Kwalify::BaseParser</a><br />
28
29
  <a href="classes/Kwalify/CommandOptionError.html">Kwalify::CommandOptionError</a><br />
29
30
  <a href="classes/Kwalify/ErrorHelper.html">Kwalify::ErrorHelper</a><br />
30
31
  <a href="classes/Kwalify/HashInterface.html">Kwalify::HashInterface</a><br />
32
+ <a href="classes/Kwalify/Json.html">Kwalify::Json</a><br />
31
33
  <a href="classes/Kwalify/KwalifyError.html">Kwalify::KwalifyError</a><br />
32
34
  <a href="classes/Kwalify/Main.html">Kwalify::Main</a><br />
33
35
  <a href="classes/Kwalify/MetaValidator.html">Kwalify::MetaValidator</a><br />
@@ -36,14 +38,19 @@
36
38
  <a href="classes/Kwalify/PlainYamlParser/Alias.html">Kwalify::PlainYamlParser::Alias</a><br />
37
39
  <a href="classes/Kwalify/Rule.html">Kwalify::Rule</a><br />
38
40
  <a href="classes/Kwalify/SchemaError.html">Kwalify::SchemaError</a><br />
41
+ <a href="classes/Kwalify/SyntaxError.html">Kwalify::SyntaxError</a><br />
39
42
  <a href="classes/Kwalify/Types.html">Kwalify::Types</a><br />
43
+ <a href="classes/Kwalify/Util.html">Kwalify::Util</a><br />
44
+ <a href="classes/Kwalify/Util/HashLike.html">Kwalify::Util::HashLike</a><br />
45
+ <a href="classes/Kwalify/Util/OrderedHash.html">Kwalify::Util::OrderedHash</a><br />
40
46
  <a href="classes/Kwalify/ValidationError.html">Kwalify::ValidationError</a><br />
41
47
  <a href="classes/Kwalify/Validator.html">Kwalify::Validator</a><br />
48
+ <a href="classes/Kwalify/Yaml.html">Kwalify::Yaml</a><br />
49
+ <a href="classes/Kwalify/Yaml/Parser.html">Kwalify::Yaml::Parser</a><br />
42
50
  <a href="classes/Kwalify/YamlParser.html">Kwalify::YamlParser</a><br />
43
51
  <a href="classes/Kwalify/YamlSyntaxError.html">Kwalify::YamlSyntaxError</a><br />
44
52
  <a href="classes/Test.html">Test</a><br />
45
53
  <a href="classes/Test/Unit.html">Test::Unit</a><br />
46
- <a href="classes/YamlHelper.html">YamlHelper</a><br />
47
54
  </div>
48
55
  </div>
49
56
  </body>
@@ -26,13 +26,17 @@
26
26
  <a href="files/kwalify/main_rb.html">kwalify/main.rb</a><br />
27
27
  <a href="files/kwalify/messages_rb.html">kwalify/messages.rb</a><br />
28
28
  <a href="files/kwalify/meta-validator_rb.html">kwalify/meta-validator.rb</a><br />
29
+ <a href="files/kwalify/parser/base_rb.html">kwalify/parser/base.rb</a><br />
30
+ <a href="files/kwalify/parser/yaml_rb.html">kwalify/parser/yaml.rb</a><br />
29
31
  <a href="files/kwalify/rule_rb.html">kwalify/rule.rb</a><br />
30
32
  <a href="files/kwalify/types_rb.html">kwalify/types.rb</a><br />
33
+ <a href="files/kwalify/util_rb.html">kwalify/util.rb</a><br />
31
34
  <a href="files/kwalify/util/assert-text-equal_rb.html">kwalify/util/assert-text-equal.rb</a><br />
32
35
  <a href="files/kwalify/util/hash-interface_rb.html">kwalify/util/hash-interface.rb</a><br />
36
+ <a href="files/kwalify/util/hashlike_rb.html">kwalify/util/hashlike.rb</a><br />
33
37
  <a href="files/kwalify/util/option-parser_rb.html">kwalify/util/option-parser.rb</a><br />
38
+ <a href="files/kwalify/util/ordered-hash_rb.html">kwalify/util/ordered-hash.rb</a><br />
34
39
  <a href="files/kwalify/util/testcase-helper_rb.html">kwalify/util/testcase-helper.rb</a><br />
35
- <a href="files/kwalify/util/yaml-helper_rb.html">kwalify/util/yaml-helper.rb</a><br />
36
40
  <a href="files/kwalify/validator_rb.html">kwalify/validator.rb</a><br />
37
41
  <a href="files/kwalify/yaml-parser_rb.html">kwalify/yaml-parser.rb</a><br />
38
42
  </div>
@@ -20,88 +20,147 @@
20
20
  <div id="index">
21
21
  <h1 class="section-bar">Methods</h1>
22
22
  <div id="index-entries">
23
- <a href="classes/Kwalify/BaseError.html#M000035"><=> (Kwalify::BaseError)</a><br />
24
- <a href="classes/Kwalify/HashInterface.html#M000015">[] (Kwalify::HashInterface)</a><br />
25
- <a href="classes/Kwalify/HashInterface.html#M000016">[]= (Kwalify::HashInterface)</a><br />
26
- <a href="classes/Kwalify/ErrorHelper.html#M000023">_build_message (Kwalify::ErrorHelper)</a><br />
27
- <a href="classes/Kwalify/Validator.html#M000025">_inspect (Kwalify::Validator)</a><br />
28
- <a href="classes/Kwalify/Main.html#M000039">_inspect (Kwalify::Main)</a><br />
29
- <a href="classes/Kwalify/Rule.html#M000058">_inspect (Kwalify::Rule)</a><br />
30
- <a href="classes/Kwalify/Validator.html#M000028">_validate (Kwalify::Validator)</a><br />
31
- <a href="classes/Kwalify/PlainYamlParser.html#M000073">add_to_map (Kwalify::PlainYamlParser)</a><br />
32
- <a href="classes/Kwalify/YamlParser.html#M000051">add_to_map (Kwalify::YamlParser)</a><br />
33
- <a href="classes/Kwalify/YamlParser.html#M000048">add_to_seq (Kwalify::YamlParser)</a><br />
34
- <a href="classes/Kwalify/PlainYamlParser.html#M000070">add_to_seq (Kwalify::PlainYamlParser)</a><br />
35
- <a href="classes/Kwalify/ErrorHelper.html#M000020">assert_error (Kwalify::ErrorHelper)</a><br />
23
+ <a href="classes/Kwalify/BaseError.html#M000084"><=> (Kwalify::BaseError)</a><br />
24
+ <a href="classes/Kwalify/Util/HashLike.html#M000025">[] (Kwalify::Util::HashLike)</a><br />
25
+ <a href="classes/Kwalify/Util/HashLike.html#M000026">[]= (Kwalify::Util::HashLike)</a><br />
26
+ <a href="classes/Kwalify/Util/OrderedHash.html#M000033">[]= (Kwalify::Util::OrderedHash)</a><br />
27
+ <a href="classes/Kwalify/ErrorHelper.html#M000018">_build_message (Kwalify::ErrorHelper)</a><br />
28
+ <a href="classes/Kwalify/BaseParser.html#M000098">_getch (Kwalify::BaseParser)</a><br />
29
+ <a href="classes/Kwalify/Yaml/Parser.html#M000071">_getclass (Kwalify::Yaml::Parser)</a><br />
30
+ <a href="classes/Kwalify/Rule.html#M000118">_init (Kwalify::Rule)</a><br />
31
+ <a href="classes/Kwalify/Validator.html#M000075">_inspect (Kwalify::Validator)</a><br />
32
+ <a href="classes/Kwalify/Main.html#M000088">_inspect (Kwalify::Main)</a><br />
33
+ <a href="classes/Kwalify/Rule.html#M000120">_inspect (Kwalify::Rule)</a><br />
34
+ <a href="classes/Kwalify/BaseParser.html#M000093">_set_column_and_linenum (Kwalify::BaseParser)</a><br />
35
+ <a href="classes/Kwalify/Yaml/Parser.html#M000042">_set_error_info (Kwalify::Yaml::Parser)</a><br />
36
+ <a href="classes/Kwalify/BaseParser.html#M000100">_syntax_error (Kwalify::BaseParser)</a><br />
37
+ <a href="classes/Kwalify/Validator.html#M000078">_validate (Kwalify::Validator)</a><br />
38
+ <a href="classes/Kwalify/Yaml/Parser.html#M000057">_validate_map_value (Kwalify::Yaml::Parser)</a><br />
39
+ <a href="classes/Kwalify/Validator.html#M000079">_validate_unique (Kwalify::Validator)</a><br />
40
+ <a href="classes/Kwalify/Util/OrderedHash.html#M000032">add (Kwalify::Util::OrderedHash)</a><br />
41
+ <a href="classes/Kwalify/PlainYamlParser.html#M000135">add_to_map (Kwalify::PlainYamlParser)</a><br />
42
+ <a href="classes/Kwalify/YamlParser.html#M000112">add_to_map (Kwalify::YamlParser)</a><br />
43
+ <a href="classes/Kwalify/PlainYamlParser.html#M000132">add_to_seq (Kwalify::PlainYamlParser)</a><br />
44
+ <a href="classes/Kwalify/YamlParser.html#M000109">add_to_seq (Kwalify::YamlParser)</a><br />
45
+ <a href="classes/Kwalify/Yaml/Parser.html#M000069">add_to_seq (Kwalify::Yaml::Parser)</a><br />
46
+ <a href="classes/Kwalify/ErrorHelper.html#M000015">assert_error (Kwalify::ErrorHelper)</a><br />
36
47
  <a href="classes/Kwalify/Types.html#M000011">collection? (Kwalify::Types)</a><br />
37
48
  <a href="classes/Kwalify/Types.html#M000013">collection_type? (Kwalify::Types)</a><br />
38
- <a href="classes/YamlHelper.html#M000082">create_hashtable (YamlHelper)</a><br />
39
- <a href="classes/Kwalify/PlainYamlParser.html#M000072">create_mapping (Kwalify::PlainYamlParser)</a><br />
40
- <a href="classes/Kwalify/YamlParser.html#M000050">create_mapping (Kwalify::YamlParser)</a><br />
41
- <a href="classes/Kwalify/YamlParser.html#M000055">create_scalar (Kwalify::YamlParser)</a><br />
42
- <a href="classes/Kwalify/PlainYamlParser.html#M000077">create_scalar (Kwalify::PlainYamlParser)</a><br />
43
- <a href="classes/Kwalify/YamlParser.html#M000047">create_sequence (Kwalify::YamlParser)</a><br />
44
- <a href="classes/Kwalify/PlainYamlParser.html#M000069">create_sequence (Kwalify::PlainYamlParser)</a><br />
45
- <a href="classes/Kwalify/PlainYamlParser.html#M000078">current_line (Kwalify::PlainYamlParser)</a><br />
46
- <a href="classes/Kwalify/PlainYamlParser.html#M000079">current_linenum (Kwalify::PlainYamlParser)</a><br />
47
- <a href="classes/Kwalify/Main.html#M000038">debug? (Kwalify::Main)</a><br />
48
- <a href="classes/Kwalify/HashInterface.html#M000019">each (Kwalify::HashInterface)</a><br />
49
- <a href="classes/Kwalify/Main.html#M000040">execute (Kwalify::Main)</a><br />
49
+ <a href="classes/Kwalify/Util.html#M000023">create_hashtable (Kwalify::Util)</a><br />
50
+ <a href="classes/Kwalify/YamlParser.html#M000111">create_mapping (Kwalify::YamlParser)</a><br />
51
+ <a href="classes/Kwalify/PlainYamlParser.html#M000134">create_mapping (Kwalify::PlainYamlParser)</a><br />
52
+ <a href="classes/Kwalify/Yaml/Parser.html#M000067">create_mapping (Kwalify::Yaml::Parser)</a><br />
53
+ <a href="classes/Kwalify/YamlParser.html#M000116">create_scalar (Kwalify::YamlParser)</a><br />
54
+ <a href="classes/Kwalify/PlainYamlParser.html#M000139">create_scalar (Kwalify::PlainYamlParser)</a><br />
55
+ <a href="classes/Kwalify/Yaml/Parser.html#M000068">create_scalar (Kwalify::Yaml::Parser)</a><br />
56
+ <a href="classes/Kwalify/YamlParser.html#M000108">create_sequence (Kwalify::YamlParser)</a><br />
57
+ <a href="classes/Kwalify/PlainYamlParser.html#M000131">create_sequence (Kwalify::PlainYamlParser)</a><br />
58
+ <a href="classes/Kwalify/Yaml/Parser.html#M000066">create_sequence (Kwalify::Yaml::Parser)</a><br />
59
+ <a href="classes/Kwalify/PlainYamlParser.html#M000140">current_line (Kwalify::PlainYamlParser)</a><br />
60
+ <a href="classes/Kwalify/PlainYamlParser.html#M000141">current_linenum (Kwalify::PlainYamlParser)</a><br />
61
+ <a href="classes/Kwalify/Main.html#M000087">debug? (Kwalify::Main)</a><br />
62
+ <a href="classes/Kwalify/Util/OrderedHash.html#M000036">delete (Kwalify::Util::OrderedHash)</a><br />
63
+ <a href="classes/Kwalify/Yaml/Parser.html#M000044">document_start? (Kwalify::Yaml::Parser)</a><br />
64
+ <a href="classes/Kwalify/Util/OrderedHash.html#M000037">each (Kwalify::Util::OrderedHash)</a><br />
65
+ <a href="classes/Kwalify/Util/HashLike.html#M000029">each (Kwalify::Util::HashLike)</a><br />
66
+ <a href="classes/Kwalify/BaseParser.html#M000096">eos? (Kwalify::BaseParser)</a><br />
67
+ <a href="classes/Kwalify/Main.html#M000089">execute (Kwalify::Main)</a><br />
68
+ <a href="classes/Kwalify/Util.html#M000022">get_class (Kwalify::Util)</a><br />
69
+ <a href="classes/Kwalify/Rule.html#M000119">get_init_method (Kwalify::Rule)</a><br />
50
70
  <a href="classes/Kwalify/Types.html#M000010">get_type_class (Kwalify::Types)</a><br />
51
- <a href="classes/YamlHelper.html#M000083">get_value (YamlHelper)</a><br />
52
- <a href="classes/Kwalify/PlainYamlParser.html#M000067">has_next? (Kwalify::PlainYamlParser)</a><br />
53
- <a href="classes/Kwalify/Rule.html#M000057">init (Kwalify::Rule)</a><br />
54
- <a href="classes/Kwalify/MetaValidator.html#M000061">instance (Kwalify::MetaValidator)</a><br />
55
- <a href="classes/Kwalify/HashInterface.html#M000018">key? (Kwalify::HashInterface)</a><br />
56
- <a href="classes/Kwalify/HashInterface.html#M000017">keys (Kwalify::HashInterface)</a><br />
57
- <a href="classes/Kwalify/Main.html#M000041">main (Kwalify::Main)</a><br />
58
- <a href="classes/Kwalify/YamlParser.html#M000054">merge_map (Kwalify::YamlParser)</a><br />
59
- <a href="classes/Kwalify/PlainYamlParser.html#M000076">merge_map (Kwalify::PlainYamlParser)</a><br />
60
- <a href="classes/Kwalify/BaseError.html#M000033">message (Kwalify::BaseError)</a><br />
71
+ <a href="classes/Kwalify/Util.html#M000024">get_value (Kwalify::Util)</a><br />
72
+ <a href="classes/Kwalify/BaseParser.html#M000095">group (Kwalify::BaseParser)</a><br />
73
+ <a href="classes/Kwalify/Yaml/Parser.html#M000046">has_next? (Kwalify::Yaml::Parser)</a><br />
74
+ <a href="classes/Kwalify/PlainYamlParser.html#M000129">has_next? (Kwalify::PlainYamlParser)</a><br />
75
+ <a href="classes/Kwalify/MetaValidator.html#M000121">instance (Kwalify::MetaValidator)</a><br />
76
+ <a href="classes/Kwalify/Util/HashLike.html#M000028">key? (Kwalify::Util::HashLike)</a><br />
77
+ <a href="classes/Kwalify/Util/HashLike.html#M000027">key? (Kwalify::Util::HashLike)</a><br />
78
+ <a href="classes/Kwalify/Util/OrderedHash.html#M000034">keys (Kwalify::Util::OrderedHash)</a><br />
79
+ <a href="classes/Kwalify/Yaml.html#M000038">load (Kwalify::Yaml)</a><br />
80
+ <a href="classes/Kwalify/Yaml.html#M000039">load_file (Kwalify::Yaml)</a><br />
81
+ <a href="classes/Kwalify/Yaml/Parser.html#M000072">location (Kwalify::Yaml::Parser)</a><br />
82
+ <a href="classes/Kwalify/Main.html#M000090">main (Kwalify::Main)</a><br />
83
+ <a href="classes/Kwalify/BaseParser.html#M000094">match? (Kwalify::BaseParser)</a><br />
84
+ <a href="classes/Kwalify/YamlParser.html#M000115">merge_map (Kwalify::YamlParser)</a><br />
85
+ <a href="classes/Kwalify/PlainYamlParser.html#M000138">merge_map (Kwalify::PlainYamlParser)</a><br />
86
+ <a href="classes/Kwalify/SyntaxError.html#M000102">message (Kwalify::SyntaxError)</a><br />
61
87
  <a href="classes/Kwalify.html#M000007">meta_validator (Kwalify)</a><br />
62
88
  <a href="classes/Kwalify.html#M000005">msg (Kwalify)</a><br />
63
- <a href="classes/Kwalify/AssertionError.html#M000062">new (Kwalify::AssertionError)</a><br />
64
- <a href="classes/Kwalify/YamlParser.html#M000042">new (Kwalify::YamlParser)</a><br />
65
89
  <a href="classes/CommandOptionError.html#M000001">new (CommandOptionError)</a><br />
90
+ <a href="classes/Kwalify/PlainYamlParser/Alias.html#M000142">new (Kwalify::PlainYamlParser::Alias)</a><br />
91
+ <a href="classes/Kwalify/YamlParser.html#M000103">new (Kwalify::YamlParser)</a><br />
66
92
  <a href="classes/CommandOptionParser.html#M000002">new (CommandOptionParser)</a><br />
67
- <a href="classes/Kwalify/PlainYamlParser/Alias.html#M000080">new (Kwalify::PlainYamlParser::Alias)</a><br />
68
- <a href="classes/Kwalify/PlainYamlParser.html#M000065">new (Kwalify::PlainYamlParser)</a><br />
69
- <a href="classes/Kwalify/Parser.html#M000036">new (Kwalify::Parser)</a><br />
70
- <a href="classes/Kwalify/ValidationError.html#M000064">new (Kwalify::ValidationError)</a><br />
71
- <a href="classes/Kwalify/Rule.html#M000056">new (Kwalify::Rule)</a><br />
72
- <a href="classes/Kwalify/Main.html#M000037">new (Kwalify::Main)</a><br />
73
- <a href="classes/Kwalify/BaseError.html#M000031">new (Kwalify::BaseError)</a><br />
74
- <a href="classes/Kwalify/Validator.html#M000024">new (Kwalify::Validator)</a><br />
75
- <a href="classes/Kwalify/MetaValidator.html#M000059">new (Kwalify::MetaValidator)</a><br />
76
- <a href="classes/Kwalify/YamlSyntaxError.html#M000030">new (Kwalify::YamlSyntaxError)</a><br />
77
- <a href="classes/Kwalify/SchemaError.html#M000029">new (Kwalify::SchemaError)</a><br />
78
- <a href="classes/Kwalify/CommandOptionError.html#M000063">new (Kwalify::CommandOptionError)</a><br />
79
- <a href="classes/Kwalify/YamlParser.html#M000043">parse (Kwalify::YamlParser)</a><br />
80
- <a href="classes/Kwalify/PlainYamlParser.html#M000066">parse (Kwalify::PlainYamlParser)</a><br />
93
+ <a href="classes/Kwalify/Yaml/Parser.html#M000040">new (Kwalify::Yaml::Parser)</a><br />
94
+ <a href="classes/Kwalify/Util/OrderedHash.html#M000030">new (Kwalify::Util::OrderedHash)</a><br />
95
+ <a href="classes/Kwalify/Rule.html#M000117">new (Kwalify::Rule)</a><br />
96
+ <a href="classes/Kwalify/Validator.html#M000074">new (Kwalify::Validator)</a><br />
97
+ <a href="classes/Kwalify/PlainYamlParser.html#M000127">new (Kwalify::PlainYamlParser)</a><br />
98
+ <a href="classes/Kwalify/ValidationError.html#M000126">new (Kwalify::ValidationError)</a><br />
99
+ <a href="classes/Kwalify/CommandOptionError.html#M000125">new (Kwalify::CommandOptionError)</a><br />
100
+ <a href="classes/Kwalify/Main.html#M000086">new (Kwalify::Main)</a><br />
101
+ <a href="classes/Kwalify/Parser.html#M000085">new (Kwalify::Parser)</a><br />
102
+ <a href="classes/Kwalify/SchemaError.html#M000080">new (Kwalify::SchemaError)</a><br />
103
+ <a href="classes/Kwalify/BaseError.html#M000081">new (Kwalify::BaseError)</a><br />
104
+ <a href="classes/Kwalify/AssertionError.html#M000124">new (Kwalify::AssertionError)</a><br />
105
+ <a href="classes/Kwalify/MetaValidator.html#M000122">new (Kwalify::MetaValidator)</a><br />
106
+ <a href="classes/Kwalify/SyntaxError.html#M000101">new (Kwalify::SyntaxError)</a><br />
81
107
  <a href="classes/CommandOptionParser.html#M000004">parse (CommandOptionParser)</a><br />
82
- <a href="classes/Kwalify/PlainYamlParser.html#M000068">parse_all (Kwalify::PlainYamlParser)</a><br />
83
- <a href="classes/Kwalify/BaseError.html#M000032">path (Kwalify::BaseError)</a><br />
84
- <a href="classes/Kwalify/YamlParser.html#M000044">path_linenum (Kwalify::YamlParser)</a><br />
108
+ <a href="classes/Kwalify/YamlParser.html#M000104">parse (Kwalify::YamlParser)</a><br />
109
+ <a href="classes/Kwalify/PlainYamlParser.html#M000128">parse (Kwalify::PlainYamlParser)</a><br />
110
+ <a href="classes/Kwalify/Yaml/Parser.html#M000047">parse (Kwalify::Yaml::Parser)</a><br />
111
+ <a href="classes/Kwalify/Yaml/Parser.html#M000053">parse_alias (Kwalify::Yaml::Parser)</a><br />
112
+ <a href="classes/Kwalify/PlainYamlParser.html#M000130">parse_all (Kwalify::PlainYamlParser)</a><br />
113
+ <a href="classes/Kwalify/Yaml/Parser.html#M000052">parse_anchor (Kwalify::Yaml::Parser)</a><br />
114
+ <a href="classes/Kwalify/Yaml/Parser.html#M000058">parse_block_map (Kwalify::Yaml::Parser)</a><br />
115
+ <a href="classes/Kwalify/Yaml/Parser.html#M000059">parse_block_scalar (Kwalify::Yaml::Parser)</a><br />
116
+ <a href="classes/Kwalify/Yaml/Parser.html#M000056">parse_block_seq (Kwalify::Yaml::Parser)</a><br />
117
+ <a href="classes/Kwalify/Yaml/Parser.html#M000060">parse_block_text (Kwalify::Yaml::Parser)</a><br />
118
+ <a href="classes/Kwalify/Yaml/Parser.html#M000055">parse_block_value (Kwalify::Yaml::Parser)</a><br />
119
+ <a href="classes/Kwalify/Yaml/Parser.html#M000051">parse_documents (Kwalify::Yaml::Parser)</a><br />
120
+ <a href="classes/Kwalify/Yaml/Parser.html#M000048">parse_file (Kwalify::Yaml::Parser)</a><br />
121
+ <a href="classes/Kwalify/Yaml/Parser.html#M000063">parse_flow_map (Kwalify::Yaml::Parser)</a><br />
122
+ <a href="classes/Kwalify/Yaml/Parser.html#M000064">parse_flow_scalar (Kwalify::Yaml::Parser)</a><br />
123
+ <a href="classes/Kwalify/Yaml/Parser.html#M000062">parse_flow_seq (Kwalify::Yaml::Parser)</a><br />
124
+ <a href="classes/Kwalify/Yaml/Parser.html#M000061">parse_flow_value (Kwalify::Yaml::Parser)</a><br />
125
+ <a href="classes/Kwalify/Yaml/Parser.html#M000049">parse_next (Kwalify::Yaml::Parser)</a><br />
126
+ <a href="classes/Kwalify/Yaml/Parser.html#M000050">parse_stream (Kwalify::Yaml::Parser)</a><br />
127
+ <a href="classes/Kwalify/BaseError.html#M000082">path (Kwalify::BaseError)</a><br />
128
+ <a href="classes/Kwalify/YamlParser.html#M000105">path_linenum (Kwalify::YamlParser)</a><br />
129
+ <a href="classes/Kwalify/BaseParser.html#M000097">peep (Kwalify::BaseParser)</a><br />
130
+ <a href="classes/Kwalify/Util/OrderedHash.html#M000031">put (Kwalify::Util::OrderedHash)</a><br />
131
+ <a href="classes/Kwalify/Yaml/Parser.html#M000070">put_to_map (Kwalify::Yaml::Parser)</a><br />
132
+ <a href="classes/Kwalify/BaseParser.html#M000091">reset (Kwalify::BaseParser)</a><br />
133
+ <a href="classes/Kwalify/Yaml/Parser.html#M000041">reset_parser (Kwalify::Yaml::Parser)</a><br />
134
+ <a href="classes/Kwalify/Yaml/Parser.html#M000054">resolve_preceding_aliases (Kwalify::Yaml::Parser)</a><br />
85
135
  <a href="classes/Kwalify/Types.html#M000012">scalar? (Kwalify::Types)</a><br />
86
136
  <a href="classes/Kwalify/Types.html#M000014">scalar_type? (Kwalify::Types)</a><br />
87
- <a href="classes/Kwalify/ErrorHelper.html#M000022">schema_error (Kwalify::ErrorHelper)</a><br />
88
- <a href="classes/Kwalify/PlainYamlParser.html#M000075">set_default (Kwalify::PlainYamlParser)</a><br />
89
- <a href="classes/Kwalify/YamlParser.html#M000053">set_default (Kwalify::YamlParser)</a><br />
90
- <a href="classes/Kwalify/YamlParser.html#M000046">set_error_linenums (Kwalify::YamlParser)</a><br />
91
- <a href="classes/Kwalify/YamlParser.html#M000045">set_errors_linenum (Kwalify::YamlParser)</a><br />
92
- <a href="classes/Kwalify/YamlParser.html#M000052">set_map_with (Kwalify::YamlParser)</a><br />
93
- <a href="classes/Kwalify/PlainYamlParser.html#M000074">set_map_with (Kwalify::PlainYamlParser)</a><br />
94
- <a href="classes/Kwalify/YamlParser.html#M000049">set_seq_at (Kwalify::YamlParser)</a><br />
95
- <a href="classes/Kwalify/PlainYamlParser.html#M000071">set_seq_at (Kwalify::PlainYamlParser)</a><br />
96
- <a href="classes/Kwalify/BaseError.html#M000034">to_s (Kwalify::BaseError)</a><br />
137
+ <a href="classes/Kwalify/BaseParser.html#M000092">scan (Kwalify::BaseParser)</a><br />
138
+ <a href="classes/Kwalify/BaseParser.html#M000099">scan_string (Kwalify::BaseParser)</a><br />
139
+ <a href="classes/Kwalify/ErrorHelper.html#M000017">schema_error (Kwalify::ErrorHelper)</a><br />
140
+ <a href="classes/Kwalify/PlainYamlParser.html#M000137">set_default (Kwalify::PlainYamlParser)</a><br />
141
+ <a href="classes/Kwalify/YamlParser.html#M000114">set_default (Kwalify::YamlParser)</a><br />
142
+ <a href="classes/Kwalify/YamlParser.html#M000107">set_error_linenums (Kwalify::YamlParser)</a><br />
143
+ <a href="classes/Kwalify/YamlParser.html#M000106">set_errors_linenum (Kwalify::YamlParser)</a><br />
144
+ <a href="classes/Kwalify/Yaml/Parser.html#M000073">set_errors_linenum (Kwalify::Yaml::Parser)</a><br />
145
+ <a href="classes/Kwalify/YamlParser.html#M000113">set_map_with (Kwalify::YamlParser)</a><br />
146
+ <a href="classes/Kwalify/PlainYamlParser.html#M000136">set_map_with (Kwalify::PlainYamlParser)</a><br />
147
+ <a href="classes/Kwalify/YamlParser.html#M000110">set_seq_at (Kwalify::YamlParser)</a><br />
148
+ <a href="classes/Kwalify/PlainYamlParser.html#M000133">set_seq_at (Kwalify::PlainYamlParser)</a><br />
149
+ <a href="classes/Kwalify/Yaml/Parser.html#M000043">skip_spaces_and_comments (Kwalify::Yaml::Parser)</a><br />
150
+ <a href="classes/Kwalify/Yaml/Parser.html#M000045">stream_end? (Kwalify::Yaml::Parser)</a><br />
151
+ <a href="classes/Kwalify/BaseError.html#M000083">to_s (Kwalify::BaseError)</a><br />
152
+ <a href="classes/Kwalify/Yaml/Parser.html#M000065">to_scalar (Kwalify::Yaml::Parser)</a><br />
97
153
  <a href="classes/CommandOptionParser.html#M000003">to_value (CommandOptionParser)</a><br />
154
+ <a href="classes/Kwalify/Util.html#M000021">traverse_rule (Kwalify::Util)</a><br />
155
+ <a href="classes/Kwalify/Util.html#M000020">traverse_schema (Kwalify::Util)</a><br />
98
156
  <a href="classes/Kwalify/Types.html#M000009">type_class (Kwalify::Types)</a><br />
99
157
  <a href="classes/Kwalify/Types.html#M000008">type_table (Kwalify::Types)</a><br />
100
- <a href="classes/YamlHelper.html#M000081">untabify (YamlHelper)</a><br />
101
- <a href="classes/Kwalify/Validator.html#M000026">validate (Kwalify::Validator)</a><br />
102
- <a href="classes/Kwalify/ErrorHelper.html#M000021">validate_error (Kwalify::ErrorHelper)</a><br />
103
- <a href="classes/Kwalify/MetaValidator.html#M000060">validate_hook (Kwalify::MetaValidator)</a><br />
104
- <a href="classes/Kwalify/Validator.html#M000027">validate_hook (Kwalify::Validator)</a><br />
158
+ <a href="classes/Kwalify/Util.html#M000019">untabify (Kwalify::Util)</a><br />
159
+ <a href="classes/Kwalify/Validator.html#M000076">validate (Kwalify::Validator)</a><br />
160
+ <a href="classes/Kwalify/ErrorHelper.html#M000016">validate_error (Kwalify::ErrorHelper)</a><br />
161
+ <a href="classes/Kwalify/MetaValidator.html#M000123">validate_hook (Kwalify::MetaValidator)</a><br />
162
+ <a href="classes/Kwalify/Validator.html#M000077">validate_hook (Kwalify::Validator)</a><br />
163
+ <a href="classes/Kwalify/Util/OrderedHash.html#M000035">values (Kwalify::Util::OrderedHash)</a><br />
105
164
  <a href="classes/Kwalify.html#M000006">word (Kwalify)</a><br />
106
165
  </div>
107
166
  </div>
Binary file
@@ -2,7 +2,7 @@
2
2
  <html>
3
3
  <head>
4
4
  <meta http-equiv="Content-Type" content="text/html">
5
- <title>Kwalify Users' Guide (for Ruby and Java)</title>
5
+ <title>Kwalify User's Guide (for Ruby)</title>
6
6
  <meta name="author" content="makoto kuwata &lt;kwa(at)kuwata-lab.com&gt;">
7
7
  <meta name="generator" content="kwaser">
8
8
  <meta http-equiv="Content-Style-Type" content="text/css">
@@ -12,51 +12,29 @@
12
12
 
13
13
  <div class="mainbody">
14
14
 
15
- <div align="left"><h1>Kwalify Users' Guide (for Ruby and Java)</h1></div>
15
+ <div align="left"><h1>Kwalify User's Guide (for Ruby)</h1></div>
16
16
  <div align="left">
17
17
  makoto kuwata &lt;kwa(at)kuwata-lab.com&gt;<br>
18
- last update: $Date: 2006-05-14 13:57:07 +0900 (Sun, 14 May 2006) $<br>
18
+ last update: $Date: 2008-01-27 22:57:22 +0900 (Sun, 27 Jan 2008) $<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 and JSON document.
23
+ <p>Kwalify<sup>(<a href="#fnref:1" name="fnlink:1">*1</a>)</sup> is a parser, schema validator, and data binding tool for YAML and JSON.
24
+ Kwalify enables you to handle YAML and JSON more easily and strictly.
24
25
  </p>
25
- <p>You know "80-20 rule" known as Pareto Law, don't you? This rule suggests that 20% of the population owns 80% of the wealth.
26
- Kwalify is based on a new "50-5 rule" which suggests that 5% of the population owns 50% of the wealth.
27
- This rule is more aggressive and cost-effective than Pareto Law. The rule is named as "Levi's Law".
28
- </p>
29
- <div align="center">
30
- <table class="table1" border="1" cellspacing="0">
31
- <tr class="tr1">
32
- <th class="th1">schema technology</th>
33
- <th class="th1">(A) cover range</th>
34
- <th class="th1">(B) cost to pay</th>
35
- <th class="th1">(A)/(B) effectiveness</th>
36
- </tr>
37
- <tr class="tr1">
38
- <td class="td1">XML Schema</td>
39
- <td class="td1">95%</td>
40
- <td class="td1">100%</td>
41
- <td class="td1">0.95 (= 95/100)</td>
42
- </tr>
43
- <tr class="tr1">
44
- <td class="td1">RelaxNG</td>
45
- <td class="td1">80%</td>
46
- <td class="td1">20%</td>
47
- <td class="td1">4.0 (= 80/20)</td>
48
- </tr>
49
- <tr class="tr1">
50
- <td class="td1">Kwalify</td>
51
- <td class="td1">50%</td>
52
- <td class="td1">5%</td>
53
- <td class="td1">10.0 (= 50/5)</td>
54
- </tr>
55
- </table>
56
- </div>
57
- <p>Kwalify is small and in fact poorer than RelaxNG or XML Schema.
58
- I hope you extend/customize Kwalify for your own way.
26
+ <p>Topics:
59
27
  </p>
28
+ <ul type="disc">
29
+ <li><a href="#schema">Schema validation for YAML</a> and <a href="#tips-json">JSON</a>
30
+ </li>
31
+ <li><a href="#actions">Class definition generation for Ruby, PHP, and Java</a>
32
+ </li>
33
+ <li><a href="#howto-databinding">Data binding</a>
34
+ </li>
35
+ <li><a href="#howto-preceding">Preceding alias</a>
36
+ </li>
37
+ </ul>
60
38
  <div class="footnote">
61
39
  <dl compact>
62
40
  <dt>(<a name="fnref:1" href="#fnlink:1">*1</a>)</dt>
@@ -82,23 +60,17 @@ I hope you extend/customize Kwalify for your own way.
82
60
  </li>
83
61
  <li><a href="#schema-map-of-seq">Mapping of Sequence</a>
84
62
  </li>
85
- <li><a href="#schema-rules">Rule and Entry</a>
63
+ <li><a href="#schema-rules">Rule and Constraint</a>
86
64
  </li>
87
65
  <li><a href="#schema-unique">Unique constraint</a>
88
66
  </li>
89
- <li><a href="#schema-hook">Validator#validator_hook()</a>
90
- </li>
91
- <li><a href="#schema-block">Validator with Block</a>
92
- </li>
93
67
  </ul>
94
68
  </li>
95
69
  <li><a href="#tips">Tips</a>
96
70
  <ul>
97
- <li><a href="#tips-quotes">Enclose Key Names in (Double) Quotes</a>
98
- </li>
99
71
  <li><a href="#tips-json">JSON</a>
100
72
  </li>
101
- <li><a href="#tips-anchor">Anchor</a>
73
+ <li><a href="#tips-anchor">Anchor and Alias</a>
102
74
  </li>
103
75
  <li><a href="#tips-default">Default of Mapping</a>
104
76
  </li>
@@ -106,6 +78,22 @@ I hope you extend/customize Kwalify for your own way.
106
78
  </li>
107
79
  </ul>
108
80
  </li>
81
+ <li><a href="#howto">How to in Ruby</a>
82
+ <ul>
83
+ <li><a href="#howot-validate">Validation</a>
84
+ </li>
85
+ <li><a href="#howto-parse">Parsing with Validation</a>
86
+ </li>
87
+ <li><a href="#howto-meta">Meta Validation</a>
88
+ </li>
89
+ <li><a href="#howto-hook">Validator#validator_hook()</a>
90
+ </li>
91
+ <li><a href="#howto-preceding">Preceding Alias</a>
92
+ </li>
93
+ <li><a href="#howto-databinding">Data Binding</a>
94
+ </li>
95
+ </ul>
96
+ </li>
109
97
  <li><a href="#actions">Actions</a>
110
98
  <ul>
111
99
  <li><a href="#action-genclass">Class Definition Generation</a>
@@ -118,13 +106,9 @@ I hope you extend/customize Kwalify for your own way.
118
106
  </li>
119
107
  </ul>
120
108
  </li>
121
- <li><a href="#usage">Usage of Kwalify</a>
109
+ <li><a href="#ref">References</a>
122
110
  <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>
111
+ <li><a href="#ref-usage">Usage in Command-Line</a>
128
112
  </li>
129
113
  </ul>
130
114
  </li>
@@ -137,6 +121,8 @@ I hope you extend/customize Kwalify for your own way.
137
121
 
138
122
  <a name="schema"></a>
139
123
  <h2 class="section1">Schema Definition</h2>
124
+ <p>This section describes how to define schema definition of YAML.
125
+ </p>
140
126
  <a name="schema-seq"></a>
141
127
  <h3 class="section2">Sequence</h3>
142
128
  <a name="schema01.yaml"></a>
@@ -153,7 +139,7 @@ sequence:
153
139
  - bar
154
140
  - baz
155
141
  </pre>
156
- <a name="valid01.expected"></a>
142
+ <a name="valid01.result"></a>
157
143
  <div class="terminal_caption">
158
144
  validate</div>
159
145
  <pre class="terminal">$ kwalify -lf schema01.yaml document01a.yaml
@@ -166,7 +152,7 @@ document01a.yaml#0: valid.
166
152
  - 123
167
153
  - baz
168
154
  </pre>
169
- <a name="invalid01.expected"></a>
155
+ <a name="invalid01.result"></a>
170
156
  <div class="terminal_caption">
171
157
  validate</div>
172
158
  <pre class="terminal">$ kwalify -lf schema01.yaml document01b.yaml
@@ -185,15 +171,15 @@ document01b.yaml#0: INVALID
185
171
  <code>schema02.yaml</code> : mapping of scalar</div>
186
172
  <pre class="program">type: map
187
173
  mapping:
188
- name:
174
+ "name":
189
175
  type: str
190
176
  required: yes
191
- email:
177
+ "email":
192
178
  type: str
193
179
  pattern: /@/
194
- age:
180
+ "age":
195
181
  type: int
196
- birth:
182
+ "birth":
197
183
  type: date
198
184
  </pre>
199
185
  <a name="document02a.yaml"></a>
@@ -204,7 +190,7 @@ email: foo@mail.com
204
190
  age: 20
205
191
  birth: 1985-01-01
206
192
  </pre>
207
- <a name="valid02.expected"></a>
193
+ <a name="valid02.result"></a>
208
194
  <div class="terminal_caption">
209
195
  validate</div>
210
196
  <pre class="terminal">$ kwalify -lf schema02.yaml document02a.yaml
@@ -218,7 +204,7 @@ email: foo(at)mail.com
218
204
  age: twenty
219
205
  birth: Jun 01, 1985
220
206
  </pre>
221
- <a name="invalid02.expected"></a>
207
+ <a name="invalid02.result"></a>
222
208
  <div class="terminal_caption">
223
209
  validate</div>
224
210
  <pre class="terminal">$ kwalify -lf schema02.yaml document02b.yaml
@@ -239,10 +225,10 @@ document02b.yaml#0: INVALID
239
225
  sequence:
240
226
  - type: map
241
227
  mapping:
242
- name:
228
+ "name":
243
229
  type: str
244
230
  required: true
245
- email:
231
+ "email":
246
232
  type: str
247
233
  </pre>
248
234
  <a name="document03a.yaml"></a>
@@ -255,7 +241,7 @@ sequence:
255
241
  - name: baz
256
242
  email: baz@mail.org
257
243
  </pre>
258
- <a name="valid03.expected"></a>
244
+ <a name="valid03.result"></a>
259
245
  <div class="terminal_caption">
260
246
  validate</div>
261
247
  <pre class="terminal">$ kwalify -lf schema03.yaml document03a.yaml
@@ -271,7 +257,7 @@ document03a.yaml#0: valid.
271
257
  - name: baz
272
258
  mail: baz@mail.org
273
259
  </pre>
274
- <a name="invalid03.expected"></a>
260
+ <a name="invalid03.result"></a>
275
261
  <div class="terminal_caption">
276
262
  validate</div>
277
263
  <pre class="terminal">$ kwalify -lf schema03.yaml document03b.yaml
@@ -290,23 +276,23 @@ document03b.yaml#0: INVALID
290
276
  <code>schema04.yaml</code> : mapping of sequence of mapping</div>
291
277
  <pre class="program">type: map
292
278
  mapping:
293
- company:
279
+ "company":
294
280
  type: str
295
281
  required: yes
296
- email:
282
+ "email":
297
283
  type: str
298
- employees:
284
+ "employees":
299
285
  type: seq
300
286
  sequence:
301
287
  - type: map
302
288
  mapping:
303
- code:
289
+ "code":
304
290
  type: int
305
291
  required: yes
306
- name:
292
+ "name":
307
293
  type: str
308
294
  required: yes
309
- email:
295
+ "email":
310
296
  type: str
311
297
  </pre>
312
298
  <a name="document04a.yaml"></a>
@@ -322,7 +308,7 @@ employees:
322
308
  name: bar
323
309
  email: bar@kuwata-lab.com
324
310
  </pre>
325
- <a name="valid04.expected"></a>
311
+ <a name="valid04.result"></a>
326
312
  <div class="terminal_caption">
327
313
  validate</div>
328
314
  <pre class="terminal">$ kwalify -lf schema04.yaml document04a.yaml
@@ -341,7 +327,7 @@ employees:
341
327
  name: bar
342
328
  mail: bar@kuwata-lab.com
343
329
  </pre>
344
- <a name="invalid04.expected"></a>
330
+ <a name="invalid04.result"></a>
345
331
  <div class="terminal_caption">
346
332
  validate</div>
347
333
  <pre class="terminal">$ kwalify -lf schema04.yaml document04b.yaml
@@ -353,16 +339,28 @@ document04b.yaml#0: INVALID
353
339
 
354
340
 
355
341
  <a name="schema-rules"></a>
356
- <h3 class="section2">Rule and Entry</h3>
357
- <p>Rule is set of entries. Entry usually represents constraint outside of a few exceptions.
342
+ <h3 class="section2">Rule and Constraint</h3>
343
+ <p><code>type:</code>, <code>required:</code>, <code>length</code>, ... are called <strong>constraint</strong> and set of constraints are called <strong>rule</strong>.
358
344
  </p>
359
- <p>The followings are constraint entries.
345
+ <ul type="disc">
346
+ <li>Rule contains 'type:' constraint. If 'type:' is omitted, 'type: str' is used as default.
347
+ </li>
348
+ <li>'sequence:' constraint takes a sequence of rule (the sequence can contain only a rule).
349
+ </li>
350
+ <li>'mapping:' constraint takes a mapping which values are rules.
351
+ </li>
352
+ </ul>
353
+ <div style="align:center;">
354
+ <img src="img/fig01.png" alt="constraints and rules of schema definition." />
355
+ </div>
356
+ <p>The following is a list of constraints.
360
357
  </p>
361
358
  <dl class="dl3">
362
359
  <dt class="dt3"><strong>
363
360
  <code>required:</code> </strong></dt>
364
361
  <dd class="dd3">
365
362
  Value is required when true (default is false).
363
+ This is similar to not-null constraint in RDBMS.
366
364
  </dd>
367
365
  <dt class="dt3"><strong>
368
366
  <code>enum:</code> </strong></dt>
@@ -426,23 +424,23 @@ document04b.yaml#0: INVALID
426
424
  <dt class="dt3"><strong>
427
425
  <code>length:</code> </strong></dt>
428
426
  <dd class="dd3">
429
- 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>.
427
+ Range of length of value between max/max-ex and min/min-ex.
428
+ Only type <code>str</code> and <code>text</code> are available with <code>length:</code>.
430
429
  </dd>
431
430
  <dt class="dt3"><strong>
432
431
  <code>assert:</code> </strong></dt>
433
432
  <dd class="dd3">
434
- String which represents validation expression. String should contain variable name <code>val</code> which repsents value.
435
- (This is an experimental function and supported only Kwartz-ruby).
433
+ String which represents validation expression.
434
+ String should contain variable name <code>val</code> which repsents value.
435
+ (This is an experimental function and not supported in Kwartz-java).
436
436
  </dd>
437
437
  <dt class="dt3"><strong>
438
438
  <code>unique:</code> </strong></dt>
439
439
  <dd class="dd3">
440
- Value is unique for mapping or sequence. See the next subsection for detail.
440
+ Value is unique for mapping or sequence.
441
+ This is similar to unique constraint of RDBMS.
442
+ See the next subsection for detail.
441
443
  </dd>
442
- </dl>
443
- <p>The followings are non-constraint entries.
444
- </p>
445
- <dl class="dl3">
446
444
  <dt class="dt3"><strong>
447
445
  <code>name:</code> </strong></dt>
448
446
  <dd class="dd3">
@@ -454,46 +452,51 @@ document04b.yaml#0: INVALID
454
452
  Description. This is not used for validation.
455
453
  </dd>
456
454
  <dt class="dt3"><strong>
457
- <code>classname:</code> </strong></dt>
455
+ <code>class:</code> </strong></dt>
456
+ <dd class="dd3">
457
+ Class name. This is for data-binding and is available only with type 'map'.
458
+ This is also used in 'genclass' action.
459
+ </dd>
460
+ <dt class="dt3"><strong>
461
+ <code>default:</code> </strong></dt>
458
462
  <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.
463
+ Default value.
464
+ This is only for 'genclass' action, and have no effect to validation and parsing.
465
+ Default value should be scalar and it is not available if <code>type:</code> is <code>map</code> or <code>seq</code>, and also not available when <code>required:</code> is true.
460
466
  </dd>
461
467
  </dl>
462
- <p>Rule contains 'type:' entry. 'sequence:' entry takes a list of rule. 'mapping:' entry takes a hash which values are rules.
463
- </p>
464
468
  <a name="schema05.yaml"></a>
465
469
  <div class="program_caption">
466
470
  <code>schema05.yaml</code> : rule examples</div>
467
- <pre class="program">type: seq # new rule
471
+ <pre class="program">type: seq
468
472
  sequence:
469
473
  -
470
- type: map # new rule
474
+ type: map
471
475
  mapping:
472
- name:
473
- type: str # new rule
476
+ "name":
477
+ type: str
474
478
  required: yes
475
- email:
476
- type: str # new rule
479
+ "email":
480
+ type: str
477
481
  required: yes
478
482
  pattern: /@/
479
- password:
480
- type: text # new rule
483
+ "password":
484
+ type: text
481
485
  length: { max: 16, min: 8 }
482
- age:
483
- type: int # new rule
486
+ "age":
487
+ type: int
484
488
  range: { max: 30, min: 18 }
485
489
  # or assert: 18 &lt;= val &amp;&amp; val &lt;= 30
486
- blood:
487
- type: str # new rule
488
- enum:
489
- - A
490
- - B
491
- - O
492
- - AB
493
- birth:
494
- type: date # new rule
495
- memo:
496
- type: any # new rule
490
+ "blood":
491
+ type: str
492
+ enum: [A, B, O, AB]
493
+ "birth":
494
+ type: date
495
+ "memo":
496
+ type: any
497
+ "deleted":
498
+ type: bool
499
+ default: false
497
500
  </pre>
498
501
  <a name="document05a.yaml"></a>
499
502
  <div class="program_caption">
@@ -510,7 +513,7 @@ sequence:
510
513
  blood: AB
511
514
  birth: 1980-01-01
512
515
  </pre>
513
- <a name="valid05.expected"></a>
516
+ <a name="valid05.result"></a>
514
517
  <div class="terminal_caption">
515
518
  validate</div>
516
519
  <pre class="terminal">$ kwalify -lf schema05.yaml document05a.yaml
@@ -532,7 +535,7 @@ document05a.yaml#0: valid.
532
535
  blood: AB
533
536
  birth: 1980/01/01
534
537
  </pre>
535
- <a name="invalid05.expected"></a>
538
+ <a name="invalid05.result"></a>
536
539
  <div class="terminal_caption">
537
540
  validate</div>
538
541
  <pre class="terminal">$ kwalify -lf schema05.yaml document05b.yaml
@@ -541,8 +544,8 @@ document05b.yaml#0: INVALID
541
544
  - (line 3) [/0/password] 'xxx123': too short (length 6 &lt; min 8).
542
545
  - (line 4) [/0/age] 'twenty': not a integer.
543
546
  - (line 5) [/0/blood] 'a': invalid blood value.
544
- - (line 7) [/1/given-name] key 'given-name:' is undefined.
545
547
  - (line 7) [/1] key 'name:' is required.
548
+ - (line 7) [/1/given-name] key 'given-name:' is undefined.
546
549
  - (line 8) [/1/family-name] key 'family-name:' is undefined.
547
550
  - (line 10) [/1/age] '15': too small (&lt; min 18).
548
551
  - (line 12) [/1/birth] '1980/01/01': not a date.
@@ -552,12 +555,15 @@ document05b.yaml#0: INVALID
552
555
 
553
556
  <a name="schema-unique"></a>
554
557
  <h3 class="section2">Unique constraint</h3>
555
- <p>'<code>unique:</code>' constraint entry is available with elements of sequence or mapping.
556
- This is equivalent to unique key or primary key of RDBMS.
557
- </p>
558
- <p>Type of rule which has '<code>unique:</code>' entry must be scalar (str, int, float, ...).
559
- Type of parent rule must be sequence or mapping.
558
+ <p>'<code>unique:</code>' constraint is available with elements of sequence or mapping.
559
+ This is equivalent to unique constraint of RDBMS.
560
560
  </p>
561
+ <ul type="disc">
562
+ <li>Type of rule which has '<code>unique:</code>' entry must be scalar (str, int, float, ...).
563
+ </li>
564
+ <li>Type of parent rule must be sequence or mapping.
565
+ </li>
566
+ </ul>
561
567
  <a name="schema06.yaml"></a>
562
568
  <div class="program_caption">
563
569
  <code>schema06.yaml</code> : unique constraint entry with mapping and sequence</div>
@@ -566,17 +572,12 @@ sequence:
566
572
  - type: map
567
573
  required: yes
568
574
  mapping:
569
- name:
570
- type: str
571
- required: yes
572
- <strong>unique: yes</strong>
573
- email:
574
- type: str
575
- groups:
575
+ "name": { type: str, required: yes, <strong>unique: yes</strong> }
576
+ "email": { type: str }
577
+ "groups":
576
578
  type: seq
577
579
  sequence:
578
- - type: str
579
- <strong>unique: yes</strong>
580
+ - { type: str, <strong>unique: yes</strong> }
580
581
  </pre>
581
582
  <a name="document06a.yaml"></a>
582
583
  <div class="program_caption">
@@ -597,7 +598,7 @@ sequence:
597
598
  groups:
598
599
  - users
599
600
  </pre>
600
- <a name="valid06.expected"></a>
601
+ <a name="valid06.result"></a>
601
602
  <div class="terminal_caption">
602
603
  validate</div>
603
604
  <pre class="terminal">$ kwalify -lf schema06.yaml document06a.yaml
@@ -623,7 +624,7 @@ document06a.yaml#0: valid.
623
624
  groups:
624
625
  - users
625
626
  </pre>
626
- <a name="invalid06.expected"></a>
627
+ <a name="invalid06.result"></a>
627
628
  <div class="terminal_caption">
628
629
  validate</div>
629
630
  <pre class="terminal">$ kwalify -lf schema06.yaml document06b.yaml
@@ -634,364 +635,19 @@ document06b.yaml#0: INVALID
634
635
  <br>
635
636
 
636
637
 
637
- <a name="schema-hook"></a>
638
- <h3 class="section2">Validator#validator_hook()</h3>
639
- <p>You can extend Kwalify::Validator class (Ruby) or kwalify.Validator class (Java), and override Kwalify::Validator#validator_hook() method (Ruby) or kwalify.Validator#validateHook() method (Java).
640
- This method is called by Kwalify::Validator#validate() (Ruby) or kwalify.Validator#validate() (Java).
641
- </p>
642
- <a name="answers-schema.yaml"></a>
643
- <div class="program_caption">
644
- answers-schema.yaml : 'name:' is important.</div>
645
- <pre class="program">type: map
646
- mapping:
647
- answers:
648
- type: seq
649
- sequence:
650
- - type: map
651
- <strong>name: Answer</strong>
652
- mapping:
653
- name:
654
- type: str
655
- required: yes
656
- answer:
657
- type: str
658
- required: yes
659
- enum:
660
- - good
661
- - not bad
662
- - bad
663
- reason:
664
- type: str
665
- </pre>
666
- <a name="answers-validator.rb"></a>
667
- <div class="program_caption">
668
- answers-validator.rb : validate script for Ruby</div>
669
- <pre class="program">#!/usr/bin/env ruby
670
-
671
- require 'kwalify'
672
- require 'yaml'
673
-
674
- ## validator class for answers
675
- class AnswersValidator &lt; Kwalify::Validator
676
-
677
- ## load schema definition
678
- @@schema = YAML.load_file('answers-schema.yaml')
679
-
680
- def initialize()
681
- super(@@schema)
682
- end
683
-
684
- ## hook method called by Validator#validate()
685
- <strong>def validate_hook(value, rule, path, errors)</strong>
686
- <strong>case rule.name</strong>
687
- <strong>when 'Answer'</strong>
688
- if value['answer'] == 'bad'
689
- reason = value['reason']
690
- if !reason || reason.empty?
691
- msg = "reason is required when answer is 'bad'."
692
- errors &lt;&lt; Kwalify::ValidationError.new(msg, path)
693
- end
694
- end
695
- end
696
- end
697
-
698
- end
699
-
700
- ## create validator
701
- validator = AnswersValidator.new
702
-
703
- ## load YAML document
704
- input = ARGF.read()
705
- document = YAML.load(input)
706
-
707
- ## validate
708
- errors = validator.validate(document)
709
- if errors.empty?
710
- puts "Valid."
711
- else
712
- puts "*** INVALID!"
713
- errors.each do |error|
714
- # error.class == Kwalify::ValidationError
715
- puts " - [#{error.path}] : #{error.message}"
716
- end
717
- end
718
- </pre>
719
- <a name="document07a.yaml"></a>
720
- <div class="program_caption">
721
- <code>document07a.yaml</code> : valid document example</div>
722
- <pre class="program">answers:
723
- - name: Foo
724
- answer: good
725
- reason: I like this style.
726
- - name: Bar
727
- answer: not bad
728
- - name: Baz
729
- answer: bad
730
- reason: I don't like this style.
731
- </pre>
732
- <a name="valid07.expected"></a>
733
- <div class="terminal_caption">
734
- validate</div>
735
- <pre class="terminal">$ ruby answers-validator.rb document07a.yaml
736
- Valid.
737
- </pre>
738
- <a name="document07b.yaml"></a>
739
- <div class="program_caption">
740
- <code>document07b.yaml</code> : invalid document example</div>
741
- <pre class="program">answers:
742
- - name: Foo
743
- answer: good
744
- - name: Bar
745
- answer: bad
746
- - name: Baz
747
- answer: not bad
748
- </pre>
749
- <a name="invalid07.expected"></a>
750
- <div class="terminal_caption">
751
- validate</div>
752
- <pre class="terminal">$ ruby answers-validator.rb document07b.yaml
753
- *** INVALID!
754
- - [/answers/1] : reason is required when answer is 'bad'.
755
- </pre>
756
- <p>You can validate some document by a Validator instance because Validator class and Validator#validate() method are stateless. If you use instance variables in custom validator_hook() method, it becomes to be stateful.
757
- </p>
758
- <p>Here is a Java program equivarent to 'answers-validator.rb'.
759
- </p>
760
- <a name="AnswersValidator.java"></a>
761
- <div class="program_caption">
762
- AnswersValidator.java : validate program for Java</div>
763
- <pre class="program">import kwalify.Validator;
764
- import kwalify.Rule;
765
- import kwalify.Util;
766
- import kwalify.YamlUtil;
767
- import kwalify.YamlParser;
768
- import kwalify.SyntaxException;
769
- import kwalify.ValidationException;
770
-
771
- import java.util.*;
772
- import java.io.IOException;
773
-
774
-
775
- /**
776
- * validator class for answers
777
- */
778
- public class AnswersValidator extends Validator {
779
-
780
- /** schema string */
781
- private static final String SCHEMA = ""
782
- + "type: map\n"
783
- + "mapping:\n"
784
- + " answers:\n"
785
- + " type: seq\n"
786
- + " sequence:\n"
787
- + " - type: map\n"
788
- + " name: Answer\n"
789
- + " mapping:\n"
790
- + " name:\n"
791
- + " type: str\n"
792
- + " required: yes\n"
793
- + " answer:\n"
794
- + " type: str\n"
795
- + " required: yes\n"
796
- + " enum:\n"
797
- + " - good\n"
798
- + " - not bad\n"
799
- + " - bad\n"
800
- + " reason:\n"
801
- + " type: str\n"
802
- ;
803
-
804
- /** schema object */
805
- private static Map schema = null;
806
- static {
807
- try {
808
- schema = (Map)YamlUtil.load(SCHEMA);
809
- } catch (SyntaxException ex) {
810
- assert false;
811
- }
812
- }
813
-
814
- /** construnctor */
815
- public AnswersValidator() {
816
- super(schema);
817
- }
818
-
819
- /** hook method called by Validator#validate() */
820
- protected void validateHook(Object value, Rule rule, String path, List errors) {
821
- String rule_name = rule.getName();
822
- if (rule_name != null &amp;&amp; rule_name.equals("Answer")) {
823
- assert value instanceof Map;
824
- Map val = (Map)value;
825
- assert val.get("answer") != null;
826
- if (val.get("answer").equals("bad")) {
827
- String reason = (String)val.get("reason");
828
- if (reason == null || reason.length() == 0) {
829
- String msg = "reason is required when answer is 'bad'.";
830
- errors.add(new ValidationException(msg, path));
831
- }
832
- }
833
- }
834
- }
835
-
836
- /** main program */
837
- public static void main(String[] args) throws IOException, SyntaxException {
838
- // create validator
839
- Validator validator = new AnswersValidator();
840
-
841
- // load YAML document
842
- String input;
843
- if (args.length &gt; 0) {
844
- input = Util.readFile(args[0]);
845
- } else {
846
- input = Util.readInputStream(System.in);
847
- }
848
- YamlParser parser = new YamlParser(input);
849
- Object document = parser.parse();
850
-
851
- // validate and show errors
852
- List errors = validator.validate(document);
853
- if (errors == null || errors.size() == 0) {
854
- System.out.println("Valid.");
855
- } else {
856
- System.out.println("*** INVALID!");
857
- parser.setErrorsLineNumber(errors);
858
- Collections.sort(errors);
859
- for (Iterator it = errors.iterator(); it.hasNext(); ) {
860
- ValidationException error = (ValidationException)it.next();
861
- int linenum = error.getLineNumber();
862
- String path = error.getPath();
863
- String mesg = error.getMessage();
864
- String s = "- line " + linenum + ": [" + path + "] " + mesg;
865
- System.out.println(s);
866
- }
867
- }
868
- }
869
- }
870
- </pre>
871
- <a name="AnswersValidator.expected"></a>
872
- <div class="terminal_caption">
873
- validate</div>
874
- <pre class="terminal">$ java -classpath kwalify.jar AnswersValidator document07a.yaml
875
- Valid.
876
- $ java -classpath kwalify.jar AnswersValidator document07b.yaml
877
- *** INVALID!
878
- - line 4: [/answers/1] reason is required when answer is 'bad'.
879
- </pre>
880
- <br>
881
-
882
-
883
- <a name="schema-block"></a>
884
- <h3 class="section2">Validator with Block</h3>
885
- <p><strong>Notice: This feature has been obsolete. Use Kwalify::Validator#validate_hook() method instead.</strong>
886
- </p>
887
- <p><code>Kwalify::Validator.new()</code> method can take a block which is invoked when validation.
888
- </p>
889
- <a name="validate08.rb"></a>
890
- <div class="program_caption">
891
- <code>validate08.rb</code> : validate script</div>
892
- <pre class="program">#!/usr/bin/env ruby
893
-
894
- require 'kwalify'
895
- require 'yaml'
896
-
897
- ## load schema definition
898
- schema = YAML.load_file('answers-schema.yaml')
899
-
900
- ## create validator for answers
901
- validator = Kwalify::Validator.new(schema) <strong>{ |value, rule, path, errors|</strong>
902
- <strong>case rule.name</strong>
903
- <strong>when 'Answer'</strong>
904
- if value['answer'] == 'bad'
905
- reason = value['reason']
906
- if !reason || reason.empty?
907
- msg = "reason is required when answer is 'bad'."
908
- errors &lt;&lt; Kwalify::ValidationError.new(msg, path)
909
- end
910
- end
911
- end
912
- <strong>}</strong>
913
-
914
- ## load YAML document
915
- input = ARGF.read()
916
- document = YAML.load(input)
917
-
918
- ## validate
919
- errors = validator.validate(document)
920
- if errors.empty?
921
- puts "Valid."
922
- else
923
- puts "*** INVALID!"
924
- errors.each do |error|
925
- # error.class == Kwalify::ValidationError
926
- puts " - [#{error.path}] : #{error.message}"
927
- end
928
- end
929
- </pre>
930
- <a name="valid08.expected"></a>
931
- <div class="terminal_caption">
932
- validate</div>
933
- <pre class="terminal">$ ruby validate08.rb document07a.yaml
934
- Valid.
935
- </pre>
936
- <a name="valid08.expected"></a>
937
- <div class="terminal_caption">
938
- validate</div>
939
- <pre class="terminal">$ ruby validate08.rb document07b.yaml
940
- *** INVALID!
941
- - [/answers/1] : reason is required when answer is 'bad'.
942
- </pre>
943
- <br>
944
-
945
-
946
638
  <br>
947
639
 
948
640
 
949
641
  <a name="tips"></a>
950
642
  <h2 class="section1">Tips</h2>
951
- <a name="tips-quotes"></a>
952
- <h3 class="section2">Enclose Key Names in (Double) Quotes</h3>
953
- <p>It is allowed to enclose key name in quotes (') or double-quotes (") in YAML.
954
- This tip highlights user-defined key names.
955
- </p>
956
- <div class="program_caption">
957
- <code>schema11a.yaml</code> : enclosing in double-quotes</div>
958
- <pre class="program">type: map
959
- mapping:
960
- "name":
961
- required: yes
962
- "email":
963
- pattern: /@/
964
- "age":
965
- type: int
966
- "birth":
967
- type: date
968
- </pre>
969
- <p>You may prefer to indent with 1 space and 3 spaces.
970
- </p>
971
- <div class="program_caption">
972
- <code>schema11b.yaml</code> : indent with 1 space and 3 spaces</div>
973
- <pre class="program">type: map
974
- mapping:
975
- "name":
976
- required: yes
977
- "email":
978
- pattern: /@/
979
- "age":
980
- type: int
981
- "birth":
982
- type: date
983
- </pre>
984
- <br>
985
-
986
-
987
643
  <a name="tips-json"></a>
988
644
  <h3 class="section2">JSON</h3>
989
645
  <p><a href="http://www.json.org">JSON</a> is a lightweight data-interchange format, especially useful for JavaScript.
990
646
  JSON can be considered as a subset of YAML. It means that YAML parser can parse JSON and Kwalify can validate JSON document.
991
647
  </p>
992
- <a name="schema12.yaml"></a>
648
+ <a name="schema12.json"></a>
993
649
  <div class="program_caption">
994
- <code>schema12.yaml</code> : an example schema written in JSON format</div>
650
+ <code>schema12.json</code> : an example schema definition written in JSON format</div>
995
651
  <pre class="program">{ "type": "map",
996
652
  "required": true,
997
653
  "mapping": {
@@ -1000,16 +656,14 @@ JSON can be considered as a subset of YAML. It means that YAML parser can parse
1000
656
  "age": { "type": "int" },
1001
657
  "gender": { "type": "str", "enum": ["M", "F"] },
1002
658
  "favorite": { "type": "seq",
1003
- "sequence": [
1004
- { "type": "str" }
1005
- ]
1006
- }
659
+ "sequence": [ { "type": "str" } ]
660
+ }
1007
661
  }
1008
662
  }
1009
663
  </pre>
1010
- <a name="document12a.yaml"></a>
664
+ <a name="document12a.json"></a>
1011
665
  <div class="program_caption">
1012
- <code>document12a.yaml</code> : valid JSON document example</div>
666
+ <code>document12a.json</code> : valid JSON document example</div>
1013
667
  <pre class="program">{ "name": "Foo",
1014
668
  "email": "foo@mail.com",
1015
669
  "age": 20,
@@ -1021,15 +675,15 @@ JSON can be considered as a subset of YAML. It means that YAML parser can parse
1021
675
  ]
1022
676
  }
1023
677
  </pre>
1024
- <a name="valid12.expected"></a>
678
+ <a name="valid12.result"></a>
1025
679
  <div class="terminal_caption">
1026
680
  validate</div>
1027
- <pre class="terminal">$ kwalify -lf schema12.yaml document12a.yaml
1028
- document12a.yaml#0: valid.
681
+ <pre class="terminal">$ kwalify -lf schema12.json document12a.json
682
+ document12a.json#0: valid.
1029
683
  </pre>
1030
- <a name="document12b.yaml"></a>
684
+ <a name="document12b.json"></a>
1031
685
  <div class="program_caption">
1032
- <code>document12b.yaml</code> : invalid JSON document example</div>
686
+ <code>document12b.json</code> : invalid JSON document example</div>
1033
687
  <pre class="program">{
1034
688
  "mail": "foo@mail.com",
1035
689
  "age": twenty,
@@ -1037,11 +691,11 @@ document12a.yaml#0: valid.
1037
691
  "favorite": [ 123, 456 ]
1038
692
  }
1039
693
  </pre>
1040
- <a name="invalid12.yaml"></a>
694
+ <a name="invalid12.json"></a>
1041
695
  <div class="terminal_caption">
1042
696
  validate</div>
1043
- <pre class="terminal">$ kwalify -lf schema12.yaml document12b.yaml
1044
- document12b.yaml#0: INVALID
697
+ <pre class="terminal">$ kwalify -lf schema12.json document12b.json
698
+ document12b.json#0: INVALID
1045
699
  - (line 1) [/] key 'name:' is required.
1046
700
  - (line 2) [/mail] key 'mail:' is undefined.
1047
701
  - (line 3) [/age] 'twenty': not a integer.
@@ -1053,8 +707,8 @@ document12b.yaml#0: INVALID
1053
707
 
1054
708
 
1055
709
  <a name="tips-anchor"></a>
1056
- <h3 class="section2">Anchor</h3>
1057
- <p>You can share schemas with YAML anchor.
710
+ <h3 class="section2">Anchor and Alias</h3>
711
+ <p>You can share rules by YAML anchor and alias.
1058
712
  </p>
1059
713
  <a name="schema13.yaml"></a>
1060
714
  <div class="program_caption">
@@ -1069,13 +723,11 @@ sequence:
1069
723
  required: yes
1070
724
  "family-name": <strong>*name</strong>
1071
725
  "post":
1072
- enum:
1073
- - exective
1074
- - manager
1075
- - clerk
726
+ type: str
727
+ enum: [exective, manager, clerk]
1076
728
  "supervisor": <strong>*employee</strong>
1077
729
  </pre>
1078
- <p>Anchor is also available in YAML document.
730
+ <p>Anchor and alias is also available in YAML document.
1079
731
  </p>
1080
732
  <a name="document13a.yaml"></a>
1081
733
  <div class="program_caption">
@@ -1098,7 +750,7 @@ sequence:
1098
750
  post: clerk
1099
751
  supervisor: <strong>*bar</strong>
1100
752
  </pre>
1101
- <a name="valid13.expected"></a>
753
+ <a name="valid13.result"></a>
1102
754
  <div class="terminal_caption">
1103
755
  validate</div>
1104
756
  <pre class="terminal">$ kwalify -lf schema13.yaml document13a.yaml
@@ -1142,7 +794,7 @@ mapping:
1142
794
  value2: 0.5
1143
795
  value3: -0.9
1144
796
  </pre>
1145
- <a name="valid14.expected"></a>
797
+ <a name="valid14.result"></a>
1146
798
  <div class="terminal_caption">
1147
799
  validate</div>
1148
800
  <pre class="terminal">$ kwalify -lf schema14.yaml document14a.yaml
@@ -1155,7 +807,7 @@ document14a.yaml#0: valid.
1155
807
  value2: 1.1
1156
808
  value3: -2.0
1157
809
  </pre>
1158
- <a name="invalid14.expected"></a>
810
+ <a name="invalid14.result"></a>
1159
811
  <div class="terminal_caption">
1160
812
  validate</div>
1161
813
  <pre class="terminal">$ kwalify -lf schema14.yaml document14b.yaml
@@ -1207,10 +859,10 @@ mapping:
1207
859
  mapping:
1208
860
  "name":
1209
861
  <strong>&lt;&lt;: *name</strong> # merge
1210
- <strong>length: { max: 16 }</strong> # override
862
+ <strong>length: { max: 16 }</strong> # add
1211
863
  "email":
1212
864
  <strong>&lt;&lt;: *email</strong> # merge
1213
- <strong>required: yes</strong> # add
865
+ <strong>required: yes</strong> # override
1214
866
  </pre>
1215
867
  <a name="document15a.yaml"></a>
1216
868
  <div class="program_caption">
@@ -1222,7 +874,7 @@ user:
1222
874
  name: bar
1223
875
  email: bar@mail.com
1224
876
  </pre>
1225
- <a name="valid15.expected"></a>
877
+ <a name="valid15.result"></a>
1226
878
  <div class="terminal_caption">
1227
879
  validate</div>
1228
880
  <pre class="terminal">$ kwalify -lf schema15.yaml document15a.yaml
@@ -1237,12 +889,12 @@ document15a.yaml#0: valid.
1237
889
  user:
1238
890
  name: toooooo-looooong-name
1239
891
  </pre>
1240
- <a name="invalid15.expected"></a>
892
+ <a name="invalid15.result"></a>
1241
893
  <div class="terminal_caption">
1242
894
  validate</div>
1243
895
  <pre class="terminal">$ kwalify -lf schema15.yaml document15b.yaml
1244
896
  document15b.yaml#0: INVALID
1245
- - (line 4) [/user] key 'email:' is required.
897
+ - (line 5) [/user] key 'email:' is required.
1246
898
  - (line 5) [/user/name] 'toooooo-looooong-name': too long (length 21 &gt; max 16).
1247
899
  </pre>
1248
900
  <br>
@@ -1251,21 +903,602 @@ document15b.yaml#0: INVALID
1251
903
  <br>
1252
904
 
1253
905
 
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.
906
+ <a name="howto"></a>
907
+ <h2 class="section1">How to in Ruby</h2>
908
+ <p>This section describes how to use Kwalify in Ruby.
909
+ </p>
910
+ <a name="howot-validate"></a>
911
+ <h3 class="section2">Validation</h3>
912
+ <a name="howto-validation.rb"></a>
913
+ <pre class="program">require 'kwalify'
914
+ #require 'yaml'
915
+
916
+ ## load schema data
917
+ schema = Kwalify::Yaml.load_file('schema.yaml')
918
+ ## or
919
+ #schema = YAML.load_file('schema.yaml')
920
+
921
+ ## create validator
922
+ validator = Kwalify::Validator.new(schema)
923
+
924
+ ## load document
925
+ document = Kwalify::Yaml.load_file('document.yaml')
926
+ ## or
927
+ #document = YAML.load_file('document.yaml')
928
+
929
+ ## validate
930
+ errors = validator.validate(document)
931
+
932
+ ## show errors
933
+ if errors &amp;&amp; !errors.empty?
934
+ for err in errors
935
+ puts "[#{err.path}] #{err.message}"
936
+ end
937
+ end
938
+ </pre>
939
+ <br>
940
+
941
+
942
+ <a name="howto-parse"></a>
943
+ <h3 class="section2">Parsing with Validation</h3>
944
+ <p>From version 0.7, Kwalify supports parsing with validation.
945
+ </p>
946
+ <a name="howto-validation-with-parsing.rb"></a>
947
+ <pre class="program">require 'kwalify'
948
+ #require 'yaml'
949
+
950
+ ## load schema data
951
+ schema = Kwalify::Yaml.load_file('schema.yaml')
952
+ ## or
953
+ #schema = YAML.load_file('schema.yaml')
954
+
955
+ ## create validator
956
+ validator = Kwalify::Validator.new(schema)
957
+
958
+ ## create parser with validator
959
+ ## (if validator is ommitted, no validation executed.)
960
+ parser = Kwalify:::Yaml::Parser.new(validator)
961
+
962
+ ## parse document with validation
963
+ filename = 'document.yaml'
964
+ document = parser.parse_file(filename)
965
+ ## or
966
+ #document = parser.parse(File.read(filename), filename)
967
+
968
+ ## show errors if exist
969
+ errors = parser.errors()
970
+ if errors &amp;&amp; !errors.empty?
971
+ for e in errors
972
+ puts "#{e.linenum}:#{e.column} [#{e.path}] #{e.message}"
973
+ end
974
+ end
975
+ </pre>
976
+ <br>
977
+
978
+
979
+ <a name="howto-meta"></a>
980
+ <h3 class="section2">Meta Validation</h3>
981
+ <p>Meta validator is a validator which validates schema definition.
982
+ The schema definition is placed at 'kwalify/kwalify.schema.yaml'.
983
+ </p>
984
+ <p>Kwalify also provides Kwalify::MetaValidator class which validates
985
+ schema defition.
986
+ </p>
987
+ <pre class="program">require 'kwalify'
988
+
989
+ ## meta validator
990
+ metavalidator = Kwalify::MetaValidator.instance
991
+
992
+ ## validate schema definition
993
+ parser = Kwalify::Yaml::Parser.new(metavalidator)
994
+ errors = parser.parse_file('schema.yaml')
995
+ for e in errors
996
+ puts "#{e.linenum}:#{e.column} [#{e.path}] #{e.message}"
997
+ end if errors &amp;&amp; !errors.empty?
998
+ </pre>
999
+ <p>Meta validation is also available with command-line option '-m'.
1000
+ </p>
1001
+ <pre class="terminal">$ kwalify -m schema1.yaml schema2.yaml ...
1002
+ </pre>
1003
+ <br>
1004
+
1005
+
1006
+ <a name="howto-hook"></a>
1007
+ <h3 class="section2">Validator#validator_hook()</h3>
1008
+ <p>You can extend Kwalify::Validator and override Kwalify::Validator#validator_hook() method.
1009
+ This method is called by Kwalify::Validator#validate().
1010
+ </p>
1011
+ <a name="answers-schema.yaml"></a>
1012
+ <div class="program_caption">
1013
+ answers-schema.yaml : 'name:' is important.</div>
1014
+ <pre class="program">type: map
1015
+ mapping:
1016
+ "answers":
1017
+ type: seq
1018
+ sequence:
1019
+ - type: map
1020
+ <strong>name: Answer</strong>
1021
+ mapping:
1022
+ "name": { type: str, required: yes }
1023
+ "answer": { type: str, required: yes,
1024
+ enum: [good, not bad, bad] }
1025
+ "reason": { type: str }
1026
+ </pre>
1027
+ <a name="answers-validator.rb"></a>
1028
+ <div class="program_caption">
1029
+ answers-validator.rb : validate script for Ruby</div>
1030
+ <pre class="program">#!/usr/bin/env ruby
1031
+
1032
+ require 'kwalify'
1033
+
1034
+ ## validator class for answers
1035
+ class AnswersValidator &lt; Kwalify::Validator
1036
+
1037
+ ## load schema definition
1038
+ @@schema = Kwalify::Yaml.load_file('answers-schema.yaml')
1039
+ ## or
1040
+ ## require 'yaml'
1041
+ ## @@schema = YAML.load_file('answers-schema.yaml')
1042
+
1043
+ def initialize()
1044
+ super(@@schema)
1045
+ end
1046
+
1047
+ ## hook method called by Validator#validate()
1048
+ <strong>def validate_hook(value, rule, path, errors)</strong>
1049
+ <strong>case rule.name</strong>
1050
+ <strong>when 'Answer'</strong>
1051
+ if value['answer'] == 'bad'
1052
+ reason = value['reason']
1053
+ if !reason || reason.empty?
1054
+ msg = "reason is required when answer is 'bad'."
1055
+ errors &lt;&lt; Kwalify::ValidationError.new(msg, path)
1056
+ end
1057
+ end
1058
+ end
1059
+ end
1060
+
1061
+ end
1062
+
1063
+ ## create validator
1064
+ validator = AnswersValidator.new
1065
+
1066
+ ## load YAML document
1067
+ input = ARGF.read()
1068
+ document = Kwalify::Yaml.load(input)
1069
+ ## or document = YAML.load(input)
1070
+
1071
+ ## validate
1072
+ errors = validator.validate(document)
1073
+ if errors.empty?
1074
+ puts "Valid."
1075
+ else
1076
+ puts "*** INVALID!"
1077
+ errors.each do |error|
1078
+ # error.class == Kwalify::ValidationError
1079
+ puts " - [#{error.path}] : #{error.message}"
1080
+ end
1081
+ end
1082
+ </pre>
1083
+ <a name="document07a.yaml"></a>
1084
+ <div class="program_caption">
1085
+ <code>document07a.yaml</code> : valid document example</div>
1086
+ <pre class="program">answers:
1087
+ - name: Foo
1088
+ answer: good
1089
+ reason: I like this style.
1090
+ - name: Bar
1091
+ answer: not bad
1092
+ - name: Baz
1093
+ answer: bad
1094
+ reason: I don't like this style.
1095
+ </pre>
1096
+ <a name="valid07.result"></a>
1097
+ <div class="terminal_caption">
1098
+ validate</div>
1099
+ <pre class="terminal">$ ruby answers-validator.rb document07a.yaml
1100
+ Valid.
1101
+ </pre>
1102
+ <a name="document07b.yaml"></a>
1103
+ <div class="program_caption">
1104
+ <code>document07b.yaml</code> : invalid document example</div>
1105
+ <pre class="program">answers:
1106
+ - name: Foo
1107
+ answer: good
1108
+ - name: Bar
1109
+ answer: bad
1110
+ - name: Baz
1111
+ answer: not bad
1112
+ </pre>
1113
+ <a name="invalid07.result"></a>
1114
+ <div class="terminal_caption">
1115
+ validate</div>
1116
+ <pre class="terminal">$ ruby answers-validator.rb document07b.yaml
1117
+ *** INVALID!
1118
+ - [/answers/1] : reason is required when answer is 'bad'.
1119
+ </pre>
1120
+ <p>You can validate some document by a Validator instance because Validator class and Validator#validate() method are stateless. If you use instance variables in custom validator_hook() method, it becomes to be stateful.
1121
+ </p>
1122
+ <br>
1123
+
1124
+
1125
+ <a name="howto-preceding"></a>
1126
+ <h3 class="section2">Preceding Alias</h3>
1127
+ <p>From version 0.7, Kwalify allows aliases to appear before corresponding anchors are now appeared.
1128
+ These aliases are called as 'preceding alias'.
1129
+ </p>
1130
+ <a name="howto3.yaml"></a>
1131
+ <div class="program_caption">
1132
+ howto3.yaml</div>
1133
+ <pre class="program">- name: Foo
1134
+ parent: *bar # preceding alias
1135
+ - &amp;bar
1136
+ name: Bar
1137
+ parent: *baz # preceding alias
1138
+ - &amp;baz
1139
+ name: Baz
1140
+ parent: null
1141
+ </pre>
1142
+ <p>To enable preceding alias, set Kwalify::Yaml::Parser#preceding_alias to true.
1143
+ </p>
1144
+ <a name="howto3.rb"></a>
1145
+ <div class="program_caption">
1146
+ howto3.rb</div>
1147
+ <pre class="program">require 'kwalify'
1148
+ parser = Kwalify::Yaml::Parser.new
1149
+ <strong>parser.preceding_alias = true</strong> # enable preceding alias
1150
+ ydoc = parser.parse_file('howto3.yaml')
1151
+ require 'pp'
1152
+ pp ydoc
1153
+ </pre>
1154
+ <a name="howto3.result"></a>
1155
+ <div class="terminal_caption">
1156
+ result</div>
1157
+ <pre class="terminal">$ ruby howto3.rb
1158
+ [{"name"=&gt;"Foo",
1159
+ "parent"=&gt;{"name"=&gt;"Bar", "parent"=&gt;{"name"=&gt;"Baz", "parent"=&gt;nil}}},
1160
+ {"name"=&gt;"Bar", "parent"=&gt;{"name"=&gt;"Baz", "parent"=&gt;nil}},
1161
+ {"name"=&gt;"Baz", "parent"=&gt;nil}]
1162
+ </pre>
1163
+ <p>Command-line option '-P' also enables preceding alias.
1164
+ </p>
1165
+ <p>Preceding alias is very useful when document is complex.
1166
+ </p>
1167
+ <br>
1168
+
1169
+
1170
+ <a name="howto-databinding"></a>
1171
+ <h3 class="section2">Data Binding</h3>
1172
+ <p>From version 0.7, Kwalify supports data binding.
1173
+ * To enable data binding, set Kwlaify::Yaml::Parser#data_binding to true.
1174
+ * It is required to specify class name in schema definition.
1175
+ (Notice that 'class:' constraint is avaialbe only with rule which type is 'map'.)
1176
+ * Also instance methods '[]', '[]=', and 'keys?' must be defined in the classes.
1177
+ (Including Kwalify::Util::HashLike modules is easy way to define them.)
1178
+ </p>
1179
+ <a name="config.schema.yaml"></a>
1180
+ <div class="program_caption">
1181
+ config.schema.yaml: schema definition file</div>
1182
+ <pre class="program">type: map
1183
+ <strong>class: Config</strong>
1184
+ mapping:
1185
+ "host": { type: str, required: true }
1186
+ "port": { type: int }
1187
+ "user": { type: str, required: true }
1188
+ "pass": { type: str, required: true }
1189
+ </pre>
1190
+ <a name="config.yaml"></a>
1191
+ <div class="program_caption">
1192
+ config.yaml: data file</div>
1193
+ <pre class="program">host: localhost
1194
+ port: 8080
1195
+ user: user1
1196
+ pass: password1
1197
+ </pre>
1198
+ <a name="loadconfig.rb"></a>
1199
+ <div class="program_caption">
1200
+ loadconfig.rb: ruby program</div>
1201
+ <pre class="program">## class definition
1202
+ require 'kwalify/util/hashlike'
1203
+ <strong>class Config</strong>
1204
+ <strong>include Kwalify::Util::HashLike</strong> # defines [], []=, and keys?
1205
+ attr_accessor :host, :posrt, :user, :pass
1206
+ <strong>end</strong>
1207
+ ## create validator object
1208
+ require 'kwalify'
1209
+ schema = Kwalify::Yaml.load_file('config.schema.yaml')
1210
+ validator = Kwalify::Validator.new(schema)
1211
+ ## parse configuration file with data binding
1212
+ parser = Kwalify::Yaml::Parser.new(validator)
1213
+ <strong>parser.data_binding = true</strong> # enable data binding
1214
+ config = parser.parse_file('config.yaml')
1215
+ p config
1216
+ </pre>
1217
+ <a name="loadconfig.result"></a>
1218
+ <div class="terminal_caption">
1219
+ result</div>
1220
+ <pre class="terminal">$ ruby loadconfig.rb
1221
+ #&lt;Config:0x542590 @host="localhost", @pass="password1", @port=8080, @user="user1"&gt;
1222
+ </pre>
1223
+ <p>Data binding is available even when data is more complex.
1224
+ Preceding alias is also available.
1225
+ </p>
1226
+ <p>For example, the following data is complex because it uses anchor and alias (including preceding alias).
1227
+ </p>
1228
+ <a name="BABEL.data.yaml"></a>
1229
+ <div class="program_caption">
1230
+ BABEL.data.yaml</div>
1231
+ <pre class="program">teams:
1232
+ - &amp;thechildren
1233
+ name: The Children
1234
+ desc: Level 7 ESPers
1235
+ chief: *minamoto # preceding alias
1236
+ members: [*kaoru, *aoi, *shiho] # preceding aliases
1237
+
1238
+ members:
1239
+ - &amp;minamoto
1240
+ name: Kohichi Minamoto
1241
+ desc: Scientist
1242
+ team: *thechildren
1243
+ - &amp;kaoru
1244
+ name: Kaoru Akashi
1245
+ desc: Psychokino
1246
+ team: *thechildren
1247
+ - &amp;aoi
1248
+ name: Aoi Nogami
1249
+ desc: Teleporter
1250
+ team: *thechildren
1251
+ - &amp;shiho
1252
+ name: Shiho Sannomiya
1253
+ desc: Psycometrer
1254
+ team: *thechildren
1255
+ </pre>
1256
+ <p>Here is the schema definition.
1257
+ (Notice that 'class:' constraint is avaialbe only with rule which type is 'map'.)
1258
+ </p>
1259
+ <a name="BABEL.schema.yaml"></a>
1260
+ <div class="program_caption">
1261
+ BABEL.schema.yaml</div>
1262
+ <pre class="program">type: map
1263
+ required: yes
1264
+ mapping:
1265
+ "teams":
1266
+ type: seq
1267
+ required: yes
1268
+ sequence:
1269
+ - &amp;team
1270
+ type: map
1271
+ required: yes
1272
+ <strong>class: Team</strong>
1273
+ mapping:
1274
+ "name": {type: str, required: yes, unique: yes}
1275
+ "desc": {type: str}
1276
+ "chief": *member # preceding alias
1277
+ "members":
1278
+ type: seq
1279
+ sequence: [*member] # preceding alias
1280
+ "members":
1281
+ type: seq
1282
+ required: yes
1283
+ sequence:
1284
+ - &amp;member
1285
+ type: map
1286
+ required: yes
1287
+ <strong>class: Member</strong>
1288
+ mapping:
1289
+ "name": {type: str, required: yes, unique: yes}
1290
+ "desc": {type: str}
1291
+ "team": *team
1292
+ </pre>
1293
+ <p>It is required to define class 'Team' and 'Member' for data-binding.
1294
+ Command-line option '-a genclass-ruby' will help you to generate class definitions from schema definition.
1295
+ Try 'kwalify -ha genclass-ruby' for more details about 'genclass-ruby' action.
1296
+ </p>
1297
+ <a name="babel_genclass.result"></a>
1298
+ <pre class="terminal">$ kwalify -a genclass-ruby -P -f BABEL.schema.yaml \
1299
+ --hashlike --initialize=false --module=Babel
1300
+ require 'kwalify/util/hashlike'
1301
+
1302
+ module Babel
1303
+
1304
+ ##
1305
+ class Team
1306
+ include Kwalify::Util::HashLike
1307
+ attr_accessor :name # str
1308
+ attr_accessor :desc # str
1309
+ attr_accessor :chief # map
1310
+ attr_accessor :members # seq
1311
+ end
1312
+
1313
+ ##
1314
+ class Member
1315
+ include Kwalify::Util::HashLike
1316
+ attr_accessor :name # str
1317
+ attr_accessor :desc # str
1318
+ attr_accessor :team # map
1319
+ end
1320
+
1321
+ end
1322
+ $ kwalify -a genclass-ruby -P -f BABEL.schema.yaml \
1323
+ --hashlike --initialize=false --module=Babel &gt; models.rb
1324
+ </pre>
1325
+ <p>Here is the ruby program.
1326
+ </p>
1327
+ <a name="loadbabel.rb"></a>
1328
+ <div class="program_caption">
1329
+ loadbabel.rb</div>
1330
+ <pre class="program">require 'kwalify'
1331
+ <strong>require 'models'</strong>
1332
+
1333
+ ## load schema definition
1334
+ schema = Kwalify::Yaml.load_file('BABEL.schema.yaml',
1335
+ :untabify=&gt;true,
1336
+ :preceding_alias=&gt;true)
1337
+
1338
+ ## add module name to 'class:'
1339
+ Kwalify::Util.traverse_schema(schema) do |rulehash|
1340
+ if rulehash['class']
1341
+ rulehash['class'] = 'Babel::' + rulehash['class']
1342
+ end
1343
+ end
1344
+
1345
+ ## create validator
1346
+ validator = Kwalify::Validator.new(schema)
1347
+
1348
+ ## parse with data-binding
1349
+ parser = Kwalify::Yaml::Parser.new(validator)
1350
+ parser.preceding_alias = true
1351
+ <strong>parser.data_binding = true</strong>
1352
+ ydoc = parser.parse_file('BABEL.data.yaml', :untabify=&gt;true)
1353
+
1354
+ ## show document
1355
+ require 'pp'
1356
+ pp ydoc
1357
+ </pre>
1358
+ <a name="howto5_databinding.result"></a>
1359
+ <div class="terminal_caption">
1360
+ result</div>
1361
+ <pre class="terminal">$ ruby loadbabel.rb
1362
+ {"teams"=&gt;
1363
+ [#&lt;Babel::Team:0x53e0f8
1364
+ @chief=
1365
+ #&lt;Babel::Member:0x53d5e0
1366
+ @desc="Scientist",
1367
+ @name="Kohichi Minamoto",
1368
+ @team=#&lt;Babel::Team:0x53e0f8 ...&gt;&gt;,
1369
+ @desc="Level 7 ESPers",
1370
+ @members=
1371
+ [#&lt;Babel::Member:0x53d018
1372
+ @desc="Psychokino",
1373
+ @name="Kaoru Akashi",
1374
+ @team=#&lt;Babel::Team:0x53e0f8 ...&gt;&gt;,
1375
+ #&lt;Babel::Member:0x53ca50
1376
+ @desc="Teleporter",
1377
+ @name="Aoi Nogami",
1378
+ @team=#&lt;Babel::Team:0x53e0f8 ...&gt;&gt;,
1379
+ #&lt;Babel::Member:0x53c488
1380
+ @desc="Psycometrer",
1381
+ @name="Shiho Sannomiya",
1382
+ @team=#&lt;Babel::Team:0x53e0f8 ...&gt;&gt;],
1383
+ @name="The Children"&gt;],
1384
+ "members"=&gt;
1385
+ [#&lt;Babel::Member:0x53d5e0
1386
+ @desc="Scientist",
1387
+ @name="Kohichi Minamoto",
1388
+ @team=
1389
+ #&lt;Babel::Team:0x53e0f8
1390
+ @chief=#&lt;Babel::Member:0x53d5e0 ...&gt;,
1391
+ @desc="Level 7 ESPers",
1392
+ @members=
1393
+ [#&lt;Babel::Member:0x53d018
1394
+ @desc="Psychokino",
1395
+ @name="Kaoru Akashi",
1396
+ @team=#&lt;Babel::Team:0x53e0f8 ...&gt;&gt;,
1397
+ #&lt;Babel::Member:0x53ca50
1398
+ @desc="Teleporter",
1399
+ @name="Aoi Nogami",
1400
+ @team=#&lt;Babel::Team:0x53e0f8 ...&gt;&gt;,
1401
+ #&lt;Babel::Member:0x53c488
1402
+ @desc="Psycometrer",
1403
+ @name="Shiho Sannomiya",
1404
+ @team=#&lt;Babel::Team:0x53e0f8 ...&gt;&gt;],
1405
+ @name="The Children"&gt;&gt;,
1406
+ #&lt;Babel::Member:0x53d018
1407
+ @desc="Psychokino",
1408
+ @name="Kaoru Akashi",
1409
+ @team=
1410
+ #&lt;Babel::Team:0x53e0f8
1411
+ @chief=
1412
+ #&lt;Babel::Member:0x53d5e0
1413
+ @desc="Scientist",
1414
+ @name="Kohichi Minamoto",
1415
+ @team=#&lt;Babel::Team:0x53e0f8 ...&gt;&gt;,
1416
+ @desc="Level 7 ESPers",
1417
+ @members=
1418
+ [#&lt;Babel::Member:0x53d018 ...&gt;,
1419
+ #&lt;Babel::Member:0x53ca50
1420
+ @desc="Teleporter",
1421
+ @name="Aoi Nogami",
1422
+ @team=#&lt;Babel::Team:0x53e0f8 ...&gt;&gt;,
1423
+ #&lt;Babel::Member:0x53c488
1424
+ @desc="Psycometrer",
1425
+ @name="Shiho Sannomiya",
1426
+ @team=#&lt;Babel::Team:0x53e0f8 ...&gt;&gt;],
1427
+ @name="The Children"&gt;&gt;,
1428
+ #&lt;Babel::Member:0x53ca50
1429
+ @desc="Teleporter",
1430
+ @name="Aoi Nogami",
1431
+ @team=
1432
+ #&lt;Babel::Team:0x53e0f8
1433
+ @chief=
1434
+ #&lt;Babel::Member:0x53d5e0
1435
+ @desc="Scientist",
1436
+ @name="Kohichi Minamoto",
1437
+ @team=#&lt;Babel::Team:0x53e0f8 ...&gt;&gt;,
1438
+ @desc="Level 7 ESPers",
1439
+ @members=
1440
+ [#&lt;Babel::Member:0x53d018
1441
+ @desc="Psychokino",
1442
+ @name="Kaoru Akashi",
1443
+ @team=#&lt;Babel::Team:0x53e0f8 ...&gt;&gt;,
1444
+ #&lt;Babel::Member:0x53ca50 ...&gt;,
1445
+ #&lt;Babel::Member:0x53c488
1446
+ @desc="Psycometrer",
1447
+ @name="Shiho Sannomiya",
1448
+ @team=#&lt;Babel::Team:0x53e0f8 ...&gt;&gt;],
1449
+ @name="The Children"&gt;&gt;,
1450
+ #&lt;Babel::Member:0x53c488
1451
+ @desc="Psycometrer",
1452
+ @name="Shiho Sannomiya",
1453
+ @team=
1454
+ #&lt;Babel::Team:0x53e0f8
1455
+ @chief=
1456
+ #&lt;Babel::Member:0x53d5e0
1457
+ @desc="Scientist",
1458
+ @name="Kohichi Minamoto",
1459
+ @team=#&lt;Babel::Team:0x53e0f8 ...&gt;&gt;,
1460
+ @desc="Level 7 ESPers",
1461
+ @members=
1462
+ [#&lt;Babel::Member:0x53d018
1463
+ @desc="Psychokino",
1464
+ @name="Kaoru Akashi",
1465
+ @team=#&lt;Babel::Team:0x53e0f8 ...&gt;&gt;,
1466
+ #&lt;Babel::Member:0x53ca50
1467
+ @desc="Teleporter",
1468
+ @name="Aoi Nogami",
1469
+ @team=#&lt;Babel::Team:0x53e0f8 ...&gt;&gt;,
1470
+ #&lt;Babel::Member:0x53c488 ...&gt;],
1471
+ @name="The Children"&gt;&gt;]}
1472
+ </pre>
1473
+ <br>
1474
+
1475
+
1476
+ <br>
1477
+
1478
+
1479
+ <a name="actions"></a>
1480
+ <h2 class="section1">Actions</h2>
1481
+ <p>Kwalify has the command-line '-a <em>action</em>' which perform a certain action to schema definition.
1482
+ Currently only the following actions are provided.
1483
+ </p>
1484
+ <dl class="dl2">
1485
+ <dt class="dt2">
1486
+ genclass-ruby</dt>
1487
+ <dd class="dd2">
1488
+ <p> Generate class definitions in Ruby.
1258
1489
  </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
1490
  </dd>
1265
- <dt class="dt3"><strong>
1266
- genclass-java </strong></dt>
1267
- <dd class="dd3">
1268
- Generate class definitions in Java.
1491
+ <dt class="dt2">
1492
+ genclass-java</dt>
1493
+ <dd class="dd2">
1494
+ <p> Generate class definitions in Java.
1495
+ </p>
1496
+ </dd>
1497
+ <dt class="dt2">
1498
+ genclass-php</dt>
1499
+ <dd class="dd2">
1500
+ <p> Generate class definitions in Ruby.
1501
+ </p>
1269
1502
  </dd>
1270
1503
  </dl>
1271
1504
  <p>In fact action name represents template filename.
@@ -1275,6 +1508,9 @@ For example, action 'genclass-ruby' invokes template file 'kwalify/templates/gen
1275
1508
  For example, action 'genclass-ruby' can accept the command-line properties '--module=<em>name</em>', '--parent=<em>name</em>', and so on.
1276
1509
  Type 'kwalify -h -a <em>action</em>' to show the list of command-line properties the action can accept.
1277
1510
  </p>
1511
+ <p>It is able to add your on action template file.
1512
+ The command-line option '-I' (template path) will help you.
1513
+ </p>
1278
1514
  <a name="action-genclass"></a>
1279
1515
  <h3 class="section2">Class Definition Generation</h3>
1280
1516
  <p>Command-line option '-a genclass-ruby' or '-a genclass-java' generates class definition
@@ -1282,9 +1518,9 @@ automatically from schema definition in Ruby or Java.
1282
1518
  </p>
1283
1519
  <p>Assume the following data file and schema definition.
1284
1520
  </p>
1285
- <a name="address-book.yaml"></a>
1521
+ <a name="address_book.yaml"></a>
1286
1522
  <div class="program_caption">
1287
- <code>address-book.yaml</code> : data file</div>
1523
+ <code>address_book.yaml</code> : data file</div>
1288
1524
  <pre class="program">groups:
1289
1525
 
1290
1526
  - name: family
@@ -1296,7 +1532,7 @@ automatically from schema definition in Ruby or Java.
1296
1532
  - name: business
1297
1533
  desc: those who works together
1298
1534
 
1299
- persons:
1535
+ people:
1300
1536
 
1301
1537
  - name: Sumire
1302
1538
  group: family
@@ -1313,27 +1549,27 @@ persons:
1313
1549
  email: cherry@mail.net
1314
1550
  phone: 012-345-6789
1315
1551
  </pre>
1316
- <a name="address-book.schema.yaml"></a>
1552
+ <a name="address_book.schema.yaml"></a>
1317
1553
  <div class="program_caption">
1318
- <code>address-book.schema.yaml</code> : schema definition file</div>
1554
+ <code>address_book.schema.yaml</code> : schema definition file</div>
1319
1555
  <pre class="program">type: map
1320
- <strong>classname: AddressBook</strong>
1556
+ <strong>class: AddressBook</strong>
1321
1557
  desc: address-book class
1322
1558
  mapping:
1323
1559
  "groups":
1324
1560
  type: seq
1325
1561
  sequence:
1326
1562
  - type: map
1327
- <strong>classname: Group</strong>
1563
+ <strong>class: Group</strong>
1328
1564
  desc: group class
1329
1565
  mapping:
1330
1566
  "name": { type: str, required: yes }
1331
1567
  "desc": { type: str }
1332
- "persons":
1568
+ "people":
1333
1569
  type: seq
1334
1570
  sequence:
1335
1571
  - type: map
1336
- <strong>classname: Person</strong>
1572
+ <strong>class: Person</strong>
1337
1573
  desc: person class
1338
1574
  mapping:
1339
1575
  "name": { type: str, required: yes }
@@ -1343,81 +1579,95 @@ mapping:
1343
1579
  "phone": { type: str }
1344
1580
  "birth": { type: date }
1345
1581
  "blood": { type: str, enum: [A, B, O, AB] }
1582
+ "deleted": { type: bool, <strong>default: false</strong> }
1346
1583
  </pre>
1347
1584
  <a name="action-genclass-ruby"></a>
1348
1585
  <h4 class="section3">Ruby Class Definition</h4>
1349
1586
  <div class="terminal_caption">
1350
1587
  generate class definition</div>
1351
- <pre class="terminal">$ kwalify <strong>-a genclass-ruby</strong> -tf address-book.schema.yaml &gt; address-book.rb
1588
+ <pre class="terminal">$ kwalify <strong>-a genclass-ruby</strong> -tf address_book.schema.yaml &gt; address_book.rb
1352
1589
  </pre>
1353
- <a name="address-book.rb"></a>
1590
+ <a name="address_book.rb"></a>
1354
1591
  <div class="program_caption">
1355
- <code>address-book.rb</code> : generated class definition</div>
1592
+ <code>address_book.rb</code> : generated class definition</div>
1356
1593
  <pre class="program">## address-book class
1357
1594
  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
1595
+ def initialize(hash=nil)
1596
+ if hash.nil?
1597
+ return
1598
+ end
1599
+ @groups = (v=hash['groups']) ? v.map!{|e| e.is_a?(Group) ? e : Group.new(e)} : v
1600
+ @people = (v=hash['people']) ? v.map!{|e| e.is_a?(Person) ? e : Person.new(e)} : v
1361
1601
  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
1602
+ attr_accessor :groups # seq
1603
+ attr_accessor :people # seq
1384
1604
  end
1385
1605
 
1386
1606
  ## group class
1387
1607
  class Group
1388
- def initialize(hash)
1389
- @name = hash['name']
1390
- @desc = hash['desc']
1608
+ def initialize(hash=nil)
1609
+ if hash.nil?
1610
+ return
1611
+ end
1612
+ @name = hash['name']
1613
+ @desc = hash['desc']
1391
1614
  end
1392
- attr_accessor :name # str
1393
- attr_accessor :desc # str
1615
+ attr_accessor :name # str
1616
+ attr_accessor :desc # str
1394
1617
  end
1395
1618
 
1619
+ ## person class
1620
+ class Person
1621
+ def initialize(hash=nil)
1622
+ if hash.nil?
1623
+ @deleted = false
1624
+ return
1625
+ end
1626
+ @name = hash['name']
1627
+ @desc = hash['desc']
1628
+ @group = hash['group']
1629
+ @email = hash['email']
1630
+ @phone = hash['phone']
1631
+ @birth = hash['birth']
1632
+ @blood = hash['blood']
1633
+ @deleted = (v=hash['deleted']).nil? ? false : v
1634
+ end
1635
+ attr_accessor :name # str
1636
+ attr_accessor :desc # str
1637
+ attr_accessor :group # str
1638
+ attr_accessor :email # str
1639
+ attr_accessor :phone # str
1640
+ attr_accessor :birth # date
1641
+ attr_accessor :blood # str
1642
+ attr_accessor :deleted # bool
1643
+ def deleted? ; @deleted ; end
1644
+ end
1396
1645
  </pre>
1397
- <a name="example-address-book.rb"></a>
1646
+ <a name="example_address_book.rb"></a>
1398
1647
  <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'
1648
+ <code>example_address_book.rb</code> : example code of using address-book.rb</div>
1649
+ <pre class="program">require 'address_book'
1401
1650
  require 'yaml'
1402
1651
  require 'pp'
1403
1652
 
1404
- str = File.read('address-book.yaml')
1653
+ str = File.read('address_book.yaml')
1405
1654
  ydoc = YAML.load(str)
1406
1655
  <strong>addrbook = AddressBook.new(ydoc)</strong>
1407
1656
 
1408
1657
  pp <strong>addrbook.groups</strong>
1409
- pp <strong>addrbook.persons</strong>
1658
+ pp <strong>addrbook.people</strong>
1410
1659
  </pre>
1411
- <a name="example-address-book.expected"></a>
1660
+ <a name="example_address_book_ruby.result"></a>
1412
1661
  <div class="terminal_caption">
1413
1662
  result</div>
1414
- <pre class="terminal">$ ruby example-address-book.rb
1663
+ <pre class="terminal">$ ruby example_address_book.rb
1415
1664
  [#&lt;Group:0xddf24 @desc="my family", @name="family"&gt;,
1416
1665
  #&lt;Group:0xddf10 @desc="my friends", @name="friend"&gt;,
1417
1666
  #&lt;Group:0xdde84 @desc="those who works together", @name="business"&gt;]
1418
1667
  [#&lt;Person:0xdefdc
1419
1668
  @birth=#&lt;Date: 4903089/2,0,2299161&gt;,
1420
1669
  @blood="A",
1670
+ @deleted=false,
1421
1671
  @desc=nil,
1422
1672
  @email=nil,
1423
1673
  @group="family",
@@ -1426,6 +1676,7 @@ result</div>
1426
1676
  #&lt;Person:0xdee9c
1427
1677
  @birth=#&lt;Date: 4899437/2,0,2299161&gt;,
1428
1678
  @blood=nil,
1679
+ @deleted=false,
1429
1680
  @desc=nil,
1430
1681
  @email="shiina@mail.org",
1431
1682
  @group="friend",
@@ -1434,6 +1685,7 @@ result</div>
1434
1685
  #&lt;Person:0xde8e8
1435
1686
  @birth=nil,
1436
1687
  @blood=nil,
1688
+ @deleted=false,
1437
1689
  @desc=nil,
1438
1690
  @email="cherry@mail.net",
1439
1691
  @group="business",
@@ -1442,37 +1694,40 @@ result</div>
1442
1694
  </pre>
1443
1695
  <p>Command-line option '<code>-h -a genclass-ruby</code>' shows the commpand-line properties that template can accept.
1444
1696
  </p>
1445
- <a name="option_ha.expected"></a>
1697
+ <a name="option_ha.result"></a>
1446
1698
  <div class="terminal_caption">
1447
1699
  show command-line properties</div>
1448
1700
  <pre class="terminal">$ kwalify -ha genclass-ruby
1449
1701
  --module=name : module name in which class defined
1450
1702
  --parent=name : parent class name
1451
1703
  --include=name : module name which all classes include
1704
+ --initialize=false : not print initialize() method
1705
+ --hashlike : include Kwalify::Util::HashLike module
1452
1706
  </pre>
1453
1707
  <div class="terminal_caption">
1454
1708
  example of command-line properties</div>
1455
- <pre class="terminal">$ kwalify -a genclass-ruby --module=My --include=Kwalify::HashInterface
1709
+ <pre class="terminal">$ kwalify -a genclass-ruby --module=My --hashlike
1456
1710
  </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'
1711
+ <p>If command-line property '--hashlike' (== '--hashlike=true') is specified,
1712
+ module Kwalify::Util::HashLike is included for each classes generated.
1713
+ That module is defined in 'kwalify/util/hashlike.rb'
1459
1714
  </p>
1460
1715
  <br>
1461
1716
 
1462
1717
  <a name="action-genclass-java"></a>
1463
1718
  <h4 class="section3">Java Class Definition</h4>
1464
- <a name="genclass_java.expected"></a>
1719
+ <a name="genclass_java.result"></a>
1465
1720
  <div class="terminal_caption">
1466
1721
  generate java class definition</div>
1467
- <pre class="terminal">$ kwalify <strong>-a genclass-java</strong> -tf address-book.schema.yaml
1722
+ <pre class="terminal">$ kwalify <strong>-a genclass-java</strong> -tf address_book.schema.yaml
1468
1723
  generating ./AddressBook.java...done.
1469
- generating ./Person.java...done.
1470
1724
  generating ./Group.java...done.
1725
+ generating ./Person.java...done.
1471
1726
  </pre>
1472
1727
  <a name="AddressBook.java.expected"></a>
1473
1728
  <div class="program_caption">
1474
1729
  <code>AddressBook.java</code> : generated class definition</div>
1475
- <pre class="program">// generated by kwalify from address-book.schema.yaml
1730
+ <pre class="program">// generated by kwalify from address_book.schema.yaml
1476
1731
 
1477
1732
  import java.util.*;
1478
1733
 
@@ -1481,42 +1736,42 @@ import java.util.*;
1481
1736
  */
1482
1737
  public class AddressBook {
1483
1738
 
1484
- private List _persons;
1485
1739
  private List _groups;
1740
+ private List _people;
1486
1741
 
1487
1742
  public AddressBook() {}
1488
1743
 
1489
1744
  public AddressBook(Map map) {
1490
1745
  List seq;
1491
1746
  Object obj;
1492
- if ((seq = (List)map.get("persons")) != null) {
1747
+ if ((seq = (List)map.get("groups")) != null) {
1493
1748
  for (int i = 0; i &lt; seq.size(); i++) {
1494
1749
  if ((obj = seq.get(i)) instanceof Map) {
1495
- seq.set(i, new Person((Map)obj));
1750
+ seq.set(i, new Group((Map)obj));
1496
1751
  }
1497
1752
  }
1498
1753
  }
1499
- _persons = seq;
1500
- if ((seq = (List)map.get("groups")) != null) {
1754
+ _groups = seq;
1755
+ if ((seq = (List)map.get("people")) != null) {
1501
1756
  for (int i = 0; i &lt; seq.size(); i++) {
1502
1757
  if ((obj = seq.get(i)) instanceof Map) {
1503
- seq.set(i, new Group((Map)obj));
1758
+ seq.set(i, new Person((Map)obj));
1504
1759
  }
1505
1760
  }
1506
1761
  }
1507
- _groups = seq;
1762
+ _people = seq;
1508
1763
  }
1509
1764
 
1510
- public List getPersons() { return _persons; }
1511
- public void setPersons(List persons_) { _persons = persons_; }
1512
1765
  public List getGroups() { return _groups; }
1513
1766
  public void setGroups(List groups_) { _groups = groups_; }
1767
+ public List getPeople() { return _people; }
1768
+ public void setPeople(List people_) { _people = people_; }
1514
1769
  }
1515
1770
  </pre>
1516
1771
  <a name="Group.java.expected"></a>
1517
1772
  <div class="program_caption">
1518
1773
  <code>Group.java</code> : generated class definition</div>
1519
- <pre class="program">// generated by kwalify from address-book.schema.yaml
1774
+ <pre class="program">// generated by kwalify from address_book.schema.yaml
1520
1775
 
1521
1776
  import java.util.*;
1522
1777
 
@@ -1544,7 +1799,7 @@ public class Group {
1544
1799
  <a name="Person.java.expected"></a>
1545
1800
  <div class="program_caption">
1546
1801
  <code>Person.java</code> : generated class definition</div>
1547
- <pre class="program">// generated by kwalify from address-book.schema.yaml
1802
+ <pre class="program">// generated by kwalify from address_book.schema.yaml
1548
1803
 
1549
1804
  import java.util.*;
1550
1805
 
@@ -1555,38 +1810,38 @@ public class Person {
1555
1810
 
1556
1811
  private String _name;
1557
1812
  private String _desc;
1558
- private String _phone;
1559
- private String _blood;
1560
1813
  private String _group;
1561
- private Date _birth;
1562
1814
  private String _email;
1815
+ private String _phone;
1816
+ private Date _birth;
1817
+ private String _blood;
1563
1818
 
1564
1819
  public Person() {}
1565
1820
 
1566
1821
  public Person(Map map) {
1567
1822
  _name = (String)map.get("name");
1568
1823
  _desc = (String)map.get("desc");
1569
- _phone = (String)map.get("phone");
1570
- _blood = (String)map.get("blood");
1571
1824
  _group = (String)map.get("group");
1572
- _birth = (Date)map.get("birth");
1573
1825
  _email = (String)map.get("email");
1826
+ _phone = (String)map.get("phone");
1827
+ _birth = (Date)map.get("birth");
1828
+ _blood = (String)map.get("blood");
1574
1829
  }
1575
1830
 
1576
1831
  public String getName() { return _name; }
1577
1832
  public void setName(String name_) { _name = name_; }
1578
1833
  public String getDesc() { return _desc; }
1579
1834
  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
1835
  public String getGroup() { return _group; }
1585
1836
  public void setGroup(String group_) { _group = group_; }
1586
- public Date getBirth() { return _birth; }
1587
- public void setBirth(Date birth_) { _birth = birth_; }
1588
1837
  public String getEmail() { return _email; }
1589
1838
  public void setEmail(String email_) { _email = email_; }
1839
+ public String getPhone() { return _phone; }
1840
+ public void setPhone(String phone_) { _phone = phone_; }
1841
+ public Date getBirth() { return _birth; }
1842
+ public void setBirth(Date birth_) { _birth = birth_; }
1843
+ public String getBlood() { return _blood; }
1844
+ public void setBlood(String blood_) { _blood = blood_; }
1590
1845
  }
1591
1846
  </pre>
1592
1847
  <a name="ExampleAddressBook.java"></a>
@@ -1598,12 +1853,12 @@ import kwalify.*;
1598
1853
  public class ExampleAddressBook {
1599
1854
  public static void main(String args[]) throws Exception {
1600
1855
  // read schema
1601
- String schema_str = Util.readFile("address-book.schema.yaml");
1856
+ String schema_str = Util.readFile("address_book.schema.yaml");
1602
1857
  schema_str = Util.untabify(schema_str);
1603
1858
  Object schema = new YamlParser(schema_str).parse();
1604
1859
 
1605
1860
  // read document file
1606
- String document_str = Util.readFile("address-book.yaml");
1861
+ String document_str = Util.readFile("address_book.yaml");
1607
1862
  document_str = Util.untabify(document_str);
1608
1863
  YamlParser parser = new YamlParser(document_str);
1609
1864
  Object document = parser.parse();
@@ -1622,10 +1877,10 @@ public class ExampleAddressBook {
1622
1877
  }
1623
1878
  }
1624
1879
 
1625
- // show persons
1626
- List persons = addrbook.getPersons();
1627
- if (persons != null) {
1628
- for (Iterator it = persons.iterator(); it.hasNext(); ) {
1880
+ // show people
1881
+ List people = addrbook.getPeople();
1882
+ if (people != null) {
1883
+ for (Iterator it = people.iterator(); it.hasNext(); ) {
1629
1884
  Person person = (Person)it.next();
1630
1885
  System.out.println("person name: " + person.getName());
1631
1886
  System.out.println("person group: " + person.getGroup());
@@ -1640,7 +1895,7 @@ public class ExampleAddressBook {
1640
1895
 
1641
1896
  }
1642
1897
  </pre>
1643
- <a name="example-address-book-java.expected"></a>
1898
+ <a name="example_address_book_java.result"></a>
1644
1899
  <div class="terminal_caption">
1645
1900
  result</div>
1646
1901
  <pre class="terminal">$ javac -classpath '.:kwalify.jar' *.java
@@ -1678,7 +1933,7 @@ person birth: null
1678
1933
  </pre>
1679
1934
  <p>Command-line option '<code>-h -a genclass-java</code>' shows the commpand-line properties that template can accept.
1680
1935
  </p>
1681
- <a name="option_ha_genclass_java.expected"></a>
1936
+ <a name="option_ha_genclass_java.result"></a>
1682
1937
  <div class="terminal_caption">
1683
1938
  show command-line properties</div>
1684
1939
  <pre class="terminal">$ kwalify -ha genclass-java
@@ -1687,6 +1942,7 @@ show command-line properties</div>
1687
1942
  --implements=name,... : interface names to implement
1688
1943
  --dir=path : directory to locate output file
1689
1944
  --basedir=path : base directory to locate output file
1945
+ --constructor=false : not print initialize() method
1690
1946
  </pre>
1691
1947
  <div class="terminal_caption">
1692
1948
  example of command-line properties</div>
@@ -1700,25 +1956,16 @@ example of command-line properties</div>
1700
1956
  <br>
1701
1957
 
1702
1958
 
1703
- <a name="usage"></a>
1704
- <h2 class="section1">Usage of Kwalify</h2>
1705
- <a name="usage1"></a>
1959
+ <a name="ref"></a>
1960
+ <h2 class="section1">References</h2>
1961
+ <a name="ref-usage"></a>
1706
1962
  <h3 class="section2">Usage in Command-Line</h3>
1707
1963
  <div class="terminal_caption">
1708
- usage1: validate YAML document in command-line</div>
1709
- <pre class="terminal">### kwalify-ruby
1964
+ </div>
1965
+ <pre class="terminal">### usage1: validate YAML document in command-line
1710
1966
  $ 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
1967
+ ### usage2: validate schema definition in command-line
1718
1968
  $ kwalify -m schema.yaml [schema2.yaml ...]
1719
-
1720
- ### kwalify-java
1721
- $ java -classpath kwalify.jar kwalify.Main -m schema.yaml [schema2.yaml ...]
1722
1969
  </pre>
1723
1970
  <p>Command-line options:
1724
1971
  </p>
@@ -1734,9 +1981,14 @@ $ java -classpath kwalify.jar kwalify.Main -m schema.yaml [schema2.yaml ...]
1734
1981
  Print version.
1735
1982
  </dd>
1736
1983
  <dt class="dt3"><strong>
1984
+ <code>-q</code> </strong></dt>
1985
+ <dd class="dd3">
1986
+ Quiet mode.
1987
+ </dd>
1988
+ <dt class="dt3"><strong>
1737
1989
  <code>-s</code> </strong></dt>
1738
1990
  <dd class="dd3">
1739
- Silent mode.
1991
+ (Obsolete. Use '-q' instead.) Silent mode.
1740
1992
  </dd>
1741
1993
  <dt class="dt3"><strong>
1742
1994
  <code>-f <em>schema.yaml</em></code> </strong></dt>
@@ -1769,104 +2021,17 @@ $ java -classpath kwalify.jar kwalify.Main -m schema.yaml [schema2.yaml ...]
1769
2021
  Do action. Currently supported action is 'genclass-ruby' and 'genclass-java'.
1770
2022
  Try '-ha action' to get help about the action.
1771
2023
  </dd>
2024
+ <dt class="dt3"><strong>
2025
+ <code>-I path1,path2,...</code> </strong></dt>
2026
+ <dd class="dd3">
2027
+ Template path (for '-a').
2028
+ </dd>
2029
+ <dt class="dt3"><strong>
2030
+ <code>-P</code> </strong></dt>
2031
+ <dd class="dd3">
2032
+ Enable preceding alias.
2033
+ </dd>
1772
2034
  </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
2035
  <br>
1871
2036
 
1872
2037