88f34170f2ed2d1e755d3f617b17e34b0df5eda6 chmalee Wed May 15 11:12:11 2019 -0700 Making python api client handle pipes a bit more gracefully diff --git src/utils/ucscApiClient src/utils/ucscApiClient index aa88e2a..ae28d80 100755 --- src/utils/ucscApiClient +++ src/utils/ucscApiClient @@ -52,96 +52,96 @@ response = urlopen(request) content = response.read() if content: data = json.loads(content, object_pairs_hook=OrderedDict) except HTTPError as e: if e.code == 400: # does this work for other status codes? msg = json.loads(e.read(), object_pairs_hook=OrderedDict) sys.stderr.write("Error: %s\n" % msg["error"]) sys.exit(1) else: sys.stderr.write("Request %s failed with HTTP status %s\nreason:%s\n" % (requestUrl, e.code, e.reason)) sys.exit(1) return data +def printJsonData(data, prettyPrint=False): + """Dump json to stdout, potentially pretty printing. Handle pipes gracefully.""" + if data is not None: + try: + if prettyPrint: + print(json.dumps(data,indent=4, separators=(",",":"))) + else: + print(json.dumps(data)) + except IOError: + pass + + def runGetDnaExample(prettyPrint=False): """ Run test of getting short DNA sequence from the hg38 assembly and exit. """ req = serverName + "/getData/sequence?genome=hg38;chrom=chr1;start=11110531;end=11110538" data = tryJsonRequest(req) if data: print("Example request for obtaining DNA sequence:\n%s" % req) - if prettyPrint: - print(json.dumps(data, indent=4, separators=(" , "," : "))) - else: - print(json.dumps(data)) + printJsonData(data, prettyPrint) sys.exit(0) def runTest0(prettyPrint=False): """ Run test of getting public hub data for "Plants" and print UCSC info for the hg38 genome and exit """ hubRequest = serverName + "/list/publicHubs" hg38Request = serverName + "/list/ucscGenomes" # do plants hub test first data = tryJsonRequest(hubRequest) if data: plantData = None for obj in data['publicHubs']: if obj['shortLabel'] == 'Plants': plantData = obj if plantData is not None: print("Plants public hub data") - if prettyPrint: - print(json.dumps(plantData,indent=4, separators=(",",":"))) - else: - print(json.dumps(plantData)) + printJsonData(plantData, prettyPrint) # now do ucsc hg38 test data = tryJsonRequest(hg38Request) if data: hg38Data = None if data['ucscGenomes']['hg38']: hg38Data = data['ucscGenomes']['hg38'] if hg38Data is not None: print("hg38/Human information") - if prettyPrint: - print(json.dumps(hg38Data,indent=4, separators=(",",":"))) - else: - print(json.dumps(hg38Data)) + printJsonData(hg38Data, prettyPrint) sys.exit(0) def main(): cmd = parseCommandLine() args = cmd.parse_args() req = serverName if len(sys.argv) == 1: cmd.print_help() sys.exit(0) # run special test if args.test0: runTest0(args.pretty_print) if args.getDnaExample: runGetDnaExample(args.pretty_print) req += args.endpoint + "?" + args.parameters # make http request and print the output data = None if args.debug: print("request URL: %s\n" % req) data = tryJsonRequest(req) - if data: - if args.pretty_print: - print(json.dumps(data, indent=4, separators=(",",":"))) - else: - print(json.dumps(data)) + printJsonData(data, args.pretty_print) + sys.exit(0) if __name__ == "__main__": main()