Make 'default' param of json.decode keyword or positional Following the discussion at https://github.com/google/starlark-go/pull/466 RELNOTES: the 'default' param of json.decode can now be used as a keyword parameter. PiperOrigin-RevId: 535643654 Change-Id: Ie203548ba46e037db6ce2303bfcd156edf7e96c9
diff --git a/src/main/java/net/starlark/java/lib/json/Json.java b/src/main/java/net/starlark/java/lib/json/Json.java index c13da7e..608a046 100644 --- a/src/main/java/net/starlark/java/lib/json/Json.java +++ b/src/main/java/net/starlark/java/lib/json/Json.java
@@ -290,17 +290,16 @@ + " string occurs more than once in the object, the last value for the key is kept.\n" + "<li>a JSON array is parsed as new unfrozen Starlark list.\n" + "</ul>\n" - + "If <code>x</code> is not a valid JSON encoding and the optional, positional-only" + + "If <code>x</code> is not a valid JSON encoding and the optional" + " <code>default</code> parameter is specified (including specified as" + " <code>None</code>), this function returns the <code>default</code> value.\n" + "If <code>x</code> is not a valid JSON encoding and the optional" - + " <code>default</code> parameter is <em>not</em> specified, this" - + " function fails.", + + " <code>default</code> parameter is <em>not</em> specified, this function fails.", parameters = { @Param(name = "x", doc = "JSON string to decode."), @Param( - // positional-only to match Starlark language spec for dict.get(), dict.pop(), getattr() name = "default", + named = true, doc = "If specified, the value to return when <code>x</code> cannot be decoded.", defaultValue = "unbound") },
diff --git a/src/test/java/net/starlark/java/eval/testdata/json.star b/src/test/java/net/starlark/java/eval/testdata/json.star index bf81227..0ce226c 100644 --- a/src/test/java/net/starlark/java/eval/testdata/json.star +++ b/src/test/java/net/starlark/java/eval/testdata/json.star
@@ -151,15 +151,13 @@ ## json.decode with default specified +assert_eq(json.decode('{"valid": "json"}', default = "default value"), {"valid": "json"}) assert_eq(json.decode('{"valid": "json"}', "default value"), {"valid": "json"}) +assert_eq(json.decode('{"invalid": "json"', default = "default value"), "default value") assert_eq(json.decode('{"invalid": "json"', "default value"), "default value") +assert_eq(json.decode('{"invalid": "json"', default = None), None) assert_eq(json.decode('{"invalid": "json"', None), None) -assert_fails( - lambda: json.decode('{"invalid": "json"', default = "default value"), - "got named argument for positional-only parameter 'default'", -) - def codec(x): return json.decode(json.encode(x))