Project

General

Profile

Actions

Bug #11988

closed

YAML.dump doesn't quote string starting with 0 which will be recognized as float in YAML 1.2

Added by frsyuki (Sadayuki Furuhashi) almost 9 years ago. Updated over 8 years ago.

Status:
Closed
Target version:
-
ruby -v:
ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-darwin14]
[ruby-core:72850]

Description

YAML.dump doesn't quote string "019" but it is recognized as float using Core Schema tag resolution option of YAML 1.2 specification.
Therefore, SnakeYAML (Java) recognizes a string "019" serialized by Ruby's YAML as float 19.0 unexpectedly.

YAML.dump works as following:

irb(main):002:0> require 'yaml'
=> true
irb(main):003:0> puts YAML.dump({'a' => '017'})
---
a: '017'
=> nil
irb(main):004:0> puts YAML.dump({'a' => '019'})
---
a: 019
=> nil

This is valid behavior as a YAML 1.1 implementation.
However, YAML 1.2 defines a new optional mechanism for resolving types implicitly. With this new option named Core Schema, type of 019 is resolved as tag:yaml.org,2002:float.
Here is the specification: http://www.yaml.org/spec/1.2/spec.html#id2805071

irb(main):002:0> /[-+]?(\.[0-9]+|[0-9]+(\.[0-9]*)?)([eE][-+]?[0-9]+)?/ =~ '019'
=> 0

I think it's better to quote 019 as '019' to avoid unexpected results when YAML is read by YAML 1.2 Core Schema implementation.

Related: a rejected pull-request to SnakeYAML
https://bitbucket.org/asomov/snakeyaml/pull-requests/4/fix-implicit-resolver-of-float-type-so/diff

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0