summaryrefslogtreecommitdiff
path: root/src/checkenv_resolver
diff options
context:
space:
mode:
authorJoseph Hunkeler <jhunkeler@gmail.com>2015-01-13 18:11:39 -0500
committerJoseph Hunkeler <jhunkeler@gmail.com>2015-01-13 18:11:39 -0500
commit05dc5e533758338131949d8d33b66980b593b24d (patch)
tree6ef39c97fbcec4835155d53dca9a954bf5df8779 /src/checkenv_resolver
parent5fdbca629d6fbf4b6382ec70f5e20fe530566312 (diff)
downloadpymkenv-master.tar.gz
Reimplement '-w' flagHEADmaster
Diffstat (limited to 'src/checkenv_resolver')
-rwxr-xr-xsrc/checkenv_resolver103
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)