diff options
author | Joseph Hunkeler <jhunkeler@gmail.com> | 2015-01-13 18:11:39 -0500 |
---|---|---|
committer | Joseph Hunkeler <jhunkeler@gmail.com> | 2015-01-13 18:11:39 -0500 |
commit | 05dc5e533758338131949d8d33b66980b593b24d (patch) | |
tree | 6ef39c97fbcec4835155d53dca9a954bf5df8779 /src | |
parent | 5fdbca629d6fbf4b6382ec70f5e20fe530566312 (diff) | |
download | pymkenv-05dc5e533758338131949d8d33b66980b593b24d.tar.gz |
Diffstat (limited to 'src')
-rwxr-xr-x | src/checkenv_resolver | 103 |
1 files changed, 84 insertions, 19 deletions
diff --git a/src/checkenv_resolver b/src/checkenv_resolver index 6ebabaf..9d2e1ba 100755 --- a/src/checkenv_resolver +++ b/src/checkenv_resolver @@ -29,7 +29,20 @@ except ImportError: import os import sys +from pprint import pprint from string import Template +from collections import OrderedDict + + +BAD_VERSION_ERROR="{0} requires Python 2.6 or greater.".format(sys.argv[0]) +try: + pyinfo = sys.version_info + if pyinfo.major <= 2 and pyinfo.minor < 6: + print(BAD_VERSION_ERROR) + exit(2) +except: + # Edge case failure + print(BAD_VERSION_ERROR) class PackageException(Exception): @@ -68,20 +81,20 @@ class Package(object): self.data = {} self.verbose = False + if os.path.exists(self.filename): + self.exists = True + + self.name = os.path.basename(self.filename.replace(' ', '_')) + if not load: return - self.preload() + self.populate() def __repr__(self): return self.name - def preload(self): - if os.path.exists(self.filename): - self.exists = True - - self.name = os.path.basename(self.filename.replace(' ', '_')) - + def populate(self): if self.filename is not None \ and self.exists: self.data = self.load() @@ -209,6 +222,24 @@ def solver(p, style='dependency'): solver(dep, style) spaces = '' + +def solver_ex(p, style='dependency'): + ''' Recursive package dependency resolver + ''' + resolver = p.dependencies + + if style != 'dependency': + resolver = p.precedence + + for dep in resolver: + yield dep.name, dep.exists + + if dep.dependencies: + # Fall back in on yourself if there are more dependencies + # beyond the current 'dep' + solver_ex(dep, style) + + def show_package_map(packages, style='dependency'): tree = '*--' global missing @@ -225,8 +256,41 @@ def show_package_map(packages, style='dependency'): print('') +def find_missing(pkgs, style='dependency'): + package_records = {} + head = '' + tail = '' + + for pkg in pkgs: + if tail: + for dep_name, dep_exists in list(tail): + #print('{0} {1}'.format(dep, flag)) + if dep_exists: + continue + package_records[head].append((dep_name, dep_exists)) + + head = pkg.name + package_records[head] = [(pkg.name, pkg.exists)] + #print('{0} {1}'.format(pkg.name, flags)) + yield head, package_records[head] + tail = solver_ex(pkg, style) + + +def show_missing(package_records, style_flag): + for top, deps in package_records.items(): + dep_output = '' + for index, (dep_name, dep_exists) in enumerate(deps, 1): + if not dep_exists: + dep_output += dep_name + if index < len(deps): + dep_output += ', ' + if dep_output: + print('Missing {0:<11s} in {1:<20s}: {2:<1s}'.format(style_flag, top, dep_output)) + + if __name__ == '__main__': args = None + # ENVCONFIG_PATH = os.path.abspath('/usr/local/envconfig') ENVCONFIG_PATH = os.path.abspath('/usr/local/envconfig') HOME = os.environ['HOME'] ENVRC = os.path.join(HOME, '.envrc') @@ -263,23 +327,24 @@ if __name__ == '__main__': except OSError as e: print(e.message) + if not args.requires and not args.precedence: print('To see a summary of available options, issue -h or --help') exit(0) if args.warnings: - for pkg in pkgs: - pkg.verbose = True - - if not pkg.exists: - # Normally the object performs its own checks to make sure - # it can read precedence, but we're overriding that functionality. - print('General failure, {0}: {1} does not exist'.format(pkg.name)) - - if args.requires: - pkg.get_requirements() - if args.precedence: - pkg.get_precedence() + dep_records = {} + prec_records = {} + + if args.requires: + dep_records = dict(find_missing(pkgs)) + if args.precedence: + prec_records = dict(find_missing(pkgs, 'precedence')) + + if dep_records: + show_missing(dep_records, 'requirement') + if prec_records: + show_missing(prec_records, 'precedence') exit(0) |