mkrf 0.1.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 (186) hide show
  1. data/CHANGELOG +2 -0
  2. data/MIT-LICENSE +7 -0
  3. data/README +54 -0
  4. data/Rakefile +107 -0
  5. data/lib/mkrf.rb +4 -0
  6. data/lib/mkrf/availability.rb +219 -0
  7. data/lib/mkrf/generator.rb +146 -0
  8. data/test/abstract_unit.rb +4 -0
  9. data/test/fixtures/down_a_directory/header_down_a_directory.h +1 -0
  10. data/test/fixtures/stdmkrf.h +1 -0
  11. data/test/sample_files/libtrivial/Rakefile +31 -0
  12. data/test/sample_files/libtrivial/extconf.rb +3 -0
  13. data/test/sample_files/libtrivial/lib/libtrivial.c +5 -0
  14. data/test/sample_files/libtrivial/lib/libtrivial.o +0 -0
  15. data/test/sample_files/libtrivial/libtrivial_so.bundle +0 -0
  16. data/test/sample_files/libtrivial/mkrf.log +1 -0
  17. data/test/sample_files/libxml-ruby-0.3.8/CHANGELOG +74 -0
  18. data/test/sample_files/libxml-ruby-0.3.8/LICENSE +22 -0
  19. data/test/sample_files/libxml-ruby-0.3.8/README +144 -0
  20. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/cbg.c +76 -0
  21. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/extconf.rb +49 -0
  22. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/libxml.c +86 -0
  23. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/libxml.h +82 -0
  24. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/libxml.rb +107 -0
  25. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/mkrf.log +1 -0
  26. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/old_extconf.rb +95 -0
  27. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_attr.c +372 -0
  28. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_attr.h +21 -0
  29. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_attribute.c +224 -0
  30. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_attribute.h +21 -0
  31. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_document.c +1159 -0
  32. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_document.h +27 -0
  33. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_dtd.c +168 -0
  34. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_dtd.h +17 -0
  35. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_input_cbg.c +167 -0
  36. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_input_cbg.h +21 -0
  37. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_node.c +2139 -0
  38. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_node.h +28 -0
  39. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_node_set.c +248 -0
  40. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_node_set.h +26 -0
  41. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_ns.c +153 -0
  42. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_ns.h +21 -0
  43. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_parser.c +1417 -0
  44. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_parser.h +31 -0
  45. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_parser_context.c +715 -0
  46. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_parser_context.h +22 -0
  47. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_sax_parser.c +426 -0
  48. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_sax_parser.h +52 -0
  49. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_schema.c +142 -0
  50. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_schema.h +16 -0
  51. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_tree.c +43 -0
  52. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_tree.h +12 -0
  53. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_xinclude.c +20 -0
  54. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_xinclude.h +13 -0
  55. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_xpath.c +363 -0
  56. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_xpath.h +24 -0
  57. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_xpath_context.c +125 -0
  58. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_xpath_context.h +24 -0
  59. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_xpointer.c +100 -0
  60. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_xpointer.h +27 -0
  61. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_xpointer_context.c +21 -0
  62. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/ruby_xml_xpointer_context.h +18 -0
  63. data/test/sample_files/libxml-ruby-0.3.8/ext/xml/sax_parser_callbacks.inc +202 -0
  64. data/test/sample_files/syck-0.55/CHANGELOG +186 -0
  65. data/test/sample_files/syck-0.55/COPYING +54 -0
  66. data/test/sample_files/syck-0.55/Makefile +582 -0
  67. data/test/sample_files/syck-0.55/Makefile.am +5 -0
  68. data/test/sample_files/syck-0.55/Makefile.in +582 -0
  69. data/test/sample_files/syck-0.55/README +105 -0
  70. data/test/sample_files/syck-0.55/README.BYTECODE +484 -0
  71. data/test/sample_files/syck-0.55/README.EXT +444 -0
  72. data/test/sample_files/syck-0.55/RELEASE +123 -0
  73. data/test/sample_files/syck-0.55/TODO +25 -0
  74. data/test/sample_files/syck-0.55/aclocal.m4 +883 -0
  75. data/test/sample_files/syck-0.55/bootstrap +7 -0
  76. data/test/sample_files/syck-0.55/config.h +79 -0
  77. data/test/sample_files/syck-0.55/config.h.in +78 -0
  78. data/test/sample_files/syck-0.55/config.status +1197 -0
  79. data/test/sample_files/syck-0.55/config/README +14 -0
  80. data/test/sample_files/syck-0.55/config/depcomp +529 -0
  81. data/test/sample_files/syck-0.55/config/install-sh +323 -0
  82. data/test/sample_files/syck-0.55/config/missing +357 -0
  83. data/test/sample_files/syck-0.55/configure +6728 -0
  84. data/test/sample_files/syck-0.55/configure.in +36 -0
  85. data/test/sample_files/syck-0.55/ext/ruby/CHANGELOG +303 -0
  86. data/test/sample_files/syck-0.55/ext/ruby/README +400 -0
  87. data/test/sample_files/syck-0.55/ext/ruby/ext/syck/MANIFEST +1 -0
  88. data/test/sample_files/syck-0.55/ext/ruby/ext/syck/bytecode.c +1170 -0
  89. data/test/sample_files/syck-0.55/ext/ruby/ext/syck/emitter.c +1224 -0
  90. data/test/sample_files/syck-0.55/ext/ruby/ext/syck/extconf.rb +10 -0
  91. data/test/sample_files/syck-0.55/ext/ruby/ext/syck/gram.c +1894 -0
  92. data/test/sample_files/syck-0.55/ext/ruby/ext/syck/gram.h +79 -0
  93. data/test/sample_files/syck-0.55/ext/ruby/ext/syck/handler.c +174 -0
  94. data/test/sample_files/syck-0.55/ext/ruby/ext/syck/implicit.c +2989 -0
  95. data/test/sample_files/syck-0.55/ext/ruby/ext/syck/mkrf.log +1 -0
  96. data/test/sample_files/syck-0.55/ext/ruby/ext/syck/node.c +407 -0
  97. data/test/sample_files/syck-0.55/ext/ruby/ext/syck/rubyext.c +2385 -0
  98. data/test/sample_files/syck-0.55/ext/ruby/ext/syck/syck.c +504 -0
  99. data/test/sample_files/syck-0.55/ext/ruby/ext/syck/syck.h +458 -0
  100. data/test/sample_files/syck-0.55/ext/ruby/ext/syck/token.c +2707 -0
  101. data/test/sample_files/syck-0.55/ext/ruby/ext/syck/yaml2byte.c +250 -0
  102. data/test/sample_files/syck-0.55/ext/ruby/ext/syck/yamlbyte.h +170 -0
  103. data/test/sample_files/syck-0.55/ext/ruby/install.rb +1022 -0
  104. data/test/sample_files/syck-0.55/ext/ruby/lib/okay.rb +161 -0
  105. data/test/sample_files/syck-0.55/ext/ruby/lib/okay/news.rb +69 -0
  106. data/test/sample_files/syck-0.55/ext/ruby/lib/okay/rpc.rb +434 -0
  107. data/test/sample_files/syck-0.55/ext/ruby/lib/yaml.rb +436 -0
  108. data/test/sample_files/syck-0.55/ext/ruby/lib/yaml/baseemitter.rb +247 -0
  109. data/test/sample_files/syck-0.55/ext/ruby/lib/yaml/basenode.rb +216 -0
  110. data/test/sample_files/syck-0.55/ext/ruby/lib/yaml/compat.rb +26 -0
  111. data/test/sample_files/syck-0.55/ext/ruby/lib/yaml/constants.rb +45 -0
  112. data/test/sample_files/syck-0.55/ext/ruby/lib/yaml/dbm.rb +111 -0
  113. data/test/sample_files/syck-0.55/ext/ruby/lib/yaml/emitter.rb +107 -0
  114. data/test/sample_files/syck-0.55/ext/ruby/lib/yaml/encoding.rb +33 -0
  115. data/test/sample_files/syck-0.55/ext/ruby/lib/yaml/error.rb +34 -0
  116. data/test/sample_files/syck-0.55/ext/ruby/lib/yaml/rubytypes.rb +438 -0
  117. data/test/sample_files/syck-0.55/ext/ruby/lib/yaml/store.rb +29 -0
  118. data/test/sample_files/syck-0.55/ext/ruby/lib/yaml/stream.rb +40 -0
  119. data/test/sample_files/syck-0.55/ext/ruby/lib/yaml/stringio.rb +83 -0
  120. data/test/sample_files/syck-0.55/ext/ruby/lib/yaml/syck.rb +19 -0
  121. data/test/sample_files/syck-0.55/ext/ruby/lib/yaml/tag.rb +86 -0
  122. data/test/sample_files/syck-0.55/ext/ruby/lib/yaml/types.rb +188 -0
  123. data/test/sample_files/syck-0.55/ext/ruby/lib/yaml/yamlnode.rb +54 -0
  124. data/test/sample_files/syck-0.55/ext/ruby/lib/yaml/ypath.rb +52 -0
  125. data/test/sample_files/syck-0.55/ext/ruby/lib/yod.rb +1168 -0
  126. data/test/sample_files/syck-0.55/ext/ruby/samples/okayNews-modules.rb +27 -0
  127. data/test/sample_files/syck-0.55/ext/ruby/samples/okayNews-sample.rb +336 -0
  128. data/test/sample_files/syck-0.55/ext/ruby/samples/okayNews-validate.rb +341 -0
  129. data/test/sample_files/syck-0.55/ext/ruby/samples/okayRpc-client.rb +51 -0
  130. data/test/sample_files/syck-0.55/ext/ruby/samples/okayRpc-server.rb +85 -0
  131. data/test/sample_files/syck-0.55/ext/ruby/samples/yaml-sortHashKeys.rb +128 -0
  132. data/test/sample_files/syck-0.55/ext/ruby/tests/basic.rb +1653 -0
  133. data/test/sample_files/syck-0.55/ext/ruby/yts/YtsAnchorAlias.yml +51 -0
  134. data/test/sample_files/syck-0.55/ext/ruby/yts/YtsBasicTests.yml +282 -0
  135. data/test/sample_files/syck-0.55/ext/ruby/yts/YtsBlockMapping.yml +78 -0
  136. data/test/sample_files/syck-0.55/ext/ruby/yts/YtsBlockSequence.yml +0 -0
  137. data/test/sample_files/syck-0.55/ext/ruby/yts/YtsDocumentSeparator.yml +102 -0
  138. data/test/sample_files/syck-0.55/ext/ruby/yts/YtsErrorTests.yml +23 -0
  139. data/test/sample_files/syck-0.55/ext/ruby/yts/YtsFlowCollections.yml +73 -0
  140. data/test/sample_files/syck-0.55/ext/ruby/yts/YtsFoldedScalars.yml +215 -0
  141. data/test/sample_files/syck-0.55/ext/ruby/yts/YtsMapInSeq.yml +0 -0
  142. data/test/sample_files/syck-0.55/ext/ruby/yts/YtsNullsAndEmpties.yml +66 -0
  143. data/test/sample_files/syck-0.55/ext/ruby/yts/YtsRubyTests.yml +182 -0
  144. data/test/sample_files/syck-0.55/ext/ruby/yts/YtsSpecificationExamples.yml +2699 -0
  145. data/test/sample_files/syck-0.55/ext/ruby/yts/YtsTypeTransfers.yml +265 -0
  146. data/test/sample_files/syck-0.55/ext/ruby/yts/YtsYpath.yml +221 -0
  147. data/test/sample_files/syck-0.55/ext/ruby/yts/cookbook.rb +159 -0
  148. data/test/sample_files/syck-0.55/ext/ruby/yts/index.yml +10 -0
  149. data/test/sample_files/syck-0.55/ext/ruby/yts/yts.rb +193 -0
  150. data/test/sample_files/syck-0.55/lib/Makefile +497 -0
  151. data/test/sample_files/syck-0.55/lib/Makefile.am +27 -0
  152. data/test/sample_files/syck-0.55/lib/Makefile.in +497 -0
  153. data/test/sample_files/syck-0.55/lib/bytecode.c +1170 -0
  154. data/test/sample_files/syck-0.55/lib/bytecode.re +525 -0
  155. data/test/sample_files/syck-0.55/lib/emitter.c +1224 -0
  156. data/test/sample_files/syck-0.55/lib/gram.c +1894 -0
  157. data/test/sample_files/syck-0.55/lib/gram.h +79 -0
  158. data/test/sample_files/syck-0.55/lib/gram.output +2005 -0
  159. data/test/sample_files/syck-0.55/lib/gram.y +481 -0
  160. data/test/sample_files/syck-0.55/lib/handler.c +174 -0
  161. data/test/sample_files/syck-0.55/lib/implicit.c +2989 -0
  162. data/test/sample_files/syck-0.55/lib/implicit.re +206 -0
  163. data/test/sample_files/syck-0.55/lib/node.c +407 -0
  164. data/test/sample_files/syck-0.55/lib/syck.c +504 -0
  165. data/test/sample_files/syck-0.55/lib/syck.h +458 -0
  166. data/test/sample_files/syck-0.55/lib/syck_st.c +577 -0
  167. data/test/sample_files/syck-0.55/lib/syck_st.h +46 -0
  168. data/test/sample_files/syck-0.55/lib/token.c +2707 -0
  169. data/test/sample_files/syck-0.55/lib/token.re +1139 -0
  170. data/test/sample_files/syck-0.55/lib/yaml2byte.c +250 -0
  171. data/test/sample_files/syck-0.55/lib/yamlbyte.h +170 -0
  172. data/test/sample_files/syck-0.55/stamp-h1 +1 -0
  173. data/test/sample_files/syck-0.55/tests/Basic.c +141 -0
  174. data/test/sample_files/syck-0.55/tests/CuTest.c +294 -0
  175. data/test/sample_files/syck-0.55/tests/CuTest.h +84 -0
  176. data/test/sample_files/syck-0.55/tests/Emit.c +87 -0
  177. data/test/sample_files/syck-0.55/tests/Makefile +480 -0
  178. data/test/sample_files/syck-0.55/tests/Makefile.am +13 -0
  179. data/test/sample_files/syck-0.55/tests/Makefile.in +480 -0
  180. data/test/sample_files/syck-0.55/tests/Parse.c +208 -0
  181. data/test/sample_files/syck-0.55/tests/YTS.c +2310 -0
  182. data/test/sample_files/syck-0.55/tests/YTS.c.erb +326 -0
  183. data/test/sample_files/syck-0.55/tests/YTS.c.rb +44 -0
  184. data/test/test_availability.rb +68 -0
  185. data/test/test_generator.rb +74 -0
  186. metadata +252 -0
@@ -0,0 +1,2699 @@
1
+ --- %YAML:1.0
2
+ test: Sequence of scalars
3
+ spec: 2.1
4
+ yaml: |
5
+ - Mark McGwire
6
+ - Sammy Sosa
7
+ - Ken Griffey
8
+ perl: |
9
+ [ 'Mark McGwire', 'Sammy Sosa', 'Ken Griffey' ]
10
+ python: |
11
+ [ ['Mark McGwire', 'Sammy Sosa', 'Ken Griffey'] ]
12
+ ruby: |
13
+ [ 'Mark McGwire', 'Sammy Sosa', 'Ken Griffey' ]
14
+ syck: |
15
+ struct test_node seq[] = {
16
+ { T_STR, 0, "Mark McGwire" },
17
+ { T_STR, 0, "Sammy Sosa" },
18
+ { T_STR, 0, "Ken Griffey" },
19
+ end_node
20
+ };
21
+ struct test_node stream[] = {
22
+ { T_SEQ, 0, 0, seq },
23
+ end_node
24
+ };
25
+
26
+ ---
27
+ test: Mapping of scalars to scalars
28
+ spec: 2.2
29
+ yaml: |
30
+ hr: 65
31
+ avg: 0.278
32
+ rbi: 147
33
+ perl: |
34
+ { hr => 65, avg => 0.278, rbi => 147 }
35
+ python: |
36
+ [ {'hr': 65, 'avg': .278, 'rbi': 147} ]
37
+ ruby: |
38
+ { 'hr' => 65, 'avg' => 0.278, 'rbi' => 147 }
39
+ syck: |
40
+ struct test_node map[] = {
41
+ { T_STR, 0, "hr" },
42
+ { T_STR, 0, "65" },
43
+ { T_STR, 0, "avg" },
44
+ { T_STR, 0, "0.278" },
45
+ { T_STR, 0, "rbi" },
46
+ { T_STR, 0, "147" },
47
+ end_node
48
+ };
49
+ struct test_node stream[] = {
50
+ { T_MAP, 0, 0, map },
51
+ end_node
52
+ };
53
+
54
+ ---
55
+ test: Mapping of scalars to sequences
56
+ spec: 2.3
57
+ yaml: |
58
+ american:
59
+ - Boston Red Sox
60
+ - Detroit Tigers
61
+ - New York Yankees
62
+ national:
63
+ - New York Mets
64
+ - Chicago Cubs
65
+ - Atlanta Braves
66
+ perl: |
67
+ { american =>
68
+ [ 'Boston Red Sox', 'Detroit Tigers',
69
+ 'New York Yankees' ],
70
+ national =>
71
+ [ 'New York Mets', 'Chicago Cubs',
72
+ 'Atlanta Braves' ]
73
+ }
74
+ python: |
75
+ [
76
+ {
77
+ 'american':
78
+ ['Boston Red Sox', 'Detroit Tigers',
79
+ 'New York Yankees'],
80
+ 'national':
81
+ ['New York Mets', 'Chicago Cubs',
82
+ 'Atlanta Braves']
83
+ }
84
+ ]
85
+ ruby: |
86
+ { 'american' =>
87
+ [ 'Boston Red Sox', 'Detroit Tigers',
88
+ 'New York Yankees' ],
89
+ 'national' =>
90
+ [ 'New York Mets', 'Chicago Cubs',
91
+ 'Atlanta Braves' ]
92
+ }
93
+ syck: |
94
+ struct test_node seq1[] = {
95
+ { T_STR, 0, "Boston Red Sox" },
96
+ { T_STR, 0, "Detroit Tigers" },
97
+ { T_STR, 0, "New York Yankees" },
98
+ end_node
99
+ };
100
+ struct test_node seq2[] = {
101
+ { T_STR, 0, "New York Mets" },
102
+ { T_STR, 0, "Chicago Cubs" },
103
+ { T_STR, 0, "Atlanta Braves" },
104
+ end_node
105
+ };
106
+ struct test_node map[] = {
107
+ { T_STR, 0, "american" },
108
+ { T_SEQ, 0, 0, seq1 },
109
+ { T_STR, 0, "national" },
110
+ { T_SEQ, 0, 0, seq2 },
111
+ end_node
112
+ };
113
+ struct test_node stream[] = {
114
+ { T_MAP, 0, 0, map },
115
+ end_node
116
+ };
117
+
118
+ ---
119
+ test: Sequence of mappings
120
+ spec: 2.4
121
+ yaml: |
122
+ -
123
+ name: Mark McGwire
124
+ hr: 65
125
+ avg: 0.278
126
+ -
127
+ name: Sammy Sosa
128
+ hr: 63
129
+ avg: 0.288
130
+ perl: |
131
+ [
132
+ {name => 'Mark McGwire', hr => 65, avg => 0.278},
133
+ {name => 'Sammy Sosa', hr => 63, avg => 0.288}
134
+ ]
135
+ python: |
136
+ [[
137
+ {
138
+ 'name': 'Mark McGwire',
139
+ 'hr': 65,
140
+ 'avg': 0.278
141
+ },
142
+ {
143
+ 'name': 'Sammy Sosa',
144
+ 'hr': 63,
145
+ 'avg': 0.288
146
+ }
147
+ ]]
148
+ ruby: |
149
+ [
150
+ {'name' => 'Mark McGwire', 'hr' => 65, 'avg' => 0.278},
151
+ {'name' => 'Sammy Sosa', 'hr' => 63, 'avg' => 0.288}
152
+ ]
153
+ syck: |
154
+ struct test_node map1[] = {
155
+ { T_STR, 0, "name" },
156
+ { T_STR, 0, "Mark McGwire" },
157
+ { T_STR, 0, "hr" },
158
+ { T_STR, 0, "65" },
159
+ { T_STR, 0, "avg" },
160
+ { T_STR, 0, "0.278" },
161
+ end_node
162
+ };
163
+ struct test_node map2[] = {
164
+ { T_STR, 0, "name" },
165
+ { T_STR, 0, "Sammy Sosa" },
166
+ { T_STR, 0, "hr" },
167
+ { T_STR, 0, "63" },
168
+ { T_STR, 0, "avg" },
169
+ { T_STR, 0, "0.288" },
170
+ end_node
171
+ };
172
+ struct test_node seq[] = {
173
+ { T_MAP, 0, 0, map1 },
174
+ { T_MAP, 0, 0, map2 },
175
+ end_node
176
+ };
177
+ struct test_node stream[] = {
178
+ { T_SEQ, 0, 0, seq },
179
+ end_node
180
+ };
181
+
182
+ ---
183
+ test: Legacy A5
184
+ spec: legacy_A5
185
+ yaml: |
186
+ ?
187
+ - New York Yankees
188
+ - Atlanta Braves
189
+ :
190
+ - 2001-07-02
191
+ - 2001-08-12
192
+ - 2001-08-14
193
+ ?
194
+ - Detroit Tigers
195
+ - Chicago Cubs
196
+ :
197
+ - 2001-07-23
198
+ perl-busted: >
199
+ YAML.pm will be able to emulate this behavior soon. In this regard
200
+ it may be somewhat more correct than Python's native behaviour which
201
+ can only use tuples as mapping keys. PyYAML will also need to figure
202
+ out some clever way to roundtrip structured keys.
203
+ python: |
204
+ [
205
+ {
206
+ ('New York Yankees', 'Atlanta Braves'):
207
+ [yaml.timestamp('2001-07-02'),
208
+ yaml.timestamp('2001-08-12'),
209
+ yaml.timestamp('2001-08-14')],
210
+ ('Detroit Tigers', 'Chicago Cubs'):
211
+ [yaml.timestamp('2001-07-23')]
212
+ }
213
+ ]
214
+ ruby: |
215
+ {
216
+ [ 'New York Yankees', 'Atlanta Braves' ] =>
217
+ [ Date.new( 2001, 7, 2 ), Date.new( 2001, 8, 12 ), Date.new( 2001, 8, 14 ) ],
218
+ [ 'Detroit Tigers', 'Chicago Cubs' ] =>
219
+ [ Date.new( 2001, 7, 23 ) ]
220
+ }
221
+ syck: |
222
+ struct test_node seq1[] = {
223
+ { T_STR, 0, "New York Yankees" },
224
+ { T_STR, 0, "Atlanta Braves" },
225
+ end_node
226
+ };
227
+ struct test_node seq2[] = {
228
+ { T_STR, 0, "2001-07-02" },
229
+ { T_STR, 0, "2001-08-12" },
230
+ { T_STR, 0, "2001-08-14" },
231
+ end_node
232
+ };
233
+ struct test_node seq3[] = {
234
+ { T_STR, 0, "Detroit Tigers" },
235
+ { T_STR, 0, "Chicago Cubs" },
236
+ end_node
237
+ };
238
+ struct test_node seq4[] = {
239
+ { T_STR, 0, "2001-07-23" },
240
+ end_node
241
+ };
242
+ struct test_node map[] = {
243
+ { T_SEQ, 0, 0, seq1 },
244
+ { T_SEQ, 0, 0, seq2 },
245
+ { T_SEQ, 0, 0, seq3 },
246
+ { T_SEQ, 0, 0, seq4 },
247
+ end_node
248
+ };
249
+ struct test_node stream[] = {
250
+ { T_MAP, 0, 0, map },
251
+ end_node
252
+ };
253
+
254
+ ---
255
+ test: Sequence of sequences
256
+ spec: 2.5
257
+ yaml: |
258
+ - [ name , hr , avg ]
259
+ - [ Mark McGwire , 65 , 0.278 ]
260
+ - [ Sammy Sosa , 63 , 0.288 ]
261
+ perl: |
262
+ [
263
+ [ 'name', 'hr', 'avg' ],
264
+ [ 'Mark McGwire', 65, 0.278 ],
265
+ [ 'Sammy Sosa', 63, 0.288 ],
266
+ ]
267
+ python: |
268
+ [[
269
+ [ 'name', 'hr', 'avg' ],
270
+ [ 'Mark McGwire', 65, 0.278 ],
271
+ [ 'Sammy Sosa', 63, 0.288 ]
272
+ ]]
273
+ ruby: |
274
+ [
275
+ [ 'name', 'hr', 'avg' ],
276
+ [ 'Mark McGwire', 65, 0.278 ],
277
+ [ 'Sammy Sosa', 63, 0.288 ]
278
+ ]
279
+ syck: |
280
+ struct test_node seq1[] = {
281
+ { T_STR, 0, "name" },
282
+ { T_STR, 0, "hr" },
283
+ { T_STR, 0, "avg" },
284
+ end_node
285
+ };
286
+ struct test_node seq2[] = {
287
+ { T_STR, 0, "Mark McGwire" },
288
+ { T_STR, 0, "65" },
289
+ { T_STR, 0, "0.278" },
290
+ end_node
291
+ };
292
+ struct test_node seq3[] = {
293
+ { T_STR, 0, "Sammy Sosa" },
294
+ { T_STR, 0, "63" },
295
+ { T_STR, 0, "0.288" },
296
+ end_node
297
+ };
298
+ struct test_node seq[] = {
299
+ { T_SEQ, 0, 0, seq1 },
300
+ { T_SEQ, 0, 0, seq2 },
301
+ { T_SEQ, 0, 0, seq3 },
302
+ end_node
303
+ };
304
+ struct test_node stream[] = {
305
+ { T_SEQ, 0, 0, seq },
306
+ end_node
307
+ };
308
+
309
+ ---
310
+ test: Mapping of mappings
311
+ spec: 2.6
312
+ yaml: |
313
+ Mark McGwire: {hr: 65, avg: 0.278}
314
+ Sammy Sosa: {
315
+ hr: 63,
316
+ avg: 0.288
317
+ }
318
+ perl-xxx: |
319
+ {
320
+ 'Mark McGwire' => { 'hr' => 65, 'avg' => 0.278 },
321
+ 'Sammy Sosa' => { 'hr' => 63, 'avg' => 0.288 },
322
+ }
323
+ not_yet_in_python: |
324
+ [{
325
+ 'Mark McGwire':
326
+ { 'hr': 65, 'avg': 0.278 },
327
+ 'Sammy Sosa':
328
+ { 'hr': 63, 'avg': 0.288 }
329
+ }]
330
+ ruby: |
331
+ {
332
+ 'Mark McGwire' =>
333
+ { 'hr' => 65, 'avg' => 0.278 },
334
+ 'Sammy Sosa' =>
335
+ { 'hr' => 63, 'avg' => 0.288 }
336
+ }
337
+ syck: |
338
+ struct test_node map1[] = {
339
+ { T_STR, 0, "hr" },
340
+ { T_STR, 0, "65" },
341
+ { T_STR, 0, "avg" },
342
+ { T_STR, 0, "0.278" },
343
+ end_node
344
+ };
345
+ struct test_node map2[] = {
346
+ { T_STR, 0, "hr" },
347
+ { T_STR, 0, "63" },
348
+ { T_STR, 0, "avg" },
349
+ { T_STR, 0, "0.288" },
350
+ end_node
351
+ };
352
+ struct test_node map[] = {
353
+ { T_STR, 0, "Mark McGwire" },
354
+ { T_MAP, 0, 0, map1 },
355
+ { T_STR, 0, "Sammy Sosa" },
356
+ { T_MAP, 0, 0, map2 },
357
+ end_node
358
+ };
359
+ struct test_node stream[] = {
360
+ { T_MAP, 0, 0, map },
361
+ end_node
362
+ };
363
+
364
+ ---
365
+ test: Two documents in a stream each with a
366
+ leading comment
367
+ spec: 2.7
368
+ yaml: |
369
+ # Ranking of 1998 home runs
370
+ ---
371
+ - Mark McGwire
372
+ - Sammy Sosa
373
+ - Ken Griffey
374
+
375
+ # Team ranking
376
+ ---
377
+ - Chicago Cubs
378
+ - St Louis Cardinals
379
+ perl: |
380
+ { name => 'Mark McGwire', 'hr' => 65, 'avg' => 0.278 },
381
+ { name => 'Sammy Sosa', 'hr' => 63, 'avg' => 0.288 }
382
+ python: |
383
+ [
384
+ { 'name': 'Mark McGwire', 'hr': 65, 'avg': 0.278 },
385
+ { 'name': 'Sammy Sosa', 'hr': 63, 'avg': 0.288 }
386
+ ]
387
+ ruby: |
388
+ y = YAML::Stream.new
389
+ y.add( [ 'Mark McGwire', 'Sammy Sosa', 'Ken Griffey' ] )
390
+ y.add( [ 'Chicago Cubs', 'St Louis Cardinals' ] )
391
+ syck: |
392
+ struct test_node seq1[] = {
393
+ { T_STR, 0, "Mark McGwire" },
394
+ { T_STR, 0, "Sammy Sosa" },
395
+ { T_STR, 0, "Ken Griffey" },
396
+ end_node
397
+ };
398
+ struct test_node seq2[] = {
399
+ { T_STR, 0, "Chicago Cubs" },
400
+ { T_STR, 0, "St Louis Cardinals" },
401
+ end_node
402
+ };
403
+ struct test_node stream[] = {
404
+ { T_SEQ, 0, 0, seq1 },
405
+ { T_SEQ, 0, 0, seq2 },
406
+ end_node
407
+ };
408
+ documents: 2
409
+
410
+ ---
411
+ test: Play by play feed from a game
412
+ spec: 2.8
413
+ yaml: |
414
+ ---
415
+ time: 20:03:20
416
+ player: Sammy Sosa
417
+ action: strike (miss)
418
+ ...
419
+ ---
420
+ time: 20:03:47
421
+ player: Sammy Sosa
422
+ action: grand slam
423
+ ...
424
+ perl: |
425
+ [ 'Mark McGwire', 'Sammy Sosa', 'Ken Griffey' ]
426
+ python: |
427
+ [[ 'Mark McGwire', 'Sammy Sosa', 'Ken Griffey' ]]
428
+ ruby: |
429
+ y = YAML::Stream.new
430
+ y.add( {"player"=>"Sammy Sosa", "time"=>72200, "action"=>"strike (miss)"} )
431
+ y.add( {"player"=>"Sammy Sosa", "time"=>72227, "action"=>"grand slam"} )
432
+ syck: |
433
+ struct test_node map1[] = {
434
+ { T_STR, 0, "time" },
435
+ { T_STR, 0, "20:03:20" },
436
+ { T_STR, 0, "player" },
437
+ { T_STR, 0, "Sammy Sosa" },
438
+ { T_STR, 0, "action" },
439
+ { T_STR, 0, "strike (miss)" },
440
+ end_node
441
+ };
442
+ struct test_node map2[] = {
443
+ { T_STR, 0, "time" },
444
+ { T_STR, 0, "20:03:47" },
445
+ { T_STR, 0, "player" },
446
+ { T_STR, 0, "Sammy Sosa" },
447
+ { T_STR, 0, "action" },
448
+ { T_STR, 0, "grand slam" },
449
+ end_node
450
+ };
451
+ struct test_node stream[] = {
452
+ { T_MAP, 0, 0, map1 },
453
+ { T_MAP, 0, 0, map2 },
454
+ end_node
455
+ };
456
+ documents: 2
457
+
458
+ ---
459
+ test: Single document with two comments
460
+ spec: 2.9
461
+ yaml: |
462
+ hr: # 1998 hr ranking
463
+ - Mark McGwire
464
+ - Sammy Sosa
465
+ rbi:
466
+ # 1998 rbi ranking
467
+ - Sammy Sosa
468
+ - Ken Griffey
469
+ perl-xxx: |
470
+ {
471
+ 'hr' => [ 'Mark McGwire', 'Sammy Sosa' ],
472
+ 'rbi' => [ 'Sammy Sosa', 'Ken Griffey' ]
473
+ }
474
+ python: |
475
+ [{
476
+ 'hr': [ 'Mark McGwire', 'Sammy Sosa' ],
477
+ 'rbi': [ 'Sammy Sosa', 'Ken Griffey' ]
478
+ }]
479
+ ruby: |
480
+ {
481
+ 'hr' => [ 'Mark McGwire', 'Sammy Sosa' ],
482
+ 'rbi' => [ 'Sammy Sosa', 'Ken Griffey' ]
483
+ }
484
+ syck: |
485
+ struct test_node seq1[] = {
486
+ { T_STR, 0, "Mark McGwire" },
487
+ { T_STR, 0, "Sammy Sosa" },
488
+ end_node
489
+ };
490
+ struct test_node seq2[] = {
491
+ { T_STR, 0, "Sammy Sosa" },
492
+ { T_STR, 0, "Ken Griffey" },
493
+ end_node
494
+ };
495
+ struct test_node map[] = {
496
+ { T_STR, 0, "hr" },
497
+ { T_SEQ, 0, 0, seq1 },
498
+ { T_STR, 0, "rbi" },
499
+ { T_SEQ, 0, 0, seq2 },
500
+ end_node
501
+ };
502
+ struct test_node stream[] = {
503
+ { T_MAP, 0, 0, map },
504
+ end_node
505
+ };
506
+
507
+ ---
508
+ test: Node for Sammy Sosa appears twice in this document
509
+ spec: 2.10
510
+ yaml: |
511
+ ---
512
+ hr:
513
+ - Mark McGwire
514
+ # Following node labeled SS
515
+ - &SS Sammy Sosa
516
+ rbi:
517
+ - *SS # Subsequent occurance
518
+ - Ken Griffey
519
+ perl: |
520
+ {
521
+ 'hr' => [ 'Mark McGwire', 'Sammy Sosa' ],
522
+ 'rbi' => [ 'Sammy Sosa', 'Ken Griffey' ]
523
+ }
524
+ python: |
525
+ [{
526
+ 'hr': [ 'Mark McGwire', 'Sammy Sosa' ],
527
+ 'rbi': [ 'Sammy Sosa', 'Ken Griffey' ]
528
+ }]
529
+ ruby: |
530
+ {
531
+ 'hr' =>
532
+ [ 'Mark McGwire', 'Sammy Sosa' ],
533
+ 'rbi' =>
534
+ [ 'Sammy Sosa', 'Ken Griffey' ]
535
+ }
536
+ syck: |
537
+ struct test_node seq1[] = {
538
+ { T_STR, 0, "Mark McGwire" },
539
+ { T_STR, 0, "Sammy Sosa" },
540
+ end_node
541
+ };
542
+ struct test_node seq2[] = {
543
+ { T_STR, 0, "Sammy Sosa" },
544
+ { T_STR, 0, "Ken Griffey" },
545
+ end_node
546
+ };
547
+ struct test_node map[] = {
548
+ { T_STR, 0, "hr" },
549
+ { T_SEQ, 0, 0, seq1 },
550
+ { T_STR, 0, "rbi" },
551
+ { T_SEQ, 0, 0, seq2 },
552
+ end_node
553
+ };
554
+ struct test_node stream[] = {
555
+ { T_MAP, 0, 0, map },
556
+ end_node
557
+ };
558
+
559
+ ---
560
+ test: Mapping between sequences
561
+ spec: 2.11
562
+ yaml: |
563
+ ? # PLAY SCHEDULE
564
+ - Detroit Tigers
565
+ - Chicago Cubs
566
+ :
567
+ - 2001-07-23
568
+
569
+ ? [ New York Yankees,
570
+ Atlanta Braves ]
571
+ : [ 2001-07-02, 2001-08-12,
572
+ 2001-08-14 ]
573
+ ruby: |
574
+ {
575
+ [ 'Detroit Tigers', 'Chicago Cubs' ] => [ Date.new( 2001, 7, 23 ) ],
576
+ [ 'New York Yankees', 'Atlanta Braves' ] => [ Date.new( 2001, 7, 2 ), Date.new( 2001, 8, 12 ), Date.new( 2001, 8, 14 ) ]
577
+ }
578
+ syck: |
579
+ struct test_node seq1[] = {
580
+ { T_STR, 0, "New York Yankees" },
581
+ { T_STR, 0, "Atlanta Braves" },
582
+ end_node
583
+ };
584
+ struct test_node seq2[] = {
585
+ { T_STR, 0, "2001-07-02" },
586
+ { T_STR, 0, "2001-08-12" },
587
+ { T_STR, 0, "2001-08-14" },
588
+ end_node
589
+ };
590
+ struct test_node seq3[] = {
591
+ { T_STR, 0, "Detroit Tigers" },
592
+ { T_STR, 0, "Chicago Cubs" },
593
+ end_node
594
+ };
595
+ struct test_node seq4[] = {
596
+ { T_STR, 0, "2001-07-23" },
597
+ end_node
598
+ };
599
+ struct test_node map[] = {
600
+ { T_SEQ, 0, 0, seq3 },
601
+ { T_SEQ, 0, 0, seq4 },
602
+ { T_SEQ, 0, 0, seq1 },
603
+ { T_SEQ, 0, 0, seq2 },
604
+ end_node
605
+ };
606
+ struct test_node stream[] = {
607
+ { T_MAP, 0, 0, map },
608
+ end_node
609
+ };
610
+
611
+ ---
612
+ test: Sequence key shortcut
613
+ spec: 2.12
614
+ yaml: |
615
+ ---
616
+ # products purchased
617
+ - item : Super Hoop
618
+ quantity: 1
619
+ - item : Basketball
620
+ quantity: 4
621
+ - item : Big Shoes
622
+ quantity: 1
623
+ perl: |
624
+ [
625
+ { item => 'Super Hoop', quantity => 1 },
626
+ { item => 'Basketball', quantity => 4 },
627
+ { item => 'Big Shoes', quantity => 1 }
628
+ ]
629
+
630
+ ruby: |
631
+ [
632
+ { 'item' => 'Super Hoop', 'quantity' => 1 },
633
+ { 'item' => 'Basketball', 'quantity' => 4 },
634
+ { 'item' => 'Big Shoes', 'quantity' => 1 }
635
+ ]
636
+ python: |
637
+ [
638
+ { 'item': 'Super Hoop', 'quantity': 1 },
639
+ { 'item': 'Basketball', 'quantity': 4 },
640
+ { 'item': 'Big Shoes', 'quantity': 1 }
641
+ ]
642
+ syck: |
643
+ struct test_node map1[] = {
644
+ { T_STR, 0, "item" },
645
+ { T_STR, 0, "Super Hoop" },
646
+ { T_STR, 0, "quantity" },
647
+ { T_STR, 0, "1" },
648
+ end_node
649
+ };
650
+ struct test_node map2[] = {
651
+ { T_STR, 0, "item" },
652
+ { T_STR, 0, "Basketball" },
653
+ { T_STR, 0, "quantity" },
654
+ { T_STR, 0, "4" },
655
+ end_node
656
+ };
657
+ struct test_node map3[] = {
658
+ { T_STR, 0, "item" },
659
+ { T_STR, 0, "Big Shoes" },
660
+ { T_STR, 0, "quantity" },
661
+ { T_STR, 0, "1" },
662
+ end_node
663
+ };
664
+ struct test_node seq[] = {
665
+ { T_MAP, 0, 0, map1 },
666
+ { T_MAP, 0, 0, map2 },
667
+ { T_MAP, 0, 0, map3 },
668
+ end_node
669
+ };
670
+ struct test_node stream[] = {
671
+ { T_SEQ, 0, 0, seq },
672
+ end_node
673
+ };
674
+
675
+
676
+ ---
677
+ test: Literal perserves newlines
678
+ spec: 2.13
679
+ yaml: |
680
+ # ASCII Art
681
+ --- |
682
+ \//||\/||
683
+ // || ||_
684
+ perl: |
685
+ "\\//||\\/||\n// || ||_\n"
686
+ ruby: |
687
+ "\\//||\\/||\n// || ||_\n"
688
+ python: |
689
+ [
690
+ flushLeft(
691
+ """
692
+ \//||\/||
693
+ // || ||_
694
+ """
695
+ )
696
+ ]
697
+ syck: |
698
+ struct test_node stream[] = {
699
+ { T_STR, 0, "\\//||\\/||\n// || ||_\n" },
700
+ end_node
701
+ };
702
+
703
+ ---
704
+ test: Folded treats newlines as a space
705
+ spec: 2.14
706
+ yaml: |
707
+ ---
708
+ Mark McGwire's
709
+ year was crippled
710
+ by a knee injury.
711
+ perl: |
712
+ "Mark McGwire's year was crippled by a knee injury."
713
+ ruby: |
714
+ "Mark McGwire's year was crippled by a knee injury."
715
+ python: |
716
+ [ "Mark McGwire's year was crippled by a knee injury." ]
717
+ syck: |
718
+ struct test_node stream[] = {
719
+ { T_STR, 0, "Mark McGwire's year was crippled by a knee injury." },
720
+ end_node
721
+ };
722
+
723
+ ---
724
+ test: Newlines preserved for indented and blank lines
725
+ spec: 2.15
726
+ yaml: |
727
+ --- >
728
+ Sammy Sosa completed another
729
+ fine season with great stats.
730
+
731
+ 63 Home Runs
732
+ 0.288 Batting Average
733
+
734
+ What a year!
735
+ perl: |
736
+ "Sammy Sosa completed another fine season with great stats.\n\n 63 Home Runs\n 0.288 Batting Average\n\nWhat a year!\n"
737
+ ruby: |
738
+ "Sammy Sosa completed another fine season with great stats.\n\n 63 Home Runs\n 0.288 Batting Average\n\nWhat a year!\n"
739
+ python: |
740
+ [
741
+ flushLeft(
742
+ """
743
+ Sammy Sosa completed another fine season with great stats.
744
+
745
+ 63 Home Runs
746
+ 0.288 Batting Average
747
+
748
+ What a year!
749
+ """
750
+ )
751
+ ]
752
+ syck: |
753
+ struct test_node stream[] = {
754
+ { T_STR, 0, "Sammy Sosa completed another fine season with great stats.\n\n 63 Home Runs\n 0.288 Batting Average\n\nWhat a year!\n" },
755
+ end_node
756
+ };
757
+
758
+
759
+ ---
760
+ test: Indentation determines scope
761
+ spec: 2.16
762
+ yaml: |
763
+ name: Mark McGwire
764
+ accomplishment: >
765
+ Mark set a major league
766
+ home run record in 1998.
767
+ stats: |
768
+ 65 Home Runs
769
+ 0.278 Batting Average
770
+ perl: |
771
+ {
772
+ name => 'Mark McGwire',
773
+ accomplishment => "Mark set a major league home run record in 1998.\n",
774
+ stats => "65 Home Runs\n0.278 Batting Average\n"
775
+ }
776
+ ruby: |
777
+ {
778
+ 'name' => 'Mark McGwire', 'accomplishment' => "Mark set a major league home run record in 1998.\n",
779
+ 'stats' => "65 Home Runs\n0.278 Batting Average\n"
780
+ }
781
+ python: |
782
+ [
783
+ {
784
+ 'name': 'Mark McGwire',
785
+ 'accomplishment':
786
+ 'Mark set a major league home run record in 1998.\n',
787
+ 'stats': "65 Home Runs\n0.278 Batting Average\n"
788
+ }
789
+ ]
790
+ syck: |
791
+ struct test_node map[] = {
792
+ { T_STR, 0, "name" },
793
+ { T_STR, 0, "Mark McGwire" },
794
+ { T_STR, 0, "accomplishment" },
795
+ { T_STR, 0, "Mark set a major league home run record in 1998.\n" },
796
+ { T_STR, 0, "stats" },
797
+ { T_STR, 0, "65 Home Runs\n0.278 Batting Average\n" },
798
+ end_node
799
+ };
800
+ struct test_node stream[] = {
801
+ { T_MAP, 0, 0, map },
802
+ end_node
803
+ };
804
+
805
+ ---
806
+ test: Quoted scalars
807
+ spec: 2.17
808
+ yaml: |
809
+ unicode: "Sosa did fine.\u263A"
810
+ control: "\b1998\t1999\t2000\n"
811
+ hexesc: "\x0D\x0A is \r\n"
812
+
813
+ single: '"Howdy!" he cried.'
814
+ quoted: ' # not a ''comment''.'
815
+ tie-fighter: '|\-*-/|'
816
+ perl-not-working: |
817
+ {
818
+ unicode => "Sosa did fine.\x{263A}",
819
+ control => "\x081998\t1999\t2000\n",
820
+ hexesc => "\r\n is \r\n",
821
+ single => '"Howdy!" he cried.',
822
+ quoted => " # not a 'comment'.",
823
+ "tie-fighter" => '|\\-*-/|',
824
+ }
825
+ ruby: |
826
+ {
827
+ "tie-fighter" => "|\\-*-/|",
828
+ "control"=>"\0101998\t1999\t2000\n",
829
+ "unicode"=>"Sosa did fine." + ["263A".hex ].pack('U*'),
830
+ "quoted"=>" # not a 'comment'.",
831
+ "single"=>"\"Howdy!\" he cried.",
832
+ "hexesc"=>"\r\n is \r\n"
833
+ }
834
+ python: |
835
+ [ {
836
+ 'unicode': u"Sosa did fine.\u263A",
837
+ 'control': "\b1998\t1999\t2000\n",
838
+ 'hexesc': "\x0D\x0A is \r\n",
839
+ 'single': '"Howdy!" he cried.',
840
+ 'quoted': ' # not a \'comment\'.',
841
+ 'tie-fighter': '|\-*-/|',
842
+ } ]
843
+
844
+
845
+ ---
846
+ test: Multiline flow scalars
847
+ spec: 2.18
848
+ yaml: |
849
+ plain:
850
+ This unquoted scalar
851
+ spans many lines.
852
+
853
+ quoted: "So does this
854
+ quoted scalar.\n"
855
+ perl-not-working: |
856
+ {
857
+ plain => 'This unquoted scalar spans many lines.',
858
+ quoted => "So does this quoted scalar.\n"
859
+ }
860
+ ruby: |
861
+ {
862
+ 'plain' => 'This unquoted scalar spans many lines.',
863
+ 'quoted' => "So does this quoted scalar.\n"
864
+ }
865
+ python: |
866
+ [ {
867
+ 'plain': 'This unquoted scalar spans many lines.',
868
+ 'quoted': 'So does this quoted scalar.\n'
869
+ }
870
+ ]
871
+ syck: |
872
+ struct test_node map[] = {
873
+ { T_STR, 0, "plain" },
874
+ { T_STR, 0, "This unquoted scalar spans many lines." },
875
+ { T_STR, 0, "quoted" },
876
+ { T_STR, 0, "So does this quoted scalar.\n" },
877
+ end_node
878
+ };
879
+ struct test_node stream[] = {
880
+ { T_MAP, 0, 0, map },
881
+ end_node
882
+ };
883
+
884
+ ---
885
+ test: Integers
886
+ spec: 2.19
887
+ yaml: |
888
+ canonical: 12345
889
+ decimal: +12,345
890
+ sexagecimal: 3:25:45
891
+ octal: 014
892
+ hexadecimal: 0xC
893
+ perl: |
894
+ {
895
+ canonical => 12345,
896
+ decimal => 12345,
897
+ octal => oct("014"),
898
+ hexadecimal => hex("0xC"),
899
+ }
900
+ ruby: |
901
+ {
902
+ 'canonical' => 12345,
903
+ 'decimal' => 12345,
904
+ 'sexagecimal' => 12345,
905
+ 'octal' => '014'.oct,
906
+ 'hexadecimal' => '0xC'.hex
907
+ }
908
+ python: |
909
+ [ {
910
+ 'canonical': 12345,
911
+ 'decimal': 12345,
912
+ 'octal': 014,
913
+ 'hexadecimal': 0xC
914
+ } ]
915
+ syck: |
916
+ struct test_node map[] = {
917
+ { T_STR, 0, "canonical" },
918
+ { T_STR, 0, "12345" },
919
+ { T_STR, 0, "decimal" },
920
+ { T_STR, 0, "+12,345" },
921
+ { T_STR, 0, "sexagecimal" },
922
+ { T_STR, 0, "3:25:45" },
923
+ { T_STR, 0, "octal" },
924
+ { T_STR, 0, "014" },
925
+ { T_STR, 0, "hexadecimal" },
926
+ { T_STR, 0, "0xC" },
927
+ end_node
928
+ };
929
+ struct test_node stream[] = {
930
+ { T_MAP, 0, 0, map },
931
+ end_node
932
+ };
933
+
934
+ ---
935
+ # FIX: spec shows parens around -inf and NaN
936
+ test: Floating point
937
+ spec: 2.20
938
+ yaml: |
939
+ canonical: 1.23015e+3
940
+ exponential: 12.3015e+02
941
+ sexagecimal: 20:30.15
942
+ fixed: 1,230.15
943
+ negative infinity: -.inf
944
+ not a number: .NaN
945
+ perl: |
946
+ {
947
+ 'canonical' => 1230.15,
948
+ 'exponential' => 1230.15,
949
+ 'fixed' => 1230.15,
950
+ 'negative infinity' => "-.inf",
951
+ 'not a number' => ".NaN",
952
+ }
953
+ ruby: |
954
+ {
955
+ 'canonical' => 1230.15,
956
+ 'exponential' => 1230.15,
957
+ 'sexagecimal' => 1230.15,
958
+ 'fixed' => 1230.15,
959
+ 'negative infinity' => -1.0/0.0,
960
+ 'not a number' => 0.0/0.0
961
+ }
962
+ if obj_y['not a number'].nan? # NaN comparison doesn't work right against 0.0/0.0
963
+ obj_r['not a number'] = obj_y['not a number']
964
+ end
965
+ python: |
966
+ [ {
967
+ 'canonical': 1.23015e+3,
968
+ 'exponential': 1.23015e+3,
969
+ 'fixed': 1230.15,
970
+ 'negative infinity': '-.inf',
971
+ 'not a number': '.NaN',
972
+ } ]
973
+ syck: |
974
+ struct test_node map[] = {
975
+ { T_STR, 0, "canonical" },
976
+ { T_STR, 0, "1.23015e+3" },
977
+ { T_STR, 0, "exponential" },
978
+ { T_STR, 0, "12.3015e+02" },
979
+ { T_STR, 0, "sexagecimal" },
980
+ { T_STR, 0, "20:30.15" },
981
+ { T_STR, 0, "fixed" },
982
+ { T_STR, 0, "1,230.15" },
983
+ { T_STR, 0, "negative infinity" },
984
+ { T_STR, 0, "-.inf" },
985
+ { T_STR, 0, "not a number" },
986
+ { T_STR, 0, ".NaN" },
987
+ end_node
988
+ };
989
+ struct test_node stream[] = {
990
+ { T_MAP, 0, 0, map },
991
+ end_node
992
+ };
993
+
994
+ ---
995
+ test: Miscellaneous
996
+ spec: 2.21
997
+ yaml: |
998
+ null: ~
999
+ true: y
1000
+ false: n
1001
+ string: '12345'
1002
+ perl: |
1003
+ {
1004
+ null => undef,
1005
+ true => 1,
1006
+ false => 0,
1007
+ string => "12345"
1008
+ }
1009
+ ruby: |
1010
+ {
1011
+ nil => nil,
1012
+ true => true,
1013
+ false => false,
1014
+ 'string' => '12345'
1015
+ }
1016
+ python: |
1017
+ [ {
1018
+ 'null': None,
1019
+ 'true': 1,
1020
+ 'false': 0,
1021
+ 'string': '12345',
1022
+ } ]
1023
+ syck: |
1024
+ struct test_node map[] = {
1025
+ { T_STR, 0, "null" },
1026
+ { T_STR, 0, "~" },
1027
+ { T_STR, 0, "true" },
1028
+ { T_STR, 0, "y" },
1029
+ { T_STR, 0, "false" },
1030
+ { T_STR, 0, "n" },
1031
+ { T_STR, 0, "string" },
1032
+ { T_STR, 0, "12345" },
1033
+ end_node
1034
+ };
1035
+ struct test_node stream[] = {
1036
+ { T_MAP, 0, 0, map },
1037
+ end_node
1038
+ };
1039
+
1040
+ ---
1041
+ test: Timestamps
1042
+ spec: 2.22
1043
+ yaml: |
1044
+ canonical: 2001-12-15T02:59:43.1Z
1045
+ iso8601: 2001-12-14t21:59:43.10-05:00
1046
+ spaced: 2001-12-14 21:59:43.10 -05:00
1047
+ date: 2002-12-14 # Time is noon UTC
1048
+ perl: |
1049
+ {
1050
+ canonical => "2001-12-15T02:59:43.1Z",
1051
+ iso8601 => "2001-12-14t21:59:43.10-05:00",
1052
+ spaced => "2001-12-14 21:59:43.10 -05:00",
1053
+ date => "2002-12-14",
1054
+ }
1055
+ ruby: |
1056
+ {
1057
+ 'canonical' => YAML::mktime( 2001, 12, 15, 2, 59, 43, 0.10 ),
1058
+ 'iso8601' => YAML::mktime( 2001, 12, 14, 21, 59, 43, 0.10, "-05:00" ),
1059
+ 'spaced' => YAML::mktime( 2001, 12, 14, 21, 59, 43, 0.10, "-05:00" ),
1060
+ 'date' => Date.new( 2002, 12, 14 )
1061
+ }
1062
+ syck: |
1063
+ struct test_node map[] = {
1064
+ { T_STR, 0, "canonical" },
1065
+ { T_STR, 0, "2001-12-15T02:59:43.1Z" },
1066
+ { T_STR, 0, "iso8601" },
1067
+ { T_STR, 0, "2001-12-14t21:59:43.10-05:00" },
1068
+ { T_STR, 0, "spaced" },
1069
+ { T_STR, 0, "2001-12-14 21:59:43.10 -05:00" },
1070
+ { T_STR, 0, "date" },
1071
+ { T_STR, 0, "2002-12-14" },
1072
+ end_node
1073
+ };
1074
+ struct test_node stream[] = {
1075
+ { T_MAP, 0, 0, map },
1076
+ end_node
1077
+ };
1078
+
1079
+ ---
1080
+ test: legacy Timestamps test
1081
+ spec: legacy D4
1082
+ yaml: |
1083
+ canonical: 2001-12-15T02:59:43.00Z
1084
+ iso8601: 2001-02-28t21:59:43.00-05:00
1085
+ spaced: 2001-12-14 21:59:43.00 -05:00
1086
+ date: 2002-12-14
1087
+ python: |
1088
+ [ {
1089
+ 'canonical': yaml.timestamp('2001-12-15T02:59:43.00Z'),
1090
+ 'iso8601': yaml.timestamp('2001-03-01T02:59:43.00Z'),
1091
+ 'spaced': yaml.timestamp('2001-12-15T02:59:43.00Z'),
1092
+ 'date': yaml.timestamp('2002-12-14T00:00:00.00Z')
1093
+ } ]
1094
+ ruby: |
1095
+ {
1096
+ 'canonical' => Time::utc( 2001, 12, 15, 2, 59, 43, 0 ),
1097
+ 'iso8601' => YAML::mktime( 2001, 2, 28, 21, 59, 43, 0, "-05:00" ),
1098
+ 'spaced' => YAML::mktime( 2001, 12, 14, 21, 59, 43, 0, "-05:00" ),
1099
+ 'date' => Date.new( 2002, 12, 14 )
1100
+ }
1101
+ syck: |
1102
+ struct test_node map[] = {
1103
+ { T_STR, 0, "canonical" },
1104
+ { T_STR, 0, "2001-12-15T02:59:43.00Z" },
1105
+ { T_STR, 0, "iso8601" },
1106
+ { T_STR, 0, "2001-02-28t21:59:43.00-05:00" },
1107
+ { T_STR, 0, "spaced" },
1108
+ { T_STR, 0, "2001-12-14 21:59:43.00 -05:00" },
1109
+ { T_STR, 0, "date" },
1110
+ { T_STR, 0, "2002-12-14" },
1111
+ end_node
1112
+ };
1113
+ struct test_node stream[] = {
1114
+ { T_MAP, 0, 0, map },
1115
+ end_node
1116
+ };
1117
+
1118
+ ---
1119
+ test: Various explicit families
1120
+ spec: 2.23
1121
+ yaml: |
1122
+ not-date: !str 2002-04-28
1123
+ picture: !binary |
1124
+ R0lGODlhDAAMAIQAAP//9/X
1125
+ 17unp5WZmZgAAAOfn515eXv
1126
+ Pz7Y6OjuDg4J+fn5OTk6enp
1127
+ 56enmleECcgggoBADs=
1128
+
1129
+ application specific tag: !!something |
1130
+ The semantics of the tag
1131
+ above may be different for
1132
+ different documents.
1133
+
1134
+ ruby-setup: |
1135
+ YAML.add_private_type( "something" ) do |type, val|
1136
+ "SOMETHING: #{val}"
1137
+ end
1138
+ ruby: |
1139
+ {
1140
+ 'not-date' => '2002-04-28',
1141
+ 'picture' => "GIF89a\f\000\f\000\204\000\000\377\377\367\365\365\356\351\351\345fff\000\000\000\347\347\347^^^\363\363\355\216\216\216\340\340\340\237\237\237\223\223\223\247\247\247\236\236\236i^\020' \202\n\001\000;",
1142
+ 'application specific tag' => "SOMETHING: The semantics of the tag\nabove may be different for\ndifferent documents.\n"
1143
+ }
1144
+ syck: |
1145
+ struct test_node map[] = {
1146
+ { T_STR, 0, "not-date" },
1147
+ { T_STR, "tag:yaml.org,2002:str", "2002-04-28" },
1148
+ { T_STR, 0, "picture" },
1149
+ { T_STR, "tag:yaml.org,2002:binary", "R0lGODlhDAAMAIQAAP//9/X\n17unp5WZmZgAAAOfn515eXv\nPz7Y6OjuDg4J+fn5OTk6enp\n56enmleECcgggoBADs=\n" },
1150
+ { T_STR, 0, "application specific tag" },
1151
+ { T_STR, "x-private:something", "The semantics of the tag\nabove may be different for\ndifferent documents.\n" },
1152
+ end_node
1153
+ };
1154
+ struct test_node stream[] = {
1155
+ { T_MAP, 0, 0, map },
1156
+ end_node
1157
+ };
1158
+
1159
+ ---
1160
+ test: Application specific family
1161
+ spec: 2.24
1162
+ yaml: |
1163
+ # Establish a tag prefix
1164
+ --- !clarkevans.com,2002/graph/^shape
1165
+ # Use the prefix: shorthand for
1166
+ # !clarkevans.com,2002/graph/circle
1167
+ - !^circle
1168
+ center: &ORIGIN {x: 73, 'y': 129}
1169
+ radius: 7
1170
+ - !^line # !clarkevans.com,2002/graph/line
1171
+ start: *ORIGIN
1172
+ finish: { x: 89, 'y': 102 }
1173
+ - !^label
1174
+ start: *ORIGIN
1175
+ color: 0xFFEEBB
1176
+ value: Pretty vector drawing.
1177
+ ruby-setup: |
1178
+ YAML.add_domain_type( "clarkevans.com,2002", 'graph/shape' ) { |type, val|
1179
+ if Array === val
1180
+ val << "Shape Container"
1181
+ val
1182
+ else
1183
+ raise YAML::Error, "Invalid graph of class #{ val.class }: " + val.inspect
1184
+ end
1185
+ }
1186
+ one_shape_proc = Proc.new { |type, val|
1187
+ scheme, domain, type = type.split( /:/, 3 )
1188
+ if val.is_a? ::Hash
1189
+ val['TYPE'] = "Shape: #{type}"
1190
+ val
1191
+ else
1192
+ raise YAML::Error, "Invalid graph of class #{ val.class }: " + val.inspect
1193
+ end
1194
+ }
1195
+ YAML.add_domain_type( "clarkevans.com,2002", 'graph/circle', &one_shape_proc )
1196
+ YAML.add_domain_type( "clarkevans.com,2002", 'graph/line', &one_shape_proc )
1197
+ YAML.add_domain_type( "clarkevans.com,2002", 'graph/label', &one_shape_proc )
1198
+ ruby: |
1199
+ [
1200
+ {
1201
+ "radius" => 7,
1202
+ "center"=>
1203
+ {
1204
+ "x" => 73,
1205
+ "y" => 129
1206
+ },
1207
+ "TYPE" => "Shape: graph/circle"
1208
+ }, {
1209
+ "finish" =>
1210
+ {
1211
+ "x" => 89,
1212
+ "y" => 102
1213
+ },
1214
+ "TYPE" => "Shape: graph/line",
1215
+ "start" =>
1216
+ {
1217
+ "x" => 73,
1218
+ "y" => 129
1219
+ }
1220
+ }, {
1221
+ "TYPE" => "Shape: graph/label",
1222
+ "value" => "Pretty vector drawing.",
1223
+ "start" =>
1224
+ {
1225
+ "x" => 73,
1226
+ "y" => 129
1227
+ },
1228
+ "color" => 16772795
1229
+ },
1230
+ "Shape Container"
1231
+ ]
1232
+ syck: |
1233
+ struct test_node point1[] = {
1234
+ { T_STR, 0, "x" },
1235
+ { T_STR, 0, "73" },
1236
+ { T_STR, 0, "y" },
1237
+ { T_STR, 0, "129" },
1238
+ end_node
1239
+ };
1240
+ struct test_node point2[] = {
1241
+ { T_STR, 0, "x" },
1242
+ { T_STR, 0, "89" },
1243
+ { T_STR, 0, "y" },
1244
+ { T_STR, 0, "102" },
1245
+ end_node
1246
+ };
1247
+ struct test_node map1[] = {
1248
+ { T_STR, 0, "center" },
1249
+ { T_MAP, 0, 0, point1 },
1250
+ { T_STR, 0, "radius" },
1251
+ { T_STR, 0, "7" },
1252
+ end_node
1253
+ };
1254
+ struct test_node map2[] = {
1255
+ { T_STR, 0, "start" },
1256
+ { T_MAP, 0, 0, point1 },
1257
+ { T_STR, 0, "finish" },
1258
+ { T_MAP, 0, 0, point2 },
1259
+ end_node
1260
+ };
1261
+ struct test_node map3[] = {
1262
+ { T_STR, 0, "start" },
1263
+ { T_MAP, 0, 0, point1 },
1264
+ { T_STR, 0, "color" },
1265
+ { T_STR, 0, "0xFFEEBB" },
1266
+ { T_STR, 0, "value" },
1267
+ { T_STR, 0, "Pretty vector drawing." },
1268
+ end_node
1269
+ };
1270
+ struct test_node seq[] = {
1271
+ { T_MAP, "tag:clarkevans.com,2002:graph/circle", 0, map1 },
1272
+ { T_MAP, "tag:clarkevans.com,2002:graph/line", 0, map2 },
1273
+ { T_MAP, "tag:clarkevans.com,2002:graph/label", 0, map3 },
1274
+ end_node
1275
+ };
1276
+ struct test_node stream[] = {
1277
+ { T_SEQ, "tag:clarkevans.com,2002:graph/shape", 0, seq },
1278
+ end_node
1279
+ };
1280
+
1281
+ # ---
1282
+ # test: Unordered set
1283
+ # spec: 2.25
1284
+ # yaml: |
1285
+ # # sets are represented as a
1286
+ # # mapping where each key is
1287
+ # # associated with the empty string
1288
+ # --- !set
1289
+ # ? Mark McGwire
1290
+ # ? Sammy Sosa
1291
+ # ? Ken Griff
1292
+ ---
1293
+ test: Ordered mappings
1294
+ spec: 2.26
1295
+ yaml: |
1296
+ # ordered maps are represented as
1297
+ # a sequence of mappings, with
1298
+ # each mapping having one key
1299
+ --- !omap
1300
+ - Mark McGwire: 65
1301
+ - Sammy Sosa: 63
1302
+ - Ken Griffy: 58
1303
+ ruby: |
1304
+ YAML::Omap[
1305
+ 'Mark McGwire', 65,
1306
+ 'Sammy Sosa', 63,
1307
+ 'Ken Griffy', 58
1308
+ ]
1309
+ syck: |
1310
+ struct test_node map1[] = {
1311
+ { T_STR, 0, "Mark McGwire" },
1312
+ { T_STR, 0, "65" },
1313
+ end_node
1314
+ };
1315
+ struct test_node map2[] = {
1316
+ { T_STR, 0, "Sammy Sosa" },
1317
+ { T_STR, 0, "63" },
1318
+ end_node
1319
+ };
1320
+ struct test_node map3[] = {
1321
+ { T_STR, 0, "Ken Griffy" },
1322
+ { T_STR, 0, "58" },
1323
+ end_node
1324
+ };
1325
+ struct test_node seq[] = {
1326
+ { T_MAP, 0, 0, map1 },
1327
+ { T_MAP, 0, 0, map2 },
1328
+ { T_MAP, 0, 0, map3 },
1329
+ end_node
1330
+ };
1331
+ struct test_node stream[] = {
1332
+ { T_SEQ, "tag:yaml.org,2002:omap", 0, seq },
1333
+ end_node
1334
+ };
1335
+
1336
+ ---
1337
+ test: Invoice
1338
+ spec: 2.27
1339
+ yaml: |
1340
+ --- !clarkevans.com,2002/^invoice
1341
+ invoice: 34843
1342
+ date : 2001-01-23
1343
+ bill-to: &id001
1344
+ given : Chris
1345
+ family : Dumars
1346
+ address:
1347
+ lines: |
1348
+ 458 Walkman Dr.
1349
+ Suite #292
1350
+ city : Royal Oak
1351
+ state : MI
1352
+ postal : 48046
1353
+ ship-to: *id001
1354
+ product:
1355
+ - sku : BL394D
1356
+ quantity : 4
1357
+ description : Basketball
1358
+ price : 450.00
1359
+ - sku : BL4438H
1360
+ quantity : 1
1361
+ description : Super Hoop
1362
+ price : 2392.00
1363
+ tax : 251.42
1364
+ total: 4443.52
1365
+ comments: >
1366
+ Late afternoon is best.
1367
+ Backup contact is Nancy
1368
+ Billsmer @ 338-4338.
1369
+ ruby-setup: |
1370
+ YAML.add_domain_type( "clarkevans.com,2002", "invoice" ) { |type, val| val }
1371
+ id001 = { 'given' => 'Chris', 'family' => 'Dumars', 'address' =>
1372
+ { 'lines' => "458 Walkman Dr.\nSuite #292\n", 'city' => 'Royal Oak',
1373
+ 'state' => 'MI', 'postal' => 48046 } }
1374
+ ruby: |
1375
+ {
1376
+ 'invoice' => 34843, 'date' => Date.new( 2001, 1, 23 ),
1377
+ 'bill-to' => id001, 'ship-to' => id001, 'product' =>
1378
+ [ { 'sku' => 'BL394D', 'quantity' => 4,
1379
+ 'description' => 'Basketball', 'price' => 450.00 },
1380
+ { 'sku' => 'BL4438H', 'quantity' => 1,
1381
+ 'description' => 'Super Hoop', 'price' => 2392.00 } ],
1382
+ 'tax' => 251.42, 'total' => 4443.52,
1383
+ 'comments' => "Late afternoon is best. Backup contact is Nancy Billsmer @ 338-4338.\n" }
1384
+ syck: |
1385
+ struct test_node prod1[] = {
1386
+ { T_STR, 0, "sku" },
1387
+ { T_STR, 0, "BL394D" },
1388
+ { T_STR, 0, "quantity" },
1389
+ { T_STR, 0, "4" },
1390
+ { T_STR, 0, "description" },
1391
+ { T_STR, 0, "Basketball" },
1392
+ { T_STR, 0, "price" },
1393
+ { T_STR, 0, "450.00" },
1394
+ end_node
1395
+ };
1396
+ struct test_node prod2[] = {
1397
+ { T_STR, 0, "sku" },
1398
+ { T_STR, 0, "BL4438H" },
1399
+ { T_STR, 0, "quantity" },
1400
+ { T_STR, 0, "1" },
1401
+ { T_STR, 0, "description" },
1402
+ { T_STR, 0, "Super Hoop" },
1403
+ { T_STR, 0, "price" },
1404
+ { T_STR, 0, "2392.00" },
1405
+ end_node
1406
+ };
1407
+ struct test_node products[] = {
1408
+ { T_MAP, 0, 0, prod1 },
1409
+ { T_MAP, 0, 0, prod2 },
1410
+ end_node
1411
+ };
1412
+ struct test_node address[] = {
1413
+ { T_STR, 0, "lines" },
1414
+ { T_STR, 0, "458 Walkman Dr.\nSuite #292\n" },
1415
+ { T_STR, 0, "city" },
1416
+ { T_STR, 0, "Royal Oak" },
1417
+ { T_STR, 0, "state" },
1418
+ { T_STR, 0, "MI" },
1419
+ { T_STR, 0, "postal" },
1420
+ { T_STR, 0, "48046" },
1421
+ end_node
1422
+ };
1423
+ struct test_node id001[] = {
1424
+ { T_STR, 0, "given" },
1425
+ { T_STR, 0, "Chris" },
1426
+ { T_STR, 0, "family" },
1427
+ { T_STR, 0, "Dumars" },
1428
+ { T_STR, 0, "address" },
1429
+ { T_MAP, 0, 0, address },
1430
+ end_node
1431
+ };
1432
+ struct test_node map[] = {
1433
+ { T_STR, 0, "invoice" },
1434
+ { T_STR, 0, "34843" },
1435
+ { T_STR, 0, "date" },
1436
+ { T_STR, 0, "2001-01-23" },
1437
+ { T_STR, 0, "bill-to" },
1438
+ { T_MAP, 0, 0, id001 },
1439
+ { T_STR, 0, "ship-to" },
1440
+ { T_MAP, 0, 0, id001 },
1441
+ { T_STR, 0, "product" },
1442
+ { T_SEQ, 0, 0, products },
1443
+ { T_STR, 0, "tax" },
1444
+ { T_STR, 0, "251.42" },
1445
+ { T_STR, 0, "total" },
1446
+ { T_STR, 0, "4443.52" },
1447
+ { T_STR, 0, "comments" },
1448
+ { T_STR, 0, "Late afternoon is best. Backup contact is Nancy Billsmer @ 338-4338.\n" },
1449
+ end_node
1450
+ };
1451
+ struct test_node stream[] = {
1452
+ { T_MAP, "tag:clarkevans.com,2002:invoice", 0, map },
1453
+ end_node
1454
+ };
1455
+
1456
+ ---
1457
+ test: Log file
1458
+ spec: 2.28
1459
+ yaml: |
1460
+ ---
1461
+ Time: 2001-11-23 15:01:42 -05:00
1462
+ User: ed
1463
+ Warning: >
1464
+ This is an error message
1465
+ for the log file
1466
+ ---
1467
+ Time: 2001-11-23 15:02:31 -05:00
1468
+ User: ed
1469
+ Warning: >
1470
+ A slightly different error
1471
+ message.
1472
+ ---
1473
+ Date: 2001-11-23 15:03:17 -05:00
1474
+ User: ed
1475
+ Fatal: >
1476
+ Unknown variable "bar"
1477
+ Stack:
1478
+ - file: TopClass.py
1479
+ line: 23
1480
+ code: |
1481
+ x = MoreObject("345\n")
1482
+ - file: MoreClass.py
1483
+ line: 58
1484
+ code: |-
1485
+ foo = bar
1486
+ ruby: |
1487
+ y = YAML::Stream.new
1488
+ y.add( { 'Time' => YAML::mktime( 2001, 11, 23, 15, 01, 42, 00, "-05:00" ),
1489
+ 'User' => 'ed', 'Warning' => "This is an error message for the log file\n" } )
1490
+ y.add( { 'Time' => YAML::mktime( 2001, 11, 23, 15, 02, 31, 00, "-05:00" ),
1491
+ 'User' => 'ed', 'Warning' => "A slightly different error message.\n" } )
1492
+ y.add( { 'Date' => YAML::mktime( 2001, 11, 23, 15, 03, 17, 00, "-05:00" ),
1493
+ 'User' => 'ed', 'Fatal' => "Unknown variable \"bar\"\n",
1494
+ 'Stack' => [
1495
+ { 'file' => 'TopClass.py', 'line' => 23, 'code' => "x = MoreObject(\"345\\n\")\n" },
1496
+ { 'file' => 'MoreClass.py', 'line' => 58, 'code' => "foo = bar" } ] } )
1497
+ syck: |
1498
+ struct test_node map1[] = {
1499
+ { T_STR, 0, "Time" },
1500
+ { T_STR, 0, "2001-11-23 15:01:42 -05:00" },
1501
+ { T_STR, 0, "User" },
1502
+ { T_STR, 0, "ed" },
1503
+ { T_STR, 0, "Warning" },
1504
+ { T_STR, 0, "This is an error message for the log file\n" },
1505
+ end_node
1506
+ };
1507
+ struct test_node map2[] = {
1508
+ { T_STR, 0, "Time" },
1509
+ { T_STR, 0, "2001-11-23 15:02:31 -05:00" },
1510
+ { T_STR, 0, "User" },
1511
+ { T_STR, 0, "ed" },
1512
+ { T_STR, 0, "Warning" },
1513
+ { T_STR, 0, "A slightly different error message.\n" },
1514
+ end_node
1515
+ };
1516
+ struct test_node file1[] = {
1517
+ { T_STR, 0, "file" },
1518
+ { T_STR, 0, "TopClass.py" },
1519
+ { T_STR, 0, "line" },
1520
+ { T_STR, 0, "23" },
1521
+ { T_STR, 0, "code" },
1522
+ { T_STR, 0, "x = MoreObject(\"345\\n\")\n" },
1523
+ end_node
1524
+ };
1525
+ struct test_node file2[] = {
1526
+ { T_STR, 0, "file" },
1527
+ { T_STR, 0, "MoreClass.py" },
1528
+ { T_STR, 0, "line" },
1529
+ { T_STR, 0, "58" },
1530
+ { T_STR, 0, "code" },
1531
+ { T_STR, 0, "foo = bar" },
1532
+ end_node
1533
+ };
1534
+ struct test_node stack[] = {
1535
+ { T_MAP, 0, 0, file1 },
1536
+ { T_MAP, 0, 0, file2 },
1537
+ end_node
1538
+ };
1539
+ struct test_node map3[] = {
1540
+ { T_STR, 0, "Date" },
1541
+ { T_STR, 0, "2001-11-23 15:03:17 -05:00" },
1542
+ { T_STR, 0, "User" },
1543
+ { T_STR, 0, "ed" },
1544
+ { T_STR, 0, "Fatal" },
1545
+ { T_STR, 0, "Unknown variable \"bar\"\n" },
1546
+ { T_STR, 0, "Stack" },
1547
+ { T_SEQ, 0, 0, stack },
1548
+ end_node
1549
+ };
1550
+ struct test_node stream[] = {
1551
+ { T_MAP, 0, 0, map1 },
1552
+ { T_MAP, 0, 0, map2 },
1553
+ { T_MAP, 0, 0, map3 },
1554
+ end_node
1555
+ };
1556
+ documents: 3
1557
+
1558
+ ---
1559
+ test: Throwaway comments
1560
+ yaml: |
1561
+ ### These are four throwaway comment ###
1562
+
1563
+ ### lines (the second line is empty). ###
1564
+ this: | # Comments may trail lines.
1565
+ contains three lines of text.
1566
+ The third one starts with a
1567
+ # character. This isn't a comment.
1568
+
1569
+ # These are three throwaway comment
1570
+ # lines (the first line is empty).
1571
+ ruby: |
1572
+ {
1573
+ 'this' => "contains three lines of text.\nThe third one starts with a\n# character. This isn't a comment.\n"
1574
+ }
1575
+ syck: |
1576
+ struct test_node map[] = {
1577
+ { T_STR, 0, "this" },
1578
+ { T_STR, 0, "contains three lines of text.\nThe third one starts with a\n# character. This isn't a comment.\n" },
1579
+ end_node
1580
+ };
1581
+ struct test_node stream[] = {
1582
+ { T_MAP, 0, 0, map },
1583
+ end_node
1584
+ };
1585
+
1586
+ ---
1587
+ test: Document with a single value
1588
+ yaml: |
1589
+ --- >
1590
+ This YAML stream contains a single text value.
1591
+ The next stream is a log file - a sequence of
1592
+ log entries. Adding an entry to the log is a
1593
+ simple matter of appending it at the end.
1594
+ ruby: |
1595
+ "This YAML stream contains a single text value. The next stream is a log file - a sequence of log entries. Adding an entry to the log is a simple matter of appending it at the end.\n"
1596
+ syck: |
1597
+ struct test_node stream[] = {
1598
+ { T_STR, 0, "This YAML stream contains a single text value. The next stream is a log file - a sequence of log entries. Adding an entry to the log is a simple matter of appending it at the end.\n" },
1599
+ end_node
1600
+ };
1601
+
1602
+ ---
1603
+ test: Document stream
1604
+ yaml: |
1605
+ ---
1606
+ at: 2001-08-12 09:25:00.00 Z
1607
+ type: GET
1608
+ HTTP: '1.0'
1609
+ url: '/index.html'
1610
+ ---
1611
+ at: 2001-08-12 09:25:10.00 Z
1612
+ type: GET
1613
+ HTTP: '1.0'
1614
+ url: '/toc.html'
1615
+ ruby: |
1616
+ y = YAML::Stream.new
1617
+ y.add( {
1618
+ 'at' => Time::utc( 2001, 8, 12, 9, 25, 00 ),
1619
+ 'type' => 'GET',
1620
+ 'HTTP' => '1.0',
1621
+ 'url' => '/index.html'
1622
+ } )
1623
+ y.add( {
1624
+ 'at' => Time::utc( 2001, 8, 12, 9, 25, 10 ),
1625
+ 'type' => 'GET',
1626
+ 'HTTP' => '1.0',
1627
+ 'url' => '/toc.html'
1628
+ } )
1629
+ syck: |
1630
+ struct test_node map1[] = {
1631
+ { T_STR, 0, "at" },
1632
+ { T_STR, 0, "2001-08-12 09:25:00.00 Z" },
1633
+ { T_STR, 0, "type" },
1634
+ { T_STR, 0, "GET" },
1635
+ { T_STR, 0, "HTTP" },
1636
+ { T_STR, 0, "1.0" },
1637
+ { T_STR, 0, "url" },
1638
+ { T_STR, 0, "/index.html" },
1639
+ end_node
1640
+ };
1641
+ struct test_node map2[] = {
1642
+ { T_STR, 0, "at" },
1643
+ { T_STR, 0, "2001-08-12 09:25:10.00 Z" },
1644
+ { T_STR, 0, "type" },
1645
+ { T_STR, 0, "GET" },
1646
+ { T_STR, 0, "HTTP" },
1647
+ { T_STR, 0, "1.0" },
1648
+ { T_STR, 0, "url" },
1649
+ { T_STR, 0, "/toc.html" },
1650
+ end_node
1651
+ };
1652
+ struct test_node stream[] = {
1653
+ { T_MAP, 0, 0, map1 },
1654
+ { T_MAP, 0, 0, map2 },
1655
+ end_node
1656
+ };
1657
+ documents: 2
1658
+
1659
+ ---
1660
+ test: Top level mapping
1661
+ yaml: |
1662
+ # This stream is an example of a top-level mapping.
1663
+ invoice : 34843
1664
+ date : 2001-01-23
1665
+ total : 4443.52
1666
+ ruby: |
1667
+ {
1668
+ 'invoice' => 34843,
1669
+ 'date' => Date.new( 2001, 1, 23 ),
1670
+ 'total' => 4443.52
1671
+ }
1672
+ syck: |
1673
+ struct test_node map[] = {
1674
+ { T_STR, 0, "invoice" },
1675
+ { T_STR, 0, "34843" },
1676
+ { T_STR, 0, "date" },
1677
+ { T_STR, 0, "2001-01-23" },
1678
+ { T_STR, 0, "total" },
1679
+ { T_STR, 0, "4443.52" },
1680
+ end_node
1681
+ };
1682
+ struct test_node stream[] = {
1683
+ { T_MAP, 0, 0, map },
1684
+ end_node
1685
+ };
1686
+
1687
+ ---
1688
+ test: Single-line documents
1689
+ yaml: |
1690
+ # The following is a sequence of three documents.
1691
+ # The first contains an empty mapping, the second
1692
+ # an empty sequence, and the last an empty string.
1693
+ --- {}
1694
+ --- [ ]
1695
+ --- ''
1696
+ ruby: |
1697
+ y = YAML::Stream.new
1698
+ y.add( {} )
1699
+ y.add( [] )
1700
+ y.add( '' )
1701
+ syck: |
1702
+ struct test_node map[] = {
1703
+ end_node
1704
+ };
1705
+ struct test_node seq[] = {
1706
+ end_node
1707
+ };
1708
+ struct test_node stream[] = {
1709
+ { T_MAP, 0, 0, map },
1710
+ { T_SEQ, 0, 0, seq },
1711
+ { T_STR, 0, "" },
1712
+ end_node
1713
+ };
1714
+ documents: 3
1715
+
1716
+ ---
1717
+ test: Document with pause
1718
+ yaml: |
1719
+ # A communication channel based on a YAML stream.
1720
+ ---
1721
+ sent at: 2002-06-06 11:46:25.10 Z
1722
+ payload: Whatever
1723
+ # Receiver can process this as soon as the following is sent:
1724
+ ...
1725
+ # Even if the next message is sent long after:
1726
+ ---
1727
+ sent at: 2002-06-06 12:05:53.47 Z
1728
+ payload: Whatever
1729
+ ...
1730
+ ruby: |
1731
+ y = YAML::Stream.new
1732
+ y.add(
1733
+ { 'sent at' => YAML::mktime( 2002, 6, 6, 11, 46, 25, 0.10 ),
1734
+ 'payload' => 'Whatever' }
1735
+ )
1736
+ y.add(
1737
+ { "payload" => "Whatever", "sent at" => YAML::mktime( 2002, 6, 6, 12, 5, 53, 0.47 ) }
1738
+ )
1739
+ syck: |
1740
+ struct test_node map1[] = {
1741
+ { T_STR, 0, "sent at" },
1742
+ { T_STR, 0, "2002-06-06 11:46:25.10 Z" },
1743
+ { T_STR, 0, "payload" },
1744
+ { T_STR, 0, "Whatever" },
1745
+ end_node
1746
+ };
1747
+ struct test_node map2[] = {
1748
+ { T_STR, 0, "sent at" },
1749
+ { T_STR, 0, "2002-06-06 12:05:53.47 Z" },
1750
+ { T_STR, 0, "payload" },
1751
+ { T_STR, 0, "Whatever" },
1752
+ end_node
1753
+ };
1754
+ struct test_node stream[] = {
1755
+ { T_MAP, 0, 0, map1 },
1756
+ { T_MAP, 0, 0, map2 },
1757
+ end_node
1758
+ };
1759
+ documents: 2
1760
+
1761
+ ---
1762
+ test: Explicit typing
1763
+ yaml: |
1764
+ integer: 12
1765
+ also int: ! "12"
1766
+ string: !str 12
1767
+ ruby: |
1768
+ { 'integer' => 12, 'also int' => 12, 'string' => '12' }
1769
+ syck: |
1770
+ struct test_node map[] = {
1771
+ { T_STR, 0, "integer" },
1772
+ { T_STR, "tag:yaml.org,2002:int", "12" },
1773
+ { T_STR, 0, "also int" },
1774
+ { T_STR, "tag:yaml.org,2002:int", "12" },
1775
+ { T_STR, 0, "string" },
1776
+ { T_STR, "tag:yaml.org,2002:str", "12" },
1777
+ end_node
1778
+ };
1779
+ struct test_node stream[] = {
1780
+ { T_MAP, 0, 0, map },
1781
+ end_node
1782
+ };
1783
+
1784
+ ---
1785
+ test: Private types
1786
+ yaml: |
1787
+ # Both examples below make use of the 'x-private:ball'
1788
+ # type family URI, but with different semantics.
1789
+ ---
1790
+ pool: !!ball
1791
+ number: 8
1792
+ color: black
1793
+ ---
1794
+ bearing: !!ball
1795
+ material: steel
1796
+ ruby: |
1797
+ y = YAML::Stream.new
1798
+ y.add( { 'pool' =>
1799
+ YAML::PrivateType.new( 'ball',
1800
+ { 'number' => 8, 'color' => 'black' } ) }
1801
+ )
1802
+ y.add( { 'bearing' =>
1803
+ YAML::PrivateType.new( 'ball',
1804
+ { 'material' => 'steel' } ) }
1805
+ )
1806
+ syck: |
1807
+ struct test_node pool[] = {
1808
+ { T_STR, 0, "number" },
1809
+ { T_STR, 0, "8" },
1810
+ { T_STR, 0, "color" },
1811
+ { T_STR, 0, "black" },
1812
+ end_node
1813
+ };
1814
+ struct test_node map1[] = {
1815
+ { T_STR, 0, "pool" },
1816
+ { T_MAP, "x-private:ball", 0, pool },
1817
+ end_node
1818
+ };
1819
+ struct test_node bearing[] = {
1820
+ { T_STR, 0, "material" },
1821
+ { T_STR, 0, "steel" },
1822
+ end_node
1823
+ };
1824
+ struct test_node map2[] = {
1825
+ { T_STR, 0, "bearing" },
1826
+ { T_MAP, "x-private:ball", 0, bearing },
1827
+ end_node
1828
+ };
1829
+ struct test_node stream[] = {
1830
+ { T_MAP, 0, 0, map1 },
1831
+ { T_MAP, 0, 0, map2 },
1832
+ end_node
1833
+ };
1834
+ documents: 2
1835
+
1836
+ ---
1837
+ test: Type family under yaml.org
1838
+ yaml: |
1839
+ # The URI is 'tag:yaml.org,2002:str'
1840
+ - !str a Unicode string
1841
+ python: |
1842
+ [ [ 'a Unicode string' ] ]
1843
+ ruby: |
1844
+ [ 'a Unicode string' ]
1845
+ syck: |
1846
+ struct test_node seq[] = {
1847
+ { T_STR, "tag:yaml.org,2002:str", "a Unicode string" },
1848
+ end_node
1849
+ };
1850
+ struct test_node stream[] = {
1851
+ { T_SEQ, 0, 0, seq },
1852
+ end_node
1853
+ };
1854
+
1855
+ ---
1856
+ test: Type family under perl.yaml.org
1857
+ yaml: |
1858
+ # The URI is 'tag:perl.yaml.org,2002:Text::Tabs'
1859
+ - !perl/Text::Tabs {}
1860
+ ruby: |
1861
+ [ YAML::DomainType.new( 'perl.yaml.org,2002', 'Text::Tabs', {} ) ]
1862
+ syck: |
1863
+ struct test_node map[] = {
1864
+ end_node
1865
+ };
1866
+ struct test_node seq[] = {
1867
+ { T_MAP, "tag:perl.yaml.org,2002:Text::Tabs", 0, map },
1868
+ end_node
1869
+ };
1870
+ struct test_node stream[] = {
1871
+ { T_SEQ, 0, 0, seq },
1872
+ end_node
1873
+ };
1874
+
1875
+ ---
1876
+ test: Type family under clarkevans.com
1877
+ yaml: |
1878
+ # The URI is 'tag:clarkevans.com,2003-02:timesheet'
1879
+ - !clarkevans.com,2003-02/timesheet {}
1880
+ ruby: |
1881
+ [ YAML::DomainType.new( 'clarkevans.com,2003-02', 'timesheet', {} ) ]
1882
+ syck: |
1883
+ struct test_node map[] = {
1884
+ end_node
1885
+ };
1886
+ struct test_node seq[] = {
1887
+ { T_MAP, "tag:clarkevans.com,2003-02:timesheet", 0, map },
1888
+ end_node
1889
+ };
1890
+ struct test_node stream[] = {
1891
+ { T_SEQ, 0, 0, seq },
1892
+ end_node
1893
+ };
1894
+
1895
+ ---
1896
+ test: URI Escaping
1897
+ yaml: |
1898
+ same:
1899
+ - !domain.tld,2002/type\x30 value
1900
+ - !domain.tld,2002/type0 value
1901
+ different: # As far as the YAML parser is concerned
1902
+ - !domain.tld,2002/type%30 value
1903
+ - !domain.tld,2002/type0 value
1904
+ ruby-setup: |
1905
+ YAML.add_domain_type( "domain.tld,2002", "type0" ) { |type, val|
1906
+ "ONE: #{val}"
1907
+ }
1908
+ YAML.add_domain_type( "domain.tld,2002", "type%30" ) { |type, val|
1909
+ "TWO: #{val}"
1910
+ }
1911
+ ruby: |
1912
+ { 'same' => [ 'ONE: value', 'ONE: value' ], 'different' => [ 'TWO: value', 'ONE: value' ] }
1913
+ syck: |
1914
+ struct test_node same[] = {
1915
+ { T_STR, "tag:domain.tld,2002:type0", "value" },
1916
+ { T_STR, "tag:domain.tld,2002:type0", "value" },
1917
+ end_node
1918
+ };
1919
+ struct test_node diff[] = {
1920
+ { T_STR, "tag:domain.tld,2002:type%30", "value" },
1921
+ { T_STR, "tag:domain.tld,2002:type0", "value" },
1922
+ end_node
1923
+ };
1924
+ struct test_node map[] = {
1925
+ { T_STR, 0, "same" },
1926
+ { T_SEQ, 0, 0, same },
1927
+ { T_STR, 0, "different" },
1928
+ { T_SEQ, 0, 0, diff },
1929
+ end_node
1930
+ };
1931
+ struct test_node stream[] = {
1932
+ { T_MAP, 0, 0, map },
1933
+ end_node
1934
+ };
1935
+
1936
+ ---
1937
+ test: URI Prefixing
1938
+ yaml: |
1939
+ # 'tag:domain.tld,2002:invoice' is some type family.
1940
+ invoice: !domain.tld,2002/^invoice
1941
+ # 'seq' is shorthand for 'tag:yaml.org,2002:seq'.
1942
+ # This does not effect '^customer' below
1943
+ # because it is does not specify a prefix.
1944
+ customers: !seq
1945
+ # '^customer' is shorthand for the full
1946
+ # notation 'tag:domain.tld,2002:customer'.
1947
+ - !^customer
1948
+ given : Chris
1949
+ family : Dumars
1950
+ ruby-setup: |
1951
+ YAML.add_domain_type( "domain.tld,2002", /(invoice|customer)/ ) { |type, val|
1952
+ if val.is_a? ::Hash
1953
+ scheme, domain, type = type.split( /:/, 3 )
1954
+ val['type'] = "domain #{type}"
1955
+ val
1956
+ else
1957
+ raise YAML::Error, "Not a Hash in domain.tld/invoice: " + val.inspect
1958
+ end
1959
+ }
1960
+ ruby: |
1961
+ { "invoice"=> { "customers"=> [ { "given"=>"Chris", "type"=>"domain customer", "family"=>"Dumars" } ], "type"=>"domain invoice" } }
1962
+
1963
+ ---
1964
+ test: Overriding anchors
1965
+ yaml: |
1966
+ anchor : &A001 This scalar has an anchor.
1967
+ override : &A001 >
1968
+ The alias node below is a
1969
+ repeated use of this value.
1970
+ alias : *A001
1971
+ ruby: |
1972
+ { 'anchor' => 'This scalar has an anchor.',
1973
+ 'override' => "The alias node below is a repeated use of this value.\n",
1974
+ 'alias' => "The alias node below is a repeated use of this value.\n" }
1975
+ syck: |
1976
+ struct test_node map[] = {
1977
+ { T_STR, 0, "anchor" },
1978
+ { T_STR, 0, "This scalar has an anchor." },
1979
+ { T_STR, 0, "override" },
1980
+ { T_STR, 0, "The alias node below is a repeated use of this value.\n" },
1981
+ { T_STR, 0, "alias" },
1982
+ { T_STR, 0, "The alias node below is a repeated use of this value.\n" },
1983
+ end_node
1984
+ };
1985
+ struct test_node stream[] = {
1986
+ { T_MAP, 0, 0, map },
1987
+ end_node
1988
+ };
1989
+
1990
+ ---
1991
+ test: Flow and block formatting
1992
+ yaml: |
1993
+ empty: []
1994
+ flow: [ one, two, three # May span lines,
1995
+ , four, # indentation is
1996
+ five ] # mostly ignored.
1997
+ block:
1998
+ - First item in top sequence
1999
+ -
2000
+ - Subordinate sequence entry
2001
+ - >
2002
+ A folded sequence entry
2003
+ - Sixth item in top sequence
2004
+ ruby: |
2005
+ { 'empty' => [], 'flow' => [ 'one', 'two', 'three', 'four', 'five' ],
2006
+ 'block' => [ 'First item in top sequence', [ 'Subordinate sequence entry' ],
2007
+ "A folded sequence entry\n", 'Sixth item in top sequence' ] }
2008
+ syck: |
2009
+ struct test_node empty[] = {
2010
+ end_node
2011
+ };
2012
+ struct test_node flow[] = {
2013
+ { T_STR, 0, "one" },
2014
+ { T_STR, 0, "two" },
2015
+ { T_STR, 0, "three" },
2016
+ { T_STR, 0, "four" },
2017
+ { T_STR, 0, "five" },
2018
+ end_node
2019
+ };
2020
+ struct test_node inblock[] = {
2021
+ { T_STR, 0, "Subordinate sequence entry" },
2022
+ end_node
2023
+ };
2024
+ struct test_node block[] = {
2025
+ { T_STR, 0, "First item in top sequence" },
2026
+ { T_SEQ, 0, 0, inblock },
2027
+ { T_STR, 0, "A folded sequence entry\n" },
2028
+ { T_STR, 0, "Sixth item in top sequence" },
2029
+ end_node
2030
+ };
2031
+ struct test_node map[] = {
2032
+ { T_STR, 0, "empty" },
2033
+ { T_SEQ, 0, 0, empty },
2034
+ { T_STR, 0, "flow" },
2035
+ { T_SEQ, 0, 0, flow },
2036
+ { T_STR, 0, "block" },
2037
+ { T_SEQ, 0, 0, block },
2038
+ end_node
2039
+ };
2040
+ struct test_node stream[] = {
2041
+ { T_MAP, 0, 0, map },
2042
+ end_node
2043
+ };
2044
+
2045
+ ---
2046
+ test: Complete mapping test
2047
+ yaml: |
2048
+ empty: {}
2049
+ flow: { one: 1, two: 2 }
2050
+ spanning: { one: 1,
2051
+ two: 2 }
2052
+ block:
2053
+ first : First entry
2054
+ second:
2055
+ key: Subordinate mapping
2056
+ third:
2057
+ - Subordinate sequence
2058
+ - { }
2059
+ - Previous mapping is empty.
2060
+ - A key: value pair in a sequence.
2061
+ A second: key:value pair.
2062
+ - The previous entry is equal to the following one.
2063
+ -
2064
+ A key: value pair in a sequence.
2065
+ A second: key:value pair.
2066
+ !float 12 : This key is a float.
2067
+ ? >
2068
+ ?
2069
+ : This key had to be protected.
2070
+ "\a" : This key had to be escaped.
2071
+ ? >
2072
+ This is a
2073
+ multi-line
2074
+ folded key
2075
+ : Whose value is
2076
+ also multi-line.
2077
+ ? this also works as a key
2078
+ : with a value at the next line.
2079
+ ?
2080
+ - This key
2081
+ - is a sequence
2082
+ :
2083
+ - With a sequence value.
2084
+ ?
2085
+ This: key
2086
+ is a: mapping
2087
+ :
2088
+ with a: mapping value.
2089
+ ruby: |
2090
+ { 'empty' => {}, 'flow' => { 'one' => 1, 'two' => 2 },
2091
+ 'spanning' => { 'one' => 1, 'two' => 2 },
2092
+ 'block' => { 'first' => 'First entry', 'second' =>
2093
+ { 'key' => 'Subordinate mapping' }, 'third' =>
2094
+ [ 'Subordinate sequence', {}, 'Previous mapping is empty.',
2095
+ { 'A key' => 'value pair in a sequence.', 'A second' => 'key:value pair.' },
2096
+ 'The previous entry is equal to the following one.',
2097
+ { 'A key' => 'value pair in a sequence.', 'A second' => 'key:value pair.' } ],
2098
+ 12.0 => 'This key is a float.', "?\n" => 'This key had to be protected.',
2099
+ "\a" => 'This key had to be escaped.',
2100
+ "This is a multi-line folded key\n" => "Whose value is also multi-line.",
2101
+ 'this also works as a key' => 'with a value at the next line.',
2102
+ [ 'This key', 'is a sequence' ] => [ 'With a sequence value.' ] } }
2103
+ # Couldn't recreate map exactly, so we'll do a detailed check to be sure it's entact
2104
+ obj_y['block'].keys.each { |k|
2105
+ if Hash === k
2106
+ v = obj_y['block'][k]
2107
+ if k['This'] == 'key' and k['is a'] == 'mapping' and v['with a'] == 'mapping value.'
2108
+ obj_r['block'][k] = v
2109
+ end
2110
+ end
2111
+ }
2112
+
2113
+ ---
2114
+ test: Literal explicit indentation
2115
+ yaml: |
2116
+ # Explicit indentation must
2117
+ # be given in all the three
2118
+ # following cases.
2119
+ leading spaces: |2
2120
+ This value starts with four spaces.
2121
+
2122
+ leading line break: |2
2123
+
2124
+ This value starts with a line break.
2125
+
2126
+ leading comment indicator: |2
2127
+ # first line starts with a
2128
+ # character.
2129
+
2130
+ # Explicit indentation may
2131
+ # also be given when it is
2132
+ # not required.
2133
+ redundant: |2
2134
+ This value is indented 2 spaces.
2135
+ ruby: |
2136
+ {
2137
+ 'leading spaces' => " This value starts with four spaces.\n",
2138
+ 'leading line break' => "\nThis value starts with a line break.\n",
2139
+ 'leading comment indicator' => "# first line starts with a\n# character.\n",
2140
+ 'redundant' => "This value is indented 2 spaces.\n"
2141
+ }
2142
+
2143
+ ---
2144
+ test: Chomping and keep modifiers
2145
+ yaml: |
2146
+ clipped: |
2147
+ This has one newline.
2148
+
2149
+ same as "clipped" above: "This has one newline.\n"
2150
+
2151
+ stripped: |-
2152
+ This has no newline.
2153
+
2154
+ same as "stripped" above: "This has no newline."
2155
+
2156
+ kept: |+
2157
+ This has two newlines.
2158
+
2159
+ same as "kept" above: "This has two newlines.\n\n"
2160
+ ruby: |
2161
+ {
2162
+ 'clipped' => "This has one newline.\n",
2163
+ 'same as "clipped" above' => "This has one newline.\n",
2164
+ 'stripped' => 'This has no newline.',
2165
+ 'same as "stripped" above' => 'This has no newline.',
2166
+ 'kept' => "This has two newlines.\n\n",
2167
+ 'same as "kept" above' => "This has two newlines.\n\n"
2168
+ }
2169
+
2170
+ ---
2171
+ test: Literal combinations
2172
+ yaml: |
2173
+ empty: |
2174
+
2175
+ literal: |
2176
+ The \ ' " characters may be
2177
+ freely used. Leading white
2178
+ space is significant.
2179
+
2180
+ Line breaks are significant.
2181
+ Thus this value contains one
2182
+ empty line and ends with a
2183
+ single line break, but does
2184
+ not start with one.
2185
+
2186
+ is equal to: "The \\ ' \" characters may \
2187
+ be\nfreely used. Leading white\n space \
2188
+ is significant.\n\nLine breaks are \
2189
+ significant.\nThus this value contains \
2190
+ one\nempty line and ends with a\nsingle \
2191
+ line break, but does\nnot start with one.\n"
2192
+
2193
+ # Comments may follow a block
2194
+ # scalar value. They must be
2195
+ # less indented.
2196
+
2197
+ # Modifiers may be combined in any order.
2198
+ indented and chomped: |2-
2199
+ This has no newline.
2200
+
2201
+ also written as: |-2
2202
+ This has no newline.
2203
+
2204
+ both are equal to: " This has no newline."
2205
+ ruby: |
2206
+ {
2207
+ 'empty' => '',
2208
+ 'literal' => "The \\ ' \" characters may be\nfreely used. Leading white\n space " +
2209
+ "is significant.\n\nLine breaks are significant.\nThus this value contains one\n" +
2210
+ "empty line and ends with a\nsingle line break, but does\nnot start with one.\n",
2211
+ 'is equal to' => "The \\ ' \" characters may be\nfreely used. Leading white\n space " +
2212
+ "is significant.\n\nLine breaks are significant.\nThus this value contains one\n" +
2213
+ "empty line and ends with a\nsingle line break, but does\nnot start with one.\n",
2214
+ 'indented and chomped' => ' This has no newline.',
2215
+ 'also written as' => ' This has no newline.',
2216
+ 'both are equal to' => ' This has no newline.'
2217
+ }
2218
+
2219
+ ---
2220
+ test: Folded combinations
2221
+ yaml: |
2222
+ empty: >
2223
+
2224
+ one paragraph: >
2225
+ Line feeds are converted
2226
+ to spaces, so this value
2227
+ contains no line breaks
2228
+ except for the final one.
2229
+
2230
+ multiple paragraphs: >2
2231
+
2232
+ An empty line, either
2233
+ at the start or in
2234
+ the value:
2235
+
2236
+ Is interpreted as a
2237
+ line break. Thus this
2238
+ value contains three
2239
+ line breaks.
2240
+
2241
+ indented text: >
2242
+ This is a folded
2243
+ paragraph followed
2244
+ by a list:
2245
+ * first entry
2246
+ * second entry
2247
+ Followed by another
2248
+ folded paragraph,
2249
+ another list:
2250
+
2251
+ * first entry
2252
+
2253
+ * second entry
2254
+
2255
+ And a final folded
2256
+ paragraph.
2257
+
2258
+ above is equal to: |
2259
+ This is a folded paragraph followed by a list:
2260
+ * first entry
2261
+ * second entry
2262
+ Followed by another folded paragraph, another list:
2263
+
2264
+ * first entry
2265
+
2266
+ * second entry
2267
+
2268
+ And a final folded paragraph.
2269
+
2270
+ # Explicit comments may follow
2271
+ # but must be less indented.
2272
+ ruby: |
2273
+ {
2274
+ 'empty' => '',
2275
+ 'one paragraph' => 'Line feeds are converted to spaces, so this value' +
2276
+ " contains no line breaks except for the final one.\n",
2277
+ 'multiple paragraphs' => "\nAn empty line, either at the start or in the value:\n" +
2278
+ "Is interpreted as a line break. Thus this value contains three line breaks.\n",
2279
+ 'indented text' => "This is a folded paragraph followed by a list:\n" +
2280
+ " * first entry\n * second entry\nFollowed by another folded paragraph, " +
2281
+ "another list:\n\n * first entry\n\n * second entry\n\nAnd a final folded paragraph.\n",
2282
+ 'above is equal to' => "This is a folded paragraph followed by a list:\n" +
2283
+ " * first entry\n * second entry\nFollowed by another folded paragraph, " +
2284
+ "another list:\n\n * first entry\n\n * second entry\n\nAnd a final folded paragraph.\n"
2285
+ }
2286
+
2287
+ ---
2288
+ test: Single quotes
2289
+ yaml: |
2290
+ empty: ''
2291
+ second: '! : \ etc. can be used freely.'
2292
+ third: 'a single quote '' must be escaped.'
2293
+ span: 'this contains
2294
+ six spaces
2295
+
2296
+ and one
2297
+ line break'
2298
+ is same as: "this contains six spaces\nand one line break"
2299
+ ruby: |
2300
+ {
2301
+ 'empty' => '',
2302
+ 'second' => '! : \\ etc. can be used freely.',
2303
+ 'third' => "a single quote ' must be escaped.",
2304
+ 'span' => "this contains six spaces\nand one line break",
2305
+ 'is same as' => "this contains six spaces\nand one line break"
2306
+ }
2307
+
2308
+ ---
2309
+ test: Double quotes
2310
+ yaml: |
2311
+ empty: ""
2312
+ second: "! : etc. can be used freely."
2313
+ third: "a \" or a \\ must be escaped."
2314
+ fourth: "this value ends with an LF.\n"
2315
+ span: "this contains
2316
+ four \
2317
+ spaces"
2318
+ is equal to: "this contains four spaces"
2319
+ ruby: |
2320
+ {
2321
+ 'empty' => '',
2322
+ 'second' => '! : etc. can be used freely.',
2323
+ 'third' => 'a " or a \\ must be escaped.',
2324
+ 'fourth' => "this value ends with an LF.\n",
2325
+ 'span' => "this contains four spaces",
2326
+ 'is equal to' => "this contains four spaces"
2327
+ }
2328
+
2329
+ ---
2330
+ test: Unquoted strings
2331
+ yaml: |
2332
+ first: There is no unquoted empty string.
2333
+
2334
+ second: 12 ## This is an integer.
2335
+
2336
+ third: !str 12 ## This is a string.
2337
+
2338
+ span: this contains
2339
+ six spaces
2340
+
2341
+ and one
2342
+ line break
2343
+
2344
+ indicators: this has no comments.
2345
+ #:foo and bar# are
2346
+ both text.
2347
+
2348
+ flow: [ can span
2349
+ lines, # comment
2350
+ like
2351
+ this ]
2352
+
2353
+ note: { one-line keys: but multi-line values }
2354
+
2355
+ ruby: |
2356
+ {
2357
+ 'first' => 'There is no unquoted empty string.',
2358
+ 'second' => 12,
2359
+ 'third' => '12',
2360
+ 'span' => "this contains six spaces\nand one line break",
2361
+ 'indicators' => "this has no comments. #:foo and bar# are both text.",
2362
+ 'flow' => [ 'can span lines', 'like this' ],
2363
+ 'note' => { 'one-line keys' => 'but multi-line values' }
2364
+ }
2365
+
2366
+ ---
2367
+ test: Spanning sequences
2368
+ yaml: |
2369
+ # The following are equal seqs
2370
+ # with different identities.
2371
+ flow: [ one, two ]
2372
+ spanning: [ one,
2373
+ two ]
2374
+ block:
2375
+ - one
2376
+ - two
2377
+ ruby: |
2378
+ {
2379
+ 'flow' => [ 'one', 'two' ],
2380
+ 'spanning' => [ 'one', 'two' ],
2381
+ 'block' => [ 'one', 'two' ]
2382
+ }
2383
+
2384
+ ---
2385
+ test: Flow mappings
2386
+ yaml: |
2387
+ # The following are equal maps
2388
+ # with different identities.
2389
+ flow: { one: 1, two: 2 }
2390
+ block:
2391
+ one: 1
2392
+ two: 2
2393
+ ruby: |
2394
+ {
2395
+ 'flow' => { 'one' => 1, 'two' => 2 },
2396
+ 'block' => { 'one' => 1, 'two' => 2 }
2397
+ }
2398
+
2399
+ ---
2400
+ test: Representations of 12
2401
+ yaml: |
2402
+ - 12 # An integer
2403
+ # The following scalars
2404
+ # are loaded to the
2405
+ # string value '1' '2'.
2406
+ - !str 12
2407
+ - '12'
2408
+ - "12"
2409
+ - "\
2410
+ 1\
2411
+ 2\
2412
+ "
2413
+ # Strings containing paths and regexps can be unquoted:
2414
+ - /foo/bar
2415
+ - d:/foo/bar
2416
+ - foo/bar
2417
+ - /a.*b/
2418
+ ruby: |
2419
+ [ 12, '12', '12', '12', '12', '/foo/bar', 'd:/foo/bar', 'foo/bar', '/a.*b/' ]
2420
+
2421
+ ---
2422
+ test: "Null"
2423
+ yaml: |
2424
+ canonical: ~
2425
+
2426
+ english: null
2427
+
2428
+ # This sequence has five
2429
+ # entries, two with values.
2430
+ sparse:
2431
+ - ~
2432
+ - 2nd entry
2433
+ - Null
2434
+ - 4th entry
2435
+ -
2436
+
2437
+ four: This mapping has five keys,
2438
+ only two with values.
2439
+
2440
+ ruby: |
2441
+ {
2442
+ 'canonical' => nil,
2443
+ 'english' => nil,
2444
+ 'sparse' => [ nil, '2nd entry', nil, '4th entry', nil ],
2445
+ 'four' => 'This mapping has five keys, only two with values.'
2446
+ }
2447
+
2448
+ ---
2449
+ test: Omap
2450
+ yaml: |
2451
+ # Explicitly typed dictionary.
2452
+ Bestiary: !omap
2453
+ - aardvark: African pig-like ant eater. Ugly.
2454
+ - anteater: South-American ant eater. Two species.
2455
+ - anaconda: South-American constrictor snake. Scary.
2456
+ # Etc.
2457
+ ruby: |
2458
+ {
2459
+ 'Bestiary' => YAML::Omap[
2460
+ 'aardvark', 'African pig-like ant eater. Ugly.',
2461
+ 'anteater', 'South-American ant eater. Two species.',
2462
+ 'anaconda', 'South-American constrictor snake. Scary.'
2463
+ ]
2464
+ }
2465
+
2466
+ ---
2467
+ test: Pairs
2468
+ yaml: |
2469
+ # Explicitly typed pairs.
2470
+ tasks: !pairs
2471
+ - meeting: with team.
2472
+ - meeting: with boss.
2473
+ - break: lunch.
2474
+ - meeting: with client.
2475
+ ruby: |
2476
+ {
2477
+ 'tasks' => YAML::Pairs[
2478
+ 'meeting', 'with team.',
2479
+ 'meeting', 'with boss.',
2480
+ 'break', 'lunch.',
2481
+ 'meeting', 'with client.'
2482
+ ]
2483
+ }
2484
+
2485
+ ---
2486
+ test: Set
2487
+ yaml: |
2488
+ # Explicitly typed set.
2489
+ baseball players: !set
2490
+ Mark McGwire:
2491
+ Sammy Sosa:
2492
+ Ken Griffey:
2493
+ ruby: |
2494
+ {
2495
+ 'baseball players' => YAML::Set[
2496
+ 'Mark McGwire', nil,
2497
+ 'Sammy Sosa', nil,
2498
+ 'Ken Griffey', nil
2499
+ ]
2500
+ }
2501
+
2502
+ ---
2503
+ test: Boolean
2504
+ yaml: |
2505
+ false: used as key
2506
+ logical: true
2507
+ answer: no
2508
+ ruby: |
2509
+ {
2510
+ false => 'used as key',
2511
+ 'logical' => true,
2512
+ 'answer' => false
2513
+ }
2514
+
2515
+ ---
2516
+ test: Integer
2517
+ yaml: |
2518
+ canonical: 12345
2519
+ decimal: +12,345
2520
+ octal: 014
2521
+ hexadecimal: 0xC
2522
+ ruby: |
2523
+ {
2524
+ 'canonical' => 12345,
2525
+ 'decimal' => 12345,
2526
+ 'octal' => 12,
2527
+ 'hexadecimal' => 12
2528
+ }
2529
+
2530
+ ---
2531
+ test: Float
2532
+ yaml: |
2533
+ canonical: 1.23015e+3
2534
+ exponential: 12.3015e+02
2535
+ fixed: 1,230.15
2536
+ negative infinity: -.inf
2537
+ not a number: .NaN
2538
+ ruby: |
2539
+ {
2540
+ 'canonical' => 1230.15,
2541
+ 'exponential' => 1230.15,
2542
+ 'fixed' => 1230.15,
2543
+ 'negative infinity' => -1.0/0.0,
2544
+ 'not a number' => 0.0/0.0
2545
+ }
2546
+ if obj_y['not a number'].nan? # NaN comparison doesn't work right against 0.0/0.0
2547
+ obj_r['not a number'] = obj_y['not a number']
2548
+ end
2549
+
2550
+ ---
2551
+ test: Timestamp
2552
+ yaml: |
2553
+ canonical: 2001-12-15T02:59:43.1Z
2554
+ valid iso8601: 2001-12-14t21:59:43.10-05:00
2555
+ space separated: 2001-12-14 21:59:43.10 -05:00
2556
+ date (noon UTC): 2002-12-14
2557
+ ruby: |
2558
+ {
2559
+ 'canonical' => YAML::mktime( 2001, 12, 15, 2, 59, 43, 0.10 ),
2560
+ 'valid iso8601' => YAML::mktime( 2001, 12, 14, 21, 59, 43, 0.10, "-05:00" ),
2561
+ 'space separated' => YAML::mktime( 2001, 12, 14, 21, 59, 43, 0.10, "-05:00" ),
2562
+ 'date (noon UTC)' => Date.new( 2002, 12, 14 )
2563
+ }
2564
+ syck: |
2565
+ struct test_node map[] = {
2566
+ { T_STR, 0, "canonical" },
2567
+ { T_STR, 0, "2001-12-15T02:59:43.1Z" },
2568
+ { T_STR, 0, "valid iso8601" },
2569
+ { T_STR, 0, "2001-12-14t21:59:43.10-05:00" },
2570
+ { T_STR, 0, "space separated" },
2571
+ { T_STR, 0, "2001-12-14 21:59:43.10 -05:00" },
2572
+ { T_STR, 0, "date (noon UTC)" },
2573
+ { T_STR, 0, "2002-12-14" },
2574
+ end_node
2575
+ };
2576
+ struct test_node stream[] = {
2577
+ { T_MAP, 0, 0, map },
2578
+ end_node
2579
+ };
2580
+
2581
+
2582
+ ---
2583
+ test: Binary
2584
+ yaml: |
2585
+ canonical: !binary "\
2586
+ R0lGODlhDAAMAIQAAP//9/X17unp5WZmZgAAAOfn515eXvPz7Y6OjuDg4J+fn5\
2587
+ OTk6enp56enmlpaWNjY6Ojo4SEhP/++f/++f/++f/++f/++f/++f/++f/++f/+\
2588
+ +f/++f/++f/++f/++f/++SH+Dk1hZGUgd2l0aCBHSU1QACwAAAAADAAMAAAFLC\
2589
+ AgjoEwnuNAFOhpEMTRiggcz4BNJHrv/zCFcLiwMWYNG84BwwEeECcgggoBADs="
2590
+ base64: !binary |
2591
+ R0lGODlhDAAMAIQAAP//9/X17unp5WZmZgAAAOfn515eXvPz7Y6OjuDg4J+fn5
2592
+ OTk6enp56enmlpaWNjY6Ojo4SEhP/++f/++f/++f/++f/++f/++f/++f/++f/+
2593
+ +f/++f/++f/++f/++f/++SH+Dk1hZGUgd2l0aCBHSU1QACwAAAAADAAMAAAFLC
2594
+ AgjoEwnuNAFOhpEMTRiggcz4BNJHrv/zCFcLiwMWYNG84BwwEeECcgggoBADs=
2595
+ description: >
2596
+ The binary value above is a tiny arrow
2597
+ encoded as a gif image.
2598
+ ruby-setup: |
2599
+ arrow_gif = "GIF89a\f\000\f\000\204\000\000\377\377\367\365\365\356\351\351\345fff\000\000\000\347\347\347^^^\363\363\355\216\216\216\340\340\340\237\237\237\223\223\223\247\247\247\236\236\236iiiccc\243\243\243\204\204\204\377\376\371\377\376\371\377\376\371\377\376\371\377\376\371\377\376\371\377\376\371\377\376\371\377\376\371\377\376\371\377\376\371\377\376\371\377\376\371\377\376\371!\376\016Made with GIMP\000,\000\000\000\000\f\000\f\000\000\005, \216\2010\236\343@\024\350i\020\304\321\212\010\034\317\200M$z\357\3770\205p\270\2601f\r\e\316\001\303\001\036\020' \202\n\001\000;"
2600
+ ruby: |
2601
+ {
2602
+ 'canonical' => arrow_gif,
2603
+ 'base64' => arrow_gif,
2604
+ 'description' => "The binary value above is a tiny arrow encoded as a gif image.\n"
2605
+ }
2606
+
2607
+ ---
2608
+ test: Merge key
2609
+ yaml: |
2610
+ ---
2611
+ - &CENTER { x: 1, y: 2 }
2612
+ - &LEFT { x: 0, y: 2 }
2613
+ - &BIG { r: 10 }
2614
+ - &SMALL { r: 1 }
2615
+
2616
+ # All the following maps are equal:
2617
+
2618
+ - # Explicit keys
2619
+ x: 1
2620
+ y: 2
2621
+ r: 10
2622
+ label: center/big
2623
+
2624
+ - # Merge one map
2625
+ << : *CENTER
2626
+ r: 10
2627
+ label: center/big
2628
+
2629
+ - # Merge multiple maps
2630
+ << : [ *CENTER, *BIG ]
2631
+ label: center/big
2632
+
2633
+ - # Override
2634
+ << : [ *BIG, *LEFT, *SMALL ]
2635
+ x: 1
2636
+ label: center/big
2637
+
2638
+ ruby-setup: |
2639
+ center = { 'x' => 1, 'y' => 2 }
2640
+ left = { 'x' => 0, 'y' => 2 }
2641
+ big = { 'r' => 10 }
2642
+ small = { 'r' => 1 }
2643
+ node1 = { 'x' => 1, 'y' => 2, 'r' => 10, 'label' => 'center/big' }
2644
+ node2 = center.dup
2645
+ node2.update( { 'r' => 10, 'label' => 'center/big' } )
2646
+ node3 = big.dup
2647
+ node3.update( center )
2648
+ node3.update( { 'label' => 'center/big' } )
2649
+ node4 = small.dup
2650
+ node4.update( left )
2651
+ node4.update( big )
2652
+ node4.update( { 'x' => 1, 'label' => 'center/big' } )
2653
+
2654
+ ruby: |
2655
+ [
2656
+ center, left, big, small, node1, node2, node3, node4
2657
+ ]
2658
+
2659
+ ---
2660
+ test: Default key
2661
+ yaml: |
2662
+ --- # Old schema
2663
+ link with:
2664
+ - library1.dll
2665
+ - library2.dll
2666
+ --- # New schema
2667
+ link with:
2668
+ - = : library1.dll
2669
+ version: 1.2
2670
+ - = : library2.dll
2671
+ version: 2.3
2672
+ ruby: |
2673
+ y = YAML::Stream.new
2674
+ y.add( { 'link with' => [ 'library1.dll', 'library2.dll' ] } )
2675
+ obj_h = Hash[ 'version' => 1.2 ]
2676
+ obj_h.default = 'library1.dll'
2677
+ obj_h2 = Hash[ 'version' => 2.3 ]
2678
+ obj_h2.default = 'library2.dll'
2679
+ y.add( { 'link with' => [ obj_h, obj_h2 ] } )
2680
+ documents: 2
2681
+
2682
+ ---
2683
+ test: Special keys
2684
+ yaml: |
2685
+ "!": These three keys
2686
+ "&": had to be quoted
2687
+ "=": and are normal strings.
2688
+ # NOTE: the following node should NOT be serialized this way.
2689
+ encoded node :
2690
+ !special '!' : '!type'
2691
+ !special|canonical '&' : 12
2692
+ = : value
2693
+ # The proper way to serialize the above node is as follows:
2694
+ node : !!type &12 value
2695
+ ruby: |
2696
+ { '!' => 'These three keys', '&' => 'had to be quoted',
2697
+ '=' => 'and are normal strings.',
2698
+ 'encoded node' => YAML::PrivateType.new( 'type', 'value' ),
2699
+ 'node' => YAML::PrivateType.new( 'type', 'value' ) }