| """pyversioncheck - Module to help with checking versions""" | 
 | import types | 
 | import rfc822 | 
 | import urllib | 
 | import sys | 
 | import string | 
 |  | 
 | # Verbose options | 
 | VERBOSE_SILENT=0	# Single-line reports per package | 
 | VERBOSE_NORMAL=1	# Single-line reports per package, more info if outdated | 
 | VERBOSE_EACHFILE=2	# Report on each URL checked | 
 | VERBOSE_CHECKALL=3	# Check each URL for each package | 
 |  | 
 | # Test directory | 
 | ## urllib bug: _TESTDIR="ftp://ftp.cwi.nl/pub/jack/python/versiontestdir/" | 
 | _TESTDIR="http://www.cwi.nl/~jack/versiontestdir/" | 
 |  | 
 | def versioncheck(package, url, version, verbose=0): | 
 |     ok, newversion, fp = checkonly(package, url, version, verbose) | 
 |     if verbose > VERBOSE_NORMAL: | 
 |         return ok | 
 |     if ok < 0: | 
 |         print '%s: No correctly formatted current version file found'%(package) | 
 |     elif ok == 1: | 
 |         print '%s: up-to-date (version %s)'%(package, version) | 
 |     else: | 
 |         print '%s: version %s installed, version %s found:' % \ | 
 |                         (package, version, newversion) | 
 |         if verbose > VERBOSE_SILENT: | 
 |             while 1: | 
 |                 line = fp.readline() | 
 |                 if not line: break | 
 |                 sys.stdout.write('\t'+line) | 
 |     return ok | 
 |  | 
 | def checkonly(package, url, version, verbose=0): | 
 |     if verbose >= VERBOSE_EACHFILE: | 
 |         print '%s:'%package | 
 |     if type(url) == types.StringType: | 
 |         ok, newversion, fp = _check1version(package, url, version, verbose) | 
 |     else: | 
 |         for u in url: | 
 |             ok, newversion, fp = _check1version(package, u, version, verbose) | 
 |             if ok >= 0 and verbose < VERBOSE_CHECKALL: | 
 |                 break | 
 |     return ok, newversion, fp | 
 |  | 
 | def _check1version(package, url, version, verbose=0): | 
 |     if verbose >= VERBOSE_EACHFILE: | 
 |         print '  Checking %s'%url | 
 |     try: | 
 |         fp = urllib.urlopen(url) | 
 |     except IOError, arg: | 
 |         if verbose >= VERBOSE_EACHFILE: | 
 |             print '    Cannot open:', arg | 
 |         return -1, None, None | 
 |     msg = rfc822.Message(fp, seekable=0) | 
 |     newversion = msg.getheader('current-version') | 
 |     if not newversion: | 
 |         if verbose >= VERBOSE_EACHFILE: | 
 |             print '    No "Current-Version:" header in URL or URL not found' | 
 |         return -1, None, None | 
 |     version = string.strip(string.lower(version)) | 
 |     newversion = string.strip(string.lower(newversion)) | 
 |     if version == newversion: | 
 |         if verbose >= VERBOSE_EACHFILE: | 
 |             print '    Version identical (%s)'%newversion | 
 |         return 1, version, fp | 
 |     else: | 
 |         if verbose >= VERBOSE_EACHFILE: | 
 |             print '    Versions different (installed: %s, new: %s)'% \ | 
 |                         (version, newversion) | 
 |         return 0, newversion, fp | 
 |  | 
 |  | 
 | def _test(): | 
 |     print '--- TEST VERBOSE=1' | 
 |     print '--- Testing existing and identical version file' | 
 |     versioncheck('VersionTestPackage', _TESTDIR+'Version10.txt', '1.0', verbose=1) | 
 |     print '--- Testing existing package with new version' | 
 |     versioncheck('VersionTestPackage', _TESTDIR+'Version11.txt', '1.0', verbose=1) | 
 |     print '--- Testing package with non-existing version file' | 
 |     versioncheck('VersionTestPackage', _TESTDIR+'nonexistent.txt', '1.0', verbose=1) | 
 |     print '--- Test package with 2 locations, first non-existing second ok' | 
 |     versfiles = [_TESTDIR+'nonexistent.txt', _TESTDIR+'Version10.txt'] | 
 |     versioncheck('VersionTestPackage', versfiles, '1.0', verbose=1) | 
 |     print '--- TEST VERBOSE=2' | 
 |     print '--- Testing existing and identical version file' | 
 |     versioncheck('VersionTestPackage', _TESTDIR+'Version10.txt', '1.0', verbose=2) | 
 |     print '--- Testing existing package with new version' | 
 |     versioncheck('VersionTestPackage', _TESTDIR+'Version11.txt', '1.0', verbose=2) | 
 |     print '--- Testing package with non-existing version file' | 
 |     versioncheck('VersionTestPackage', _TESTDIR+'nonexistent.txt', '1.0', verbose=2) | 
 |     print '--- Test package with 2 locations, first non-existing second ok' | 
 |     versfiles = [_TESTDIR+'nonexistent.txt', _TESTDIR+'Version10.txt'] | 
 |     versioncheck('VersionTestPackage', versfiles, '1.0', verbose=2) | 
 |  | 
 | if __name__ == '__main__': | 
 |     _test() | 
 | 	 | 
 |      |