rkwalify 1.4.0.pre.preview1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (247) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/ruby.yml +39 -0
  3. data/.gitignore +61 -0
  4. data/.overcommit.yml +33 -0
  5. data/.rubocop.yml +9 -0
  6. data/.rubocop_todo.yml +1369 -0
  7. data/.ruby-version +1 -0
  8. data/Attic/README-0.7.2.md +53 -0
  9. data/Attic/features/cli.feature +9 -0
  10. data/Attic/features/step_definitions/validation_steps.rb +20 -0
  11. data/Attic/features/support/env.rb +4 -0
  12. data/Attic/features/validate_schema.feature +12 -0
  13. data/Attic/s+h +53 -0
  14. data/Attic/setup.rb +1556 -0
  15. data/Attic/spec/my_cli_tool_spec.rb +52 -0
  16. data/Attic/spec/rspec-ex_spec.rb +10 -0
  17. data/Attic/spec/spec_helper.rb +104 -0
  18. data/Attic/test-15.1.rb +28 -0
  19. data/CHANGELOG.md +292 -0
  20. data/CONTRIBUTING.md +23 -0
  21. data/CONTRIBUTORS.md +8 -0
  22. data/Gemfile +16 -0
  23. data/Gemfile.lock +146 -0
  24. data/MIT-LICENSE +21 -0
  25. data/README.md +53 -0
  26. data/ROLL-OUT-STRATEGY.md +77 -0
  27. data/Rakefile +11 -0
  28. data/bin/kwalify.rb +4167 -0
  29. data/bin/kwalify.schema.yaml +59 -0
  30. data/contrib/inline-require +181 -0
  31. data/contrib/kwalify +4167 -0
  32. data/contrib/kwalify-0.7.2 +4160 -0
  33. data/devbin/README.md +22 -0
  34. data/devbin/chk-rad-repo.sh +20 -0
  35. data/devbin/chkcopyrights.sh +42 -0
  36. data/devbin/chkspelling.sh +16 -0
  37. data/devbin/got-all-rel-numbers.sh +5 -0
  38. data/devbin/mkbig-rkwalify.sh +7 -0
  39. data/devbin/mkgem_file.sh +5 -0
  40. data/devbin/runtests.sh +6 -0
  41. data/devbin/ug-tests.golden +242 -0
  42. data/devbin/ug-tests.sh +145 -0
  43. data/devbin/update-rel-numbers.sh +7 -0
  44. data/doc/docstyle.css +188 -0
  45. data/doc/img/fig01.png +0 -0
  46. data/doc/users-guide.html +2051 -0
  47. data/doc-api/classes/CommandOptionError.html +184 -0
  48. data/doc-api/classes/CommandOptionParser.html +325 -0
  49. data/doc-api/classes/Kwalify/AssertionError.html +148 -0
  50. data/doc-api/classes/Kwalify/BaseError.html +297 -0
  51. data/doc-api/classes/Kwalify/BaseParser.html +461 -0
  52. data/doc-api/classes/Kwalify/CommandOptionError.html +168 -0
  53. data/doc-api/classes/Kwalify/ErrorHelper.html +223 -0
  54. data/doc-api/classes/Kwalify/HashInterface.html +118 -0
  55. data/doc-api/classes/Kwalify/Json.html +105 -0
  56. data/doc-api/classes/Kwalify/KwalifyError.html +111 -0
  57. data/doc-api/classes/Kwalify/Main.html +339 -0
  58. data/doc-api/classes/Kwalify/MetaValidator.html +448 -0
  59. data/doc-api/classes/Kwalify/Parser.html +155 -0
  60. data/doc-api/classes/Kwalify/PlainYamlParser/Alias.html +165 -0
  61. data/doc-api/classes/Kwalify/PlainYamlParser.html +523 -0
  62. data/doc-api/classes/Kwalify/Rule.html +433 -0
  63. data/doc-api/classes/Kwalify/SchemaError.html +148 -0
  64. data/doc-api/classes/Kwalify/SyntaxError.html +185 -0
  65. data/doc-api/classes/Kwalify/Types.html +302 -0
  66. data/doc-api/classes/Kwalify/Util/HashLike.html +246 -0
  67. data/doc-api/classes/Kwalify/Util/OrderedHash.html +330 -0
  68. data/doc-api/classes/Kwalify/Util.html +390 -0
  69. data/doc-api/classes/Kwalify/ValidationError.html +148 -0
  70. data/doc-api/classes/Kwalify/Validator.html +381 -0
  71. data/doc-api/classes/Kwalify/Yaml/Parser.html +1538 -0
  72. data/doc-api/classes/Kwalify/Yaml.html +194 -0
  73. data/doc-api/classes/Kwalify/YamlParser.html +542 -0
  74. data/doc-api/classes/Kwalify/YamlSyntaxError.html +119 -0
  75. data/doc-api/classes/Kwalify.html +292 -0
  76. data/doc-api/classes/Test/Unit.html +101 -0
  77. data/doc-api/classes/Test.html +107 -0
  78. data/doc-api/created.rid +1 -0
  79. data/doc-api/files/__/README_txt.html +153 -0
  80. data/doc-api/files/kwalify/errors_rb.html +114 -0
  81. data/doc-api/files/kwalify/main_rb.html +118 -0
  82. data/doc-api/files/kwalify/messages_rb.html +107 -0
  83. data/doc-api/files/kwalify/meta-validator_rb.html +117 -0
  84. data/doc-api/files/kwalify/parser/base_rb.html +116 -0
  85. data/doc-api/files/kwalify/parser/yaml_rb.html +117 -0
  86. data/doc-api/files/kwalify/rule_rb.html +116 -0
  87. data/doc-api/files/kwalify/types_rb.html +114 -0
  88. data/doc-api/files/kwalify/util/assert-text-equal_rb.html +115 -0
  89. data/doc-api/files/kwalify/util/hash-interface_rb.html +114 -0
  90. data/doc-api/files/kwalify/util/hashlike_rb.html +107 -0
  91. data/doc-api/files/kwalify/util/option-parser_rb.html +107 -0
  92. data/doc-api/files/kwalify/util/ordered-hash_rb.html +107 -0
  93. data/doc-api/files/kwalify/util/testcase-helper_rb.html +115 -0
  94. data/doc-api/files/kwalify/util_rb.html +107 -0
  95. data/doc-api/files/kwalify/validator_rb.html +117 -0
  96. data/doc-api/files/kwalify/yaml-parser_rb.html +117 -0
  97. data/doc-api/files/kwalify_rb.html +121 -0
  98. data/doc-api/fr_class_index.html +57 -0
  99. data/doc-api/fr_file_index.html +45 -0
  100. data/doc-api/fr_method_index.html +168 -0
  101. data/doc-api/index.html +24 -0
  102. data/doc-api/rdoc-style.css +208 -0
  103. data/examples/address-book/Makefile +10 -0
  104. data/examples/address-book/address-book.schema.yaml +45 -0
  105. data/examples/address-book/address-book.yaml +36 -0
  106. data/examples/data-binding/BABEL.data.yaml +63 -0
  107. data/examples/data-binding/BABEL.schema.yaml +31 -0
  108. data/examples/data-binding/Makefile +8 -0
  109. data/examples/data-binding/Rakefile +13 -0
  110. data/examples/data-binding/main.rb +25 -0
  111. data/examples/invoice/Makefile +9 -0
  112. data/examples/invoice/invoice.schema.yaml +43 -0
  113. data/examples/invoice/invoice.yaml +32 -0
  114. data/examples/tapkit/Makefile +10 -0
  115. data/examples/tapkit/main.rb +7 -0
  116. data/examples/tapkit/tapkit.schema.yaml +146 -0
  117. data/examples/tapkit/tapkit.yaml +85 -0
  118. data/lib/kwalify/errors.rb +127 -0
  119. data/lib/kwalify/kwalify.schema.yaml +58 -0
  120. data/lib/kwalify/main.rb +442 -0
  121. data/lib/kwalify/messages.rb +173 -0
  122. data/lib/kwalify/meta-validator.rb +276 -0
  123. data/lib/kwalify/parser/base.rb +128 -0
  124. data/lib/kwalify/parser/yaml.rb +841 -0
  125. data/lib/kwalify/rule.rb +562 -0
  126. data/lib/kwalify/templates/genclass-java.eruby +222 -0
  127. data/lib/kwalify/templates/genclass-php.eruby +104 -0
  128. data/lib/kwalify/templates/genclass-ruby.eruby +113 -0
  129. data/lib/kwalify/types.rb +156 -0
  130. data/lib/kwalify/util/assert-text-equal.rb +46 -0
  131. data/lib/kwalify/util/hash-interface.rb +18 -0
  132. data/lib/kwalify/util/hashlike.rb +51 -0
  133. data/lib/kwalify/util/option-parser.rb +220 -0
  134. data/lib/kwalify/util/ordered-hash.rb +57 -0
  135. data/lib/kwalify/util/testcase-helper.rb +112 -0
  136. data/lib/kwalify/util.rb +159 -0
  137. data/lib/kwalify/validator.rb +282 -0
  138. data/lib/kwalify/version.rb +5 -0
  139. data/lib/kwalify/yaml-parser.rb +871 -0
  140. data/lib/kwalify.rb +61 -0
  141. data/rkwalify.gemspec +26 -0
  142. data/test/Rookbook.yaml +15 -0
  143. data/test/data/users-guide/AddressBook.java.expected +40 -0
  144. data/test/data/users-guide/BABEL.data.yaml +24 -0
  145. data/test/data/users-guide/BABEL.schema.yaml +30 -0
  146. data/test/data/users-guide/ExampleAddressBook.java +47 -0
  147. data/test/data/users-guide/Group.java.expected +24 -0
  148. data/test/data/users-guide/Person.java.expected +44 -0
  149. data/test/data/users-guide/address_book.rb +52 -0
  150. data/test/data/users-guide/address_book.schema.yaml +28 -0
  151. data/test/data/users-guide/address_book.yaml +27 -0
  152. data/test/data/users-guide/answers-schema.yaml +12 -0
  153. data/test/data/users-guide/answers-validator.rb +53 -0
  154. data/test/data/users-guide/babel_genclass.result +26 -0
  155. data/test/data/users-guide/config.schema.yaml +7 -0
  156. data/test/data/users-guide/config.yaml +4 -0
  157. data/test/data/users-guide/document01a.yaml +3 -0
  158. data/test/data/users-guide/document01b.yaml +3 -0
  159. data/test/data/users-guide/document02a.yaml +4 -0
  160. data/test/data/users-guide/document02b.yaml +4 -0
  161. data/test/data/users-guide/document03a.yaml +6 -0
  162. data/test/data/users-guide/document03b.yaml +6 -0
  163. data/test/data/users-guide/document04a.yaml +9 -0
  164. data/test/data/users-guide/document04b.yaml +9 -0
  165. data/test/data/users-guide/document05a.yaml +11 -0
  166. data/test/data/users-guide/document05b.yaml +12 -0
  167. data/test/data/users-guide/document06a.yaml +15 -0
  168. data/test/data/users-guide/document06b.yaml +16 -0
  169. data/test/data/users-guide/document07a.yaml +9 -0
  170. data/test/data/users-guide/document07b.yaml +7 -0
  171. data/test/data/users-guide/document12a.json +10 -0
  172. data/test/data/users-guide/document12b.json +6 -0
  173. data/test/data/users-guide/document13a.yaml +17 -0
  174. data/test/data/users-guide/document14a.yaml +3 -0
  175. data/test/data/users-guide/document14b.yaml +3 -0
  176. data/test/data/users-guide/document15a.yaml +6 -0
  177. data/test/data/users-guide/document15b.yaml +5 -0
  178. data/test/data/users-guide/example_address_book.rb +11 -0
  179. data/test/data/users-guide/example_address_book_java.result +32 -0
  180. data/test/data/users-guide/example_address_book_ruby.result +31 -0
  181. data/test/data/users-guide/genclass_java.result +4 -0
  182. data/test/data/users-guide/howto-validation-with-parsing.rb +28 -0
  183. data/test/data/users-guide/howto-validation.rb +25 -0
  184. data/test/data/users-guide/howto3.rb +6 -0
  185. data/test/data/users-guide/howto3.result +5 -0
  186. data/test/data/users-guide/howto3.yaml +8 -0
  187. data/test/data/users-guide/howto5_databinding.result +111 -0
  188. data/test/data/users-guide/invalid01.result +3 -0
  189. data/test/data/users-guide/invalid02.result +5 -0
  190. data/test/data/users-guide/invalid03.result +5 -0
  191. data/test/data/users-guide/invalid04.result +4 -0
  192. data/test/data/users-guide/invalid05.result +11 -0
  193. data/test/data/users-guide/invalid06.result +4 -0
  194. data/test/data/users-guide/invalid07.result +3 -0
  195. data/test/data/users-guide/invalid08.result +3 -0
  196. data/test/data/users-guide/invalid12.json +8 -0
  197. data/test/data/users-guide/invalid14.result +4 -0
  198. data/test/data/users-guide/invalid15.result +4 -0
  199. data/test/data/users-guide/loadbabel.rb +27 -0
  200. data/test/data/users-guide/loadconfig.rb +17 -0
  201. data/test/data/users-guide/loadconfig.result +6 -0
  202. data/test/data/users-guide/models.rb +24 -0
  203. data/test/data/users-guide/option_ha.result +6 -0
  204. data/test/data/users-guide/option_ha_genclass_java.result +7 -0
  205. data/test/data/users-guide/schema01.yaml +3 -0
  206. data/test/data/users-guide/schema02.yaml +12 -0
  207. data/test/data/users-guide/schema03.yaml +9 -0
  208. data/test/data/users-guide/schema04.yaml +20 -0
  209. data/test/data/users-guide/schema05.yaml +29 -0
  210. data/test/data/users-guide/schema06.yaml +11 -0
  211. data/test/data/users-guide/schema12.json +12 -0
  212. data/test/data/users-guide/schema13.yaml +13 -0
  213. data/test/data/users-guide/schema14.yaml +5 -0
  214. data/test/data/users-guide/schema15.yaml +21 -0
  215. data/test/data/users-guide/valid01.result +2 -0
  216. data/test/data/users-guide/valid02.result +2 -0
  217. data/test/data/users-guide/valid03.result +2 -0
  218. data/test/data/users-guide/valid04.result +2 -0
  219. data/test/data/users-guide/valid05.result +2 -0
  220. data/test/data/users-guide/valid06.result +2 -0
  221. data/test/data/users-guide/valid07.result +2 -0
  222. data/test/data/users-guide/valid08.result +2 -0
  223. data/test/data/users-guide/valid12.result +2 -0
  224. data/test/data/users-guide/valid13.result +2 -0
  225. data/test/data/users-guide/valid14.result +2 -0
  226. data/test/data/users-guide/valid15.result +2 -0
  227. data/test/data/users-guide/validate08.rb +37 -0
  228. data/test/test-action.rb +73 -0
  229. data/test/test-action.yaml +738 -0
  230. data/test/test-databinding.rb +84 -0
  231. data/test/test-databinding.yaml +339 -0
  232. data/test/test-main.rb +156 -0
  233. data/test/test-main.yaml +409 -0
  234. data/test/test-metavalidator.rb +80 -0
  235. data/test/test-metavalidator.yaml +1179 -0
  236. data/test/test-parser-yaml.rb +57 -0
  237. data/test/test-parser-yaml.yaml +1750 -0
  238. data/test/test-rule.rb +26 -0
  239. data/test/test-rule.yaml +317 -0
  240. data/test/test-users-guide.rb +82 -0
  241. data/test/test-util.rb +125 -0
  242. data/test/test-validator.rb +95 -0
  243. data/test/test-validator.yaml +986 -0
  244. data/test/test-yaml-parser.rb +47 -0
  245. data/test/test-yaml-parser.yaml +1226 -0
  246. data/test/test.rb +75 -0
  247. metadata +293 -0
@@ -0,0 +1,173 @@
1
+ ###
2
+ ### $Rev$
3
+ ### $Release: 1.4.0-preview1 $
4
+ ### copyright(c) 2005-2010 kuwata-lab all rights reserved.
5
+ ###
6
+
7
+ module Kwalify
8
+
9
+ @@messages = {}
10
+
11
+ def self.msg(key)
12
+ return @@messages[key]
13
+ end
14
+
15
+
16
+
17
+ @@messages[:command_help] = <<END
18
+ kwalify - schema validator and data binding tool for YAML and JSON
19
+ ## Usage1: validate yaml document
20
+ kwalify [..options..] -f schema.yaml doc.yaml [doc2.yaml ...]
21
+ ## Usage2: validate schema definition
22
+ kwalify [..options..] -m schema.yaml [schema2.yaml ...]
23
+ ## Usage3: do action
24
+ kwalify [..options..] -a action -f schema.yaml [schema2.yaml ...]
25
+ -h, --help : help
26
+ -v : version
27
+ -q : quiet
28
+ -s : silent (obsolete, use '-q' instead)
29
+ -f schema.yaml : schema definition file
30
+ -m : meta-validation mode
31
+ -t : expand tab characters
32
+ -l : show linenumber when errored (experimental)
33
+ -E : show errors in emacs-style (experimental, implies '-l')
34
+ -a action : action ('genclass-ruby', 'genclass-php', 'genclass-java')
35
+ (try '-ha genclass-ruby' for details)
36
+ -I path : template path (for '-a')
37
+ -P : allow preceding alias
38
+ END
39
+ # -z : syntax checking of schema file
40
+ # -I path : path for template of action
41
+
42
+
43
+
44
+ ##----- begin
45
+ # filename: lib/kwalify/main.rb
46
+ @@messages[:command_option_actionnoschema] = "schema filename is not specified."
47
+ @@messages[:command_option_noaction] = "command-line option '-f' or '-m' required."
48
+ @@messages[:command_option_notemplate] = "%s: invalid action (template not found).\n"
49
+ @@messages[:schema_empty] = "%s: empty schema.\n"
50
+ @@messages[:validation_empty] = "%s#%d: empty."
51
+ @@messages[:validation_empty] = "%s#%d: empty.\n"
52
+ @@messages[:validation_valid] = "%s#%d: valid."
53
+ @@messages[:command_option_schema_required] = "-%s: schema filename required."
54
+ @@messages[:command_option_action_required] = "-%s: action required."
55
+ @@messages[:command_option_tpath_required] = "-%s: template path required."
56
+ @@messages[:command_property_invalid] = "%s: invalid property."
57
+ @@messages[:command_option_invalid] = "-%s: invalid command option."
58
+ # --
59
+ # filename: lib/kwalify/rule.rb
60
+ @@messages[:schema_notmap] = "schema definition is not a mapping."
61
+ @@messages[:key_unknown] = "unknown key."
62
+ @@messages[:type_notstr] = "not a string."
63
+ @@messages[:type_unknown] = "unknown type."
64
+ @@messages[:class_notmap] = "available only with map type."
65
+ @@messages[:required_notbool] = "not a boolean."
66
+ @@messages[:pattern_notstr] = "not a string (or regexp)"
67
+ @@messages[:pattern_notmatch] = "should be '/..../'."
68
+ @@messages[:pattern_syntaxerr] = "has regexp error."
69
+ @@messages[:enum_notseq] = "not a sequence."
70
+ @@messages[:enum_notscalar] = "not available with seq or map."
71
+ @@messages[:enum_type_unmatch] = "%s type expected."
72
+ @@messages[:enum_duplicate] = "duplicated enum value."
73
+ @@messages[:assert_notstr] = "not a string."
74
+ @@messages[:assert_noval] = "'val' is not used."
75
+ @@messages[:assert_syntaxerr] = "expression syntax error."
76
+ @@messages[:range_notmap] = "not a mapping."
77
+ @@messages[:range_notscalar] = "is available only with scalar type."
78
+ @@messages[:range_type_unmatch] = "not a %s."
79
+ @@messages[:range_undefined] = "undefined key."
80
+ @@messages[:range_twomax] = "both 'max' and 'max-ex' are not available at once."
81
+ @@messages[:range_twomin] = "both 'min' and 'min-ex' are not available at once."
82
+ @@messages[:range_maxltmin] = "max '%s' is less than min '%s'."
83
+ @@messages[:range_maxleminex] = "max '%s' is less than or equal to min-ex '%s'."
84
+ @@messages[:range_maxexlemin] = "max-ex '%s' is less than or equal to min '%s'."
85
+ @@messages[:range_maxexleminex] = "max-ex '%s' is less than or equal to min-ex '%s'."
86
+ @@messages[:length_notmap] = "not a mapping."
87
+ @@messages[:length_nottext] = "is available only with string or text."
88
+ @@messages[:length_notint] = "not an integer."
89
+ @@messages[:length_undefined] = "undefined key."
90
+ @@messages[:length_twomax] = "both 'max' and 'max-ex' are not available at once."
91
+ @@messages[:length_twomin] = "both 'min' and 'min-ex' are not available at once."
92
+ @@messages[:length_maxltmin] = "max '%s' is less than min '%s'."
93
+ @@messages[:length_maxleminex] = "max '%s' is less than or equal to min-ex '%s'."
94
+ @@messages[:length_maxexlemin] = "max-ex '%s' is less than or equal to min '%s'."
95
+ @@messages[:length_maxexleminex] = "max-ex '%s' is less than or equal to min-ex '%s'."
96
+ @@messages[:ident_notbool] = "not a boolean."
97
+ @@messages[:ident_notscalar] = "is available only with a scalar type."
98
+ @@messages[:ident_onroot] = "is not available on root element."
99
+ @@messages[:ident_notmap] = "is available only with an element of mapping."
100
+ @@messages[:unique_notbool] = "not a boolean."
101
+ @@messages[:unique_notscalar] = "is available only with a scalar type."
102
+ @@messages[:unique_onroot] = "is not available on root element."
103
+ @@messages[:default_nonscalarval] = "not a scalar."
104
+ @@messages[:default_notscalar] = "is available only with a scalar type."
105
+ @@messages[:default_unmatch] = "not a %s."
106
+ @@messages[:sequence_notseq] = "not a sequence."
107
+ @@messages[:sequence_noelem] = "required one element."
108
+ @@messages[:sequence_toomany] = "required just one element."
109
+ @@messages[:mapping_notmap] = "not a mapping."
110
+ @@messages[:mapping_noelem] = "required at least one element."
111
+ @@messages[:seq_nosequence] = "type 'seq' requires 'sequence:'."
112
+ @@messages[:seq_conflict] = "not available with sequence."
113
+ @@messages[:map_nomapping] = "type 'map' requires 'mapping:'."
114
+ @@messages[:map_conflict] = "not available with mapping."
115
+ @@messages[:scalar_conflict] = "not available with scalar type."
116
+ @@messages[:enum_conflict] = "not available with 'enum:'."
117
+ @@messages[:default_conflict] = "not available when 'required:' is true."
118
+ # --
119
+ # filename: lib/kwalify/validator.rb
120
+ @@messages[:required_novalue] = "value required but none."
121
+ @@messages[:type_unmatch] = "not a %s."
122
+ @@messages[:key_undefined] = "key '%s' is undefined."
123
+ @@messages[:required_nokey] = "key '%s:' is required."
124
+ @@messages[:value_notunique] = "is already used at '%s'."
125
+ @@messages[:assert_failed] = "assertion expression failed (%s)."
126
+ @@messages[:enum_notexist] = "invalid %s value."
127
+ @@messages[:pattern_unmatch] = "not matched to pattern %s."
128
+ @@messages[:range_toolarge] = "too large (> max %s)."
129
+ @@messages[:range_toosmall] = "too small (< min %s)."
130
+ @@messages[:range_toolargeex] = "too large (>= max %s)."
131
+ @@messages[:range_toosmallex] = "too small (<= min %s)."
132
+ @@messages[:length_toolong] = "too long (length %d > max %d)."
133
+ @@messages[:length_tooshort] = "too short (length %d < min %d)."
134
+ @@messages[:length_toolongex] = "too long (length %d >= max %d)."
135
+ @@messages[:length_tooshortex] = "too short (length %d <= min %d)."
136
+ # --
137
+ # filename: lib/kwalify/yaml-parser.rb
138
+ @@messages[:flow_hastail] = "flow style sequence is closed but got '%s'."
139
+ @@messages[:flow_eof] = "found EOF when parsing flow style."
140
+ @@messages[:flow_alias_label] = "alias name expected."
141
+ @@messages[:flow_anchor_label] = "anchor name expected."
142
+ @@messages[:flow_noseqitem] = "sequence item required (or last comma is extra)."
143
+ @@messages[:flow_seqnotclosed] = "flow style sequence requires ']'."
144
+ @@messages[:flow_mapnoitem] = "mapping item required (or last comma is extra)."
145
+ @@messages[:flow_mapnotclosed] = "flow style mapping requires '}'."
146
+ @@messages[:flow_nocolon] = "':' expected but got %s."
147
+ @@messages[:flow_str_notclosed] = "%s: string not closed."
148
+ @@messages[:anchor_duplicated] = "anchor '%s' is already used."
149
+ @@messages[:alias_extradata] = "alias cannot take any data."
150
+ @@messages[:anchor_notfound] = "anchor '%s' not found"
151
+ @@messages[:sequence_noitem] = "sequence item is expected."
152
+ @@messages[:sequence_badindent] = "illegal indent of sequence."
153
+ @@messages[:mapping_noitem] = "mapping item is expected."
154
+ @@messages[:mapping_badindent] = "illegal indent of mapping."
155
+ # --
156
+ ##----- end
157
+
158
+
159
+
160
+
161
+ @@words = {}
162
+
163
+ def self.word(key)
164
+ return @@words[key] || key
165
+ end
166
+
167
+ @@words['str'] = 'string'
168
+ @@words['int'] = 'integer'
169
+ @@words['bool'] = 'boolean'
170
+ @@words['seq'] = 'sequence'
171
+ @@words['map'] = 'mapping'
172
+
173
+ end
@@ -0,0 +1,276 @@
1
+ ###
2
+ ### $Rev$
3
+ ### $Release: 1.4.0-preview1 $
4
+ ### copyright(c) 2005-2010 kuwata-lab all rights reserved.
5
+ ###
6
+
7
+ require 'kwalify/errors'
8
+ require 'kwalify/rule'
9
+ require 'kwalify/validator'
10
+ require 'kwalify/parser/yaml'
11
+ #require 'yaml'
12
+
13
+ module Kwalify
14
+
15
+
16
+ ##
17
+ ## ex.
18
+ ## meta_validator = Kwalify::MetaValidator.instance()
19
+ ## schema = File.load_file('schema.yaml')
20
+ ## errors = meta_validator.validate(schema)
21
+ ## if !errors.empty?
22
+ ## errors.each do |error|
23
+ ## puts "[#{error.path}] #{error.message}"
24
+ ## end
25
+ ## end
26
+ ##
27
+ class MetaValidator < Validator
28
+
29
+ filename = File.join(File.dirname(__FILE__), 'kwalify.schema.yaml')
30
+ META_SCHEMA = File.read(filename)
31
+
32
+ def self.instance()
33
+ unless @instance
34
+ schema = Kwalify::Yaml::Parser.new().parse(META_SCHEMA)
35
+ @instance = MetaValidator.new(schema)
36
+ end
37
+ return @instance
38
+ end
39
+
40
+ def initialize(schema, &)
41
+ super
42
+ end
43
+
44
+ def validate_hook(value, rule, path, errors)
45
+ return if value.nil? ## realy?
46
+ return unless rule.name == "MAIN"
47
+ #
48
+ hash = value
49
+ type = hash['type']
50
+ type = Types::DEFAULT_TYPE if type.nil?
51
+ klass = Types.type_class(type)
52
+ #unless klass
53
+ # errors << validate_error(:type_unknown, rule, "#{path}/type", type)
54
+ #end
55
+ #
56
+ if hash.key?('class')
57
+ val = hash['class']
58
+ unless val.nil? || type == 'map'
59
+ errors << validate_error(:class_notmap, rule, "#{path}/class", 'class:')
60
+ end
61
+ end
62
+ #
63
+ if hash.key?('pattern')
64
+ val = hash['pattern']
65
+ pat = (val =~ /\A\/(.*)\/([mi]?[mi]?)\z/ ? $1 : val)
66
+ begin
67
+ Regexp.compile(pat)
68
+ rescue RegexpError => ex
69
+ errors << validate_error(:pattern_syntaxerr, rule, "#{path}/pattern", val)
70
+ end
71
+ end
72
+ #
73
+ if hash.key?('enum')
74
+ if Types.collection_type?(type)
75
+ errors << validate_error(:enum_notscalar, rule, path, 'enum:')
76
+ else
77
+ #elem_table = {}
78
+ hash['enum'].each do |elem|
79
+ #if elem_table[elem]
80
+ # errors << validate_error(:enum_duplicate, rule, "#{path}/enum", elem.to_s)
81
+ #end
82
+ #elem_table[elem] = true
83
+ unless elem.is_a?(klass)
84
+ errors << validate_error(:enum_type_unmatch, rule, "#{path}/enum", elem, [Kwalify.word(type)])
85
+ end
86
+ end
87
+ end
88
+ end
89
+ #
90
+ if hash.key?('assert')
91
+ val = hash['assert']
92
+ #val =~ /\bval\b/ or errors << validate_error(:assert_noval, rule, "#{path}/assert", val)
93
+ begin
94
+ # WAS: eval "proc { |val| #{val} }"
95
+ eval "proc { |val| #{val} }" # proc { |val| val > 10 }
96
+ rescue ::SyntaxError => ex
97
+ errors << validate_error(:assert_syntaxerr, rule, "#{path}/assert", val)
98
+ end
99
+ end
100
+ #
101
+ if hash.key?('range')
102
+ val = hash['range']
103
+ curr_path = path + "/range"
104
+ #if ! val.is_a?(Hash)
105
+ # errors << validate_error(:range_notmap, rule, curr_path, val)
106
+ #elsif ...
107
+ if Types.collection_type?(type) || type == 'bool' || type == 'any'
108
+ errors << validate_error(:range_notscalar, rule, path, 'range:')
109
+ else
110
+ val.each do |rkey, rval|
111
+ #case rkey
112
+ #when 'max', 'min', 'max-ex', 'min-ex'
113
+ unless rval.is_a?(klass)
114
+ typename = Kwalify.word(type) || type
115
+ errors << validate_error(:range_type_unmatch, rule, "#{curr_path}/#{rkey}", rval, [typename])
116
+ end
117
+ #else
118
+ # errors << validate_error(:range_undefined, rule, curr_path, "#{rkey}:")
119
+ #end
120
+ end
121
+ end
122
+ if val.key?('max') && val.key?('max-ex')
123
+ errors << validate_error(:range_twomax, rule, curr_path, nil)
124
+ end
125
+ if val.key?('min') && val.key?('min-ex')
126
+ errors << validate_error(:range_twomin, rule, curr_path, nil)
127
+ end
128
+ max, min, max_ex, min_ex = val['max'], val['min'], val['max-ex'], val['min-ex']
129
+ if max
130
+ if min && max < min
131
+ errors << validate_error(:range_maxltmin, rule, curr_path, nil, [max, min])
132
+ elsif min_ex && max <= min_ex
133
+ errors << validate_error(:range_maxleminex, rule, curr_path, nil, [max, min_ex])
134
+ end
135
+ elsif max_ex
136
+ if min && max_ex <= min
137
+ errors << validate_error(:range_maxexlemin, rule, curr_path, nil, [max_ex, min])
138
+ elsif min_ex && max_ex <= min_ex
139
+ errors << validate_error(:range_maxexleminex, rule, curr_path, nil, [max_ex, min_ex])
140
+ end
141
+ end
142
+ end
143
+ #
144
+ if hash.key?('length')
145
+ val = hash['length']
146
+ curr_path = path + "/length"
147
+ #val.is_a?(Hash) or errors << validate_error(:length_notmap, rule, curr_path, val)
148
+ unless type == 'str' || type == 'text'
149
+ errors << validate_error(:length_nottext, rule, path, 'length:')
150
+ end
151
+ #val.each do |lkey, lval|
152
+ # #case lkey
153
+ # #when 'max', 'min', 'max-ex', 'min-ex'
154
+ # unless lval.is_a?(Integer)
155
+ # errors << validate_error(:length_notint, rule, "#{curr_path}/#{lkey}", lval)
156
+ # end
157
+ # #else
158
+ # # errors << validate_error(:length_undefined, rule, curr_path, "#{lkey}:")
159
+ # #end
160
+ #end
161
+ if val.key?('max') && val.key?('max-ex')
162
+ errors << validate_error(:length_twomax, rule, curr_path, nil)
163
+ end
164
+ if val.key?('min') && val.key?('min-ex')
165
+ errors << validate_error(:length_twomin, rule, curr_path, nil)
166
+ end
167
+ max, min, max_ex, min_ex = val['max'], val['min'], val['max-ex'], val['min-ex']
168
+ if max
169
+ if min && max < min
170
+ errors << validate_error(:length_maxltmin, rule, curr_path, nil, [max, min])
171
+ elsif min_ex && max <= min_ex
172
+ errors << validate_error(:length_maxleminex, rule, curr_path, nil, [max, min_ex])
173
+ end
174
+ elsif max_ex
175
+ if min && max_ex <= min
176
+ errors << validate_error(:length_maxexlemin, rule, curr_path, nil, [max_ex, min])
177
+ elsif min_ex && max_ex <= min_ex
178
+ errors << validate_error(:length_maxexleminex, rule, curr_path, nil, [max_ex, min_ex])
179
+ end
180
+ end
181
+ end
182
+ #
183
+ if hash.key?('unique')
184
+ if hash['unique'] && Types.collection_type?(type)
185
+ errors << validate_error(:unique_notscalar, rule, path, "unique:")
186
+ end
187
+ if path.empty?
188
+ errors << validate_error(:unique_onroot, rule, "/", "unique:")
189
+ end
190
+ end
191
+ #
192
+ if hash.key?('ident')
193
+ if hash['ident'] && Types.collection_type?(type)
194
+ errors << validate_error(:ident_notscalar, rule, path, "ident:")
195
+ end
196
+ if path.empty?
197
+ errors << validate_error(:ident_onroot, rule, "/", "ident:")
198
+ end
199
+ end
200
+ #
201
+ if hash.key?('default')
202
+ val = hash['default']
203
+ if Types.collection_type?(type)
204
+ errors << validate_error(:default_notscalar, rule, path, "default:")
205
+ elsif !val.nil? && !val.is_a?(klass)
206
+ errors << validate_error(:default_unmatch, rule, "#{path}/default", val, [Kwalify.word(type)])
207
+ end
208
+ end
209
+ #
210
+ if hash.key?('sequence')
211
+ val = hash['sequence']
212
+ #if !val.nil? && !val.is_a?(Array)
213
+ # errors << validate_error(:sequence_notseq, rule, "#{path}/sequence", val)
214
+ #elsif ...
215
+ if val.nil? || val.empty?
216
+ errors << validate_error(:sequence_noelem, rule, "#{path}/sequence", val)
217
+ elsif val.length > 1
218
+ errors << validate_error(:sequence_toomany, rule, "#{path}/sequence", val)
219
+ else
220
+ elem = val[0]
221
+ assert_error("elem.class=#{elem.class}") unless elem.is_a?(Hash)
222
+ if elem['ident'] && elem['type'] != 'map'
223
+ errors << validate_error(:ident_notmap, nil, "#{path}/sequence/0", 'ident:')
224
+ end
225
+ end
226
+ end
227
+ #
228
+ if hash.key?('mapping')
229
+ val = hash['mapping']
230
+ if !val.nil? && !val.is_a?(Hash)
231
+ errors << validate_error(:mapping_notmap, rule, "#{path}/mapping", val)
232
+ elsif val.nil? || (val.empty? && !val.default)
233
+ errors << validate_error(:mapping_noelem, rule, "#{path}/mapping", val)
234
+ end
235
+ end
236
+ #
237
+ if type == 'seq'
238
+ errors << validate_error(:seq_nosequence, rule, path, nil) unless hash.key?('sequence')
239
+ #errors << validate_error(:seq_conflict, rule, path, 'enum:') if hash.key?('enum')
240
+ errors << validate_error(:seq_conflict, rule, path, 'pattern:') if hash.key?('pattern')
241
+ errors << validate_error(:seq_conflict, rule, path, 'mapping:') if hash.key?('mapping')
242
+ #errors << validate_error(:seq_conflict, rule, path, 'range:') if hash.key?('range')
243
+ #errors << validate_error(:seq_conflict, rule, path, 'length:') if hash.key?('length')
244
+ elsif type == 'map'
245
+ errors << validate_error(:map_nomapping, rule, path, nil) unless hash.key?('mapping')
246
+ #errors << validate_error(:map_conflict, rule, path, 'enum:') if hash.key?('enum')
247
+ errors << validate_error(:map_conflict, rule, path, 'pattern:') if hash.key?('pattern')
248
+ errors << validate_error(:map_conflict, rule, path, 'sequence:') if hash.key?('sequence')
249
+ #errors << validate_error(:map_conflict, rule, path, 'range:') if hash.key?('range')
250
+ #errors << validate_error(:map_conflict, rule, path, 'length:') if hash.key?('length')
251
+ else
252
+ errors << validate_error(:scalar_conflict, rule, path, 'sequence:') if hash.key?('sequence')
253
+ errors << validate_error(:scalar_conflict, rule, path, 'mapping:') if hash.key?('mapping')
254
+ if hash.key?('enum')
255
+ errors << validate_error(:enum_conflict, rule, path, 'range:') if hash.key?('range')
256
+ errors << validate_error(:enum_conflict, rule, path, 'length:') if hash.key?('length')
257
+ errors << validate_error(:enum_conflict, rule, path, 'pattern:') if hash.key?('pattern')
258
+ end
259
+ if hash.key?('default')
260
+ errors << validate_error(:default_conflict, rule, path, 'default:') if hash['required']
261
+ end
262
+ end
263
+
264
+ end # end of def validate_hook()
265
+
266
+
267
+ end # end of class MetaValidator
268
+
269
+
270
+ META_VALIDATOR = MetaValidator.instance()
271
+
272
+ def self.meta_validator # obsolete
273
+ return META_VALIDATOR
274
+ end
275
+
276
+ end
@@ -0,0 +1,128 @@
1
+ ###
2
+ ### $Rev$
3
+ ### $Release: 1.4.0-preview1 $
4
+ ### copyright(c) 2005-2010 kuwata-lab all rights reserved.
5
+ ###
6
+ # frozen_string_literal: false
7
+
8
+ require 'strscan'
9
+ require 'kwalify/errors'
10
+ require 'kwalify/util'
11
+
12
+
13
+ ##
14
+ ## base class for Yaml::Parser
15
+ ##
16
+ class Kwalify::BaseParser
17
+
18
+
19
+ def reset(input, filename=nil, untabify=false)
20
+ input = Kwalify::Util.untabify(input) if untabify
21
+ @scanner = StringScanner.new(input)
22
+ @filename = filename
23
+ @linenum = 1
24
+ @column = 1
25
+ end
26
+ attr_reader :filename, :linenum, :column
27
+
28
+
29
+ def scan(regexp)
30
+ ret = @scanner.scan(regexp)
31
+ return nil if ret.nil?
32
+ _set_column_and_linenum(ret)
33
+ return ret
34
+ end
35
+
36
+
37
+ def _set_column_and_linenum(s)
38
+ pos = s.rindex(?\n)
39
+ if pos
40
+ @column = s.length - pos
41
+ @linenum += s.count("\n")
42
+ else
43
+ @column += s.length
44
+ end
45
+ end
46
+
47
+
48
+ def match?(regexp)
49
+ return @scanner.match?(regexp)
50
+ end
51
+
52
+
53
+ def group(n)
54
+ return @scanner[n]
55
+ end
56
+
57
+
58
+ def eos?
59
+ return @scanner.eos?
60
+ end
61
+
62
+
63
+ def peep(n=1)
64
+ return @scanner.peek(n)
65
+ end
66
+
67
+
68
+ def _getch
69
+ ch = @scanner.getch()
70
+ if ch == "\n"
71
+ @linenum += 1
72
+ @column = 0
73
+ else
74
+ @column += 1
75
+ end
76
+ return ch
77
+ end
78
+
79
+
80
+ CHAR_TABLE = { "\""=>"\"", "\\"=>"\\", "n"=>"\n", "r"=>"\r", "t"=>"\t", "b"=>"\b" }
81
+
82
+ def scan_string
83
+ ch = _getch()
84
+ ch == '"' || ch == "'" or raise "assertion error"
85
+ endch = ch
86
+ s = ''
87
+ while !(ch = _getch()).nil? && ch != endch
88
+ if ch != '\\'
89
+ s << ch
90
+ elsif (ch = _getch()).nil?
91
+ raise _syntax_error("%s: string is not closed." % (endch == '"' ? "'\"'" : '"\'"'))
92
+ elsif endch == '"'
93
+ if CHAR_TABLE.key?(ch)
94
+ s << CHAR_TABLE[ch]
95
+ elsif ch == 'u'
96
+ ch2 = scan(/(?:[0-9a-f][0-9a-f]){1,4}/)
97
+ unless ch2
98
+ raise _syntax_error("\\x: invalid unicode format.")
99
+ end
100
+ s << [ch2.hex].pack('U*')
101
+ elsif ch == 'x'
102
+ ch2 = scan(/[0-9a-zA-Z][0-9a-zA-Z]/)
103
+ unless ch2
104
+ raise _syntax_error("\\x: invalid binary format.")
105
+ end
106
+ s << [ch2].pack('H2')
107
+ else
108
+ s << "\\" << ch
109
+ end
110
+ elsif endch == "'"
111
+ ch == '\'' || ch == '\\' ? s << ch : s << '\\' << ch
112
+ else
113
+ raise "unreachable"
114
+ end
115
+ end
116
+ #_getch()
117
+ return s
118
+ end
119
+
120
+
121
+ def _syntax_error(message, path=nil, linenum=@linenum, column=@column)
122
+ #message = _build_message(message_key)
123
+ return _error(Kwalify::SyntaxError, message.to_s, path, linenum, column)
124
+ end
125
+ protected :_syntax_error
126
+
127
+
128
+ end