diff options
| author | Joseph Hunkeler <jhunkeler@gmail.com> | 2016-08-03 10:09:40 -0400 | 
|---|---|---|
| committer | Joseph Hunkeler <jhunkeler@gmail.com> | 2016-08-03 10:09:40 -0400 | 
| commit | ce9bf156a5ced92d7ed5a2b8444e4948d9bc7699 (patch) | |
| tree | caac859c4916efdeb5d1b19b27f57c89b4528f2e | |
| parent | ec2ed0928074c63647735ff70d2e706acb89bb18 (diff) | |
| download | verhawk-ce9bf156a5ced92d7ed5a2b8444e4948d9bc7699.tar.gz | |
Trap stdout during module init; except TypeError to avoid packages bombing on packages like ASDF
| -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)) | 
