jsondoc_parser.py

#

Extract all paths from jsondoc file Usage: $ curl -s -X GET http://some-url/restapidoc.json | python jsondoc_parser.py

import argparse
import io
import json
import sys
from itertools import chain

ENCODE_IN = "utf-8"
ENCODE_OUT = "utf-8"
#

Parse command line arguments.

def parse_args():
#
    parser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter)
    parser.add_argument(
        "-i",
        "--infile",
        type=lambda x: open(x, encoding=ENCODE_IN),
        default=io.TextIOWrapper(sys.stdin.buffer, encoding=ENCODE_IN),
    )
    parser.add_argument(
        "-o",
        "--outfile",
        type=lambda x: open(x, "w", encoding=ENCODE_OUT),
        default=io.TextIOWrapper(sys.stdout.buffer, encoding=ENCODE_OUT),
    )
    return parser.parse_args()
#
def read_instream(in_stream):
    return json.loads(in_stream.read())
#
def flatten(nested_list):
    return list(chain.from_iterable(nested_list))
#
def extract_endpoint(api_node):
    return flatten([method.get("path") for method in api_node.get("methods")])
#
def extract_methods(api_node):
    return flatten([extract_endpoint(api) for api in api_node])
#
def manipulate_data(data):
    return flatten([extract_methods(v) for k, v in data.get("apis").items()])
#
def main():
    args = parse_args()
    data = read_instream(args.infile)
    results = manipulate_data(data)
    args.outfile.write(json.dumps(results))


if __name__ == "__main__":
    main()