view synapseGetDataset.py @ 29:d776b829f83f

Rolling the synapseClient dependency back to version 1.1
author melissacline
date Wed, 22 Jul 2015 16:59:35 -0700
parents d1104ad3646a
children e81019e3ac99
line wrap: on
line source

#!/usr/bin/env python
"""Download a dataset from Synapse into Galaxy """

import argparse
import json
import synapseclient
import sys
import zipfile

class InputError(Exception):
    def __init__(self, value):
        self.value = value
    def __str__(self):
        return repr(self.value)


def saveMetadata(entity, metadataPathname):
    fp = open(metadataPathname, "w")
    entityMetadata = dict(entity.properties.items() 
                          + entity.annotations.items())
    jsonMetadata = json.dumps(entityMetadata)
    fp.write("%s\n" % (jsonMetadata))
    fp.close()

def saveData(entity, dataPathname):
    if entity.properties['contentType'] == "application/zip":
        zf = zipfile.ZipFile(entity.path)
        if len(zf.namelist()) > 1:
            raise InputError(len(zf.namelist())), "Error: more than one input file"
        else:
            data = zf.read(zf.namelist()[0])
            fpOut = open(dataPathname, "w")
            fpOut.write(data)
            fpOut.close()
    else:
        fpIn = open(entity.path)
        fpOut = open(dataPathname, "w")
        for row in fpIn:
            fpOut.write(row)
        fpIn.close()
        fpOut.close()

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("entityId", type=str)
    parser.add_argument("email", type=str)
    parser.add_argument("outputMetadataFile", type=str)
    parser.add_argument("outputDataFile", type=str)
    parser.add_argument("--apiKey", type=str, default=None)
    parser.add_argument("--password", type=str, default=None)
    args = parser.parse_args()
    
    syn = synapseclient.Synapse()
    assert(args.apiKey != None or args.password != None)
    try:
        if args.apiKey is not None:
            syn.login(email=args.email, apiKey=args.apiKey)
        else:
            syn.login(email=args.email, password = args.password)
    except:
        print "Login Unsuccessful\n"
        sys.exit(-1)
    else:
        try:
            entity=syn.get(args.entityId)
        except:
            exc_type, exc_value, exc_traceback = sys.exc_info()
            lines = traceback.format_exception(exc_type, exc_value, 
                                               exc_traceback)
            allLines = ''.join('!! ' + line for line in lines)
            print "Unsuccessful: error %s\n" % allLines
            sys.exit(-1)
        else: 
            saveMetadata(entity, args.outputMetadataFile)
            saveData(entity, args.outputDataFile)
            sys.exit(0)

if __name__ == "__main__":
    main()