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()