github google/jsonnet v0.8.7

latest releases: v0.20.0, v0.19.1, v0.19.0...
pre-release8 years ago

Firstly, Jsonnet users should be aware of a tiny non-backwards-compatible change: It is no longer possible to put spaces or comments between the characters of each of the following operators :: +: ::: and +::: . The fact this was ever possible was an accident of implementation. In fact, we expect no-one was actually writing code like { x: /*foo */: 3 }.

With that out of the way, let's talk about the many new features this release:

The major announcement is the Jsonnet reformatter, which is in many ways like the Go reformatter, including the way it is invoked:

jsonnet fmt foo.jsonnet

(See --help for more details.)

This tool will clean up whitespace, re-indent, and use syntax sugars where possible. It can control the way strings are quoted and the comment style. However it will not (yet) break or join lines. It is quite extensible so please submit issues for more things you think it should fix. An obvious candidate is alphabetic re-ordering of imports!

One thing for which it's very useful is the process of bootstrapping unformatted JSON code into beautiful Jsonnet. To do this, use a standard JSON reformatter like json_pp to line-break the JSON how you want. Then run jsonnet fmt on it to strip the quotes from field names where possible and put commas on the end of lines. That takes care of the most boring aspects of refactoring JSON into Jsonnet!

Another new feature is to add Python style array slicing. This is the ability to do

local arr = ['it', 'was', 'the', 'best', 'of', 'times'];
assert arr[2:4] == ['the', 'best'];
assert arr[1::2] == ['was', 'best', 'times'];
true

This is designed to be compatible with Python, except the ability to use negative numbers to refer to elements relative to the far end of the array. The rationale: We'd rather have an explicit error to catch broken index arithmetic, and you can always use std.length() when you (rarely) need to refer to the last element of an array.

Did you notice the last example used ' for string literals instead of the " as prescribed by JSON? This new kind of string literal is useful in cases when you want to embed " in your string without escaping. It also has a bit less visual clutter.

Another innovation is --yaml-stream, which was implemented primarily for easy output into kubectl (from the Kubernetes project). The idea is that the Jsonnet script manifests into a JSON array, and this is rendered as a "YAML stream". For more context see yaml.org.

$ jsonnet --yaml-stream -e '[{ animal: "dog", sound: "woof" }, { animal: "cat", sound: "meow" }]'
---
{
   "animal": "dog",
   "sound": "woof"
}  
---
{
   "animal": "cat",
   "sound": "meow"
}  
...

The final new feature: We now have JSON merge patch support (RFC7396) in the standard library.

Don't miss a new jsonnet release

NewReleases is sending notifications on new releases.