2 test: Sequence of scalars
9 array('Mark McGwire', 'Sammy Sosa', 'Ken Griffey')
11 test: Mapping of scalars to scalars
18 array('hr' => 65, 'avg' => 0.278, 'rbi' => 147)
20 test: Mapping of scalars to sequences
33 array( 'Boston Red Sox', 'Detroit Tigers',
36 array( 'New York Mets', 'Chicago Cubs',
40 test: Sequence of mappings
53 array('name' => 'Mark McGwire', 'hr' => 65, 'avg' => 0.278),
54 array('name' => 'Sammy Sosa', 'hr' => 63, 'avg' => 0.288)
74 YAML.pm will be able to emulate this behavior soon. In this regard
75 it may be somewhat more correct than Python's native behaviour which
76 can only use tuples as mapping keys. PyYAML will also need to figure
77 out some clever way to roundtrip structured keys.
81 ('New York Yankees', 'Atlanta Braves'):
82 [yaml.timestamp('2001-07-02'),
83 yaml.timestamp('2001-08-12'),
84 yaml.timestamp('2001-08-14')],
85 ('Detroit Tigers', 'Chicago Cubs'):
86 [yaml.timestamp('2001-07-23')]
91 [ 'New York Yankees', 'Atlanta Braves' ] =>
92 [ Date.new( 2001, 7, 2 ), Date.new( 2001, 8, 12 ), Date.new( 2001, 8, 14 ) ],
93 [ 'Detroit Tigers', 'Chicago Cubs' ] =>
94 [ Date.new( 2001, 7, 23 ) ]
97 struct test_node seq1[] = {
98 { T_STR, 0, "New York Yankees" },
99 { T_STR, 0, "Atlanta Braves" },
102 struct test_node seq2[] = {
103 { T_STR, 0, "2001-07-02" },
104 { T_STR, 0, "2001-08-12" },
105 { T_STR, 0, "2001-08-14" },
108 struct test_node seq3[] = {
109 { T_STR, 0, "Detroit Tigers" },
110 { T_STR, 0, "Chicago Cubs" },
113 struct test_node seq4[] = {
114 { T_STR, 0, "2001-07-23" },
117 struct test_node map[] = {
118 { T_SEQ, 0, 0, seq1 },
119 { T_SEQ, 0, 0, seq2 },
120 { T_SEQ, 0, 0, seq3 },
121 { T_SEQ, 0, 0, seq4 },
124 struct test_node stream[] = {
125 { T_MAP, 0, 0, map },
130 test: Sequence of sequences
133 - [ name , hr , avg ]
134 - [ Mark McGwire , 65 , 0.278 ]
135 - [ Sammy Sosa , 63 , 0.288 ]
138 array( 'name', 'hr', 'avg' ),
139 array( 'Mark McGwire', 65, 0.278 ),
140 array( 'Sammy Sosa', 63, 0.288 )
143 test: Mapping of mappings
147 Mark McGwire: {hr: 65, avg: 0.278}
155 array( 'hr' => 65, 'avg' => 0.278 ),
157 array( 'hr' => 63, 'avg' => 0.288 )
160 test: Two documents in a stream each with a leading comment
164 # Ranking of 1998 home runs
176 y.add( [ 'Mark McGwire', 'Sammy Sosa', 'Ken Griffey' ] )
177 y.add( [ 'Chicago Cubs', 'St Louis Cardinals' ] )
181 test: Play by play feed from a game
188 action: strike (miss)
196 [ 'Mark McGwire', 'Sammy Sosa', 'Ken Griffey' ]
200 test: Single document with two comments
203 hr: # 1998 hr ranking
212 'hr' => array( 'Mark McGwire', 'Sammy Sosa' ),
213 'rbi' => array( 'Sammy Sosa', 'Ken Griffey' )
216 test: Node for Sammy Sosa appears twice in this document
222 # Following node labeled SS
225 - *SS # Subsequent occurrence
230 array('Mark McGwire', 'Sammy Sosa'),
232 array('Sammy Sosa', 'Ken Griffey')
235 test: Mapping between sequences
245 ? [ New York Yankees,
247 : [ 2001-07-02, 2001-08-12,
251 [ 'Detroit Tigers', 'Chicago Cubs' ] => [ Date.new( 2001, 7, 23 ) ],
252 [ 'New York Yankees', 'Atlanta Braves' ] => [ Date.new( 2001, 7, 2 ), Date.new( 2001, 8, 12 ), Date.new( 2001, 8, 14 ) ]
255 struct test_node seq1[] = {
256 { T_STR, 0, "New York Yankees" },
257 { T_STR, 0, "Atlanta Braves" },
260 struct test_node seq2[] = {
261 { T_STR, 0, "2001-07-02" },
262 { T_STR, 0, "2001-08-12" },
263 { T_STR, 0, "2001-08-14" },
266 struct test_node seq3[] = {
267 { T_STR, 0, "Detroit Tigers" },
268 { T_STR, 0, "Chicago Cubs" },
271 struct test_node seq4[] = {
272 { T_STR, 0, "2001-07-23" },
275 struct test_node map[] = {
276 { T_SEQ, 0, 0, seq3 },
277 { T_SEQ, 0, 0, seq4 },
278 { T_SEQ, 0, 0, seq1 },
279 { T_SEQ, 0, 0, seq2 },
282 struct test_node stream[] = {
283 { T_MAP, 0, 0, map },
288 test: Sequence key shortcut
302 'item' => 'Super Hoop',
306 'item' => 'Basketball',
310 'item' => 'Big Shoes',
316 { item => 'Super Hoop', quantity => 1 },
317 { item => 'Basketball', quantity => 4 },
318 { item => 'Big Shoes', quantity => 1 }
323 { 'item' => 'Super Hoop', 'quantity' => 1 },
324 { 'item' => 'Basketball', 'quantity' => 4 },
325 { 'item' => 'Big Shoes', 'quantity' => 1 }
329 { 'item': 'Super Hoop', 'quantity': 1 },
330 { 'item': 'Basketball', 'quantity': 4 },
331 { 'item': 'Big Shoes', 'quantity': 1 }
334 struct test_node map1[] = {
335 { T_STR, 0, "item" },
336 { T_STR, 0, "Super Hoop" },
337 { T_STR, 0, "quantity" },
341 struct test_node map2[] = {
342 { T_STR, 0, "item" },
343 { T_STR, 0, "Basketball" },
344 { T_STR, 0, "quantity" },
348 struct test_node map3[] = {
349 { T_STR, 0, "item" },
350 { T_STR, 0, "Big Shoes" },
351 { T_STR, 0, "quantity" },
355 struct test_node seq[] = {
356 { T_MAP, 0, 0, map1 },
357 { T_MAP, 0, 0, map2 },
358 { T_MAP, 0, 0, map3 },
361 struct test_node stream[] = {
362 { T_SEQ, 0, 0, seq },
368 test: Literal perserves newlines
377 "\\//||\\/||\n// || ||_\n"
379 "\\//||\\/||\n// || ||_\n"
390 struct test_node stream[] = {
391 { T_STR, 0, "\\//||\\/||\n// || ||_\n" },
396 test: Folded treats newlines as a space
405 "Mark McGwire's year was crippled by a knee injury."
407 "Mark McGwire's year was crippled by a knee injury."
409 [ "Mark McGwire's year was crippled by a knee injury." ]
411 struct test_node stream[] = {
412 { T_STR, 0, "Mark McGwire's year was crippled by a knee injury." },
417 test: Newlines preserved for indented and blank lines
422 Sammy Sosa completed another
423 fine season with great stats.
426 0.288 Batting Average
430 "Sammy Sosa completed another fine season with great stats.\n\n 63 Home Runs\n 0.288 Batting Average\n\nWhat a year!\n"
432 "Sammy Sosa completed another fine season with great stats.\n\n 63 Home Runs\n 0.288 Batting Average\n\nWhat a year!\n"
437 Sammy Sosa completed another fine season with great stats.
440 0.288 Batting Average
447 struct test_node stream[] = {
448 { 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" },
454 test: Indentation determines scope
459 Mark set a major league
460 home run record in 1998.
463 0.278 Batting Average
466 'name' => 'Mark McGwire',
467 'accomplishment' => "Mark set a major league home run record in 1998.\n",
468 'stats' => "65 Home Runs\n0.278 Batting Average\n"
475 unicode: "Sosa did fine.\u263A"
476 control: "\b1998\t1999\t2000\n"
477 hexesc: "\x0D\x0A is \r\n"
479 single: '"Howdy!" he cried.'
480 quoted: ' # not a ''comment''.'
481 tie-fighter: '|\-*-/|'
484 "tie-fighter" => "|\\-*-/|",
485 "control"=>"\0101998\t1999\t2000\n",
486 "unicode"=>"Sosa did fine." + ["263A".hex ].pack('U*'),
487 "quoted"=>" # not a 'comment'.",
488 "single"=>"\"Howdy!\" he cried.",
489 "hexesc"=>"\r\n is \r\n"
492 test: Multiline flow scalars
500 quoted: "So does this
504 'plain' => 'This unquoted scalar spans many lines.',
505 'quoted' => "So does this quoted scalar.\n"
516 'canonical' => 12345,
521 test: Decimal Integer
528 'decimal' => 12345.0,
531 # FIX: spec shows parens around -inf and NaN
535 canonical: 1.23015e+3
536 exponential: 12.3015e+02
537 negative infinity: -.inf
539 float as whole number: !!float 1
542 'canonical' => 1230.15,
543 'exponential' => 1230.15,
544 'negative infinity' => log(0),
545 'not a number' => -log(0),
546 'float as whole number' => (float) 1
549 test: Fixed Floating point
563 canonical: 2001-12-15T02:59:43.1Z
564 iso8601: 2001-12-14t21:59:43.10-05:00
565 spaced: 2001-12-14 21:59:43.10 -05:00
566 date: 2002-12-14 # Time is noon UTC
569 'canonical' => YAML::mktime( 2001, 12, 15, 2, 59, 43, 0.10 ),
570 'iso8601' => YAML::mktime( 2001, 12, 14, 21, 59, 43, 0.10, "-05:00" ),
571 'spaced' => YAML::mktime( 2001, 12, 14, 21, 59, 43, 0.10, "-05:00" ),
572 'date' => Date.new( 2002, 12, 14 )
575 test: legacy Timestamps test
579 canonical: 2001-12-15T02:59:43.00Z
580 iso8601: 2001-02-28t21:59:43.00-05:00
581 spaced: 2001-12-14 21:59:43.00 -05:00
585 'canonical' => Time::utc( 2001, 12, 15, 2, 59, 43, 0 ),
586 'iso8601' => YAML::mktime( 2001, 2, 28, 21, 59, 43, 0, "-05:00" ),
587 'spaced' => YAML::mktime( 2001, 12, 14, 21, 59, 43, 0, "-05:00" ),
588 'date' => Date.new( 2002, 12, 14 )
591 test: Various explicit families
595 not-date: !!str 2002-04-28
597 R0lGODlhDAAMAIQAAP//9/X
598 17unp5WZmZgAAAOfn515eXv
599 Pz7Y6OjuDg4J+fn5OTk6enp
602 application specific tag: !!something |
603 The semantics of the tag
604 above may be different for
608 YAML.add_private_type( "something" ) do |type, val|
613 'not-date' => '2002-04-28',
614 '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;",
615 'application specific tag' => "SOMETHING: The semantics of the tag\nabove may be different for\ndifferent documents.\n"
618 test: Application specific family
622 # Establish a tag prefix
623 --- !clarkevans.com,2002/graph/^shape
624 # Use the prefix: shorthand for
625 # !clarkevans.com,2002/graph/circle
627 center: &ORIGIN {x: 73, 'y': 129}
629 - !^line # !clarkevans.com,2002/graph/line
631 finish: { x: 89, 'y': 102 }
635 value: Pretty vector drawing.
637 YAML.add_domain_type( "clarkevans.com,2002", 'graph/shape' ) { |type, val|
639 val << "Shape Container"
642 raise YAML::Error, "Invalid graph of class #{ val.class }: " + val.inspect
645 one_shape_proc = Proc.new { |type, val|
646 scheme, domain, type = type.split( /:/, 3 )
648 val['TYPE'] = "Shape: #{type}"
651 raise YAML::Error, "Invalid graph of class #{ val.class }: " + val.inspect
654 YAML.add_domain_type( "clarkevans.com,2002", 'graph/circle', &one_shape_proc )
655 YAML.add_domain_type( "clarkevans.com,2002", 'graph/line', &one_shape_proc )
656 YAML.add_domain_type( "clarkevans.com,2002", 'graph/label', &one_shape_proc )
666 "TYPE" => "Shape: graph/circle"
673 "TYPE" => "Shape: graph/line",
680 "TYPE" => "Shape: graph/label",
681 "value" => "Pretty vector drawing.",
692 # test: Unordered set
695 # # sets are represented as a
696 # # mapping where each key is
697 # # associated with the empty string
703 test: Ordered mappings
707 # ordered maps are represented as
708 # a sequence of mappings, with
709 # each mapping having one key
725 --- !clarkevans.com,2002/^invoice
743 description : Basketball
748 description : Super Hoop
753 Late afternoon is best.
754 Backup contact is Nancy
758 'invoice' => 34843, 'date' => gmmktime(0, 0, 0, 1, 23, 2001),
760 array( 'given' => 'Chris', 'family' => 'Dumars', 'address' => array( 'lines' => "458 Walkman Dr.\nSuite #292\n", 'city' => 'Royal Oak', 'state' => 'MI', 'postal' => 48046 ) )
762 array( 'given' => 'Chris', 'family' => 'Dumars', 'address' => array( 'lines' => "458 Walkman Dr.\nSuite #292\n", 'city' => 'Royal Oak', 'state' => 'MI', 'postal' => 48046 ) )
765 array( 'sku' => 'BL394D', 'quantity' => 4, 'description' => 'Basketball', 'price' => 450.00 ),
766 array( 'sku' => 'BL4438H', 'quantity' => 1, 'description' => 'Super Hoop', 'price' => 2392.00 )
768 'tax' => 251.42, 'total' => 4443.52,
769 'comments' => "Late afternoon is best. Backup contact is Nancy Billsmer @ 338-4338.\n"
777 Time: 2001-11-23 15:01:42 -05:00
780 This is an error message
783 Time: 2001-11-23 15:02:31 -05:00
786 A slightly different error
789 Date: 2001-11-23 15:03:17 -05:00
792 Unknown variable "bar"
797 x = MoreObject("345\n")
804 y.add( { 'Time' => YAML::mktime( 2001, 11, 23, 15, 01, 42, 00, "-05:00" ),
805 'User' => 'ed', 'Warning' => "This is an error message for the log file\n" } )
806 y.add( { 'Time' => YAML::mktime( 2001, 11, 23, 15, 02, 31, 00, "-05:00" ),
807 'User' => 'ed', 'Warning' => "A slightly different error message.\n" } )
808 y.add( { 'Date' => YAML::mktime( 2001, 11, 23, 15, 03, 17, 00, "-05:00" ),
809 'User' => 'ed', 'Fatal' => "Unknown variable \"bar\"\n",
811 { 'file' => 'TopClass.py', 'line' => 23, 'code' => "x = MoreObject(\"345\\n\")\n" },
812 { 'file' => 'MoreClass.py', 'line' => 58, 'code' => "foo = bar" } ] } )
816 test: Throwaway comments
818 ### These are four throwaway comment ###
820 ### lines (the second line is empty). ###
821 this: | # Comments may trail lines.
822 contains three lines of text.
823 The third one starts with a
824 # character. This isn't a comment.
826 # These are three throwaway comment
827 # lines (the first line is empty).
830 'this' => "contains three lines of text.\nThe third one starts with a\n# character. This isn't a comment.\n"
833 test: Document with a single value
837 This YAML stream contains a single text value.
838 The next stream is a log file - a sequence of
839 log entries. Adding an entry to the log is a
840 simple matter of appending it at the end.
842 "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"
844 test: Document stream
848 at: 2001-08-12 09:25:00.00 Z
853 at: 2001-08-12 09:25:10.00 Z
860 'at' => Time::utc( 2001, 8, 12, 9, 25, 00 ),
863 'url' => '/index.html'
866 'at' => Time::utc( 2001, 8, 12, 9, 25, 10 ),
874 test: Top level mapping
876 # This stream is an example of a top-level mapping.
883 'date' => gmmktime(0, 0, 0, 1, 23, 2001),
887 test: Single-line documents
890 # The following is a sequence of three documents.
891 # The first contains an empty mapping, the second
892 # an empty sequence, and the last an empty string.
904 test: Document with pause
907 # A communication channel based on a YAML stream.
909 sent at: 2002-06-06 11:46:25.10 Z
911 # Receiver can process this as soon as the following is sent:
913 # Even if the next message is sent long after:
915 sent at: 2002-06-06 12:05:53.47 Z
921 { 'sent at' => YAML::mktime( 2002, 6, 6, 11, 46, 25, 0.10 ),
922 'payload' => 'Whatever' }
925 { "payload" => "Whatever", "sent at" => YAML::mktime( 2002, 6, 6, 12, 5, 53, 0.47 ) }
930 test: Explicit typing
931 deprecated: Using the non-specific tag "!" is deprecated since Symfony 3.4 as its behavior will change in 4.0.
937 array( 'integer' => 12, 'also int' => 12, 'string' => '12' )
942 # Both examples below make use of the 'x-private:ball'
943 # type family URI, but with different semantics.
954 YAML::PrivateType.new( 'ball',
955 { 'number' => 8, 'color' => 'black' } ) }
957 y.add( { 'bearing' =>
958 YAML::PrivateType.new( 'ball',
959 { 'material' => 'steel' } ) }
964 test: Type family under yaml.org
966 # The URI is 'tag:yaml.org,2002:str'
967 - !!str a Unicode string
969 array( 'a Unicode string' )
971 test: Type family under perl.yaml.org
974 # The URI is 'tag:perl.yaml.org,2002:Text::Tabs'
975 - !perl/Text::Tabs {}
977 [ YAML::DomainType.new( 'perl.yaml.org,2002', 'Text::Tabs', {} ) ]
979 test: Type family under clarkevans.com
982 # The URI is 'tag:clarkevans.com,2003-02:timesheet'
983 - !clarkevans.com,2003-02/timesheet {}
985 [ YAML::DomainType.new( 'clarkevans.com,2003-02', 'timesheet', {} ) ]
991 - !domain.tld,2002/type\x30 value
992 - !domain.tld,2002/type0 value
993 different: # As far as the YAML parser is concerned
994 - !domain.tld,2002/type%30 value
995 - !domain.tld,2002/type0 value
997 YAML.add_domain_type( "domain.tld,2002", "type0" ) { |type, val|
1000 YAML.add_domain_type( "domain.tld,2002", "type%30" ) { |type, val|
1004 { 'same' => [ 'ONE: value', 'ONE: value' ], 'different' => [ 'TWO: value', 'ONE: value' ] }
1009 # 'tag:domain.tld,2002:invoice' is some type family.
1010 invoice: !domain.tld,2002/^invoice
1011 # 'seq' is shorthand for 'tag:yaml.org,2002:seq'.
1012 # This does not effect '^customer' below
1013 # because it is does not specify a prefix.
1015 # '^customer' is shorthand for the full
1016 # notation 'tag:domain.tld,2002:customer'.
1021 YAML.add_domain_type( "domain.tld,2002", /(invoice|customer)/ ) { |type, val|
1023 scheme, domain, type = type.split( /:/, 3 )
1024 val['type'] = "domain #{type}"
1027 raise YAML::Error, "Not a Hash in domain.tld/invoice: " + val.inspect
1031 { "invoice"=> { "customers"=> [ { "given"=>"Chris", "type"=>"domain customer", "family"=>"Dumars" } ], "type"=>"domain invoice" } }
1034 test: Overriding anchors
1036 anchor : &A001 This scalar has an anchor.
1038 The alias node below is a
1039 repeated use of this value.
1042 array( 'anchor' => 'This scalar has an anchor.',
1043 'override' => "The alias node below is a repeated use of this value.\n",
1044 'alias' => "The alias node below is a repeated use of this value.\n" )
1046 test: Flow and block formatting
1050 flow: [ one, two, three # May span lines,
1051 , four, # indentation is
1052 five ] # mostly ignored.
1054 - First item in top sequence
1056 - Subordinate sequence entry
1058 A folded sequence entry
1059 - Sixth item in top sequence
1061 { 'empty' => [], 'flow' => [ 'one', 'two', 'three', 'four', 'five' ],
1062 'block' => [ 'First item in top sequence', [ 'Subordinate sequence entry' ],
1063 "A folded sequence entry\n", 'Sixth item in top sequence' ] }
1065 test: Complete mapping test
1069 flow: { one: 1, two: 2 }
1075 key: Subordinate mapping
1077 - Subordinate sequence
1079 - Previous mapping is empty.
1080 - A key: value pair in a sequence.
1081 A second: key:value pair.
1082 - The previous entry is equal to the following one.
1084 A key: value pair in a sequence.
1085 A second: key:value pair.
1086 !float 12 : This key is a float.
1089 : This key had to be protected.
1090 "\a" : This key had to be escaped.
1097 ? this also works as a key
1098 : with a value at the next line.
1103 - With a sequence value.
1108 with a: mapping value.
1110 { 'empty' => {}, 'flow' => { 'one' => 1, 'two' => 2 },
1111 'spanning' => { 'one' => 1, 'two' => 2 },
1112 'block' => { 'first' => 'First entry', 'second' =>
1113 { 'key' => 'Subordinate mapping' }, 'third' =>
1114 [ 'Subordinate sequence', {}, 'Previous mapping is empty.',
1115 { 'A key' => 'value pair in a sequence.', 'A second' => 'key:value pair.' },
1116 'The previous entry is equal to the following one.',
1117 { 'A key' => 'value pair in a sequence.', 'A second' => 'key:value pair.' } ],
1118 12.0 => 'This key is a float.', "?\n" => 'This key had to be protected.',
1119 "\a" => 'This key had to be escaped.',
1120 "This is a multi-line folded key\n" => "Whose value is also multi-line.",
1121 'this also works as a key' => 'with a value at the next line.',
1122 [ 'This key', 'is a sequence' ] => [ 'With a sequence value.' ] } }
1123 # Couldn't recreate map exactly, so we'll do a detailed check to be sure it's entact
1124 obj_y['block'].keys.each { |k|
1126 v = obj_y['block'][k]
1127 if k['This'] == 'key' and k['is a'] == 'mapping' and v['with a'] == 'mapping value.'
1128 obj_r['block'][k] = v
1133 test: Literal explicit indentation
1135 # Explicit indentation must
1136 # be given in all the three
1139 This value starts with four spaces.
1141 leading line break: |2
1143 This value starts with a line break.
1145 leading comment indicator: |2
1146 # first line starts with a
1149 # Explicit indentation may
1150 # also be given when it is
1153 This value is indented 2 spaces.
1156 'leading spaces' => " This value starts with four spaces.\n",
1157 'leading line break' => "\nThis value starts with a line break.\n",
1158 'leading comment indicator' => "# first line starts with a\n# character.\n",
1159 'redundant' => "This value is indented 2 spaces.\n"
1162 test: Chomping and keep modifiers
1165 This has one newline.
1167 same as "clipped" above: "This has one newline.\n"
1170 This has no newline.
1172 same as "stripped" above: "This has no newline."
1175 This has two newlines.
1177 same as "kept" above: "This has two newlines.\n\n"
1180 'clipped' => "This has one newline.\n",
1181 'same as "clipped" above' => "This has one newline.\n",
1182 'stripped' => 'This has no newline.',
1183 'same as "stripped" above' => 'This has no newline.',
1184 'kept' => "This has two newlines.\n\n",
1185 'same as "kept" above' => "This has two newlines.\n\n"
1188 test: Literal combinations
1194 The \ ' " characters may be
1195 freely used. Leading white
1196 space is significant.
1198 Line breaks are significant.
1199 Thus this value contains one
1200 empty line and ends with a
1201 single line break, but does
1204 is equal to: "The \\ ' \" characters may \
1205 be\nfreely used. Leading white\n space \
1206 is significant.\n\nLine breaks are \
1207 significant.\nThus this value contains \
1208 one\nempty line and ends with a\nsingle \
1209 line break, but does\nnot start with one.\n"
1211 # Comments may follow a block
1212 # scalar value. They must be
1215 # Modifiers may be combined in any order.
1216 indented and chomped: |2-
1217 This has no newline.
1219 also written as: |-2
1220 This has no newline.
1222 both are equal to: " This has no newline."
1226 'literal' => "The \\ ' \" characters may be\nfreely used. Leading white\n space " +
1227 "is significant.\n\nLine breaks are significant.\nThus this value contains one\n" +
1228 "empty line and ends with a\nsingle line break, but does\nnot start with one.\n",
1229 'is equal to' => "The \\ ' \" characters may be\nfreely used. Leading white\n space " +
1230 "is significant.\n\nLine breaks are significant.\nThus this value contains one\n" +
1231 "empty line and ends with a\nsingle line break, but does\nnot start with one.\n",
1232 'indented and chomped' => ' This has no newline.',
1233 'also written as' => ' This has no newline.',
1234 'both are equal to' => ' This has no newline.'
1237 test: Folded combinations
1243 Line feeds are converted
1244 to spaces, so this value
1245 contains no line breaks
1246 except for the final one.
1248 multiple paragraphs: >2
1250 An empty line, either
1255 line break. Thus this
1256 value contains three
1276 above is equal to: |
1277 This is a folded paragraph followed by a list:
1280 Followed by another folded paragraph, another list:
1286 And a final folded paragraph.
1288 # Explicit comments may follow
1289 # but must be less indented.
1293 'one paragraph' => 'Line feeds are converted to spaces, so this value'.
1294 " contains no line breaks except for the final one.\n",
1295 'multiple paragraphs' => "\nAn empty line, either at the start or in the value:\n".
1296 "Is interpreted as a line break. Thus this value contains three line breaks.\n",
1297 'indented text' => "This is a folded paragraph followed by a list:\n".
1298 " * first entry\n * second entry\nFollowed by another folded paragraph, ".
1299 "another list:\n\n * first entry\n\n * second entry\n\nAnd a final folded paragraph.\n",
1300 'above is equal to' => "This is a folded paragraph followed by a list:\n".
1301 " * first entry\n * second entry\nFollowed by another folded paragraph, ".
1302 "another list:\n\n * first entry\n\n * second entry\n\nAnd a final folded paragraph.\n"
1309 second: '! : \ etc. can be used freely.'
1310 third: 'a single quote '' must be escaped.'
1311 span: 'this contains
1316 is same as: "this contains six spaces\nand one line break"
1320 'second' => '! : \\ etc. can be used freely.',
1321 'third' => "a single quote ' must be escaped.",
1322 'span' => "this contains six spaces\nand one line break",
1323 'is same as' => "this contains six spaces\nand one line break"
1330 second: "! : etc. can be used freely."
1331 third: "a \" or a \\ must be escaped."
1332 fourth: "this value ends with an LF.\n"
1333 span: "this contains
1336 is equal to: "this contains four spaces"
1340 'second' => '! : etc. can be used freely.',
1341 'third' => 'a " or a \\ must be escaped.',
1342 'fourth' => "this value ends with an LF.\n",
1343 'span' => "this contains four spaces",
1344 'is equal to' => "this contains four spaces"
1347 test: Unquoted strings
1350 first: There is no unquoted empty string.
1352 second: 12 ## This is an integer.
1354 third: !!str 12 ## This is a string.
1362 indicators: this has no comments.
1371 note: { one-line keys: but multi-line values }
1375 'first' => 'There is no unquoted empty string.',
1378 'span' => "this contains six spaces\nand one line break",
1379 'indicators' => "this has no comments. #:foo and bar# are both text.",
1380 'flow' => [ 'can span lines', 'like this' ],
1381 'note' => { 'one-line keys' => 'but multi-line values' }
1384 test: Spanning sequences
1387 # The following are equal seqs
1388 # with different identities.
1397 'flow' => [ 'one', 'two' ],
1398 'spanning' => [ 'one', 'two' ],
1399 'block' => [ 'one', 'two' ]
1404 # The following are equal maps
1405 # with different identities.
1406 flow: { one: 1, two: 2 }
1412 'flow' => array( 'one' => 1, 'two' => 2 ),
1413 'block' => array( 'one' => 1, 'two' => 2 )
1416 test: Representations of 12
1420 # The following scalars
1422 # string value '1' '2'.
1430 # Strings containing paths and regexps can be unquoted:
1436 array( 12, '12', '12', '12', '12', '/foo/bar', 'd:/foo/bar', 'foo/bar', '/a.*b/' )
1445 # This sequence has five
1446 # entries, two with values.
1454 four: This mapping has five keys,
1455 only two with values.
1459 'canonical' => null,
1461 'sparse' => array( null, '2nd entry', null, '4th entry', null ]),
1462 'four' => 'This mapping has five keys, only two with values.'
1468 # Explicitly typed dictionary.
1470 - aardvark: African pig-like ant eater. Ugly.
1471 - anteater: South-American ant eater. Two species.
1472 - anaconda: South-American constrictor snake. Scary.
1476 'Bestiary' => YAML::Omap[
1477 'aardvark', 'African pig-like ant eater. Ugly.',
1478 'anteater', 'South-American ant eater. Two species.',
1479 'anaconda', 'South-American constrictor snake. Scary.'
1487 # Explicitly typed pairs.
1489 - meeting: with team.
1490 - meeting: with boss.
1492 - meeting: with client.
1495 'tasks' => YAML::Pairs[
1496 'meeting', 'with team.',
1497 'meeting', 'with boss.',
1499 'meeting', 'with client.'
1507 # Explicitly typed set.
1508 baseball players: !set
1514 'baseball players' => YAML::Set[
1515 'Mark McGwire', nil,
1529 'canonical' => 12345,
1540 'decimal' => 12345.0,
1554 canonical: 1.23015e+3
1555 exponential: 12.3015e+02
1556 negative infinity: -.inf
1560 'canonical' => 1230.15,
1561 'exponential' => 1230.15,
1562 'negative infinity' => log(0),
1563 'not a number' => -log(0)
1569 canonical: 2001-12-15T02:59:43.1Z
1570 valid iso8601: 2001-12-14t21:59:43.10-05:00
1571 space separated: 2001-12-14 21:59:43.10 -05:00
1572 date (noon UTC): 2002-12-14
1575 'canonical' => YAML::mktime( 2001, 12, 15, 2, 59, 43, 0.10 ),
1576 'valid iso8601' => YAML::mktime( 2001, 12, 14, 21, 59, 43, 0.10, "-05:00" ),
1577 'space separated' => YAML::mktime( 2001, 12, 14, 21, 59, 43, 0.10, "-05:00" ),
1578 'date (noon UTC)' => Date.new( 2002, 12, 14 )
1584 canonical: !binary "\
1585 R0lGODlhDAAMAIQAAP//9/X17unp5WZmZgAAAOfn515eXvPz7Y6OjuDg4J+fn5\
1586 OTk6enp56enmlpaWNjY6Ojo4SEhP/++f/++f/++f/++f/++f/++f/++f/++f/+\
1587 +f/++f/++f/++f/++f/++SH+Dk1hZGUgd2l0aCBHSU1QACwAAAAADAAMAAAFLC\
1588 AgjoEwnuNAFOhpEMTRiggcz4BNJHrv/zCFcLiwMWYNG84BwwEeECcgggoBADs="
1590 R0lGODlhDAAMAIQAAP//9/X17unp5WZmZgAAAOfn515eXvPz7Y6OjuDg4J+fn5
1591 OTk6enp56enmlpaWNjY6Ojo4SEhP/++f/++f/++f/++f/++f/++f/++f/++f/+
1592 +f/++f/++f/++f/++f/++SH+Dk1hZGUgd2l0aCBHSU1QACwAAAAADAAMAAAFLC
1593 AgjoEwnuNAFOhpEMTRiggcz4BNJHrv/zCFcLiwMWYNG84BwwEeECcgggoBADs=
1595 The binary value above is a tiny arrow
1596 encoded as a gif image.
1598 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;"
1601 'canonical' => arrow_gif,
1602 'base64' => arrow_gif,
1603 'description' => "The binary value above is a tiny arrow encoded as a gif image.\n"
1611 - &CENTER { x: 1, y: 2 }
1612 - &LEFT { x: 0, y: 2 }
1616 # All the following maps are equal:
1629 - # Merge multiple maps
1630 << : [ *CENTER, *BIG ]
1634 << : [ *BIG, *LEFT, *SMALL ]
1639 center = { 'x' => 1, 'y' => 2 }
1640 left = { 'x' => 0, 'y' => 2 }
1642 small = { 'r' => 1 }
1643 node1 = { 'x' => 1, 'y' => 2, 'r' => 10, 'label' => 'center/big' }
1645 node2.update( { 'r' => 10, 'label' => 'center/big' } )
1647 node3.update( center )
1648 node3.update( { 'label' => 'center/big' } )
1650 node4.update( left )
1652 node4.update( { 'x' => 1, 'label' => 'center/big' } )
1656 center, left, big, small, node1, node2, node3, node4
1674 y = YAML::Stream.new
1675 y.add( { 'link with' => [ 'library1.dll', 'library2.dll' ] } )
1676 obj_h = Hash[ 'version' => 1.2 ]
1677 obj_h.default = 'library1.dll'
1678 obj_h2 = Hash[ 'version' => 2.3 ]
1679 obj_h2.default = 'library2.dll'
1680 y.add( { 'link with' => [ obj_h, obj_h2 ] } )
1687 "!": These three keys
1688 "&": had to be quoted
1689 "=": and are normal strings.
1690 # NOTE: the following node should NOT be serialized this way.
1692 !special '!' : '!type'
1693 !special|canonical '&' : 12
1695 # The proper way to serialize the above node is as follows:
1696 node : !!type &12 value
1698 { '!' => 'These three keys', '&' => 'had to be quoted',
1699 '=' => 'and are normal strings.',
1700 'encoded node' => YAML::PrivateType.new( 'type', 'value' ),
1701 'node' => YAML::PrivateType.new( 'type', 'value' ) }