summaryrefslogtreecommitdiff
path: root/portato/dependency.py
diff options
context:
space:
mode:
authorRené 'Necoro' Neumann <necoro@necoro.net>2008-03-04 21:08:28 +0100
committerRené 'Necoro' Neumann <necoro@necoro.net>2008-03-04 21:08:28 +0100
commitda80e4fcaaa9bbeac8df8bbd548391b3d38cbfbe (patch)
treee8f587adf7583fd2c2a6a944c61b171046d526cf /portato/dependency.py
parente505874effd968d77d9675a6dcfa63ce1c3b1e35 (diff)
downloadportato-da80e4fcaaa9bbeac8df8bbd548391b3d38cbfbe.tar.gz
portato-da80e4fcaaa9bbeac8df8bbd548391b3d38cbfbe.tar.bz2
portato-da80e4fcaaa9bbeac8df8bbd548391b3d38cbfbe.zip
No more dict-hackery for the dependencies
Diffstat (limited to 'portato/dependency.py')
-rw-r--r--portato/dependency.py151
1 files changed, 151 insertions, 0 deletions
diff --git a/portato/dependency.py b/portato/dependency.py
new file mode 100644
index 0000000..718906f
--- /dev/null
+++ b/portato/dependency.py
@@ -0,0 +1,151 @@
+# -*- coding: utf-8 -*-
+#
+# File: portato/dependency.py
+# This file is part of the Portato-Project, a graphical portage-frontend.
+#
+# Copyright (C) 2008 René 'Necoro' Neumann
+# This is free software. You may redistribute copies of it under the terms of
+# the GNU General Public License version 2.
+# There is NO WARRANTY, to the extent permitted by law.
+#
+# Written by René 'Necoro' Neumann <necoro@necoro.net>
+
+from __future__ import absolute_import, with_statement
+
+from .helper import debug
+
+"""
+Provides classes for the presentation of dependencies.
+"""
+__docformat__ = "restructuredtext"
+
+class Dependency (object):
+
+ """
+ A simple dependency as it also is noted inside ebuilds.
+
+ :IVariables:
+
+ dep : string
+ The dependency string. It is immutable.
+ """
+
+ def __init__ (self, dep):
+ """
+ Creates a dependency out of a dep string.
+
+ :param dep: dependency string
+ :type dep: string
+ """
+ self.__dep = dep
+
+ def __cmp__ (self, b):
+ return cmp(self.dep, b.dep)
+
+ def __hash__ (self):
+ return hash(self.dep)
+
+ def __str__ (self):
+ return "<Dependency '%s'>" % self.dep
+
+ __repr__ = __str__
+
+ def __get_dep (self):
+ return self.__dep
+
+ dep = property(__get_dep)
+
+class OrDependency (Dependency):
+
+ """
+ Dependency representing an "or".
+
+ :note: Order is important. ``|| ( a b )`` != ``|| ( b a )``
+
+ :IVariables:
+
+ dep : tuple(string,...)
+ The dependency strings. The tuple and the strings are immutable.
+ """
+
+ def __init__ (self, deps):
+ """
+ Creates an or-dependency out of a list (or tuple) of deps.
+
+ :param deps: The or'ed dependencies.
+ :type deps: iter<string>
+ """
+
+ self.__dep = tuple(Dependency(dep) for dep in deps)
+
+ def __str__ (self):
+ return "<|| %s>" % str(self.dep)
+
+ __repr__ = __str__
+
+class DependencyTree (object):
+
+ """
+ The DependencyTree shows all dependencies for a package and shows which useflags want which dependencies.
+
+ :IVariables:
+
+ deps : set(`Dependency`)
+ The list of dependencies which are not dependent on a useflag.
+
+ flags : dict(string -> `DependencyTree`)
+ Holds the additional dependency trees per useflag.
+ """
+
+ def __init__ (self):
+
+ self.deps = set()
+ self.flags = {}
+
+ def add (self, dep, *moredeps):
+ """
+ Adds one or more normal dependencies to the tree.
+
+ :Parameters:
+
+ dep : string
+ A dependency string.
+
+ moredeps
+ More parameters are allowed :)
+ """
+ self.deps.add(Dependency(dep))
+
+ for dep in moredeps:
+ self.deps.add(Dependency(dep))
+
+ def add_or (self, orlist):
+ """
+ Adds a list of dependencies, which are or'ed.
+
+ :param orlist: the dependency list
+ :type orlist: iter<string>
+ """
+ self.deps.add(OrDependency(orlist))
+
+ def add_flag (self, flag):
+ """
+ Adds a new useflag to this tree.
+ For convenience the newly created sub-tree is returned.
+
+ :param flag: the new flag
+ :rtype: `DependencyTree`
+ """
+ if not flag in self.flags:
+ self.flags[flag] = DependencyTree()
+
+ return self.get_flag_tree(flag)
+
+ def get_flag_tree (self, flag):
+ """
+ Returns the sub-tree of a specific tree.
+
+ :raises KeyError: if the flag is not (yet) in this tree
+ :rtype: `DependencyTree`
+ """
+ return self.flags[flag]