diff options
author | René 'Necoro' Neumann <necoro@necoro.net> | 2008-03-04 21:08:28 +0100 |
---|---|---|
committer | René 'Necoro' Neumann <necoro@necoro.net> | 2008-03-04 21:08:28 +0100 |
commit | da80e4fcaaa9bbeac8df8bbd548391b3d38cbfbe (patch) | |
tree | e8f587adf7583fd2c2a6a944c61b171046d526cf /portato/dependency.py | |
parent | e505874effd968d77d9675a6dcfa63ce1c3b1e35 (diff) | |
download | portato-da80e4fcaaa9bbeac8df8bbd548391b3d38cbfbe.tar.gz portato-da80e4fcaaa9bbeac8df8bbd548391b3d38cbfbe.tar.bz2 portato-da80e4fcaaa9bbeac8df8bbd548391b3d38cbfbe.zip |
No more dict-hackery for the dependencies
Diffstat (limited to '')
-rw-r--r-- | portato/dependency.py | 151 |
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] |