| #!/usr/bin/env python | |
| """Fetch the most recent GAE SDK and decompress it in the current directory. | |
| Usage: | |
| fetch_gae_sdk.py [<dest_dir>] | |
| Current releases are listed here: | |
| https://www.googleapis.com/storage/v1/b/appengine-sdks/o?prefix=featured | |
| """ | |
| from __future__ import print_function | |
| import json | |
| import os | |
| import StringIO | |
| import sys | |
| import urllib2 | |
| import zipfile | |
| _SDK_URL = ( | |
| 'https://www.googleapis.com/storage/v1/b/appengine-sdks/o?prefix=featured') | |
| def get_gae_versions(): | |
| try: | |
| version_info_json = urllib2.urlopen(_SDK_URL).read() | |
| except: | |
| return {} | |
| try: | |
| version_info = json.loads(version_info_json) | |
| except: | |
| return {} | |
| return version_info.get('items', {}) | |
| def _version_tuple(v): | |
| version_string = os.path.splitext(v['name'])[0].rpartition('_')[2] | |
| return tuple(int(x) for x in version_string.split('.')) | |
| def get_sdk_urls(sdk_versions): | |
| python_releases = [v for v in sdk_versions | |
| if v['name'].startswith('featured/google_appengine')] | |
| current_releases = sorted(python_releases, key=_version_tuple, | |
| reverse=True) | |
| return [release['mediaLink'] for release in current_releases] | |
| def main(argv): | |
| if len(argv) > 2: | |
| print('Usage: {0} [<destination_dir>]'.format(argv[0])) | |
| return 1 | |
| dest_dir = argv[1] if len(argv) > 1 else '.' | |
| if not os.path.exists(dest_dir): | |
| os.makedirs(dest_dir) | |
| if os.path.exists(os.path.join(dest_dir, 'google_appengine')): | |
| print('GAE SDK already installed at {0}, exiting.'.format(dest_dir)) | |
| return 0 | |
| sdk_versions = get_gae_versions() | |
| if not sdk_versions: | |
| print('Error fetching GAE SDK version info') | |
| return 1 | |
| sdk_urls = get_sdk_urls(sdk_versions) | |
| for sdk_url in sdk_urls: | |
| try: | |
| sdk_contents = StringIO.StringIO(urllib2.urlopen(sdk_url).read()) | |
| break | |
| except: | |
| pass | |
| else: | |
| print('Could not read SDK from any of ', sdk_urls) | |
| return 1 | |
| sdk_contents.seek(0) | |
| try: | |
| zip_contents = zipfile.ZipFile(sdk_contents) | |
| zip_contents.extractall(dest_dir) | |
| except: | |
| print('Error extracting SDK contents') | |
| return 1 | |
| if __name__ == '__main__': | |
| sys.exit(main(sys.argv[:])) |