Libfyaml – Proper, compliant, maintained(ish) YAML parsing library

4 months ago 17

Fork me on github:
yaml-test-suite
All test cases and expected event/JSON output
yaml-test-matrix
Code to run tests for all supported processors and create matrix HTML
yaml-runtimes
Code to create Docker image for all supported processors

This Matrix combines all tests from yaml-test-suite and all processors from yaml-runtimes.

The YAML Test Suite currently targets YAML Version 1.2. Note that this list is not meant as a "Best Of" list, as some processors implement 1.1 or 1.0 only, and the test suite contains a lot of edge cases that don't play such an important role in real world examples. It is suited to identify which problems each processors has and what to avoid.

Valid (308)Invalid (94) Total (402) Processorsokn/idifferrorn/apassfailpassfailevent - Compare parsing events c-libfyaml-event c-libyaml-event cpp-rapidyaml-event cpp-yamlcpp-event dotnet-yamldotnet-event hs-hsyaml-event js-yaml-event nim-nimyaml-event perl-pp-event perl-refparser-event py-pyyaml-event py-ruamel-event rust-yamlrust-event json - Compare loaded data with JSON c-libfyaml-json dotnet-yamldotnet-json go-yaml-json hs-hsyaml-json js-jsyaml-json js-yaml-json lua-lyaml-json perl-pp-json perl-pplibyaml-json perl-syck-json perl-tiny-json perl-xs-json perl-yaml-json py-pyyaml-json py-ruamel-json ruby-psych-json
C libfyaml      308 94 402
C libyaml      252 9 5 42 78 16 330 72
C++ rapidyaml      274 26 8 32 62 306 96
C++ yaml-cpp      278 15 15 60 34 338 64
C# YamlDotNet      293 5 10 83 11 376 26
Haskell HsYAML      298 1 9 94 392 10
Javascript yaml      307 1 92 2 399 3
Nim NimYAML      302 1 5 76 18 378 24
Perl YAML::PP      300 8 90 4 390 12
Perl Generated RefParser      308 94 402
Python PyYAML      249 9 5 45 80 14 329 73
Python ruamel.yaml      265 6 37 80 14 345 57
Rust yaml      251 28 29 66 28 317 85
C libfyaml       278 1 29 94 372 1
C# YamlDotNet       173 16 60 30 29 84 10 257 116
Go go-yaml       224 6 49 29 79 15 303 70
Haskell HsYAML       269 1 9 29 94 363 10
Javascript js-yaml       224 12 24 19 29 82 12 306 67
Javascript yaml       276 3 29 92 2 368 5
Lua lyaml       210 29 40 29 78 16 288 85
Perl YAML::PP       277 2 29 90 4 367 6
Perl YAML::PP::LibYAML       234 5 40 29 78 16 312 61
Perl YAML::Syck       166 77 36 29 42 52 208 165
Perl YAML::Tiny       44 104 41 90 29 80 14 124 249
Perl YAML::XS (libyaml)       220 8 5 46 29 79 15 299 74
Perl YAML.pm       98 15 166 29 79 15 177 196
Python PyYAML       222 8 49 29 80 14 302 71
Python ruamel.yaml       234 6 39 29 80 14 314 59
Ruby psych       226 12 41 29 78 16 304 69

Generated with yaml-test-suite/data Commit 6e6c296a 2022-01-17 Regenerated data from main v2022-01-17

Legend

Columns

eventsjson
 okEvents matched
 n/iThis feature is not implemented in this library
 diffEvent output differs
 errorParsing was aborted with an error
 n/aNo data to compare for this test
 invalid_correctInput was correctly detected as invalid
 invalid_incorrectInput was accepted although it is invalid
 okLoaded data is equal to JSON
 n/iThis feature is not implemented in this library
 diffLoaded data differs
 errorParsing/Loading was aborted with an error
 n/aNo data to compare for this test
 invalid_correctInput was correctly detected as invalid
 invalid_incorrectInput was accepted although it is invalid

Which processors don't implement which features?

--- c-libyaml.event: [ empty-key ] dotnet-yamldotnet.json: [ local-tag, unknown-tag ] java-snakeyaml.event: [ empty-key ] java-snakeyaml.json: [ empty-key, local-tag, unknown-tag ] js-jsyaml.json: [ local-tag, unknown-tag ] js-yaml.event: [ duplicate-key ] lua-lyaml-json: [ empty-key ] perl-pplibyaml.event: [ empty-key ] perl-pplibyaml.json: [ empty-key ] perl-pplibyaml.perl: [ empty-key ] perl-tiny.json: &tiny [ alias, anchor, complex-key, empty-key, explicit-key, flow, tag ] perl-tiny.perl: *tiny perl-xs.json: [ empty-key, unknown-tag ] perl-xs.perl: [ empty-key, unknown-tag ] py-pyyaml.event: [ empty-key ] py-pyyaml.json: [ empty-key ] py-pyyaml.py: [ empty-key ]
Read Entire Article