aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xversionscanner.py59
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))