Created
May 13, 2015 20:31
-
-
Save dmpayton/7d3556406fe7eaf1bbd7 to your computer and use it in GitHub Desktop.
Check a requirements.txt for updated packages
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
''' Get a list of out-of-date packages from a pip requirements.txt file. ''' | |
import itertools | |
import json | |
import requests | |
import sys | |
# TODO: Rewrite this using requirements-parser | |
# https://github.com/davidfischer/requirements-parser | |
class ProgressIndicator(object): | |
chars = itertools.cycle(('|', '/', '-', '\\')) | |
def update(self, message): | |
self.clear() | |
sys.stdout.write('{0} {1}'.format(next(self.chars), message)) | |
sys.stdout.flush() | |
def clear(self): | |
# For more ANSI control characters, check out fish.ANSIControl | |
sys.stdout.write("\x1b[2K\r") | |
def main(): | |
try: | |
requirements_txt = sys.argv[1] | |
except IndexError: | |
requirements_txt = 'requirements.txt' | |
status = ProgressIndicator() | |
packages = [] | |
requirements = open(requirements_txt, 'r').read() | |
for line in requirements.splitlines(): | |
line = line.strip() | |
if not line or line.count('==') != 1 or line.startswith('#'): | |
continue | |
package, version = line.split('#')[0].split('==') | |
status.update(package) | |
response = requests.get('http://pypi.python.org/pypi/{0}/json'.format(package)) | |
try: | |
data = json.loads(response.content) | |
except Exception, err: | |
status.update('ERROR [{0}]: {1}'.format(package, err)) | |
continue | |
current_version = data['info']['version'].strip() | |
if version != current_version: | |
packages.append({ | |
'package': package, | |
'installed_version': version, | |
'current_version': current_version | |
}) | |
status.clear() | |
print json.dumps(packages, indent=4) | |
if __name__ == '__main__': | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment