rto: sfYaml complies for 43% with Yaml 1.2 spec

For a recent project I needed to write a small domain specific language. I decided to use a language based on YML, as the DSL was also array based.

While reading the spec of of Yaml 1.2, I was surprised some things don’t work in the current sfYaml implementation. The most important one to me is that the short syntax for lists of mappings is not supported (yet), see also example 2.12:

- item    : Super Hoop
  quantity: 1
- item    : Basketball
  quantity: 4
- item    : Big Shoes
  quantity: 1

Below is a concluding table of my findings. Currently only 12 out of 28 examples are parsed by sfYaml. Some errors are easy to fix (the ‘—‘ document separator for instance). Hopefully together we can make the sfYaml 100% compliant to spec 1.2!

NB. Tests were run on a SF1.3 trunk library, link to the used script

2.1. Sequence of Scalars
- Mark McGwire
- Sammy Sosa
- Ken Griffey
sfYaml
spec
1.2
Array
(
    [0] => Mark McGwire
    [1] => Sammy Sosa
    [2] => Ken Griffey
)
2.2. Mapping Scalars to Scalars
hr:  65    # Home runs
avg: 0.278 # Batting average
rbi: 147   # Runs Batted In
sfYaml
spec
1.2
Array
(
    [hr] => 65
    [avg] => 0.278
    [rbi] => 147
)
2.3. Mapping Scalars to Sequences
american:
  - Boston Red Sox
  - Detroit Tigers
  - New York Yankees
national:
  - New York Mets
  - Chicago Cubs
  - Atlanta Braves
sfYaml
spec
1.2
Array
(
    [american] => Array
        (
            [0] => Boston Red Sox
            [1] => Detroit Tigers
            [2] => New York Yankees
        )

    [national] => Array
        (
            [0] => New York Mets
            [1] => Chicago Cubs
            [2] => Atlanta Braves
        )

)
2.4. Sequence of Mappings
-
  name: Mark McGwire
  hr:   65
  avg:  0.278
-
  name: Sammy Sosa
  hr:   63
  avg:  0.288
sfYaml
spec
1.2
Array
(
    [0] => Array
        (
            [name] => Mark McGwire
            [hr] => 65
            [avg] => 0.278
        )

    [1] => Array
        (
            [name] => Sammy Sosa
            [hr] => 63
            [avg] => 0.288
        )

)
2.5. Sequence of Sequences
- [name        , hr, avg  ]
- [Mark McGwire, 65, 0.278]
- [Sammy Sosa  , 63, 0.288]
sfYaml
spec
1.2
Array
(
    [0] => Array
        (
            [0] => name
            [1] => hr
            [2] => avg
        )

    [1] => Array
        (
            [0] => Mark McGwire
            [1] => 65
            [2] => 0.278
        )

    [2] => Array
        (
            [0] => Sammy Sosa
            [1] => 63
            [2] => 0.288
        )

)
2.6. Mapping of Mappings
Mark McGwire: {hr: 65, avg: 0.278}
Sammy Sosa: {
    hr: 63,
    avg: 0.288
  }
sfYaml
spec
1.2
Error, unable to load YML: Unable to parse string: Malformed inline YAML string {
2.7. Two Documents in a Stream
# Ranking of 1998 home runs
---
- Mark McGwire
- Sammy Sosa
- Ken Griffey

# Team ranking
---
- Chicago Cubs
- St Louis Cardinals
sfYaml
spec
1.2
Error, unable to load YML: Unable to parse string: Unable to parse line 2 (—).
2.8. Play by Play Feed
---
time: 20:03:20
player: Sammy Sosa
action: strike (miss)
...
---
time: 20:03:47
player: Sammy Sosa
action: grand slam
...
sfYaml
spec
1.2
Error, unable to load YML: Unable to parse string: Unable to parse line 4 (…).
2.9. Single Document with Two Comments
---
hr: # 1998 hr ranking
  - Mark McGwire
  - Sammy Sosa
rbi:
  # 1998 rbi ranking
  - Sammy Sosa
  - Ken Griffey
sfYaml
spec
1.2
Array
(
    [hr] => Array
        (
            [0] => Mark McGwire
            [1] => Sammy Sosa
        )

    [rbi] => Array
        (
            [0] => Sammy Sosa
            [1] => Ken Griffey
        )

)
2.10. Node for ‘Sammy Sosa’ appears twice in this document
---
hr:
  - Mark McGwire
  # Following node labeled SS
  - &SS Sammy Sosa
rbi:
  - *SS # Subsequent occurrence
  - Ken Griffey
sfYaml
spec
1.2
Array
(
    [hr] => Array
        (
            [0] => Mark McGwire
            [1] => Sammy Sosa
        )

    [rbi] => Array
        (
            [0] => Sammy Sosa
            [1] => Ken Griffey
        )

)
2.11. Mapping between Sequences
? - Detroit Tigers
  - Chicago cubs
:
  - 2001-07-23

? [ New York Yankees,
    Atlanta Braves ]
: [ 2001-07-02, 2001-08-12,
    2001-08-14 ]
sfYaml
spec
1.2
Error, unable to load YML: Unable to parse string: Unable to parse line 1 (? - Detroit Tigers).
2.12. Compact Nested Mapping
---
# Products purchased
- item    : Super Hoop
  quantity: 1
- item    : Basketball
  quantity: 4
- item    : Big Shoes
  quantity: 1
sfYaml
spec
1.2
Error, unable to load YML: Unable to parse string: Unable to parse line 3 ( quantity: 1).
2.13. In literals, newlines are preserved
# ASCII Art
--- |
  \//||\/||
  // ||  ||__
sfYaml
spec
1.2
Error, unable to load YML: Unable to parse string: Unable to parse line 2 (— |).
2.14. In the folded scalars, newlines become spaces
--- >
  Mark McGwire's
  year was crippled
  by a knee injury.
sfYaml
spec
1.2
Error, unable to load YML: Unable to parse string: Unable to parse line 1 ( Mark McGwire’s).
2.15. Folded newlines are preserved for ‘more indented’ and blank lines
>
 Sammy Sosa completed another
 fine season with great stats.

   63 Home Runs
   0.288 Batting Average

 What a year!
sfYaml
spec
1.2
Error, unable to load YML: Unable to parse string: Unable to parse line 1 (>).
2.16. Indentation determines scope
name: Mark McGwire
accomplishment: >
  Mark set a major league
  home run record in 1998.
stats: |
  65 Home Runs
  0.278 Batting Average
sfYaml
spec
1.2
Array
(
    [name] => Mark McGwire
    [accomplishment] => Mark set a major league home run record in 1998.

    [stats] => 65 Home Runs
0.278 Batting Average

)
2.17. Quoted Scalars
unicode: "Sosa did fine.\u263A"
control: "\b1998   1999    2000
"
hex esc: "
 is 
"

single: '"Howdy!" he cried.'
quoted: ' # Not a ''comment''.'
tie-fighter: '|\-*-/|'
sfYaml
spec
1.2
Error, unable to load YML: Unable to parse string: Malformed inline YAML string ("\b1998 1999 2000).
2.18. Multi-line Flow Scalars
plain:
  This unquoted scalar
  spans many lines.

quoted: "So does this
  quoted scalar.
"
sfYaml
spec
1.2
Error, unable to load YML: Unable to parse string: Unable to parse line 2 (This unquoted scalar).
2.19. Integers
canonical: 12345
decimal: +12345
octal: 0o14
hexadecimal: 0xC
sfYaml
spec
1.2
Array
(
    [canonical] => 12345
    [decimal] => 12345
    [octal] => 0o14
    [hexadecimal] => 12
)
2.20. Floating Point
canonical: 1.23015e+3
exponential: 12.3015e+02
fixed: 1230.15
negative infinity: -.inf
not a number: .NaN
sfYaml
spec
1.2
Array
(
    [canonical] => 1230.15
    [exponential] => 1230.15
    [fixed] => 1230.15
    [negative infinity] => -INF
    [not a number] => INF
)
2.21. Miscellaneous
null:
booleans: [ true, false ]
string: '012345'
sfYaml
spec
1.2
Array
(
    [] => 
    [booleans] => Array
        (
            [0] => 1
            [1] => 
        )

    [string] => 012345
)
2.22. Timestamps
canonical: 2001-12-15T02:59:43.1Z
iso8601: 2001-12-14t21:59:43.10-05:00
spaced: 2001-12-14 21:59:43.10 -5
date: 2002-12-14
sfYaml
spec
1.2
Array
(
    [canonical] => 1008385183
    [iso8601] => 1008385183
    [spaced] => 1008385183
    [date] => 1039824000
)
2.23. Various Explicit Tags
---
not-date: !!str 2002-04-28

picture: !!binary |
 R0lGODlhDAAMAIQAAP//9/X
 17unp5WZmZgAAAOfn515eXv
 Pz7Y6OjuDg4J+fn5OTk6enp
 56enmleECcgggoBADs=

application specific tag: !something |
 The semantics of the tag
 above may be different for
 different documents.
sfYaml
spec
1.2
Error, unable to load YML: Unable to parse string: Unable to parse line 4 ( R0lGODlhDAAMAIQAAP//9/X).
2.24. Global Tags
%TAG ! tag:clarkevans.com,2002:
--- !shape
  # Use the ! handle for presenting
  # tag:clarkevans.com,2002:circle
- !circle
  center: &ORIGIN {x: 73, y: 129}
  radius: 7
- !line
  start: *ORIGIN
  finish: { x: 89, y: 102 }
- !label
  start: *ORIGIN
  color: 0xFFEEBB
  text: Pretty vector drawing.
sfYaml
spec
1.2
Error, unable to load YML: Unable to parse string: Unable to parse line 2 (— !shape).
2.25. Unordered Sets
# Sets are represented as a
# Mapping where each key is
# associated with a null value
--- !!set
? Mark McGwire
? Sammy Sosa
? Ken Griff
sfYaml
spec
1.2
Error, unable to load YML: Unable to parse string: Unable to parse line 4 (— !!set).
2.26. Ordered Mappings
# Ordered maps are represented as
# A sequence of mappings, with
# each mapping having one key
--- !!omap
- Mark McGwire: 65
- Sammy Sosa: 63
- Ken Griffy: 58
sfYaml
spec
1.2
Error, unable to load YML: Unable to parse string: Unable to parse line 4 (— !!omap).
2.27. Invoice
--- !<tag:clarkevans.com,2002:invoice>
invoice: 34843
date   : 2001-01-23
bill-to: &id001
  given  : Chris
  family : Dumars
  address:
    lines: |
      458 Walkman Dr.
      Suite #292
    city    : Royal Oak
    state   : MI
    postal  : 48046
ship-to: *id001
product:
  - sku         : BL394D
    quantity    : 4
    description : Basketball
    price       : 450.00
  - sku         : BL4438H
    quantity    : 1
    description : Super Hoop
    price       : 2392.00
tax  : 251.42
total: 4443.52
comments:
  Late afternoon is best.
  Backup contact is Nancy
  Billsmer @ 338-4338.
sfYaml
spec
1.2
Error, unable to load YML: Unable to parse string: Unable to parse line 16 ( quantity : 4).
2.28. Log File
---
Time: 2001-11-23 15:01:42 -5
User: ed
Warning:
  This is an error message
  for the log file
---
Time: 2001-11-23 15:02:31 -5
User: ed
Warning:
  A slightly different error
  message.
---
Date: 2001-11-23 15:03:17 -5
User: ed
Fatal:
  Unknown variable "bar"
Stack:
  - file: TopClass.py
    line: 23
    code: |
      x = MoreObject("345
")
  - file: MoreClass.py
    line: 58
    code: |-
      foo = bar
sfYaml
spec
1.2
Error, unable to load YML: Unable to parse string: Unable to parse line 4 (This is an error message).

Tags: , , ,

3 Responses to “rto: sfYaml complies for 43% with Yaml 1.2 spec”

  1. Tony D. says:

    This is a excellent look over for me, Must acknowledge you will be a great bloggers I ever observed.Thank you for posting this information.

  2. hey,nice post.. wow, woderful post..i am a big fan..

  3. Very good!!!

Leave a Reply