diff options
Diffstat (limited to 'roverlay/portage/metadata/nodes.py')
-rw-r--r-- | roverlay/portage/metadata/nodes.py | 83 |
1 files changed, 78 insertions, 5 deletions
diff --git a/roverlay/portage/metadata/nodes.py b/roverlay/portage/metadata/nodes.py index 7c3b890..36bf22d 100644 --- a/roverlay/portage/metadata/nodes.py +++ b/roverlay/portage/metadata/nodes.py @@ -2,8 +2,7 @@ # Copyright 2006-2012 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 -# -- concrete metadata nodes -- - +# import abstract nodes from roverlay.portage.metadata.abstractnodes import \ MetadataNode, MetadataNodeNamedAccess, MetadataLeaf @@ -13,21 +12,60 @@ class MetadataRoot ( MetadataNodeNamedAccess ): Intended usage is metadata file creation. """ + # the common metadata.xml header HEADER = '\n'.join ( [ '<?xml version="1.0" encoding="UTF-8"?>', '<!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd">' ] ) + def __init__ ( self ): super ( MetadataRoot, self ) . __init__ ( 'pkgmetadata' ) self.priority = 0 + # --- end of __init__ (...) --- def empty ( self ): + """Returns True if this node has no child nodes.""" #return 0 == len ( self.nodes ) or \ # True in ( node.empty() for node in self.nodes ) return 0 == len ( self.nodes ) + # --- end of empty (...) --- + + def add_useflag ( self, flag_name, flag_description ): + """Adds a USE Flag to the metadata. + A UseFlagListNode 'use' will be created if required and a new UseFlagNode + will then be created an added to 'use'. + + arguments: + * flag_name -- see UseFlagNode.__init__ + * flag_description -- see UseFlagNode.__init__ + + returns: the created UseFlagNode for further editing + """ + if not self.has_named ( 'use' ): + # passing fail_if_existent, this node shouldn't be used in parallel + self.add ( + UseFlagListNode(), + with_dict_entry=True, fail_if_existent=True + ) + + node = self.get ( 'use' ) + use_node = UseFlagNode ( flag_name, flag_description ) + node.add ( use_node ) + + return use_node + # --- end of add_useflag (...) --- def write_file ( self, _file ): + """Writes the metadata to a file. + + arguments: + * _file -- either a File object or a string + + returns: success True/False + + raises: *passes IOError + """ to_write = self.to_str() own_fh = False @@ -62,7 +100,16 @@ class MetadataRoot ( MetadataNodeNamedAccess ): class DescriptionNode ( MetadataLeaf ): + """A description (<description.../>, <longdescription.../>) node.""" + def __init__ ( self, description, is_long=False, linewidth=None ): + """Initializes a DescriptionNode. + + arguments: + * description -- description text + * is_long -- if this is a longdescription or a description node + * linewidth -- max text line width, TODO/FIXME: is this ignored? + """ super ( DescriptionNode, self ) . __init__ ( 'longdescription' if is_long else 'description', value=description, @@ -73,11 +120,21 @@ class DescriptionNode ( MetadataLeaf ): self.linewidth = linewidth self.priority = 150 if is_long else 149 + # --- end of __init__ (...) --- + # using value formatting _value_str = MetadataLeaf._pretty_value_str + class UseFlagNode ( MetadataLeaf ): + """A USE Flag node, <flag name=x>this flag does...</flag>""" def __init__ ( self, flag_name, flag_description ): + """Initializes an USE Flag node. + + arguments: + * flag_name -- name of the use flag + * flag_description -- flag description + """ super ( UseFlagNode, self ) . __init__ ( 'flag', flags=dict ( name = flag_name ), @@ -85,12 +142,21 @@ class UseFlagNode ( MetadataLeaf ): ) # priority shouldn't be used for this node self.priority = -1 + # --- end of __init__ (...) --- class UseFlagListNode ( MetadataNode ): + """A USE Flag list node, <use>...</use>.""" + def __init__ ( self, flags=dict() ): + """Initializes an USE Flag list node. + + arguments: + * flags -- optional + """ super ( UseFlagListNode, self ) . __init__ ( 'use', flags=flags ) self.priority = 850 + # --- end of __init__ (...) --- def active ( self ): """The UseFlag list is only active if it is enabled and at least @@ -100,21 +166,28 @@ class UseFlagListNode ( MetadataNode ): # todo/fixme: could use super ( UseFlagListNode, self ).active() instead # of self._enabled return True in ( node.active() for node in self.nodes ) and self._enabled - + # --- end of active (...) --- def _sort_nodes ( self ): """UseFlags are sorted by lowercase flag name, not priority.""" self.nodes.sort ( key=lambda node : node.flags ['name'].lower() ) + # --- end of _sort_nodes (...) --- def add ( self, node ): + """Adds a child node only if it is a UseFlagNode. + + arguments: + * node -- + """ if isinstance ( node, UseFlagNode ): super ( UseFlagListNode, self ) . add ( node ) else: raise Exception ( "UseFlagListNode accepts UseFlagNodes only." ) - - + # --- end of add (...) --- class NopNode ( MetadataNode ): + """This node is meant for testing only.""" def __init__ ( self ): super ( NopNode, self ) . __init__ ( 'nop', flags=dict() ) + # --- end of __init__ (...) --- |