diff options
Diffstat (limited to 'versionscanner.py')
-rwxr-xr-x | versionscanner.py | 59 |
1 files changed, 45 insertions, 14 deletions
diff --git a/versionscanner.py b/versionscanner.py index 26788a2..0e3aa3d 100755 --- a/versionscanner.py +++ b/versionscanner.py @@ -1,10 +1,14 @@ #!/usr/bin/env python from __future__ import print_function import json +import os import pkgutil import sys +STDERR, STDOUT = sys.stderr, sys.stdout + + class VersionScanner(object): def __init__(self, package, exclusions=[], recursive=False, packages_only=False): self.package = package @@ -15,22 +19,23 @@ class VersionScanner(object): self.packages_only = packages_only self.scan() - def __iter__(self): for k, v in self.versions.items(): yield k, v - def scan(self): + + try: module = self.package + modname = module.__name__ try: - self.versions[module.__name__] = module.__version__ or module.version + self.versions[modname] = module.__version__ or module.version or module._version except AttributeError: - self.versions[module.__name__] = None + self.versions[modname] = None except ImportError as e: - print('ImportError({0}): {1}'.format(module.__name__, e), file=sys.stderr) + print('ImportError({0}): {1}'.format(modname, e), file=sys.stderr) if self.recursive: try: @@ -49,16 +54,26 @@ class VersionScanner(object): continue try: - module = importer.find_module(modname).load_module(modname) + module = None + with open(os.devnull, 'w') as devnull: + sys.stdout = devnull + module = importer.find_module(modname).load_module(modname) + + sys.stdout = STDOUT try: self.versions[modname] = module.__version__ except AttributeError: - self.versions[module.__name__] = None + self.versions[modname] = None + except ImportError as e: print('ImportError({0}): {1}'.format(modname, e), file=sys.stderr) + except AttributeError: - # has no sub-packages or sub-modules, so just ignore the failure + # has no sub-packages or sub-modules, so ignore + pass + except TypeError: + # has strange requirements at import-time, so ignore pass def as_json(self): @@ -76,16 +91,31 @@ if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument('parent_package') - parser.add_argument('-e', '--exclude', action='append', default=[], help='Ignore sub-[package|module] by name.') - parser.add_argument('-v', '--verbose', action='store_true', help='Show packages without version data.') - parser.add_argument('-j', '--json', action='store_true', help='Emit JSON to stdout') - parser.add_argument('-p', '--packages-only', action='store_true', help='Ignore non-packages (i.e modules)') - parser.add_argument('-r', '--recursive', action='store_true', help='Descend into package looking for additional version data.') + parser.add_argument('-e', '--exclude', + action='append', + default=[], + help='Ignore sub-[package|module] by name.') + parser.add_argument('-v', '--verbose', + action='store_true', + help='Show packages without version data.') + parser.add_argument('-j', '--json', + action='store_true', + help='Emit JSON to stdout') + parser.add_argument('-p', '--packages-only', + action='store_true', + help='Ignore non-packages (i.e modules)') + parser.add_argument('-r', '--recursive', + action='store_true', + help='Descend into package looking for additional version data.') args = parser.parse_args() try: - parent_package = importlib.import_module(args.parent_package) + with open(os.devnull, 'w') as devnull: + sys.stdout = devnull + parent_package = importlib.import_module(args.parent_package) + + sys.stdout = STDOUT except ImportError as e: print(e, file=sys.stderr) exit(1) @@ -99,5 +129,6 @@ if __name__ == '__main__': for pkg, version in sorted(scanner): if not args.verbose and version is None: continue + print('{0}={1}'.format(pkg, version)) |