[2] | 1 | import os, sys, urllib, urllib2 |
---|
| 2 | |
---|
| 3 | new_path = [ os.path.join( os.path.dirname( __file__ ), '..', '..', 'lib' ) ] |
---|
| 4 | new_path.extend( sys.path[1:] ) |
---|
| 5 | sys.path = new_path |
---|
| 6 | |
---|
| 7 | from galaxy import eggs |
---|
| 8 | import pkg_resources |
---|
| 9 | |
---|
| 10 | pkg_resources.require( "simplejson" ) |
---|
| 11 | import simplejson |
---|
| 12 | |
---|
| 13 | def make_url( api_key, url, args=None ): |
---|
| 14 | # Adds the API Key to the URL if it's not already there. |
---|
| 15 | if args is None: |
---|
| 16 | args = [] |
---|
| 17 | argsep = '&' |
---|
| 18 | if '?' not in url: |
---|
| 19 | argsep = '?' |
---|
| 20 | if '?key=' not in url and '&key=' not in url: |
---|
| 21 | args.insert( 0, ( 'key', api_key ) ) |
---|
| 22 | return url + argsep + '&'.join( [ '='.join( t ) for t in args ] ) |
---|
| 23 | |
---|
| 24 | def get( api_key, url ): |
---|
| 25 | # Do the actual GET. |
---|
| 26 | url = make_url( api_key, url ) |
---|
| 27 | try: |
---|
| 28 | return simplejson.loads( urllib2.urlopen( url ).read() ) |
---|
| 29 | except simplejson.decoder.JSONDecodeError, e: |
---|
| 30 | print "URL did not return JSON data" |
---|
| 31 | sys.exit(1) |
---|
| 32 | |
---|
| 33 | def post( api_key, url, data ): |
---|
| 34 | # Do the actual POST. |
---|
| 35 | url = make_url( api_key, url ) |
---|
| 36 | req = urllib2.Request( url, headers = { 'Content-Type': 'application/json' }, data = simplejson.dumps( data ) ) |
---|
| 37 | return simplejson.loads( urllib2.urlopen( req ).read() ) |
---|
| 38 | |
---|
| 39 | def display( api_key, url ): |
---|
| 40 | # Sends an API GET request and acts as a generic formatter for the JSON response. |
---|
| 41 | try: |
---|
| 42 | r = get( api_key, url ) |
---|
| 43 | except urllib2.HTTPError, e: |
---|
| 44 | print e |
---|
| 45 | print e.read( 1024 ) # Only return the first 1K of errors. |
---|
| 46 | sys.exit( 1 ) |
---|
| 47 | if type( r ) == unicode: |
---|
| 48 | print 'error: %s' % r |
---|
| 49 | return None |
---|
| 50 | elif type( r ) == list: |
---|
| 51 | # Response is a collection as defined in the REST style. |
---|
| 52 | print 'Collection Members' |
---|
| 53 | print '------------------' |
---|
| 54 | for n, i in enumerate(r): |
---|
| 55 | # All collection members should have a name and url in the response. |
---|
| 56 | print '#%d: %s' % (n+1, i.pop( 'url' ) ) |
---|
| 57 | print ' name: %s' % i.pop( 'name' ) |
---|
| 58 | for k, v in i.items(): |
---|
| 59 | print ' %s: %s' % ( k, v ) |
---|
| 60 | print '' |
---|
| 61 | print '%d element(s) in collection' % len( r ) |
---|
| 62 | elif type( r ) == dict: |
---|
| 63 | # Response is an element as defined in the REST style. |
---|
| 64 | print 'Member Information' |
---|
| 65 | print '------------------' |
---|
| 66 | for k, v in r.items(): |
---|
| 67 | print '%s: %s' % ( k, v ) |
---|
| 68 | else: |
---|
| 69 | print 'response is unknown type: %s' % type( r ) |
---|
| 70 | |
---|
| 71 | def submit( api_key, url, data ): |
---|
| 72 | # Sends an API POST request and acts as a generic formatter for the JSON response. |
---|
| 73 | # 'data' will become the JSON payload read by Galaxy. |
---|
| 74 | try: |
---|
| 75 | r = post( api_key, url, data ) |
---|
| 76 | except urllib2.HTTPError, e: |
---|
| 77 | print e |
---|
| 78 | print e.read( 1024 ) |
---|
| 79 | sys.exit( 1 ) |
---|
| 80 | print 'Response' |
---|
| 81 | print '--------' |
---|
| 82 | if type( r ) == list: |
---|
| 83 | # Currently the only implemented responses are lists of dicts, because |
---|
| 84 | # submission creates some number of collection elements. |
---|
| 85 | for i in r: |
---|
| 86 | if type( i ) == dict: |
---|
| 87 | if 'url' in i: |
---|
| 88 | print i.pop( 'url' ) |
---|
| 89 | else: |
---|
| 90 | print '----' |
---|
| 91 | if 'name' in i: |
---|
| 92 | print ' name: %s' % i.pop( 'name' ) |
---|
| 93 | for k, v in i.items(): |
---|
| 94 | print ' %s: %s' % ( k, v ) |
---|
| 95 | else: |
---|
| 96 | print i |
---|
| 97 | else: |
---|
| 98 | print r |
---|