aboutsummaryrefslogtreecommitdiff
path: root/versionscanner.py
diff options
context:
space:
mode:
Diffstat (limited to 'versionscanner.py')
-rwxr-xr-xversionscanner.py81
1 files changed, 51 insertions, 30 deletions
diff --git a/versionscanner.py b/versionscanner.py
index eeeca14..26788a2 100755
--- a/versionscanner.py
+++ b/versionscanner.py
@@ -3,54 +3,63 @@ from __future__ import print_function
import json
import pkgutil
import sys
-from pprint import pprint
class VersionScanner(object):
- def __init__(self, package, exclusions=[]):
+ def __init__(self, package, exclusions=[], recursive=False, packages_only=False):
self.package = package
self.prefix = self.package.__name__ + '.'
self.exclusions = exclusions
self.versions = dict()
+ self.recursive = recursive
+ 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
-
+
try:
- self.versions[module.__name__] = module.__version__
+ self.versions[module.__name__] = module.__version__ or module.version
except AttributeError:
- self.versions[module.__name__] = 'unknown'
+ self.versions[module.__name__] = None
except ImportError as e:
print('ImportError({0}): {1}'.format(module.__name__, e), file=sys.stderr)
- for importer, modname, ispkg in pkgutil.iter_modules(self.package.__path__, self.prefix):
- excluded = False
- for ex in self.exclusions:
- ex = self.prefix + ex
- if modname == ex:
- excluded = True
- break
-
- if excluded:
- continue
-
+ if self.recursive:
try:
- module = importer.find_module(modname).load_module(modname)
-
- try:
- self.versions[modname] = module.__version__
- except AttributeError:
- self.versions[modname] = 'unknown'
- except ImportError as e:
- print('ImportError({0}): {1}'.format(modname, e), file=sys.stderr)
+ for importer, modname, ispkg in pkgutil.iter_modules(self.package.__path__, self.prefix):
+ excluded = False
+ for ex in self.exclusions:
+ ex = self.prefix + ex
+ if modname == ex:
+ excluded = True
+ break
+
+ if excluded:
+ continue
+
+ if self.packages_only and not ispkg:
+ continue
+
+ try:
+ module = importer.find_module(modname).load_module(modname)
+
+ try:
+ self.versions[modname] = module.__version__
+ except AttributeError:
+ self.versions[module.__name__] = 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
+ pass
def as_json(self):
return json.dumps(self.versions, sort_keys=True)
@@ -67,16 +76,28 @@ if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('parent_package')
- parser.add_argument('-e', '--exclude', action='append', default=[])
- parser.add_argument('-j', '--json', action='store_true')
+ 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()
- parent_package = importlib.import_module(args.parent_package)
- scanner = VersionScanner(parent_package, args.exclude)
+
+ try:
+ parent_package = importlib.import_module(args.parent_package)
+ except ImportError as e:
+ print(e, file=sys.stderr)
+ exit(1)
+
+ scanner = VersionScanner(parent_package, args.exclude, args.recursive, args.packages_only)
if args.json:
print(scanner.as_json())
else:
for pkg, version in sorted(scanner):
+ if not args.verbose and version is None:
+ continue
print('{0}={1}'.format(pkg, version))
+