Skip to content

Commit 1497955

Browse files
Fix corner case for YAML parsing with primitive types (#247)
I was looking at google/jsonnet#1109 and realized that we did not parse yaml correctly for primitive types: `std.parseYaml("0777")` returned `[511]` instead of `511` (something that other implementations of jsonnet do)
1 parent 6f4e54b commit 1497955

File tree

3 files changed

+14
-10
lines changed

3 files changed

+14
-10
lines changed

sjsonnet/src-jvm/sjsonnet/Platform.scala

+8-8
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ object Platform {
2929
}
3030

3131
/**
32-
* Valid compression levels are 0 (no compression) to 9 (maximum compression).
32+
* Valid compression levels are 0 (no compression) to 9 (maximum compression).
3333
*/
3434
def xzBytes(b: Array[Byte], compressionLevel: Option[Int]): String = {
3535
val outputStream: ByteArrayOutputStream = new ByteArrayOutputStream(b.length)
@@ -51,14 +51,14 @@ object Platform {
5151

5252
def yamlToJson(yamlString: String): String = {
5353
try {
54-
val yaml = new Yaml(new SafeConstructor(new LoaderOptions())).loadAll(yamlString)
55-
.asInstanceOf[java.lang.Iterable[java.util.Collection[Object]]].asScala.toSeq
54+
val yaml = new Yaml(new SafeConstructor(new LoaderOptions())).loadAll(yamlString).asScala.toSeq
5655
yaml.size match {
5756
case 0 => "{}"
58-
case 1 if yaml.head.isInstanceOf[java.util.Map[String, Object]] =>
59-
new JSONObject(yaml.head.asInstanceOf[java.util.Map[String, Object]]).toString()
60-
case 1 if yaml.head.isInstanceOf[java.util.List[Object]] =>
61-
new JSONArray(yaml.head.asInstanceOf[java.util.List[Object]]).toString()
57+
case 1 => yaml.head match {
58+
case m: java.util.Map[_, _] => new JSONObject(m).toString()
59+
case l: java.util.List[_] => new JSONArray(l).toString()
60+
case _ => new JSONArray(yaml.asJava).get(0).toString
61+
}
6262
case _ => new JSONArray(yaml.asJava).toString()
6363
}
6464
} catch {
@@ -70,7 +70,7 @@ object Platform {
7070
private def computeHash(algorithm: String, s: String) = {
7171
java.security.MessageDigest.getInstance(algorithm)
7272
.digest(s.getBytes("UTF-8"))
73-
.map{ b => String.format("%02x", (b & 0xff).asInstanceOf[Integer])}
73+
.map { b => String.format("%02x", (b & 0xff).asInstanceOf[Integer]) }
7474
.mkString
7575
}
7676

sjsonnet/src/sjsonnet/Materializer.scala

+3-1
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,10 @@ abstract class Materializer {
5959
case Val.Null(pos) => storePos(pos); visitor.visitNull(-1)
6060
case s: Val.Func =>
6161
Error.fail("Couldn't manifest function with params [" + s.params.names.mkString(",") + "]", v.pos)
62+
case vv: Val =>
63+
Error.fail("Unknown value type " + vv.prettyName, vv.pos)
6264
case _ =>
63-
Error.fail("Unknown value type", v.pos)
65+
Error.fail("Unknown value type " + v)
6466
}
6567
} catch {
6668
case _: StackOverflowError =>

sjsonnet/test/src-jvm/sjsonnet/ParseYamlTests.scala

+3-1
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,12 @@ object ParseYamlTests extends TestSuite {
77
def tests: Tests = Tests {
88
test {
99
eval("std.parseYaml('foo: bar')") ==> ujson.Value("""{"foo":"bar"}""")
10+
eval("std.parseYaml('- foo: bar')") ==> ujson.Value("""[{"foo":"bar"}]""")
1011
}
1112
test {
1213
eval("std.parseYaml('')") ==> ujson.Value("""{}""")
13-
}
14+
eval("std.parseYaml(\"0777\")") ==> ujson.Value("""511""")
15+
}
1416
test {
1517
eval("std.parseYaml('foo: bar\n---\nbar: baz\n')") ==> ujson.Value("""[{"foo": "bar"}, {"bar": "baz"}]""")
1618
}

0 commit comments

Comments
 (0)