diff options
Diffstat (limited to 'oh-my-zsh/plugins/jsontools')
-rw-r--r-- | oh-my-zsh/plugins/jsontools/README.md | 79 | ||||
-rw-r--r-- | oh-my-zsh/plugins/jsontools/jsontools.plugin.zsh | 113 |
2 files changed, 192 insertions, 0 deletions
diff --git a/oh-my-zsh/plugins/jsontools/README.md b/oh-my-zsh/plugins/jsontools/README.md new file mode 100644 index 0000000..6a27400 --- /dev/null +++ b/oh-my-zsh/plugins/jsontools/README.md @@ -0,0 +1,79 @@ +# jsontools + +Handy command line tools for dealing with json data. + +To use it, add `jsontools` to the plugins array in your zshrc file: + +```zsh +plugins=(... jsontools) +``` + +## Usage + +Usage is simple... just take your json data and pipe it into the appropriate jsontool: + +- `pp_json`: pretty prints json. +- `is_json`: returns true if valid json; false otherwise. +- `urlencode_json`: returns a url encoded string for the given json. +- `urldecode_json`: returns decoded json for the given url encoded string. + +### Supports NDJSON (Newline Delimited JSON) + +The plugin also supports [NDJSON](http://ndjson.org/) input, which means all functions +have an alternative function that reads and processes the input line by line. These +functions have the same name except using `ndjson` instead of `json`: + +> `pp_ndjson`, `is_ndjson`, `urlencode_ndjson`, `urldecode_ndjson`. + +### Examples + +- **pp_json**: + +```console +# curl json data and pretty print the results +curl https://coderwall.com/bobwilliams.json | pp_json +``` + +- **is_json**: + +```console +# validate if file's content conforms to a valid JSON schema +$ is_json < data.json +true +# shows true / false and returns the proper exit code +$ echo $? +0 +``` + +- **urlencode_json**: + +```console +# json data directly from the command line +$ echo '{"b":2, "a":1}' | urlencode_json +%7B%22b%22:2,%20%22a%22:1%7D +``` + +- **urldecode_json**: + +```console +# url encoded string to decode +$ echo '%7B%22b%22:2,%20%22a%22:1%7D' | urldecode_json +{"b":2, "a":1} +``` + +- **pp_ndjson**: + +```console +# echo two separate json objects and pretty print both +$ echo '{"a": "b"}\n{"c": [1,2,3]}' | pp_ndjson +{ + "a": "b" +} +{ + "c": [ + 1, + 2, + 3 + ] +} +``` diff --git a/oh-my-zsh/plugins/jsontools/jsontools.plugin.zsh b/oh-my-zsh/plugins/jsontools/jsontools.plugin.zsh new file mode 100644 index 0000000..49828d3 --- /dev/null +++ b/oh-my-zsh/plugins/jsontools/jsontools.plugin.zsh @@ -0,0 +1,113 @@ +# JSON Tools +# Adds command line aliases useful for dealing with JSON + +# Check that user-defined method is installed +if [[ -n "$JSONTOOLS_METHOD" ]]; then + (( $+commands[$JSONTOOLS_METHOD] )) || unset JSONTOOLS_METHOD +fi + +# If method undefined, find the first one that is installed +if [[ -z "$JSONTOOLS_METHOD" ]]; then + for JSONTOOLS_METHOD in node python3 ruby; do + # If method found, break out of loop + (( $+commands[$JSONTOOLS_METHOD] )) && break + # Otherwise unset the variable + unset JSONTOOLS_METHOD + done + + # If no methods were found, exit the plugin + [[ -n "$JSONTOOLS_METHOD" ]] || return 1 +fi + +# Define json tools for each method +case "$JSONTOOLS_METHOD" in + node) + # node doesn't make it easy to deal with stdin, so we pass it as an argument with xargs -0 + function pp_json() { + xargs -0 node -e 'console.log(JSON.stringify(JSON.parse(process.argv[1]), null, 4));' + } + function is_json() { + xargs -0 node -e ' + try { + json = JSON.parse(process.argv[1]); + console.log("true"); + process.exit(0); + } catch (e) { + console.log("false"); + process.exit(1); + } + ' + } + function urlencode_json() { + xargs -0 node -e "console.log(encodeURIComponent(process.argv[1]))" + } + function urldecode_json() { + xargs -0 node -e "console.log(decodeURIComponent(process.argv[1]))" + } + ;; + python3) + function pp_json() { + python3 -c 'import sys; del sys.path[0]; import runpy; runpy._run_module_as_main("json.tool")' + } + function is_json() { + python3 -c ' +import sys; del sys.path[0]; +import json +try: + json.loads(sys.stdin.read()) + print("true"); sys.exit(0) +except ValueError: + print("false"); sys.exit(1) + ' + } + function urlencode_json() { + python3 -c ' +import sys; del sys.path[0]; +from urllib.parse import quote_plus +print(quote_plus(sys.stdin.read())) + ' + } + function urldecode_json() { + python3 -c ' +import sys; del sys.path[0]; +from urllib.parse import unquote_plus +print(unquote_plus(sys.stdin.read())) + ' + } + ;; + ruby) + function pp_json() { + ruby -e ' + require "json" + require "yaml" + puts JSON.parse(STDIN.read).to_yaml + ' + } + function is_json() { + ruby -e ' + require "json" + begin + puts !!JSON.parse(STDIN.read); exit(0) + rescue JSON::ParserError + puts false; exit(1) + end + ' + } + function urlencode_json() { + ruby -e 'require "cgi"; puts CGI.escape(STDIN.read)' + } + function urldecode_json() { + ruby -e 'require "cgi"; puts CGI.unescape(STDIN.read)' + } + ;; +esac +unset JSONTOOLS_METHOD + +## Add NDJSON support + +function {pp,is,urlencode,urldecode}_ndjson() { + local json jsonfunc="${0//ndjson/json}" + while read -r json; do + $jsonfunc <<< "$json" + done +} |