dependencies: update Dependencies doctest to use portage-9999
[gentoolkit.git] / pym / gentoolkit / dependencies.py
index f12500622e0c3e4f7b3e90d7b588bf8950d5a8f1..726d546173e41a7fc8fd6a9f1eecd01ff7b14d2f 100644 (file)
@@ -20,34 +20,29 @@ from gentoolkit import errors
 from gentoolkit.atom import Atom
 from gentoolkit.cpv import CPV
 from gentoolkit.helpers import uniqify
-from gentoolkit.dbapi import PORTDB, VARDB
 from gentoolkit.query import Query
 
 # =======
 # Classes
 # =======
 
-class Dependencies(CPV):
+class Dependencies(Query):
        """Access a package's dependencies and reverse dependencies.
 
        Example usage:
                >>> from gentoolkit.dependencies import Dependencies
-               >>> portage = Dependencies('sys-apps/portage-2.1.6.13')
+               >>> portage = Dependencies('sys-apps/portage-9999')
                >>> portage
-               <Dependencies 'sys-apps/portage-2.1.6.13'>
+               <Dependencies 'sys-apps/portage-9999'>
                >>> # All methods return gentoolkit.atom.Atom instances
                ... portage.get_depend()
-               [<Atom '>=dev-lang/python-2.5'>, <Atom '<dev-lang/python-3.0'>, ...]
+               ... # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE
+               [<Atom 'python3? =dev-lang/python-3*'>,
+                <Atom '!python3? >=dev-lang/python-2.7'>, ...]
 
        """
-       def __init__(self, cpv, op='', parser=None):
-               if isinstance(cpv, CPV):
-                       self.__dict__.update(cpv.__dict__)
-               else:
-                       CPV.__init__(self, cpv)
-
-               self.operator = op
-               self.atom = self.operator + self.cpv
+       def __init__(self, query, parser=None):
+               Query.__init__(self, query)
                self.use = []
                self.depatom = str()
 
@@ -75,10 +70,10 @@ class Dependencies(CPV):
                # Try to use the Portage tree first, since emerge only uses the tree
                # when calculating dependencies
                try:
-                       result = PORTDB.aux_get(self.cpv, envvars)
+                       result = portage.db[portage.root]["porttree"].dbapi.aux_get(self.cpv, envvars)
                except KeyError:
                        try:
-                               result = VARDB.aux_get(self.cpv, envvars)
+                               result = portage.db[portage.root]["vartree"].dbapi.aux_get(self.cpv, envvars)
                        except KeyError:
                                return []
                return result
@@ -121,7 +116,7 @@ class Dependencies(CPV):
                max_depth=1,
                printer_fn=None,
                # The rest of these are only used internally:
-               depth=0,
+               depth=1,
                seen=None,
                depcache=None,
                result=None
@@ -157,32 +152,29 @@ class Dependencies(CPV):
                        except KeyError:
                                pkgdep = Query(dep.atom).find_best()
                                depcache[dep.atom] = pkgdep
-                       if pkgdep and pkgdep.cpv in seen:
+                       if not pkgdep:
                                continue
-                       if depth < max_depth or max_depth <= 0:
-
+                       elif pkgdep.cpv in seen:
+                               continue
+                       if depth <= max_depth or max_depth == 0:
                                if printer_fn is not None:
                                        printer_fn(depth, pkgdep, dep)
-                               if not pkgdep:
-                                       continue
+                               result.append((depth,pkgdep))
 
                                seen.add(pkgdep.cpv)
-                               result.append((
-                                       depth,
-                                       pkgdep.deps.graph_depends(
-                                               max_depth=max_depth,
-                                               printer_fn=printer_fn,
-                                               # The rest of these are only used internally:
-                                               depth=depth+1,
-                                               seen=seen,
-                                               depcache=depcache,
-                                               result=result
-                                       )
-                               ))
-
-               if depth == 0:
-                       return result
-               return pkgdep
+                               if depth < max_depth or max_depth == 0:
+                                       # result is passed in and added to directly
+                                       # so rdeps is disposable
+                                       rdeps = pkgdep.deps.graph_depends(
+                                                       max_depth=max_depth,
+                                                       printer_fn=printer_fn,
+                                                       # The rest of these are only used internally:
+                                                       depth=depth+1,
+                                                       seen=seen,
+                                                       depcache=depcache,
+                                                       result=result
+                                               )
+               return result
 
        def graph_reverse_depends(
                self,
@@ -320,10 +312,16 @@ class Dependencies(CPV):
                        if tok[0] == '!':
                                # We're not interested in blockers
                                continue
-                       atom = Atom(tok)
-                       if use_conditional is not None:
-                               atom.use_conditional = use_conditional
-                       result.append(atom)
+                       # skip it if it's empty
+                       if tok and tok != '':
+                               atom = Atom(tok)
+                               if use_conditional is not None:
+                                       atom.use_conditional = use_conditional
+                               result.append(atom)
+                       else:
+                               message = "dependencies.py: _parser() found an empty " +\
+                                       "dep string token for: %s, deps= %s"
+                               raise errors.GentoolkitInvalidAtom(message %(self.cpv, deps))
 
                return result