kwalify 0.5.1 → 0.6.0

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 (109) hide show
  1. data/ChangeLog +24 -19
  2. data/README.txt +51 -51
  3. data/bin/kwalify +2 -2
  4. data/contrib/inline-require +151 -0
  5. data/contrib/kwalify +2850 -0
  6. data/doc-api/classes/CommandOptionError.html +184 -0
  7. data/doc-api/classes/CommandOptionParser.html +325 -0
  8. data/doc-api/classes/Kwalify.html +270 -0
  9. data/doc-api/classes/Kwalify/AssertionError.html +148 -0
  10. data/doc-api/classes/Kwalify/BaseError.html +296 -0
  11. data/doc-api/classes/Kwalify/CommandOptionError.html +168 -0
  12. data/doc-api/classes/Kwalify/ErrorHelper.html +218 -0
  13. data/doc-api/classes/Kwalify/HashInterface.html +240 -0
  14. data/doc-api/classes/Kwalify/KwalifyError.html +111 -0
  15. data/doc-api/classes/Kwalify/Main.html +336 -0
  16. data/doc-api/classes/Kwalify/MetaValidator.html +432 -0
  17. data/doc-api/classes/Kwalify/Parser.html +155 -0
  18. data/doc-api/classes/Kwalify/PlainYamlParser.html +520 -0
  19. data/doc-api/classes/Kwalify/PlainYamlParser/Alias.html +165 -0
  20. data/doc-api/classes/Kwalify/Rule.html +411 -0
  21. data/doc-api/classes/Kwalify/SchemaError.html +148 -0
  22. data/doc-api/classes/Kwalify/Types.html +301 -0
  23. data/doc-api/classes/Kwalify/ValidationError.html +148 -0
  24. data/doc-api/classes/Kwalify/Validator.html +311 -0
  25. data/doc-api/classes/Kwalify/YamlParser.html +535 -0
  26. data/doc-api/classes/Kwalify/YamlSyntaxError.html +168 -0
  27. data/doc-api/classes/Test.html +107 -0
  28. data/doc-api/classes/Test/Unit.html +101 -0
  29. data/doc-api/classes/YamlHelper.html +259 -0
  30. data/doc-api/created.rid +1 -0
  31. data/doc-api/files/__/README_txt.html +179 -0
  32. data/doc-api/files/kwalify/errors_rb.html +114 -0
  33. data/doc-api/files/kwalify/main_rb.html +117 -0
  34. data/doc-api/files/kwalify/messages_rb.html +107 -0
  35. data/doc-api/files/kwalify/meta-validator_rb.html +117 -0
  36. data/doc-api/files/kwalify/rule_rb.html +116 -0
  37. data/doc-api/files/kwalify/types_rb.html +114 -0
  38. data/doc-api/files/kwalify/util/assert-text-equal_rb.html +115 -0
  39. data/doc-api/files/kwalify/util/hash-interface_rb.html +107 -0
  40. data/doc-api/files/kwalify/util/option-parser_rb.html +107 -0
  41. data/doc-api/files/kwalify/util/testcase-helper_rb.html +115 -0
  42. data/doc-api/files/kwalify/util/yaml-helper_rb.html +114 -0
  43. data/doc-api/files/kwalify/validator_rb.html +117 -0
  44. data/doc-api/files/kwalify/yaml-parser_rb.html +117 -0
  45. data/doc-api/files/kwalify_rb.html +120 -0
  46. data/doc-api/fr_class_index.html +50 -0
  47. data/doc-api/fr_file_index.html +41 -0
  48. data/doc-api/fr_method_index.html +109 -0
  49. data/doc-api/index.html +24 -0
  50. data/doc-api/rdoc-style.css +208 -0
  51. data/doc/users-guide.html +693 -193
  52. data/examples/address-book/Makefile +5 -0
  53. data/examples/address-book/address-book.schema.yaml +2 -1
  54. data/examples/invoice/Makefile +5 -0
  55. data/examples/invoice/invoice.schema.yaml +3 -2
  56. data/examples/tapkit/Makefile +5 -0
  57. data/examples/tapkit/main.rb +7 -0
  58. data/examples/tapkit/tapkit.schema.yaml +6 -1
  59. data/lib/kwalify.rb +3 -3
  60. data/lib/kwalify/errors.rb +2 -2
  61. data/lib/kwalify/main.rb +161 -84
  62. data/lib/kwalify/messages.rb +17 -11
  63. data/lib/kwalify/meta-validator.rb +11 -2
  64. data/lib/kwalify/rule.rb +13 -3
  65. data/lib/kwalify/templates/genclass-java.eruby +195 -0
  66. data/lib/kwalify/templates/genclass-ruby.eruby +84 -0
  67. data/lib/kwalify/types.rb +18 -18
  68. data/lib/kwalify/util/assert-text-equal.rb +44 -0
  69. data/lib/kwalify/util/hash-interface.rb +37 -0
  70. data/lib/kwalify/util/option-parser.rb +2 -2
  71. data/lib/kwalify/util/testcase-helper.rb +112 -0
  72. data/lib/kwalify/util/yaml-helper.rb +2 -2
  73. data/lib/kwalify/validator.rb +2 -2
  74. data/lib/kwalify/yaml-parser.rb +12 -9
  75. data/test/test-main.rb +77 -78
  76. data/test/test-main.yaml +543 -769
  77. data/test/test-metavalidator.rb +27 -47
  78. data/test/test-metavalidator.yaml +21 -2
  79. data/test/test-rule.rb +6 -39
  80. data/test/test-rule.yaml +2 -2
  81. data/test/test-validator.rb +36 -869
  82. data/test/test-validator.yaml +28 -20
  83. data/test/test-yamlparser.rb +30 -1248
  84. data/test/test-yamlparser.yaml +138 -110
  85. data/test/test.rb +33 -13
  86. data/test/tmp.dir/Context.java +40 -0
  87. data/test/tmp.dir/Group.java +33 -0
  88. data/test/tmp.dir/User.java +43 -0
  89. data/test/tmp.dir/action1.document +18 -0
  90. data/test/tmp.dir/action1.schema +32 -0
  91. data/test/tmp.dir/action2.document +18 -0
  92. data/test/tmp.dir/action2.schema +32 -0
  93. data/test/tmp.dir/emacs.document +6 -0
  94. data/test/tmp.dir/emacs.schema +6 -0
  95. data/test/tmp.dir/meta1.document +0 -0
  96. data/test/tmp.dir/meta1.schema +3 -0
  97. data/test/tmp.dir/meta2.document +0 -0
  98. data/test/tmp.dir/meta2.schema +3 -0
  99. data/test/tmp.dir/silent1.document +3 -0
  100. data/test/tmp.dir/silent1.schema +3 -0
  101. data/test/tmp.dir/silent2.document +7 -0
  102. data/test/tmp.dir/silent2.schema +3 -0
  103. data/test/tmp.dir/stream.invalid +8 -0
  104. data/test/tmp.dir/stream.schema +3 -0
  105. data/test/tmp.dir/stream.valid +8 -0
  106. data/test/tmp.dir/untabify.document +5 -0
  107. data/test/tmp.dir/untabify.schema +10 -0
  108. metadata +98 -12
  109. data/lib/kwalify/util/assert-diff.rb +0 -44
@@ -1,71 +1,55 @@
1
1
  ###
2
- ### $Rev: 42 $
3
- ### $Release: 0.5.1 $
2
+ ### $Rev: 51 $
3
+ ### $Release: 0.6.0 $
4
4
  ### copyright(c) 2005 kuwata-lab all rights reserved.
5
5
  ###
6
6
 
7
- unless defined?(TESTDIR)
8
- TESTDIR = File.dirname(__FILE__)
9
- libdir = File.dirname(TESTDIR) + "/lib"
10
- $LOAD_PATH << libdir << TESTDIR
11
- end
12
-
13
- require 'test/unit'
14
- require 'test/unit/ui/console/testrunner'
15
- require 'kwalify'
16
- require 'kwalify/util/assert-diff'
17
- require 'yaml'
7
+ require File.dirname(__FILE__) + '/test.rb'
18
8
 
19
9
 
20
10
  class MetaValidatorTest < Test::Unit::TestCase
21
11
 
22
12
  ## define test methods
23
13
  filename = __FILE__.sub(/\.rb$/, '.yaml')
24
- str = File.read(filename)
25
- @@docs = {}
26
- YAML.load_documents(str) do |doc|
27
- #doc.default = ''
28
- name = doc['name']
29
- !@@docs.key?(name) or raise "*** test name '#{name}' is duplicated."
30
- doc.each do |key, val|
31
- if key =~ /(.*)\*$/
32
- doc[$1] = val['ruby']
33
- end
14
+ load_yaml_documents(filename) do |ydoc|
15
+ name = ydoc['name']
16
+ ydoc.each do |key, val|
17
+ ydoc[$1] = val['ruby'] if key =~ /(.*)\*$/
34
18
  end
35
- @@docs[name] = doc
36
19
  s = <<-END
37
20
  def test_meta_#{name}
38
- doc = @@docs['#{name}']
39
- @name = doc['name']
40
- @desc = doc['desc']
41
- @schema = doc['schema']
42
- @meta_msg = doc['meta-msg']
43
- # @rule_msg = doc['rule-msg']
44
- _test(:meta)
21
+ @name = #{ydoc['name'].inspect}
22
+ @desc = #{ydoc['desc'].inspect}
23
+ @schema = #{ydoc['schema'].inspect}
24
+ @meta_msg = #{ydoc['meta-msg'].inspect}
25
+ # @rule_msg = #{ydoc['rule-msg'].inspect}
26
+ @test_type = :meta
27
+ _test
45
28
  end
46
29
  END
47
- eval s if doc['meta-msg']
30
+ module_eval s if ydoc['meta-msg']
48
31
  s = <<-END
49
32
  def test_rule_#{name}
50
- doc = @@docs['#{name}']
51
- @name = doc['name']
52
- @desc = doc['desc']
53
- @schema = doc['schema']
54
- # @meta_msg = doc['meta-msg']
55
- @rule_msg = doc['rule-msg']
56
- _test(:rule)
33
+ @name = #{ydoc['name'].inspect}
34
+ @desc = #{ydoc['desc'].inspect}
35
+ @schema = #{ydoc['schema'].inspect}
36
+ # @meta_msg = #{ydoc['meta-msg'].inspect}
37
+ @rule_msg = #{ydoc['rule-msg'].inspect}
38
+ @test_type = :rule
39
+ _test
57
40
  end
58
41
  END
59
- eval s if doc['rule-msg']
42
+ module_eval s if ydoc['rule-msg']
60
43
  end
61
44
 
45
+
62
46
  ## execute test
63
- def _test(test_type)
47
+ def _test()
64
48
  return if $target && $target != @name
65
49
  #schema = YAML.load(@schema)
66
50
  parser = Kwalify::YamlParser.new(@schema)
67
51
  schema = parser.parse()
68
- case test_type
52
+ case @test_type
69
53
  when :meta
70
54
  meta_validator = Kwalify::MetaValidator.instance()
71
55
  errors = meta_validator.validate(schema)
@@ -89,12 +73,8 @@ class MetaValidatorTest < Test::Unit::TestCase
89
73
  if $print
90
74
  print actual
91
75
  else
92
- assert_equal_with_diff(expected, actual)
76
+ assert_text_equal(expected, actual)
93
77
  end
94
78
  end
95
79
 
96
80
  end
97
-
98
- #if $0 == __FILE__
99
- # Test::Unit::UI::Console::TestRunner.run(MetaValidatorTest)
100
- #end
@@ -1,6 +1,6 @@
1
1
  ##
2
- ## $Rev: 2 $
3
- ## $Release: 0.5.1 $
2
+ ## $Rev: 51 $
3
+ ## $Release: 0.6.0 $
4
4
  ## copyright(c) 2005 kuwata-lab all rights reserved.
5
5
  ##
6
6
  ---
@@ -1102,3 +1102,22 @@ meta-msg: |
1102
1102
  rule-msg: |
1103
1103
  :ident_notmap : [/sequence/0/mapping/values/sequence/0] 'ident:': is available only with an element of mapping.
1104
1104
  #
1105
+ ---
1106
+ name: classname_notmap
1107
+ desc: classname_notmap
1108
+ schema: |
1109
+ type: map
1110
+ classname: User
1111
+ mapping:
1112
+ "name": { type: str, required: yes }
1113
+ "email": { type: str }
1114
+ "phones":
1115
+ type: seq
1116
+ classname: Phone
1117
+ sequence:
1118
+ - type: str
1119
+
1120
+ meta-msg: |
1121
+ :classname_notmap : [/mapping/phones/classname] 'classname:': available only with map type.
1122
+ rule-msg: |
1123
+ :classname_notmap : [/mapping/phones/classname] 'classname:': available only with map type.
@@ -1,51 +1,18 @@
1
1
  ###
2
- ### $Rev: 42 $
3
- ### $Release: 0.5.1 $
2
+ ### $Rev: 51 $
3
+ ### $Release: 0.6.0 $
4
4
  ### copyright(c) 2005 kuwata-lab all rights reserved.
5
5
  ###
6
6
 
7
- unless defined?(TESTDIR)
8
- TESTDIR = File.dirname(__FILE__)
9
- libdir = File.dirname(TESTDIR) + "/lib"
10
- $LOAD_PATH << libdir << TESTDIR
11
- end
12
-
13
- require 'test/unit'
14
- require 'test/unit/ui/console/testrunner'
15
- require 'kwalify'
16
- require 'kwalify/util/assert-diff'
17
- require 'yaml'
7
+ require File.dirname(__FILE__) + '/test.rb'
18
8
 
19
9
 
20
10
  class RuleTest < Test::Unit::TestCase
21
11
 
22
12
  ## define test methods
23
- testdata_filename = __FILE__.sub(/\.rb$/, '.yaml')
24
- str = File.read(testdata_filename)
25
- @@docs = {}
26
- YAML.load_documents(str) do |doc|
27
- name = doc['name']
28
- !@@docs.key?(name) or raise "*** test name '#name}' is duplicated."
29
- @@docs[name] = doc
30
- doc.each do |key, val|
31
- if key =~ /\A(.*)\*\z/
32
- doc[$1] ||= val['ruby']
33
- end
34
- end
35
- doc['schema'] = YAML.load(doc['input'])
36
- s = <<-END
37
- def test_#{name}
38
- doc = @@docs['#{name}']
39
- @name = doc['name']
40
- @desc = doc['desc']
41
- @input = doc['input']
42
- @schema = doc['schema']
43
- @exception = #{doc['exception'] == nil ? 'nil' : doc['error']}
44
- _test()
45
- end
46
- END
47
- eval s
48
- end
13
+ filename = __FILE__.sub(/\.rb$/, '.yaml')
14
+ load_yaml_testdata(filename, :lang=>'ruby')
15
+
49
16
 
50
17
  ## execute test
51
18
  def _test()
@@ -1,6 +1,6 @@
1
1
  ##
2
- ## $Rev: 2 $
3
- ## $Release: 0.5.1 $
2
+ ## $Rev: 48 $
3
+ ## $Release: 0.6.0 $
4
4
  ## copyright(c) 2005 kuwata-lab all rights reserved.
5
5
  ##
6
6
  ---
@@ -1,44 +1,18 @@
1
1
  ###
2
- ### $Rev: 42 $
3
- ### $Release: 0.5.1 $
2
+ ### $Rev: 51 $
3
+ ### $Release: 0.6.0 $
4
4
  ### copyright(c) 2005 kuwata-lab all rights reserved.
5
5
  ###
6
6
 
7
- unless defined?(TESTDIR)
8
- TESTDIR = File.dirname(__FILE__)
9
- libdir = File.dirname(TESTDIR) + "/lib"
10
- $LOAD_PATH << libdir << TESTDIR
11
- end
12
-
13
- require 'test/unit'
14
- require 'test/unit/ui/console/testrunner'
15
- require 'kwalify'
16
- require 'kwalify/util/assert-diff'
17
- require 'yaml'
7
+ require File.dirname(__FILE__) + '/test.rb'
18
8
 
19
9
 
20
10
  class ValidatorTest < Test::Unit::TestCase
21
11
 
12
+
22
13
  ## define test methods
23
- #str = DATA.read() # doesn't work when required by other script
24
- str = File.read(__FILE__)
25
- str.gsub!(/.*^__END__$/m, '')
26
- name_table = {}
27
- YAML.load_documents(str) do |doc|
28
- !name_table.key?(doc['name']) or raise "*** test name '#{doc['name']}' is duplicated."
29
- name_table[doc['name']] = true
30
- s = <<-END
31
- def test_#{doc['name']}
32
- @name = #{doc['name'].dump}
33
- @schema = #{doc['schema'].dump}
34
- @valid = #{doc['valid'].dump}
35
- @invalid = #{doc['invalid'].dump}
36
- @error = #{doc['error'].dump}
37
- _test()
38
- end
39
- END
40
- eval s
41
- end
14
+ filename = __FILE__.sub(/\.rb$/, '.yaml')
15
+ load_yaml_testdata(filename, :lang=>'ruby')
42
16
 
43
17
 
44
18
  ## execute test
@@ -48,856 +22,49 @@ class ValidatorTest < Test::Unit::TestCase
48
22
  schema = YAML.load(@schema)
49
23
  validator = Kwalify::Validator.new(schema)
50
24
  error2 = @error.gsub(/\(line \d+\)/, '')
51
- _test_body(validator, @valid, '' , false)
52
- _test_body(validator, @invalid, error2, false)
25
+ _test_by_syck_parser(validator, @valid, '' )
26
+ _test_by_syck_parser(validator, @invalid, error2)
53
27
  # Kwalify::YamlParser
54
28
  schema = Kwalify::YamlParser.new(@schema).parse()
55
29
  validator = Kwalify::Validator.new(schema)
56
- _test_body(validator, @valid, '' , true)
57
- _test_body(validator, @invalid, @error, true)
30
+ _test_by_kwalify_parser(validator, @valid, '' )
31
+ _test_by_kwalify_parser(validator, @invalid, @error)
58
32
  end
59
33
 
60
- def _test_body(validator, input, expected, flag_parser)
61
- if flag_parser
62
- parser = Kwalify::YamlParser.new(input)
63
- document = parser.parse()
64
- else
65
- document = YAML.load(input)
66
- end
34
+
35
+ def _test_by_kwalify_parser(validator, input, expected)
36
+ parser = Kwalify::YamlParser.new(input)
37
+ document = parser.parse()
67
38
  error_list = validator.validate(document)
68
- actual = ""
39
+ parser.set_errors_linenum(error_list)
40
+ error_list.sort!
41
+ actual = ''
69
42
  error_list.each do |error|
70
- errsym = error.error_symbol.inspect
71
- if flag_parser
72
- linenum = parser.path_linenum(error.path)
73
- actual << "%-20s: (line %d)[%s] %s\n" % [errsym, linenum, error.path, error.message]
74
- else
75
- actual << "%-20s: [%s] %s\n" % [errsym, error.path, error.message]
76
- end
43
+ e = error
44
+ args = [e.error_symbol.inspect, e.linenum, e.path, e.message]
45
+ actual << "%-20s: (line %d)[%s] %s\n" % args
77
46
  end
78
47
  if $print
79
48
  print actual
80
49
  else
81
- assert_equal_with_diff(expected, actual)
50
+ assert_text_equal(expected, actual)
82
51
  end
83
52
  end
84
53
 
85
- end
86
54
 
87
- #if $0 == __FILE__
88
- # Test::Unit::UI::Console::TestRunner.run(ValidatorTest)
89
- #end
55
+ def _test_by_syck_parser(validator, input, expected)
56
+ document = YAML.load(input)
57
+ error_list = validator.validate(document)
58
+ expected = expected.to_a.sort.join()
59
+ actual = error_list.collect { |e|
60
+ "%-20s: [%s] %s\n" % [e.error_symbol.inspect, e.path, e.message]
61
+ }.sort.join()
62
+ if $print
63
+ print actual
64
+ else
65
+ assert_text_equal(expected, actual)
66
+ end
67
+ end
90
68
 
91
- __END__
92
- ---
93
- name: mapping1
94
- desc: mapping test
95
- #
96
- schema: |
97
- type: map
98
- required: true
99
- mapping:
100
- name:
101
- type: str
102
- required: true
103
- email:
104
- type: str
105
- pattern: /@/
106
- required: yes
107
- age:
108
- type: int
109
- blood:
110
- type: str
111
- enum:
112
- - A
113
- - B
114
- - O
115
- - AB
116
- birth:
117
- type: date
118
- #
119
- valid: |
120
- name: foo
121
- email: foo@mail.com
122
- age: 20
123
- blood: AB
124
- birth: 1985-01-01
125
- #
126
- invalid: |
127
- nam: foo
128
- email: foo(at)mail.com
129
- age: twenty
130
- blood: ab
131
- birth: Jul 01, 1985
132
- #
133
- error: |
134
- :required_nokey : (line 1)[/] key 'name:' is required.
135
- :key_undefined : (line 1)[/nam] key 'nam:' is undefined.
136
- :enum_notexist : (line 4)[/blood] 'ab': invalid blood value.
137
- :type_unmatch : (line 5)[/birth] 'Jul 01, 1985': not a date.
138
- :type_unmatch : (line 3)[/age] 'twenty': not a integer.
139
- :pattern_unmatch : (line 2)[/email] 'foo(at)mail.com': not matched to pattern /@/.
140
- #
141
- ---
142
- name: sequence1
143
- desc: sequence test
144
- #
145
- schema: |
146
- type: seq
147
- required: true
148
- sequence:
149
- - type: str
150
- required: true
151
- #
152
- valid: |
153
- - foo
154
- - bar
155
- - baz
156
- #
157
- invalid: |
158
- - foo
159
- - bar
160
- -
161
- - baz
162
- - 100
163
- #
164
- error: |
165
- :required_novalue : (line 3)[/2] value required but none.
166
- :type_unmatch : (line 5)[/4] '100': not a string.
167
- #
168
- ---
169
- name: nested1
170
- desc: nest of seq and map
171
- #
172
- schema: |
173
- type: map
174
- required: true
175
- mapping:
176
- address-book:
177
- type: seq
178
- required: true
179
- sequence:
180
- - type: map
181
- mapping:
182
- name:
183
- type: str
184
- required: yes
185
- email:
186
- type: str
187
- pattern: /@/
188
- required: yes
189
- age:
190
- type: int
191
- blood:
192
- type: str
193
- enum:
194
- - A
195
- - B
196
- - O
197
- - AB
198
- birth:
199
- type: date
200
- #
201
- valid: |
202
- address-book:
203
- - name: foo
204
- email: foo@mail.com
205
- age: 20
206
- blood: AB
207
- birth: 1985-01-01
208
- - name: bar
209
- email: foo@mail.com
210
- #
211
- invalid: |
212
- address-book:
213
- - name: foo
214
- mail: foo@mail.com
215
- age: twenty
216
- blood: ab
217
- birth: 1985/01/01
218
- - name: bar
219
- email: bar(at)mail.com
220
- #
221
- error: |
222
- :required_nokey : (line 2)[/address-book/0] key 'email:' is required.
223
- :key_undefined : (line 3)[/address-book/0/mail] key 'mail:' is undefined.
224
- :enum_notexist : (line 5)[/address-book/0/blood] 'ab': invalid blood value.
225
- :type_unmatch : (line 6)[/address-book/0/birth] '1985/01/01': not a date.
226
- :type_unmatch : (line 4)[/address-book/0/age] 'twenty': not a integer.
227
- :pattern_unmatch : (line 8)[/address-book/1/email] 'bar(at)mail.com': not matched to pattern /@/.
228
- #
229
- ---
230
- name: anchor1
231
- desc: schema with anchor
232
- #
233
- schema: |
234
- type: seq
235
- required: true
236
- sequence:
237
- - type: map
238
- required: true
239
- mapping:
240
- first-name: &name
241
- type: str
242
- required: yes
243
- family-name: *name
244
- #
245
- valid: |
246
- - first-name: foo
247
- family-name: Foo
248
- - first-name: bar
249
- family-name: Bar
250
- #
251
- invalid: |
252
- - first-name: foo
253
- last-name: Foo
254
- - first-name: bar
255
- family-name: 100
256
- #
257
- error: |
258
- :required_nokey : (line 1)[/0] key 'family-name:' is required.
259
- :key_undefined : (line 2)[/0/last-name] key 'last-name:' is undefined.
260
- :type_unmatch : (line 4)[/1/family-name] '100': not a string.
261
- #
262
- ---
263
- name: anchor2
264
- desc: schema with anchor 2
265
- #
266
- schema: |
267
- type: map
268
- required: true
269
- mapping:
270
- title: &name
271
- type: str
272
- required: true
273
- address-book:
274
- type: seq
275
- required: true
276
- sequence:
277
- - type: map
278
- mapping:
279
- name: *name
280
- email:
281
- type: str
282
- required: yes
283
- #
284
- valid: |
285
- title: my friends
286
- address-book:
287
- - name: foo
288
- email: foo@mail.com
289
- - name: bar
290
- email: bar@mail.com
291
- #
292
- invalid: |
293
- title: my friends
294
- address-book:
295
- - name: 100
296
- email: foo@mail.com
297
- - first-name: bar
298
- email: bar@mail.com
299
- #
300
- error: |
301
- :type_unmatch : (line 3)[/address-book/0/name] '100': not a string.
302
- :required_nokey : (line 5)[/address-book/1] key 'name:' is required.
303
- :key_undefined : (line 5)[/address-book/1/first-name] key 'first-name:' is undefined.
304
- #
305
- ---
306
- name: anchor3
307
- desc: document with anchor
308
- #
309
- schema: |
310
- type: seq
311
- sequence:
312
- - &employee
313
- type: map
314
- mapping:
315
- name:
316
- type: str
317
- post:
318
- type: str
319
- enum:
320
- - exective
321
- - manager
322
- - clerk
323
- supervisor: *employee
324
- #
325
- valid: |
326
- - &foo
327
- name: foo
328
- post: exective
329
- - &bar
330
- name: bar
331
- post: manager
332
- supervisor: *foo
333
- - &baz
334
- name: baz
335
- post: clerk
336
- supervisor: *bar
337
- - &zak
338
- name: zak
339
- post: clerk
340
- supervisor: *bar
341
- #
342
- invalid: |
343
- - &foo
344
- name: 100
345
- post: exective
346
- supervisor: *foo
347
- - &bar
348
- name: foo
349
- post: worker
350
- supervisor: *foo
351
- #
352
- error: |
353
- :type_unmatch : (line 2)[/0/name] '100': not a string.
354
- :enum_notexist : (line 7)[/1/post] 'worker': invalid post value.
355
- #
356
- ---
357
- name: range1
358
- desc: range test && bug#?????
359
- #
360
- schema: |
361
- type: map
362
- mapping:
363
- "max-only":
364
- type: seq
365
- sequence:
366
- - type: number
367
- required: yes
368
- range: { max: 100 }
369
- "min-only":
370
- type: seq
371
- sequence:
372
- - type: number
373
- required: yes
374
- range: { min: 10.0 }
375
- "max-and-min":
376
- type: seq
377
- sequence:
378
- - type: number
379
- required: yes
380
- range: { max: 100.0, min: 10.0 }
381
- #
382
- valid: |
383
- max-only:
384
- - 100
385
- - 100.0
386
- min-only:
387
- - 10
388
- - 10.0
389
- max-and-min:
390
- - 100
391
- - 10
392
- - 100.0
393
- - 10.0
394
- #
395
- invalid: |
396
- max-only:
397
- - 101
398
- - 100.1
399
- min-only:
400
- - 9
401
- - 9.99
402
- max-and-min:
403
- - 101
404
- - 100.1
405
- - 9
406
- - 9.99
407
- #
408
- error: |
409
- :range_toosmall : (line 5)[/min-only/0] '9': too small (< min 10.0).
410
- :range_toosmall : (line 6)[/min-only/1] '9.99': too small (< min 10.0).
411
- :range_toolarge : (line 8)[/max-and-min/0] '101': too large (> max 100.0).
412
- :range_toolarge : (line 9)[/max-and-min/1] '100.1': too large (> max 100.0).
413
- :range_toosmall : (line 10)[/max-and-min/2] '9': too small (< min 10.0).
414
- :range_toosmall : (line 11)[/max-and-min/3] '9.99': too small (< min 10.0).
415
- :range_toolarge : (line 2)[/max-only/0] '101': too large (> max 100).
416
- :range_toolarge : (line 3)[/max-only/1] '100.1': too large (> max 100).
417
- #
418
- ---
419
- name: range2
420
- desc: range test (with max-ex and min-ex)
421
- #
422
- schema: |
423
- type: map
424
- mapping:
425
- "max-ex-only":
426
- type: seq
427
- sequence:
428
- - type: number
429
- required: yes
430
- range: { max-ex: 100 }
431
- "min-ex-only":
432
- type: seq
433
- sequence:
434
- - type: number
435
- required: yes
436
- range: { min-ex: 10.0 }
437
- "max-ex-and-min-ex":
438
- type: seq
439
- sequence:
440
- - type: number
441
- required: yes
442
- range: { max-ex: 100.0, min-ex: 10.0 }
443
- #
444
- valid: |
445
- max-ex-only:
446
- - 99
447
- - 99.99999
448
- min-ex-only:
449
- - 11
450
- - 10.00001
451
- max-ex-and-min-ex:
452
- - 99
453
- - 11
454
- - 99.99999
455
- - 10.00001
456
- #
457
- invalid: |
458
- max-ex-only:
459
- - 100
460
- - 100.0
461
- min-ex-only:
462
- - 10
463
- - 10.0
464
- max-ex-and-min-ex:
465
- - 100
466
- - 100.0
467
- - 10
468
- - 10.0
469
- #
470
- error: |
471
- :range_toosmallex : (line 5)[/min-ex-only/0] '10': too small (<= min 10.0).
472
- :range_toosmallex : (line 6)[/min-ex-only/1] '10.0': too small (<= min 10.0).
473
- :range_toolargeex : (line 2)[/max-ex-only/0] '100': too large (>= max 100).
474
- :range_toolargeex : (line 3)[/max-ex-only/1] '100.0': too large (>= max 100).
475
- :range_toolargeex : (line 8)[/max-ex-and-min-ex/0] '100': too large (>= max 100.0).
476
- :range_toolargeex : (line 9)[/max-ex-and-min-ex/1] '100.0': too large (>= max 100.0).
477
- :range_toosmallex : (line 10)[/max-ex-and-min-ex/2] '10': too small (<= min 10.0).
478
- :range_toosmallex : (line 11)[/max-ex-and-min-ex/3] '10.0': too small (<= min 10.0).
479
- #
480
- ---
481
- name: range3
482
- desc: range test (with max, min, max-ex and min-ex)
483
- #
484
- schema: |
485
- type: map
486
- mapping:
487
- "A":
488
- type: seq
489
- sequence:
490
- - type: number
491
- required: yes
492
- range: { max: 100, min-ex: 10.0 }
493
- "B":
494
- type: seq
495
- sequence:
496
- - type: number
497
- required: yes
498
- range: { min: 10, max-ex: 100.0 }
499
- #
500
- valid: |
501
- A:
502
- - 100
503
- - 10.00001
504
- B:
505
- - 10
506
- - 99.99999
507
- #
508
- invalid: |
509
- A:
510
- - 100.00001
511
- - 10.0
512
- B:
513
- - 9.99999
514
- - 100.0
515
- #
516
- error: |
517
- :range_toolarge : (line 2)[/A/0] '100.00001': too large (> max 100).
518
- :range_toosmallex : (line 3)[/A/1] '10.0': too small (<= min 10.0).
519
- :range_toosmall : (line 5)[/B/0] '9.99999': too small (< min 10).
520
- :range_toolargeex : (line 6)[/B/1] '100.0': too large (>= max 100.0).
521
- #
522
- ---
523
- name: length1
524
- desc: length test
525
- #
526
- schema: |
527
- type: map
528
- mapping:
529
- "max-only":
530
- type: seq
531
- sequence:
532
- - type: text
533
- length: { max: 8 }
534
- "min-only":
535
- type: seq
536
- sequence:
537
- - type: text
538
- length: { min: 4 }
539
- "max-and-min":
540
- type: seq
541
- sequence:
542
- - type: text
543
- length: { max: 8, min: 4 }
544
- #
545
- valid: |
546
- max-only:
547
- - hogehoge
548
- - 12345678
549
- - a
550
- -
551
- min-only:
552
- - hoge
553
- - 1234
554
- - hogehogehogehogehoge
555
- max-and-min:
556
- - hogehoge
557
- - 12345678
558
- - hoge
559
- - 1234
560
- #
561
- invalid: |
562
- max-only:
563
- - hogehoge!
564
- min-only:
565
- - foo
566
- -
567
- max-and-min:
568
- - foobarbaz
569
- - foo
570
- #
571
- error: |
572
- :length_tooshort : (line 4)[/min-only/0] 'foo': too short (length 3 < min 4).
573
- :length_toolong : (line 7)[/max-and-min/0] 'foobarbaz': too long (length 9 > max 8).
574
- :length_tooshort : (line 8)[/max-and-min/1] 'foo': too short (length 3 < min 4).
575
- :length_toolong : (line 2)[/max-only/0] 'hogehoge!': too long (length 9 > max 8).
576
- #
577
- ---
578
- name: length2
579
- desc: length test (with max-ex and min-ex)
580
- #
581
- schema: |
582
- type: map
583
- mapping:
584
- "max-ex-only":
585
- type: seq
586
- sequence:
587
- - type: text
588
- length: { max-ex: 8 }
589
- "min-ex-only":
590
- type: seq
591
- sequence:
592
- - type: text
593
- length: { min-ex: 4 }
594
- "max-ex-and-min-ex":
595
- type: seq
596
- sequence:
597
- - type: text
598
- length: { max-ex: 8, min-ex: 4 }
599
- #
600
- valid: |
601
- max-ex-only:
602
- - hogehog
603
- - 1234567
604
- - a
605
- -
606
- min-ex-only:
607
- - hoge!
608
- - 1234!
609
- - hogehogehogehogehoge
610
- max-ex-and-min-ex:
611
- - hogehog
612
- - 1234567
613
- - hoge!
614
- - 1234!
615
- #
616
- invalid: |
617
- max-ex-only:
618
- - hogehoge
619
- min-ex-only:
620
- - foo!
621
- -
622
- max-ex-and-min-ex:
623
- - foobarba
624
- - foo!
625
- #
626
- error: |
627
- :length_tooshortex : (line 4)[/min-ex-only/0] 'foo!': too short (length 4 <= min 4).
628
- :length_toolongex : (line 2)[/max-ex-only/0] 'hogehoge': too long (length 8 >= max 8).
629
- :length_toolongex : (line 7)[/max-ex-and-min-ex/0] 'foobarba': too long (length 8 >= max 8).
630
- :length_tooshortex : (line 8)[/max-ex-and-min-ex/1] 'foo!': too short (length 4 <= min 4).
631
- #
632
- ---
633
- name: length3
634
- desc: length test (with min, max, max-ex and min-ex)
635
- #
636
- schema: |
637
- type: map
638
- mapping:
639
- "A":
640
- type: seq
641
- sequence:
642
- - type: text
643
- length: { max: 8, min-ex: 4 }
644
- "B":
645
- type: seq
646
- sequence:
647
- - type: text
648
- length: { max-ex: 8, min: 4 }
649
- #
650
- valid: |
651
- A:
652
- - hogehoge
653
- - 12345
654
- B:
655
- - hogehog
656
- - 1234
657
- #
658
- invalid: |
659
- A:
660
- - hogehoge!
661
- - 1234
662
- B:
663
- - hogehoge
664
- - 123
665
- #
666
- error: |
667
- :length_toolong : (line 2)[/A/0] 'hogehoge!': too long (length 9 > max 8).
668
- :length_tooshortex : (line 3)[/A/1] '1234': too short (length 4 <= min 4).
669
- :length_toolongex : (line 5)[/B/0] 'hogehoge': too long (length 8 >= max 8).
670
- :length_tooshort : (line 6)[/B/1] '123': too short (length 3 < min 4).
671
- #
672
- ---
673
- name: assert1
674
- desc: assert test
675
- #
676
- schema: |
677
- type: seq
678
- sequence:
679
- - type: map
680
- mapping:
681
- "less-than":
682
- type: number
683
- assert: val < 8
684
- "more-than":
685
- type: number
686
- assert: 3 < val
687
- "between":
688
- type: number
689
- assert: 3 < val && val < 8
690
- "except":
691
- type: number
692
- assert: val < 3 || 8 < val
693
- #
694
- valid: |
695
- - less-than: 5
696
- - more-than: 5
697
- - between: 5
698
- - except: 0
699
- #
700
- invalid: |
701
- - less-than: 8
702
- - more-than: 3
703
- - between: 2.9
704
- - except: 3.1
705
- #
706
- error: |
707
- :assert_failed : (line 1)[/0/less-than] '8': assertion expression failed (val < 8).
708
- :assert_failed : (line 2)[/1/more-than] '3': assertion expression failed (3 < val).
709
- :assert_failed : (line 3)[/2/between] '2.9': assertion expression failed (3 < val && val < 8).
710
- :assert_failed : (line 4)[/3/except] '3.1': assertion expression failed (val < 3 || 8 < val).
711
- #
712
- ---
713
- name: deftype1
714
- desc: default type test
715
- #
716
- schema: |
717
- type: seq
718
- sequence:
719
- - type: map
720
- mapping:
721
- "name":
722
- "email":
723
- #
724
- valid: |
725
- - name: foo
726
- email: foo@mail.com
727
- - name: bar
728
- - email: baz@mail.com
729
- #
730
- invalid: |
731
- - name: 123
732
- email: true
733
- - name: 3.14
734
- - email: 2004-01-01
735
- #
736
- error: |
737
- :type_unmatch : (line 1)[/0/name] '123': not a string.
738
- :type_unmatch : (line 2)[/0/email] 'true': not a string.
739
- :type_unmatch : (line 3)[/1/name] '3.14': not a string.
740
- :type_unmatch : (line 4)[/2/email] '2004-01-01': not a string.
741
- #
742
- ---
743
- name: ident1
744
- desc: ident constraint test
745
- #
746
- schema: |
747
- type: seq
748
- sequence:
749
- - type: map
750
- mapping:
751
- "name":
752
- ident: yes
753
- "age":
754
- type: int
755
- #
756
- valid: |
757
- - name: foo
758
- age: 10
759
- - name: bar
760
- age: 10
761
- - name: baz
762
- age: 10
763
- #
764
- invalid: |
765
- - name: foo
766
- age: 10
767
- - name: bar
768
- age: 10
769
- - name: bar
770
- age: 10
771
- #
772
- error: |
773
- :value_notunique : (line 5)[/2/name] 'bar': is already used at '/1/name'.
774
- #
775
- ---
776
- name: unique1
777
- desc: unique constraint test with map
778
- #
779
- schema: |
780
- type: seq
781
- sequence:
782
- - type: map
783
- mapping:
784
- "name":
785
- unique: yes
786
- "age":
787
- type: int
788
- #
789
- valid: |
790
- - name: foo
791
- age: 10
792
- - name: bar
793
- age: 10
794
- - name: baz
795
- age: 10
796
- #
797
- invalid: |
798
- - name: foo
799
- age: 10
800
- - name: bar
801
- age: 10
802
- - name: bar
803
- age: 10
804
- #
805
- error: |
806
- :value_notunique : (line 5)[/2/name] 'bar': is already used at '/1/name'.
807
- #
808
- ---
809
- name: unique2
810
- desc: unique constraint test with seq
811
- #
812
- schema: |
813
- type: seq
814
- sequence:
815
- - type: str
816
- unique: yes
817
- #
818
- valid: |
819
- - foo
820
- - ~
821
- - bar
822
- - ~
823
- - baz
824
- #
825
- invalid: |
826
- - foo
827
- - ~
828
- - bar
829
- - ~
830
- - bar
831
- #
832
- error: |
833
- :value_notunique : (line 5)[/4] 'bar': is already used at '/2'.
834
- #
835
- ---
836
- name: default1
837
- desc: default value of map
838
- #
839
- schema: |
840
- type: map
841
- mapping:
842
- =:
843
- type: number
844
- range: { min: -10, max: 10 }
845
- #
846
- valid: |
847
- value1: 0
848
- value2: 10
849
- value3: -10
850
- #
851
- invalid: |
852
- value1: 0
853
- value2: 20
854
- value3: -20
855
- error: |
856
- :range_toolarge : (line 2)[/value2] '20': too large (> max 10).
857
- :range_toosmall : (line 3)[/value3] '-20': too small (< min -10).
858
- ---
859
- name: merge1
860
- desc: merge maps
861
- #
862
- schema: |
863
- type: map
864
- mapping:
865
- "group":
866
- type: map
867
- mapping:
868
- "name": &name
869
- type: str
870
- required: yes
871
- "email": &email
872
- type: str
873
- pattern: /@/
874
- required: no
875
- "user":
876
- type: map
877
- mapping:
878
- "name":
879
- <<: *name # merge
880
- length: { max: 16 } # add
881
- "email":
882
- <<: *email # merge
883
- required: yes # override
884
- #
885
- valid: |
886
- group:
887
- name: foo
888
- email: foo@mail.com
889
- user:
890
- name: bar
891
- email: bar@mail.com
892
- #
893
- invalid: |
894
- group:
895
- name: foo
896
- email: foo@mail.com
897
- user:
898
- name: toooooo-looooong-naaaame
899
- #
900
- error: |
901
- :required_nokey : (line 4)[/user] key 'email:' is required.
902
- :length_toolong : (line 5)[/user/name] 'toooooo-looooong-naaaame': too long (length 24 > max 16).
903
- #
69
+
70
+ end