From faf6e2a8a66cf8177d691d9e903152597edc8091 Mon Sep 17 00:00:00 2001 From: Hendrik Sollich Date: Wed, 24 Jul 2019 16:36:15 +0200 Subject: [PATCH 1/2] Fix emitting hexlike strings without quotes The emitter omitted quotes for strings that start with `0x` those would subsequently be parsed as strings again. This should fix #133. --- parser/src/emitter.rs | 1 + parser/tests/test_round_trip.rs | 54 +++++++++++++++++++++++++++++---- 2 files changed, 49 insertions(+), 6 deletions(-) diff --git a/parser/src/emitter.rs b/parser/src/emitter.rs index 09e9f87..872d1c8 100644 --- a/parser/src/emitter.rs +++ b/parser/src/emitter.rs @@ -336,6 +336,7 @@ fn need_quotes(string: &str) -> bool { ] .contains(&string) || string.starts_with('.') + || string.starts_with("0x") || string.parse::().is_ok() || string.parse::().is_ok() } diff --git a/parser/tests/test_round_trip.rs b/parser/tests/test_round_trip.rs index bfa9602..dc5e85e 100644 --- a/parser/tests/test_round_trip.rs +++ b/parser/tests/test_round_trip.rs @@ -2,22 +2,64 @@ extern crate yaml_rust; use yaml_rust::{Yaml, YamlEmitter, YamlLoader}; -fn test_round_trip(original: &Yaml) { - let mut out = String::new(); - YamlEmitter::new(&mut out).dump(original).unwrap(); - let documents = YamlLoader::load_from_str(&out).unwrap(); +fn roundtrip(original: &Yaml) { + let mut emitted = String::new(); + YamlEmitter::new(&mut emitted).dump(original).unwrap(); + + let documents = YamlLoader::load_from_str(&emitted).unwrap(); + println!("emitted {}", emitted); + assert_eq!(documents.len(), 1); assert_eq!(documents[0], *original); } +fn double_roundtrip(original: &str) { + let parsed = YamlLoader::load_from_str(&original).unwrap(); + + let mut serialized = String::new(); + YamlEmitter::new(&mut serialized).dump(&parsed[0]).unwrap(); + + let reparsed = YamlLoader::load_from_str(&serialized).unwrap(); + + assert_eq!(parsed, reparsed); +} + #[test] fn test_escape_character() { let y = Yaml::String("\x1b".to_owned()); - test_round_trip(&y); + roundtrip(&y); } #[test] fn test_colon_in_string() { let y = Yaml::String("x: %".to_owned()); - test_round_trip(&y); + roundtrip(&y); +} + +#[test] +fn test_numberlike_strings() { + let docs = [ + r#"x: "1234""#, r#"x: "01234""#, r#""1234""#, + r#""01234""#, r#"" 01234""#, r#""0x1234""#, + r#"" 0x1234""#, + ]; + + for doc in &docs { + roundtrip(&Yaml::String(doc.to_string())); + double_roundtrip(&doc); + } +} + +/// Example from https://github.com/chyh1990/yaml-rust/issues/133 +#[test] +fn test_issue133() { + + let doc = YamlLoader::load_from_str("\"0x123\"").unwrap().pop().unwrap(); + assert_eq!(doc, Yaml::String("0x123".to_string())); + + let mut out_str = String::new(); + YamlEmitter::new(&mut out_str).dump(&doc).unwrap(); + let doc2 = YamlLoader::load_from_str(&out_str).unwrap().pop().unwrap(); + assert_eq!(doc, doc2); // This failed because the type has changed to a number now + } From 1005387c2c904211ca71644578b1970a8375b41f Mon Sep 17 00:00:00 2001 From: Hendrik Sollich Date: Wed, 24 Jul 2019 18:25:10 +0200 Subject: [PATCH 2/2] Raise minimum rustc version to 1.28 (Fixes CI) Known minimum version to build [regex](https://crates.io/crates/regex). Old enough as it is, we're not c++ here! --- parser/.travis.yml | 4 +--- parser/README.md | 4 ++++ parser/appveyor.yml | 4 ++-- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/parser/.travis.yml b/parser/.travis.yml index 908b925..a640b6e 100644 --- a/parser/.travis.yml +++ b/parser/.travis.yml @@ -5,9 +5,7 @@ matrix: - rust: stable - rust: beta - rust: nightly - - rust: 1.17.0 - script: cargo build - - rust: 1.24.1 + - rust: 1.28.0 - rust: nightly env: CLIPPY script: | diff --git a/parser/README.md b/parser/README.md index 8517ad3..5abb430 100644 --- a/parser/README.md +++ b/parser/README.md @@ -103,6 +103,10 @@ so it may not be a huge problem for most users. * Tag directive * Alias while desearilization +## Minimum Rust version policy + +This crate's minimum supported `rustc` version is 1.28, as this is the currently known minimum version for [`regex`](https://crates.io/crates/regex#minimum-rust-version-policy) as well. + ## License Licensed under either of diff --git a/parser/appveyor.yml b/parser/appveyor.yml index d6707aa..9d0a4f4 100644 --- a/parser/appveyor.yml +++ b/parser/appveyor.yml @@ -1,6 +1,6 @@ install: - - ps: Start-FileDownload 'https://static.rust-lang.org/dist/rust-1.24.1-i686-pc-windows-gnu.exe' - - rust-1.24.1-i686-pc-windows-gnu.exe /VERYSILENT /NORESTART /DIR="C:\Program Files (x86)\Rust" + - ps: Start-FileDownload 'https://static.rust-lang.org/dist/rust-1.28.0-i686-pc-windows-gnu.exe' + - rust-1.28.0-i686-pc-windows-gnu.exe /VERYSILENT /NORESTART /DIR="C:\Program Files (x86)\Rust" - SET PATH=%PATH%;C:\Program Files (x86)\Rust\bin - SET PATH=%PATH%;C:\MinGW\bin - rustc -V