Hi Mitchell, et al.,

What do you think about using JSON as a machine readable output?

The current machine readable output format burdens users with parsing a 
sparsely documented ad hoc format, albeit one that is more structured than 
the default vagrant output.  Without very thorough documentation it is 
difficult to know if one is parsing the machine readable output correctly. 
 This makes it only slightly better than the default (non-machine readable) 
sparsely documented ad hoc output, at least for my purposes.  (I maintain 
python-vagrant: https://github.com/todddeluca/python-vagrant).

Contrast this with JSON.  JSON requires no parsing, assuming you have a 
JSON parser for your language of choice.  It can easily represent complex 
nested data structures.  If a user wants to process the output using 
command line tools, they can use jq (http://stedolan.github.io/jq/), which 
is like sed for JSON, according to its docs.

Here is an example of machine readable output:

$ vagrant box list --machine-readable 
1395431215,,box-name,precise32 
1395431215,,box-provider,virtualbox 
1395431215,,box-version,0 
1395431216,,box-name,precise64 
1395431216,,box-provider,virtualbox 
1395431216,,box-version,0 
1395431216,,box-name,python-vagrant-base 
1395431216,,box-provider,virtualbox 
1395431216,,box-version,0 
1395431216,,box-name,trusty64 
1395431216,,box-provider,virtualbox 
1395431216,,box-version,0

Since the information for one box is spread across multiple lines, the 
parsing required is more sophisticated than that for a simple CSV table. 
 With no begin and end tags, to parse the data you must intimately 
understand how each line relates to the others.  

Here is a hypothetical JSON version of the box output above:

$ vagrant box list --json
[
  {
    "target": null,
    "timestamp": 1395431215,
    "box-name": "precise32",
    "box-version": "0",
    "type": "box-list",
    "box-provider": "virtualbox"
  },
  {
    "target": null,
    "timestamp": 1395431216,
    "box-name": "precise64",
    "box-version": "0",
    "type": "box-list",
    "box-provider": "virtualbox"
  },
  {
    "target": null,
    "timestamp": 1395431216,
    "box-name": "python-vagrant-base",
    "box-version": "0",
    "type": "box-list",
    "box-provider": "virtualbox"
  },
  {
    "target": null,
    "timestamp": 1395431216,
    "box-name": "trusty64",
    "box-version": "0",
    "type": "box-list",
    "box-provider": "virtualbox"
  }
]

And to demonstrate how `jq` can manipulate this data on the command line, 
here is an example using `jq` to select the "trusty64" box:

$ vagrant box list --json | jq '.[] | select(.["box-name"] == "trusty64")'
{ 
  "box-provider": "virtualbox", 
  "type": "box-list", 
  "box-version": "0", 
  "box-name": "trusty64", 
  "timestamp": 1395431216, 
  "target": null 
}

Is this the right place to make these feature requests?  Should I open an 
issue on GitHub?

Regards,
Todd

-- 
You received this message because you are subscribed to the Google Groups 
"Vagrant" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to