aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'roverlay/portage/metadata/nodes.py')
-rw-r--r--roverlay/portage/metadata/nodes.py83
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__ (...) ---