* [gentoo-commits] proj/R_overlay:master commit in: roverlay/interface/
@ 2013-07-03 10:05 André Erdmann
0 siblings, 0 replies; 12+ messages in thread
From: André Erdmann @ 2013-07-03 10:05 UTC (permalink / raw
To: gentoo-commits
commit: 0e181458fcfaf0bd1eaf993a47d09befa6d19fa6
Author: André Erdmann <dywi <AT> mailerd <DOT> de>
AuthorDate: Tue Jul 2 21:03:31 2013 +0000
Commit: André Erdmann <dywi <AT> mailerd <DOT> de>
CommitDate: Tue Jul 2 21:03:31 2013 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/R_overlay.git;a=commit;h=0e181458
roverlay/interface: access subsystems more easily
roverlay/interface provides abstraction layers for certain roverlay modules.
Currently, it supports dependency resolution only.
---
roverlay/interface/__init__.py | 0
roverlay/interface/depres.py | 249 +++++++++++++++++++++++++++++++++++++++++
roverlay/interface/generic.py | 75 +++++++++++++
roverlay/interface/root.py | 62 ++++++++++
4 files changed, 386 insertions(+)
diff --git a/roverlay/interface/__init__.py b/roverlay/interface/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/roverlay/interface/depres.py b/roverlay/interface/depres.py
new file mode 100644
index 0000000..d416312
--- /dev/null
+++ b/roverlay/interface/depres.py
@@ -0,0 +1,249 @@
+# R overlay --
+# -*- coding: utf-8 -*-
+# Copyright (C) 2013 André Erdmann <dywi@mailerd.de>
+# Distributed under the terms of the GNU General Public License;
+# either version 2 of the License, or (at your option) any later version.
+
+#import weakref
+
+import roverlay.interface.generic
+
+
+import roverlay.depres.channels
+import roverlay.depres.depresolver
+import roverlay.depres.deptype
+import roverlay.depres.simpledeprule.pool
+import roverlay.depres.simpledeprule.rules
+import roverlay.depres.simpledeprule.rulemaker
+
+DEFAULT_DEPTYPE = roverlay.depres.deptype.ALL
+
+class RuleSyntaxException ( Exception ):
+ pass
+
+class DepresInterface ( roverlay.interface.generic.RoverlaySubInterface ):
+
+ def __init__ ( self, parent_interface ):
+ super ( DepresInterface, self ).__init__ (
+ parent_interface=parent_interface
+ )
+
+ # set up the resolver
+ self._resolver = roverlay.depres.depresolver.DependencyResolver (
+ err_queue=self.err_queue
+ )
+ ## log everything
+ self._resolver.set_logmask ( -1 )
+ ## disable passing events to listeners
+ self._resolver.set_listenermask ( 0 )
+
+ # dependency rule pools (a set of rules) are organized in a FIFO
+ # structure that allows to create and delete new pools at runtime
+ self._poolstack = self._resolver.static_rule_pools
+ self._pool_id = -1
+
+ self._parser = roverlay.depres.simpledeprule.rulemaker.SimpleRuleMaker()
+ # --- end of __init__ (...) ---
+
+ @property
+ def resolver ( self ):
+ return self._resolver
+
+ @property
+ def parser ( self ):
+ return self._parser
+
+ @property
+ def poolstack ( self ):
+ return self._poolstack
+
+ @property
+ def pool_id ( self ):
+ return self._pool_id
+
+ def _update_resolver ( self ):
+ # sort() should be called on a per-pool basis
+ self._resolver._reset_unresolvable()
+ # --- end of _update_resolver (...) ---
+
+ def close ( self ):
+ super ( DepresInterface, self ).close()
+ self._resolver.close()
+ # --- end of close (...) ---
+
+ def update ( self ):
+ super ( DepresInterface, self ).update()
+ if self._poolstack:
+ self._poolstack[-1].sort()
+ self._update_resolver()
+ # --- end of update (...) ---
+
+ def has_pool ( self ):
+ return self._poolstack
+ # --- end of has_pool (...) ---
+
+ def has_nonempty_pool ( self ):
+ return self._poolstack and not self._poolstack[-1].empty()
+ # --- end of has_nonempty_pool (...) ---
+
+ def get_pool ( self ):
+ if self._poolstack:
+ return self._poolstack[-1]
+ else:
+ return self.get_new_pool ( force=True )
+ # --- end of get_pool (...) ---
+
+ def get_new_pool ( self, force=False, with_deptype=DEFAULT_DEPTYPE ):
+ if force or not self._poolstack or not self._poolstack[-1].empty():
+ self._pool_id += 1
+ try:
+ pool = roverlay.depres.simpledeprule.pool.SimpleDependencyRulePool (
+ "pool" + str ( self._pool_id ),
+ deptype_mask=DEFAULT_DEPTYPE
+ )
+ self.poolstack.append ( pool )
+ except:
+ self._pool_id -= 1
+ raise
+
+ self._update_resolver()
+ # -- end if force or ...
+ return self._poolstack[-1]
+ # --- end of get_new_pool (...) ---
+
+ def discard_pool ( self ):
+ try:
+ self._poolstack.pop()
+ self._pool_id -= 1
+ assert self._pool_id >= -1
+ return True
+ except AssertionError:
+ raise
+ except:
+ return False
+ # --- end of discard_pool (...) ---
+
+ def discard_pools ( self, count ):
+ for i in range ( count ):
+ if not self.discard_pool():
+ return i
+ else:
+ return count
+ # --- end of discard_pools (...) ---
+
+ def discard_empty_pools ( self ):
+ removed = 0
+ while self._poolstack and self._poolstack[-1].empty():
+ if self.discard_pool():
+ removed += 1
+ else:
+ raise AssertionError (
+ "discard_pool() should succeed if topmost pool exists."
+ )
+ return removed
+ # --- end of discard_empty_pools (...) ---
+
+ def load_rules_from_config ( self ):
+ return self.load_rule_files (
+ self.config.get_or_fail ( "DEPRES.simple_rules.files" )
+ )
+ # --- end of load_rules_from_config (...) ---
+
+ def load_rule_files ( self, files_or_dirs ):
+ return self._resolver.get_reader().read ( files_or_dirs )
+ # --- end of load_rule_files (...) ---
+
+ def add_rule ( self, rule_str ):
+ if not self._parser.add ( rule_str ):
+ raise RuleSyntaxException ( rule_str )
+ return True
+ # --- end of add_rule (...) ---
+
+ def add_rules ( self, *rule_str_list ):
+ for rule_str in rule_str_list:
+ self.add_rule ( rule_str )
+ return True
+ # --- end of add_rules (...) ---
+
+ def add_rule_list ( self, rule_str_list ):
+ for rule_str in rule_str_list:
+ self.add_rule ( rule_str )
+ return True
+ # --- end of add_rule_list (...) ---
+
+ def compile_rules ( self, new_pool=False ):
+ rules = self._parser.done()
+ destpool = self.get_new_pool() if new_pool else self.get_pool()
+
+ try:
+ # FIXME/COULDFIX: deptypes not supported here
+ for deptype, rule in rules:
+ destpool.rules.append ( rule )
+
+ if destpool.empty():
+ self.discard_empty_pools()
+ else:
+ destpool.sort()
+ self._update_resolver()
+ return True
+ except:
+ if new_pool:
+ # this could discard (previosly) empty pools, too
+ # (side-effect of "optimizations" in get_new_pool())
+ #
+ self.discard_pool()
+ raise
+ # --- end of compile_rules (...) ---
+
+ def add_immediate_rule ( self, rule_str ):
+ return self.add_rule ( rule_str ) and self.compile_rules()
+ # --- end of add_immediate_rule (...) ---
+
+ def visualize_pool ( self ):
+ if self._poolstack:
+ return '\n'.join (
+ '\n'.join ( rule.export_rule() )
+ for rule in self._poolstack[-1].rules
+ )
+ else:
+ return ""
+ # --- end of visualize_pool (...) ---
+
+ def get_channel ( self, channel_name="channel" ):
+ channel = roverlay.depres.channels.EbuildJobChannel (
+ err_queue=self.err_queue, name=channel_name
+ )
+ self._resolver.register_channel ( channel )
+ return channel
+ # --- end of get_channel (...) ---
+
+ def do_resolve ( self, deps, with_deptype=DEFAULT_DEPTYPE ):
+ channel = self.get_channel()
+ # FIXME/COULDFIX: once again, hardcoded deptype
+ try:
+ channel.add_dependencies ( deps, with_deptype )
+
+ channel_result = channel.satisfy_request (
+ close_if_unresolvable=False,
+ preserve_order=True
+ )
+ finally:
+ channel.close()
+
+ return channel_result
+ # --- end of do_resolve (...) ---
+
+ def resolve ( self, *deps, **kw ):
+ result = self.do_resolve ( deps, **kw )
+ return None if result is None else result [0]
+ # --- end of resolve (...) ---
+
+ def can_resolve ( self, *deps, **kw ):
+ return self.do_resolve ( deps, **kw ) is not None
+ # --- end of can_resolve (...) ---
+
+ def cannot_resolve ( self, *deps, **kw ):
+ return self.do_resolve ( deps, **kw ) is None
+ # --- end of cannot_resolve (...) ---
+
+# --- end of DepresInterface ---
diff --git a/roverlay/interface/generic.py b/roverlay/interface/generic.py
new file mode 100644
index 0000000..08806ea
--- /dev/null
+++ b/roverlay/interface/generic.py
@@ -0,0 +1,75 @@
+# R overlay --
+# -*- coding: utf-8 -*-
+# Copyright (C) 2013 André Erdmann <dywi@mailerd.de>
+# Distributed under the terms of the GNU General Public License;
+# either version 2 of the License, or (at your option) any later version.
+
+#import weakref
+
+class RoverlayInterface ( object ):
+
+ def __init__ ( self ):
+ super ( RoverlayInterface, self ).__init__()
+ self._interfaces = dict()
+ # --- end of __init__ (...) ---
+
+ def close_interfaces ( self ):
+ if hasattr ( self, '_interfaces' ):
+ for iface in self._interfaces.values():
+ iface.close()
+ # --- end of close_interfaces (...) ---
+
+ def close ( self ):
+ self.close_interfaces()
+ # --- end of close (...) ---
+
+ def update ( self ):
+ pass
+ # --- end of update (...) ---
+
+ def attach_interface ( self, name, interface, close_detached=True ):
+ if name in self._interfaces:
+ self.detach ( name, close=close_detached )
+
+ self._interfaces [name] = interface
+ return interface
+ # --- end of attach_interface (...) ---
+
+ def detach_interface ( self, name, close=False ):
+ detached = self._interfaces [name]
+ if close:
+ detached.close()
+ return True
+ else:
+ return detached
+ # --- end of detach_interface (...) ---
+
+ def get_interface ( self, name ):
+ return self._interfaces [name]
+ # --- end of get_interface (...) ---
+
+ def has_interface ( self, name ):
+ return name and name in self._interfaces
+ # --- end of has_interface (...) ---
+
+ def __getattr__ ( self, name ):
+ if name [-10:] == '_interface':
+ iface_name = name [:-10]
+ if iface_name and iface_name in self._interfaces:
+ return self._interfaces [iface_name]
+
+ raise AttributeError ( name )
+ # --- end of __getattr__ (...) ---
+
+# --- end of RoverlayInterface ---
+
+class RoverlaySubInterface ( RoverlayInterface ):
+
+ def __init__ ( self, parent_interface ):
+ super ( RoverlaySubInterface, self ).__init__()
+ # weakref? (would require to explicitly keep "parent" instances around)
+ self.parent = parent_interface
+ self.err_queue = parent_interface.err_queue
+ self.config = parent_interface.config
+ self.logger = parent_interface.logger
+ # --- end of __init__ (...) ---
diff --git a/roverlay/interface/root.py b/roverlay/interface/root.py
new file mode 100644
index 0000000..d500582
--- /dev/null
+++ b/roverlay/interface/root.py
@@ -0,0 +1,62 @@
+# R overlay --
+# -*- coding: utf-8 -*-
+# Copyright (C) 2013 André Erdmann <dywi@mailerd.de>
+# Distributed under the terms of the GNU General Public License;
+# either version 2 of the License, or (at your option) any later version.
+
+import logging
+
+import roverlay
+import roverlay.errorqueue
+
+import roverlay.interface.generic
+
+# does nothing if already initialized
+roverlay.setup_initial_logger()
+
+class RootInterface ( roverlay.interface.generic.RoverlayInterface ):
+
+ SPAWN_MAP = dict()
+
+ @classmethod
+ def register_interface ( my_cls, name, cls, force=False ):
+ if name and ( force or name not in my_cls.SPAWN_MAP ):
+ my_cls.SPAWN_MAP [name] = cls
+ return True
+ else:
+ return False
+ # --- end of register_interface (...) ---
+
+ def __init__ ( self,
+ config_file=None, config=None, additional_config=None
+ ):
+ super ( RootInterface, self ).__init__()
+ self.parent = None
+ self.err_queue = roverlay.errorqueue.ErrorQueue()
+
+ if config is not None:
+ self.config = config
+ elif config_file is not None:
+ self.config = roverlay.load_config_file (
+ config_file, extraconf=additional_config
+ )
+ else:
+ raise Exception ( "config, config_file?" )
+
+ self.logger = logging.getLogger ( self.__class__.__name__ )
+ # --- end of __init__ (...) ---
+
+ def spawn_interface ( self, name ):
+ if self.has_interface ( name ):
+ return self.get_interface ( name )
+ else:
+ iface_cls = self.SPAWN_MAP.get ( name, None )
+ if iface_cls is None:
+ raise Exception (
+ "unknown interface identifier {!r}".format ( name )
+ )
+ else:
+ return self.attach_interface (
+ name, iface_cls ( parent_interface=self )
+ )
+ # --- end of spawn_interface (...) ---
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [gentoo-commits] proj/R_overlay:master commit in: roverlay/interface/
@ 2013-07-16 16:36 André Erdmann
0 siblings, 0 replies; 12+ messages in thread
From: André Erdmann @ 2013-07-16 16:36 UTC (permalink / raw
To: gentoo-commits
commit: 07451ee1180548e6ed961142fb512a368a107e04
Author: André Erdmann <dywi <AT> mailerd <DOT> de>
AuthorDate: Tue Jul 16 16:35:29 2013 +0000
Commit: André Erdmann <dywi <AT> mailerd <DOT> de>
CommitDate: Tue Jul 16 16:35:29 2013 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/R_overlay.git;a=commit;h=07451ee1
roverlay/interface: in-code documentation
---
roverlay/interface/depres.py | 186 +++++++++++++++++++++++++++++++++++++++++-
roverlay/interface/generic.py | 68 +++++++++++++++
roverlay/interface/root.py | 50 ++++++++++++
3 files changed, 303 insertions(+), 1 deletion(-)
diff --git a/roverlay/interface/depres.py b/roverlay/interface/depres.py
index e16363c..181243f 100644
--- a/roverlay/interface/depres.py
+++ b/roverlay/interface/depres.py
@@ -1,4 +1,4 @@
-# R overlay --
+# R overlay -- dependency resolution interface
# -*- coding: utf-8 -*-
# Copyright (C) 2013 André Erdmann <dywi@mailerd.de>
# Distributed under the terms of the GNU General Public License;
@@ -22,8 +22,28 @@ class RuleSyntaxException ( Exception ):
pass
class DepresInterface ( roverlay.interface.generic.RoverlaySubInterface ):
+ """Interface to dependency resolution.
+
+ This class provides:
+
+ * rule creation (from text/text files)
+ * manage dependency rule pools (stack-like discard_pool()/get_new_pool())
+ * resolve dependencies:
+ -> do_resolve(<deps>) for "raw" depres results
+ -> resolve(<deps>) for generic purpose results (list of resolved deps)
+ -> can_resolve(<deps>)/cannot_resolve(<deps>) for checking whether a
+ dependency string can(not) be resolved
+
+ Note that this interface relies on a parent interface (RootInterface).
+ """
def __init__ ( self, parent_interface ):
+ """Initializes the depdency resolution interface.
+
+ arguments:
+ * parent_interface -- parent interface that provides shared functionality
+ like logging and config
+ """
super ( DepresInterface, self ).__init__ (
parent_interface=parent_interface
)
@@ -47,32 +67,49 @@ class DepresInterface ( roverlay.interface.generic.RoverlaySubInterface ):
@property
def resolver ( self ):
+ """direct access to the resolver"""
return self._resolver
@property
def parser ( self ):
+ """direct access to the rule parser"""
return self._parser
@property
def poolstack ( self ):
+ """direct access to the dependency rule pool stack"""
return self._poolstack
@property
def pool_id ( self ):
+ """Index of the topmost rule pool (-1 if no rule pool active)"""
return self._pool_id
def _update_resolver ( self ):
+ """Updates the resolver.
+
+ Returns: None (implicit)
+ """
# sort() should be called on a per-pool basis
self._resolver._reset_unresolvable()
# --- end of _update_resolver (...) ---
def close ( self ):
+ """Closes the dependency resolver and all subinterfaces.
+
+ Returns: self
+ """
super ( DepresInterface, self ).close()
self._resolver.close()
return self
# --- end of close (...) ---
def update ( self ):
+ """Updates this interface, i.e. performs a "soft"-reload of the
+ resolver and sorts the topmost rule pool.
+
+ Returns: self
+ """
super ( DepresInterface, self ).update()
if self._poolstack:
self._poolstack[-1].sort()
@@ -81,18 +118,32 @@ class DepresInterface ( roverlay.interface.generic.RoverlaySubInterface ):
# --- end of update (...) ---
def fixup_pool_id ( self ):
+ """Resets the pool id.
+
+ Does not need to be called manually.
+
+ Returns: None (implicit)
+ """
self._pool_id = len ( self._poolstack ) - 1
# --- end of fixup_pool_id (...) ---
def has_pool ( self ):
+ """
+ Returns True if this interface has at least one rule pool, else False.
+ """
return self._poolstack
# --- end of has_pool (...) ---
def has_nonempty_pool ( self ):
+ """
+ Returns True if the topmost rule pool of this interface exists
+ and is not empty.
+ """
return self._poolstack and not self._poolstack[-1].empty()
# --- end of has_nonempty_pool (...) ---
def get_pool ( self ):
+ """Returns the topmost rule pool. Creates one if necessary."""
if self._poolstack:
return self._poolstack[-1]
else:
@@ -100,6 +151,13 @@ class DepresInterface ( roverlay.interface.generic.RoverlaySubInterface ):
# --- end of get_pool (...) ---
def get_new_pool ( self, force=False, with_deptype=DEFAULT_DEPTYPE ):
+ """Creates a new pool, adds it to the pool stack and returns it.
+
+ arguments:
+ * force -- if True: force creation of a new pool even if the
+ current one is empty
+ * with_deptype -- dependency type of the new pool (optional)
+ """
if force or not self._poolstack or not self._poolstack[-1].empty():
self._pool_id += 1
try:
@@ -118,6 +176,10 @@ class DepresInterface ( roverlay.interface.generic.RoverlaySubInterface ):
# --- end of get_new_pool (...) ---
def discard_pool ( self ):
+ """Discards the topmost rule pool.
+
+ Returns: True if a pool has been removed, else False.
+ """
try:
self._poolstack.pop()
self._pool_id -= 1
@@ -130,6 +192,13 @@ class DepresInterface ( roverlay.interface.generic.RoverlaySubInterface ):
# --- end of discard_pool (...) ---
def discard_pools ( self, count ):
+ """Discards up to <count> rule pools.
+
+ arguments:
+ * count -- number of rule pool to remove
+
+ Returns: number of rule pool that have been removed (<= count)
+ """
for i in range ( count ):
if not self.discard_pool():
return i
@@ -138,6 +207,10 @@ class DepresInterface ( roverlay.interface.generic.RoverlaySubInterface ):
# --- end of discard_pools (...) ---
def discard_all_pools ( self ):
+ """Discards all rule pools.
+
+ Returns: number of removed rule pools
+ """
i = 0
while self.discard_pool():
i += 1
@@ -145,6 +218,10 @@ class DepresInterface ( roverlay.interface.generic.RoverlaySubInterface ):
# --- end of discard_all_pools (...) ---
def discard_empty_pools ( self ):
+ """Discards rule pools until the topmost one is not empty.
+
+ Returns: number of removed rule pools
+ """
removed = 0
while self._poolstack and self._poolstack[-1].empty():
if self.discard_pool():
@@ -157,6 +234,14 @@ class DepresInterface ( roverlay.interface.generic.RoverlaySubInterface ):
# --- end of discard_empty_pools (...) ---
def load_rules_from_config ( self, ignore_missing=False ):
+ """Loads all configured rule files into a new pool (or new pools).
+
+ arguments:
+ * ignore_missing -- if True: do not raise an Exception if
+ SIMPLE_RULE_FILE is not set in the config
+
+ Returns: True if rule files have been loaded, else False.
+ """
if ignore_missing:
rule_files = self.config.get ( "DEPRES.simple_rules.files", None )
if rule_files:
@@ -170,30 +255,70 @@ class DepresInterface ( roverlay.interface.generic.RoverlaySubInterface ):
# --- end of load_rules_from_config (...) ---
def load_rule_files ( self, files_or_dirs ):
+ """Loads the given files into a new rule pool (or new pools).
+
+ Returns: True on success, else False
+ """
ret = self._resolver.get_reader().read ( files_or_dirs )
self.fixup_pool_id()
return ret
# --- end of load_rule_files (...) ---
def add_rule ( self, rule_str ):
+ """Sends a text line to the rule parser.
+
+ arguments:
+ * rule_str -- text line
+
+ Returns: True
+
+ Raises: RuleSyntaxException if rule_str cannot be parsed
+
+ Note: rules have to be compiled via compile_rules() after adding
+ text lines
+ """
if not self._parser.add ( rule_str ):
raise RuleSyntaxException ( rule_str )
return True
# --- end of add_rule (...) ---
def add_rules ( self, *rule_str_list ):
+ """Sends several text lines to the rule parser.
+ See add_rule() for details.
+
+ arguments:
+ * *rule_str_list --
+
+ Returns: True
+ """
for rule_str in rule_str_list:
self.add_rule ( rule_str )
return True
# --- end of add_rules (...) ---
def add_rule_list ( self, rule_str_list ):
+ """Like add_rules(), but accepts a single list-like arg.
+ See add_rule()/add_rules() for details.
+
+ arguments:
+ * rule_str_list --
+
+ Returns: True
+ """
for rule_str in rule_str_list:
self.add_rule ( rule_str )
return True
# --- end of add_rule_list (...) ---
def compile_rules ( self, new_pool=False ):
+ """Tells the rule parser to 'compile' rules. This converts the text
+ input into dependency rule objects, which are then added to a rule pool.
+
+ arguments:
+ * new_pool -- create a new pool for the compiled rules
+
+ Returns: True
+ """
rules = self._parser.done()
destpool = self.get_new_pool() if new_pool else self.get_pool()
@@ -218,10 +343,24 @@ class DepresInterface ( roverlay.interface.generic.RoverlaySubInterface ):
# --- end of compile_rules (...) ---
def add_immediate_rule ( self, rule_str ):
+ """Directly adds a single rule (given in rule file syntax form) to
+ the topmost rule pool.
+
+ arguments:
+ * rule_str -- text line
+
+ Note: this method calls compile_rules(), which creates rule objects
+ for all text lines added so far.
+
+ Returns: True
+ """
return self.add_rule ( rule_str ) and self.compile_rules()
# --- end of add_immediate_rule (...) ---
def visualize_pool ( self ):
+ """Visualizes the topmost rule pool. This returns a string that contains
+ all rules of this pool in text form (in rule file syntax).
+ """
if self._poolstack:
return '\n'.join (
'\n'.join ( rule.export_rule() )
@@ -232,6 +371,15 @@ class DepresInterface ( roverlay.interface.generic.RoverlaySubInterface ):
# --- end of visualize_pool (...) ---
def get_channel ( self, channel_name="channel" ):
+ """Creates, registers and returns an EbuildJobChannel suitable for
+ dependency resolution.
+
+ Note: This doesn't need to be called manually in order to resolve
+ dependencies.
+
+ arguments:
+ * channel_name -- name of the channel (defaults to "channel")
+ """
channel = roverlay.depres.channels.EbuildJobChannel (
err_queue=self.err_queue, name=channel_name
)
@@ -240,6 +388,17 @@ class DepresInterface ( roverlay.interface.generic.RoverlaySubInterface ):
# --- end of get_channel (...) ---
def do_resolve ( self, deps, with_deptype=DEFAULT_DEPTYPE ):
+ """Performs dependency resolution for the given dependency list and
+ returns the result, which is None (=not resolved) or a 2-tuple
+ (<resolved deps>, <unresolvable, but optional deps>).
+
+ Note: use resolve() for resolving dependencies unless the 2-tuple
+ result form is desired.
+
+ arguments:
+ * deps -- dependency string list
+ * with_deptype -- dependency type (optional, defaults to DEFAULT_DEPTYPE)
+ """
channel = self.get_channel()
# FIXME/COULDFIX: once again, hardcoded deptype
try:
@@ -256,15 +415,40 @@ class DepresInterface ( roverlay.interface.generic.RoverlaySubInterface ):
# --- end of do_resolve (...) ---
def resolve ( self, *deps, **kw ):
+ """Like do_resolve(), but accepts the dependency string list in var-args
+ form and returns None (=not resolved) or a list of resolved dependencies.
+
+ arguments:
+ * *deps -- list of dependency strings
+ * **kw -- passed to do_resolve()
+ """
result = self.do_resolve ( deps, **kw )
+ # result := ( list<resolved>, list<unresolvable> )
return None if result is None else result [0]
# --- end of resolve (...) ---
def can_resolve ( self, *deps, **kw ):
+ """Like resolve(), but simply returns True if all dependencies could
+ be resolved.
+
+ Technically, returns True IFF all mandatory dependencies could be
+ resolved.
+
+ arguments:
+ * *deps --
+ * **kw --
+ """
return self.do_resolve ( deps, **kw ) is not None
# --- end of can_resolve (...) ---
def cannot_resolve ( self, *deps, **kw ):
+ """Like can_resolve(), but returns True if at least one (mandatory)
+ dependency could not be resolved.
+
+ arguments:
+ * *deps --
+ * **kw --
+ """
return self.do_resolve ( deps, **kw ) is None
# --- end of cannot_resolve (...) ---
diff --git a/roverlay/interface/generic.py b/roverlay/interface/generic.py
index c6678f3..b86cc31 100644
--- a/roverlay/interface/generic.py
+++ b/roverlay/interface/generic.py
@@ -7,28 +7,53 @@
#import weakref
class RoverlayInterface ( object ):
+ """Base class for roverlay interfaces.
+ Provides functionality for attaching/detaching subinterfaces.
+ """
def __init__ ( self ):
+ """Initializes this interfaces."""
super ( RoverlayInterface, self ).__init__()
self._interfaces = dict()
# --- end of __init__ (...) ---
def close_interfaces ( self ):
+ """Closes all subinterfaces."""
if hasattr ( self, '_interfaces' ):
for iface in self._interfaces.values():
iface.close()
# --- end of close_interfaces (...) ---
def close ( self ):
+ """Closes this interfaces and all of its subinterfaces.
+
+ Returns: self
+ """
self.close_interfaces()
return self
# --- end of close (...) ---
def update ( self ):
+ """Updates this interface.
+
+ Does nothing. Derived classes may implement it.
+
+ Returns: self
+ """
return self
# --- end of update (...) ---
def attach_interface ( self, name, interface, close_detached=True ):
+ """Adds a subinterface.
+
+ arguments:
+ * name -- name of the interface
+ * interface -- interface object to add
+ * close_detached -- if an interface with the same name has been replaced
+ by the new one: close it if True
+
+ Returns: added interface
+ """
if name in self._interfaces:
self.detach ( name, close=close_detached )
@@ -37,6 +62,14 @@ class RoverlayInterface ( object ):
# --- end of attach_interface (...) ---
def detach_interface ( self, name, close=False ):
+ """Detaches an interface.
+
+ arguments:
+ * name -- name of the interface
+ * close -- close interface after detaching it
+
+ Returns: detached interface if close is False, else True
+ """
detached = self._interfaces [name]
del self._interfaces [name]
if close:
@@ -47,14 +80,40 @@ class RoverlayInterface ( object ):
# --- end of detach_interface (...) ---
def get_interface ( self, name ):
+ """Provides access to a subinterface by name.
+
+ arguments:
+ * name -- name of the interface
+
+ Returns: interface (object)
+
+ Raises: KeyError if interface does not exist
+ """
return self._interfaces [name]
# --- end of get_interface (...) ---
def has_interface ( self, name ):
+ """Returns True if a subinterface with the given name exists, else False.
+
+ arguments:
+ * name -- name of the interface
+ """
return name and name in self._interfaces
# --- end of has_interface (...) ---
def __getattr__ ( self, name ):
+ """ Provides alternative access to subinterfaces via
+ <self>.<subinterface name>_interface
+
+ arguments:
+ * name -- attribute name
+
+ Returns: interface if name ends with '_interface'
+
+ Raises: KeyError if name ends with '_interface' and the referenced
+ interface does not exist
+ """
+
if name [-10:] == '_interface':
iface_name = name [:-10]
if iface_name and iface_name in self._interfaces:
@@ -66,8 +125,17 @@ class RoverlayInterface ( object ):
# --- end of RoverlayInterface ---
class RoverlaySubInterface ( RoverlayInterface ):
+ """Base class derived from RoverlayInterface for interfaces that have
+ a parent interface.
+ """
def __init__ ( self, parent_interface ):
+ """Initializes the subinterface. Creates references to shared objects
+ like logger and config as well as a ref to the parent interface.
+
+ arguments:
+ * parent_interface --
+ """
super ( RoverlaySubInterface, self ).__init__()
# weakref? (would require to explicitly keep "parent" instances around)
self.parent = parent_interface
diff --git a/roverlay/interface/root.py b/roverlay/interface/root.py
index a4d287c..c571eea 100644
--- a/roverlay/interface/root.py
+++ b/roverlay/interface/root.py
@@ -16,11 +16,26 @@ import roverlay.interface.generic
roverlay.setup_initial_logger()
class RootInterface ( roverlay.interface.generic.RoverlayInterface ):
+ """Root interfaces for accessing roverlay interfaces.
+ See MainInterface for a root interface with delayed initialization.
+ """
+
+ # class-wide map ( <interface name> => <interface class> )
+ # for creating/"spawning" subinterfaces
+ #
SPAWN_MAP = dict()
@classmethod
def register_interface ( my_cls, name, cls, force=False ):
+ """Registers a subinterface with the root interface.
+
+ arguments:
+ * name -- name of the interface, e.g. "depres"
+ * cls -- interface class
+ * force -- if True: overwrite existing entries for name
+ Defaults to False.
+ """
if name and ( force or name not in my_cls.SPAWN_MAP ):
my_cls.SPAWN_MAP [name] = cls
return True
@@ -31,6 +46,19 @@ class RootInterface ( roverlay.interface.generic.RoverlayInterface ):
def __init__ ( self,
config_file=None, config=None, additional_config=None, is_installed=None
):
+ """Initializes the root interface:
+ * loads the config
+ * creates shared objects like logger and error queue
+ * calls roverlay.hook.setup()
+
+ arguments:
+ * config_file -- path to the config file
+ * config -- config tree or None
+ takes precedence over config_file
+ * additional_config -- when loading the config file: extra config dict
+ * is_installed -- whether roverlay has been installed or not
+ Defaults to None.
+ """
super ( RootInterface, self ).__init__()
self.parent = None
self.err_queue = roverlay.errorqueue.ErrorQueue()
@@ -66,10 +94,25 @@ class RootInterface ( roverlay.interface.generic.RoverlayInterface ):
# --- end of __init__ (...) ---
def set_installed ( self, status=True ):
+ """Marks roverlay as installed/not installed.
+
+ arguments:
+ * status -- installation status bool (defaults to True)
+
+ Returns: None (implicit)
+ """
self.config.merge_with ( { 'installed': bool ( status ), } )
# --- end of set_installed (...) ---
def spawn_interface ( self, name ):
+ """Spawns an registered subinterface.
+ (Creates it if necessary, else uses the existing one.)
+
+ arguments:
+ * name -- name of the interface, e.g. "depres"
+
+ Returns: subinterface
+ """
if self.has_interface ( name ):
return self.get_interface ( name )
else:
@@ -85,5 +128,12 @@ class RootInterface ( roverlay.interface.generic.RoverlayInterface ):
# --- end of spawn_interface (...) ---
def run_hook ( self, phase ):
+ """Triggers a hook event.
+
+ arguments:
+ * phase -- event, e.g. "overlay_success" or "user"
+
+ Returns: success (True/False)
+ """
return roverlay.hook.run ( phase, catch_failure=False )
# --- end of run_hook (...) ---
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [gentoo-commits] proj/R_overlay:gsoc13/next commit in: roverlay/interface/
2013-07-23 7:51 [gentoo-commits] proj/R_overlay:master commit in: roverlay/interface/ André Erdmann
@ 2013-07-19 18:00 ` André Erdmann
0 siblings, 0 replies; 12+ messages in thread
From: André Erdmann @ 2013-07-19 18:00 UTC (permalink / raw
To: gentoo-commits
commit: 8735cde4882262112c7adf46b1e55a390d920e28
Author: André Erdmann <dywi <AT> mailerd <DOT> de>
AuthorDate: Fri Jul 19 17:44:54 2013 +0000
Commit: André Erdmann <dywi <AT> mailerd <DOT> de>
CommitDate: Fri Jul 19 17:44:54 2013 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/R_overlay.git;a=commit;h=8735cde4
depres interface: visualize pools, ignore_missing
---
roverlay/interface/depres.py | 70 +++++++++++++++++++++++++++++++++++++-------
1 file changed, 60 insertions(+), 10 deletions(-)
diff --git a/roverlay/interface/depres.py b/roverlay/interface/depres.py
index 6e79bc5..ad292de 100644
--- a/roverlay/interface/depres.py
+++ b/roverlay/interface/depres.py
@@ -6,6 +6,8 @@
#import weakref
+import errno
+
import roverlay.interface.generic
@@ -245,6 +247,7 @@ class DepresInterface ( roverlay.interface.generic.RoverlaySubInterface ):
if ignore_missing:
rule_files = self.config.get ( "DEPRES.simple_rules.files", None )
if rule_files:
+ ##return self.load_rule_files ( rule_files, ignore_missing=True )
return self.load_rule_files ( rule_files )
else:
return False
@@ -254,12 +257,26 @@ class DepresInterface ( roverlay.interface.generic.RoverlaySubInterface ):
)
# --- end of load_rules_from_config (...) ---
- def load_rule_files ( self, files_or_dirs ):
+ def load_rule_files ( self, files_or_dirs, ignore_missing=False ):
"""Loads the given files into a new rule pool (or new pools).
+ arguments:
+ * ignore_missing -- suppress exceptions caused by missing files and
+ return False
+
Returns: True on success, else False
"""
- ret = self._resolver.get_reader().read ( files_or_dirs )
+ if ignore_missing:
+ try:
+ ret = self._resolver.get_reader().read ( files_or_dirs )
+ except IOError as ioerr:
+ if ioerr.errno == errno.ENOENT:
+ ret = False
+ else:
+ raise
+ else:
+ ret = self._resolver.get_reader().read ( files_or_dirs )
+
self.fixup_pool_id()
return True if ret is None else ret
# --- end of load_rule_files (...) ---
@@ -311,6 +328,13 @@ class DepresInterface ( roverlay.interface.generic.RoverlaySubInterface ):
# --- end of add_rule_list (...) ---
def try_compile_rules ( self, *args, **kwargs ):
+ """Tells the rule parser to 'compile' rules. Does nothing if the
+ rule parser has any active context (e.g. is inside a multi line rule).
+ See compile_rules() for details.
+
+ Returns: False if rule compiling has been suppressed du to active
+ context, else True (=rules compiled)
+ """
if self._parser.has_context():
return False
else:
@@ -364,18 +388,44 @@ class DepresInterface ( roverlay.interface.generic.RoverlaySubInterface ):
return self.add_rule ( rule_str ) and self.compile_rules()
# --- end of add_immediate_rule (...) ---
- def visualize_pool ( self ):
- """Visualizes the topmost rule pool. This returns a string that contains
- all rules of this pool in text form (in rule file syntax).
+ def visualize_pool ( self, pool_id=None ):
+ """Visualizes the topmost rule pool (or the specified one).
+ his returns a string that contains all rules of this pool
+ in text form (in rule file syntax).
+
+ arguments:
+ * pool_id -- index of the pool that should be visualized
+ Defaults to 0 (-> use topmost pool).
+
+ Returns:
+ visualized pool (str) if requested pool existed, else empty string
"""
- if self._poolstack:
+ try:
+ pool = self._poolstack [ -1 if pool_id is None else pool_id ]
+ except IndexError:
+ return ""
+ else:
+ return '\n'.join ( pool.export_rules() )
+ # --- end of visualize_pool (...) ---
+
+ def visualize_pools ( self, id_range=None ):
+ """Visualize multiple pools at once.
+
+ arguments:
+ * id_range -- an iterable of indexes or None (-> visualize all)
+ Defaults to None.
+
+ Returns: visualized pools (str)
+ """
+ if id_range is None:
return '\n'.join (
- '\n'.join ( rule.export_rule() )
- for rule in self._poolstack[-1].rules
+ '\n'.join ( pool.export_rules() ) for pool in self._poolstack
)
else:
- return ""
- # --- end of visualize_pool (...) ---
+ return '\n'.join (
+ self.visualize_pool ( pool_id ) for pool_id in id_range
+ )
+ # --- end of visualize_pools (...) ---
def get_channel ( self, channel_name="channel" ):
"""Creates, registers and returns an EbuildJobChannel suitable for
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [gentoo-commits] proj/R_overlay:master commit in: roverlay/interface/
2013-07-18 19:25 [gentoo-commits] proj/R_overlay:gsoc13/next " André Erdmann
@ 2013-07-23 7:51 ` André Erdmann
0 siblings, 0 replies; 12+ messages in thread
From: André Erdmann @ 2013-07-23 7:51 UTC (permalink / raw
To: gentoo-commits
commit: 9929b385114c5bb3b06b446a8b8644dcf4e9695e
Author: André Erdmann <dywi <AT> mailerd <DOT> de>
AuthorDate: Thu Jul 18 19:21:39 2013 +0000
Commit: André Erdmann <dywi <AT> mailerd <DOT> de>
CommitDate: Thu Jul 18 19:21:39 2013 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/R_overlay.git;a=commit;h=9929b385
roverlay/interface/depres: try_compile_rules()
---
roverlay/interface/depres.py | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/roverlay/interface/depres.py b/roverlay/interface/depres.py
index 181243f..6e79bc5 100644
--- a/roverlay/interface/depres.py
+++ b/roverlay/interface/depres.py
@@ -261,7 +261,7 @@ class DepresInterface ( roverlay.interface.generic.RoverlaySubInterface ):
"""
ret = self._resolver.get_reader().read ( files_or_dirs )
self.fixup_pool_id()
- return ret
+ return True if ret is None else ret
# --- end of load_rule_files (...) ---
def add_rule ( self, rule_str ):
@@ -310,6 +310,13 @@ class DepresInterface ( roverlay.interface.generic.RoverlaySubInterface ):
return True
# --- end of add_rule_list (...) ---
+ def try_compile_rules ( self, *args, **kwargs ):
+ if self._parser.has_context():
+ return False
+ else:
+ return self.compile_rules()
+ # --- end of try_compile_rules (...) ---
+
def compile_rules ( self, new_pool=False ):
"""Tells the rule parser to 'compile' rules. This converts the text
input into dependency rule objects, which are then added to a rule pool.
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [gentoo-commits] proj/R_overlay:master commit in: roverlay/interface/
@ 2013-07-23 7:51 André Erdmann
2013-07-19 18:00 ` [gentoo-commits] proj/R_overlay:gsoc13/next " André Erdmann
0 siblings, 1 reply; 12+ messages in thread
From: André Erdmann @ 2013-07-23 7:51 UTC (permalink / raw
To: gentoo-commits
commit: 8735cde4882262112c7adf46b1e55a390d920e28
Author: André Erdmann <dywi <AT> mailerd <DOT> de>
AuthorDate: Fri Jul 19 17:44:54 2013 +0000
Commit: André Erdmann <dywi <AT> mailerd <DOT> de>
CommitDate: Fri Jul 19 17:44:54 2013 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/R_overlay.git;a=commit;h=8735cde4
depres interface: visualize pools, ignore_missing
---
roverlay/interface/depres.py | 70 +++++++++++++++++++++++++++++++++++++-------
1 file changed, 60 insertions(+), 10 deletions(-)
diff --git a/roverlay/interface/depres.py b/roverlay/interface/depres.py
index 6e79bc5..ad292de 100644
--- a/roverlay/interface/depres.py
+++ b/roverlay/interface/depres.py
@@ -6,6 +6,8 @@
#import weakref
+import errno
+
import roverlay.interface.generic
@@ -245,6 +247,7 @@ class DepresInterface ( roverlay.interface.generic.RoverlaySubInterface ):
if ignore_missing:
rule_files = self.config.get ( "DEPRES.simple_rules.files", None )
if rule_files:
+ ##return self.load_rule_files ( rule_files, ignore_missing=True )
return self.load_rule_files ( rule_files )
else:
return False
@@ -254,12 +257,26 @@ class DepresInterface ( roverlay.interface.generic.RoverlaySubInterface ):
)
# --- end of load_rules_from_config (...) ---
- def load_rule_files ( self, files_or_dirs ):
+ def load_rule_files ( self, files_or_dirs, ignore_missing=False ):
"""Loads the given files into a new rule pool (or new pools).
+ arguments:
+ * ignore_missing -- suppress exceptions caused by missing files and
+ return False
+
Returns: True on success, else False
"""
- ret = self._resolver.get_reader().read ( files_or_dirs )
+ if ignore_missing:
+ try:
+ ret = self._resolver.get_reader().read ( files_or_dirs )
+ except IOError as ioerr:
+ if ioerr.errno == errno.ENOENT:
+ ret = False
+ else:
+ raise
+ else:
+ ret = self._resolver.get_reader().read ( files_or_dirs )
+
self.fixup_pool_id()
return True if ret is None else ret
# --- end of load_rule_files (...) ---
@@ -311,6 +328,13 @@ class DepresInterface ( roverlay.interface.generic.RoverlaySubInterface ):
# --- end of add_rule_list (...) ---
def try_compile_rules ( self, *args, **kwargs ):
+ """Tells the rule parser to 'compile' rules. Does nothing if the
+ rule parser has any active context (e.g. is inside a multi line rule).
+ See compile_rules() for details.
+
+ Returns: False if rule compiling has been suppressed du to active
+ context, else True (=rules compiled)
+ """
if self._parser.has_context():
return False
else:
@@ -364,18 +388,44 @@ class DepresInterface ( roverlay.interface.generic.RoverlaySubInterface ):
return self.add_rule ( rule_str ) and self.compile_rules()
# --- end of add_immediate_rule (...) ---
- def visualize_pool ( self ):
- """Visualizes the topmost rule pool. This returns a string that contains
- all rules of this pool in text form (in rule file syntax).
+ def visualize_pool ( self, pool_id=None ):
+ """Visualizes the topmost rule pool (or the specified one).
+ his returns a string that contains all rules of this pool
+ in text form (in rule file syntax).
+
+ arguments:
+ * pool_id -- index of the pool that should be visualized
+ Defaults to 0 (-> use topmost pool).
+
+ Returns:
+ visualized pool (str) if requested pool existed, else empty string
"""
- if self._poolstack:
+ try:
+ pool = self._poolstack [ -1 if pool_id is None else pool_id ]
+ except IndexError:
+ return ""
+ else:
+ return '\n'.join ( pool.export_rules() )
+ # --- end of visualize_pool (...) ---
+
+ def visualize_pools ( self, id_range=None ):
+ """Visualize multiple pools at once.
+
+ arguments:
+ * id_range -- an iterable of indexes or None (-> visualize all)
+ Defaults to None.
+
+ Returns: visualized pools (str)
+ """
+ if id_range is None:
return '\n'.join (
- '\n'.join ( rule.export_rule() )
- for rule in self._poolstack[-1].rules
+ '\n'.join ( pool.export_rules() ) for pool in self._poolstack
)
else:
- return ""
- # --- end of visualize_pool (...) ---
+ return '\n'.join (
+ self.visualize_pool ( pool_id ) for pool_id in id_range
+ )
+ # --- end of visualize_pools (...) ---
def get_channel ( self, channel_name="channel" ):
"""Creates, registers and returns an EbuildJobChannel suitable for
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [gentoo-commits] proj/R_overlay:master commit in: roverlay/interface/
@ 2013-07-23 7:51 André Erdmann
0 siblings, 0 replies; 12+ messages in thread
From: André Erdmann @ 2013-07-23 7:51 UTC (permalink / raw
To: gentoo-commits
commit: 01a383d00def3f9f5bcaccd21167187cbf61288e
Author: André Erdmann <dywi <AT> mailerd <DOT> de>
AuthorDate: Fri Jul 19 17:44:18 2013 +0000
Commit: André Erdmann <dywi <AT> mailerd <DOT> de>
CommitDate: Fri Jul 19 17:44:18 2013 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/R_overlay.git;a=commit;h=01a383d0
roverlay/interface/main: accept config in setup()
---
roverlay/interface/main.py | 7 ++-----
roverlay/interface/root.py | 5 +++--
2 files changed, 5 insertions(+), 7 deletions(-)
diff --git a/roverlay/interface/main.py b/roverlay/interface/main.py
index dfa89e2..395bd99 100644
--- a/roverlay/interface/main.py
+++ b/roverlay/interface/main.py
@@ -18,11 +18,8 @@ class MainInterface ( roverlay.interface.root.RootInterface ):
self.setup ( *args, **kwargs )
# --- end of __init__ (...) ---
- def setup ( self, config_file, *args, **kw ):
- self.config_file = config_file
- super ( MainInterface, self ).__init__ (
- config_file=config_file, *args, **kw
- )
+ def setup ( self, *args, **kw ):
+ super ( MainInterface, self ).__init__ ( *args, **kw )
self.__class__.register_interface (
"depres", roverlay.interface.depres.DepresInterface
)
diff --git a/roverlay/interface/root.py b/roverlay/interface/root.py
index c571eea..a06663b 100644
--- a/roverlay/interface/root.py
+++ b/roverlay/interface/root.py
@@ -60,8 +60,9 @@ class RootInterface ( roverlay.interface.generic.RoverlayInterface ):
Defaults to None.
"""
super ( RootInterface, self ).__init__()
- self.parent = None
- self.err_queue = roverlay.errorqueue.ErrorQueue()
+ self.parent = None
+ self.err_queue = roverlay.errorqueue.ErrorQueue()
+ self.config_file = config_file
if getattr ( self, 'config', None ):
pass
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [gentoo-commits] proj/R_overlay:master commit in: roverlay/interface/
@ 2013-07-24 9:54 André Erdmann
0 siblings, 0 replies; 12+ messages in thread
From: André Erdmann @ 2013-07-24 9:54 UTC (permalink / raw
To: gentoo-commits
commit: 99c32fe36386668b42264e6140c44ac58c7a82c4
Author: André Erdmann <dywi <AT> mailerd <DOT> de>
AuthorDate: Wed Jul 24 09:51:36 2013 +0000
Commit: André Erdmann <dywi <AT> mailerd <DOT> de>
CommitDate: Wed Jul 24 09:51:36 2013 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/R_overlay.git;a=commit;h=99c32fe3
depres interface: CONFIG_KEY_DEPRULES
---
roverlay/interface/depres.py | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/roverlay/interface/depres.py b/roverlay/interface/depres.py
index ad292de..e6885fc 100644
--- a/roverlay/interface/depres.py
+++ b/roverlay/interface/depres.py
@@ -39,6 +39,8 @@ class DepresInterface ( roverlay.interface.generic.RoverlaySubInterface ):
Note that this interface relies on a parent interface (RootInterface).
"""
+ CONFIG_KEY_DEPRULES = 'DEPRES.simple_rules.files'
+
def __init__ ( self, parent_interface ):
"""Initializes the depdency resolution interface.
@@ -245,7 +247,7 @@ class DepresInterface ( roverlay.interface.generic.RoverlaySubInterface ):
Returns: True if rule files have been loaded, else False.
"""
if ignore_missing:
- rule_files = self.config.get ( "DEPRES.simple_rules.files", None )
+ rule_files = self.config.get ( self.CONFIG_KEY_DEPRULES, None )
if rule_files:
##return self.load_rule_files ( rule_files, ignore_missing=True )
return self.load_rule_files ( rule_files )
@@ -253,10 +255,12 @@ class DepresInterface ( roverlay.interface.generic.RoverlaySubInterface ):
return False
else:
return self.load_rule_files (
- self.config.get_or_fail ( "DEPRES.simple_rules.files" )
+ self.config.get_or_fail ( self.CONFIG_KEY_DEPRULES )
)
# --- end of load_rules_from_config (...) ---
+ load_configured = load_rules_from_config
+
def load_rule_files ( self, files_or_dirs, ignore_missing=False ):
"""Loads the given files into a new rule pool (or new pools).
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [gentoo-commits] proj/R_overlay:master commit in: roverlay/interface/
@ 2013-07-24 9:54 André Erdmann
0 siblings, 0 replies; 12+ messages in thread
From: André Erdmann @ 2013-07-24 9:54 UTC (permalink / raw
To: gentoo-commits
commit: b80e7ea7409d492c298850fbcdcbd126b161c6c2
Author: André Erdmann <dywi <AT> mailerd <DOT> de>
AuthorDate: Wed Jul 24 09:52:26 2013 +0000
Commit: André Erdmann <dywi <AT> mailerd <DOT> de>
CommitDate: Wed Jul 24 09:52:26 2013 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/R_overlay.git;a=commit;h=b80e7ea7
roverlay/interface/main: register remote interface
---
roverlay/interface/main.py | 6 +++++-
roverlay/interface/root.py | 2 +-
2 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/roverlay/interface/main.py b/roverlay/interface/main.py
index 395bd99..db4ed50 100644
--- a/roverlay/interface/main.py
+++ b/roverlay/interface/main.py
@@ -1,4 +1,4 @@
-# R overlay --
+# R overlay -- main interface
# -*- coding: utf-8 -*-
# Copyright (C) 2013 André Erdmann <dywi@mailerd.de>
# Distributed under the terms of the GNU General Public License;
@@ -8,6 +8,7 @@ import roverlay
import roverlay.interface.root
import roverlay.interface.depres
+import roverlay.interface.remote
roverlay.setup_initial_logger()
@@ -23,5 +24,8 @@ class MainInterface ( roverlay.interface.root.RootInterface ):
self.__class__.register_interface (
"depres", roverlay.interface.depres.DepresInterface
)
+ self.__class__.register_interface (
+ "remote", roverlay.interface.remote.RemoteInterface
+ )
return True
# --- end of setup (...) ---
diff --git a/roverlay/interface/root.py b/roverlay/interface/root.py
index a06663b..5a4f386 100644
--- a/roverlay/interface/root.py
+++ b/roverlay/interface/root.py
@@ -1,4 +1,4 @@
-# R overlay --
+# R overlay -- root interface
# -*- coding: utf-8 -*-
# Copyright (C) 2013 André Erdmann <dywi@mailerd.de>
# Distributed under the terms of the GNU General Public License;
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [gentoo-commits] proj/R_overlay:master commit in: roverlay/interface/
@ 2013-07-24 9:54 André Erdmann
0 siblings, 0 replies; 12+ messages in thread
From: André Erdmann @ 2013-07-24 9:54 UTC (permalink / raw
To: gentoo-commits
commit: 5b8443af2e14467f9137d93a3227ee32f41164d4
Author: André Erdmann <dywi <AT> mailerd <DOT> de>
AuthorDate: Wed Jul 24 09:51:54 2013 +0000
Commit: André Erdmann <dywi <AT> mailerd <DOT> de>
CommitDate: Wed Jul 24 09:51:54 2013 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/R_overlay.git;a=commit;h=5b8443af
roverlay/interface: remote
Remote interface for syncing.
---
roverlay/interface/remote.py | 212 +++++++++++++++++++++++++++++++++++++++++++
1 file changed, 212 insertions(+)
diff --git a/roverlay/interface/remote.py b/roverlay/interface/remote.py
new file mode 100644
index 0000000..881d013
--- /dev/null
+++ b/roverlay/interface/remote.py
@@ -0,0 +1,212 @@
+# R overlay -- remote interface
+# -*- coding: utf-8 -*-
+# Copyright (C) 2013 André Erdmann <dywi@mailerd.de>
+# Distributed under the terms of the GNU General Public License;
+# either version 2 of the License, or (at your option) any later version
+
+import errno
+
+import roverlay.interface.generic
+
+import roverlay.remote.repolist
+import roverlay.remote.status
+
+
+class RemoteInterface ( roverlay.interface.generic.RoverlaySubInterface ):
+ #
+ # Note: this interface is a stub, it supports syncing only!
+ #
+
+ CONFIG_KEY_REPOS = 'REPO.config_files'
+
+ SYNC_SUCCESS = roverlay.remote.status.SYNC_SUCCESS
+ SYNC_FAIL = roverlay.remote.status.SYNC_FAIL
+ SYNC_DONE = roverlay.remote.status.SYNC_DONE
+ REPO_READY = roverlay.remote.status.REPO_READY
+
+ def __init__ ( self, parent_interface ):
+ super ( RemoteInterface, self ).__init__ ( parent_interface )
+ self._repolist = roverlay.remote.repolist.RepoList (
+ sync_enabled=self.config.get_or_fail ( "nosync" )
+ )
+ # --- end of __init__ (...) ---
+
+ @property
+ def repolist ( self ):
+ """direct access to the RepoList"""
+ return self._repolist
+
+ @property
+ def repos ( self ):
+ """direct access to the repos"""
+ return self._repolist.repos
+
+ @property
+ def sync_enabled ( self ):
+ return self._repolist.sync_enabled
+
+ def _set_sync ( self, status ):
+ """Enables/Disables syncing.
+
+ Returns: old sync enable status
+
+ arguments:
+ * status -- new sync enable status
+ """
+ old_sync_enable = self._repolist.sync_enabled
+ self._repolist.sync_enabled = bool ( status )
+ return old_sync_enable
+ # --- end of _set_sync (...) ---
+
+ def enable_sync ( self ):
+ """Enables syncing.
+
+ Returns: old sync enable status
+ """
+ return self._set_sync ( True )
+ # --- end of enable_sync (...) ---
+
+ def disable_sync ( self ):
+ """Disables syncing.
+
+ Returns: old sync enable status
+ """
+ return self._set_sync ( False )
+ # --- end of disable_sync (...) ---
+
+ def load_repo_file ( self, filepath, ignore_missing=False ):
+ """Loads a repo file.
+
+ Returns True on success, else False.
+
+ arguments:
+ * filepath -- path to the repo config file
+ * ignore_missing -- suppress exceptions caused by missing files
+ """
+ if ignore_missing:
+ try:
+ self._repolist.load_file ( filepath )
+ except OSError as oserr:
+ if oserr.errno == errno.ENOENT:
+ return False
+ else:
+ raise
+ else:
+ return True
+ else:
+ self._repolist.load_file ( filepath )
+ return True
+ # --- end of load_repo_file (...) ---
+
+ def load_repo_files ( self, files, ignore_missing=False ):
+ """Loads zero or more repo files.
+
+ Returns: True if loading of all files succeeded, else False.
+
+ arguments:
+ * files -- files to load
+ * ignore_missing -- suppress exceptions caused by missing files
+ """
+ ret = True
+ for filepath in files:
+ if not self.load_repo_file ( filepath ):
+ ret = False
+ return ret
+ # --- end of load_repo_files (...) ---
+
+ def load_configured ( self, ignore_missing=False ):
+ """Loads the configured repo files.
+
+ Returns: success (True/False)
+
+ arguments:
+ * ignore_missing -- suppress exceptions caused by missing files
+ Additionally, do not fail if no repo files
+ configured.
+ """
+ if ignore_missing:
+ files = self.config.get ( self.CONFIG_KEY_REPOS, None )
+ if files is not None:
+ return self.load_repo_files ( files, ignore_missing=True )
+ else:
+ return True
+ else:
+ return self.load_repo_files (
+ self.config.get_or_fail ( self.CONFIG_KEY_REPOS ),
+ ignore_missing=False
+ )
+ # --- end of load_configured (...) ---
+
+ def sync ( self, enable_sync=None, repo_filter=None ):
+ """Syncs all repos (or a subset of them).
+
+ Returns: success (True/False)
+
+ arguments:
+ * enable_sync -- enable/disable syncing
+ Defaults to None (-> use RepoList default)
+ * repo_filter -- filter for choosing which repos to sync
+ Defaults to None (-> do not filter)
+ """
+ sync_enabled = bool (
+ self._repolist.sync_enabled if enable_sync is None else enable_sync
+ )
+
+ success = True
+ for repo in (
+ self._repolist.repos if repo_filter is None
+ else filter ( repo_filter, self._repolist.repos )
+ ):
+ repo.reset()
+ if not repo.sync ( sync_enabled ):
+ success = False
+
+ return success
+ # --- end of sync (...) ---
+
+ def sync_named_repo ( self, repo_name, enable_sync=None ):
+ """Syncs all repos with the given name.
+
+ Returns: success (True/False)
+
+ arguments:
+ * repo_name -- name of the repo
+ * enable_sync -- enable/disable syncing
+ """
+ return self.sync (
+ enable_sync=enable_sync,
+ repo_filter=lambda r: r.name == repo_name
+ )
+ # --- end of sync_named_repo (...) ---
+
+ def sync_online ( self, repo_filter=None ):
+ """Calls sync with enable_sync=True."""
+ return self.sync ( enable_sync=True, repo_filter=repo_filter )
+ # --- end of sync_online (...) ---
+
+ def sync_offline ( self, repo_filter=None ):
+ """Calls sync with enable_sync=False."""
+ return self.sync ( enable_sync=False, repo_filter=repo_filter )
+ # --- end of sync_offline (...) ---
+
+ def get_repos_by_name ( self, repo_name ):
+ """Returns a list containing all repos with the given name.
+
+ arguments:
+ * repo_name --
+ """
+ return [ r for r in self._repolist.repos if r.name == repo_name ]
+ # --- end of get_repos_by_name (...) ---
+
+ def get_repo_by_name ( self, repo_name ):
+ """Returns the repo with the given name. Returns None if no such repo
+ exists.
+
+ arguments:
+ * repo_name --
+ """
+ rlist = self.get_repos_by_name ( repo_name )
+ return rlist[0] if rlist else None
+ # --- end of get_repo_by_name (...) ---
+
+# --- end of RemoteInterface ---
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [gentoo-commits] proj/R_overlay:master commit in: roverlay/interface/
@ 2013-08-20 21:46 André Erdmann
0 siblings, 0 replies; 12+ messages in thread
From: André Erdmann @ 2013-08-20 21:46 UTC (permalink / raw
To: gentoo-commits
commit: 0cd0e9e1f3aa993f9cc583007cb8d3de46e30d1c
Author: André Erdmann <dywi <AT> mailerd <DOT> de>
AuthorDate: Tue Aug 20 16:32:29 2013 +0000
Commit: André Erdmann <dywi <AT> mailerd <DOT> de>
CommitDate: Tue Aug 20 16:32:29 2013 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/R_overlay.git;a=commit;h=0cd0e9e1
depres interface: optionally use non-greedy channels
---
roverlay/interface/depres.py | 75 ++++++++++++++++++++++++++++++++++++++------
1 file changed, 66 insertions(+), 9 deletions(-)
diff --git a/roverlay/interface/depres.py b/roverlay/interface/depres.py
index e6885fc..c7ba95c 100644
--- a/roverlay/interface/depres.py
+++ b/roverlay/interface/depres.py
@@ -41,12 +41,22 @@ class DepresInterface ( roverlay.interface.generic.RoverlaySubInterface ):
CONFIG_KEY_DEPRULES = 'DEPRES.simple_rules.files'
- def __init__ ( self, parent_interface ):
+ GREEDY_DEPRES_CHANNEL = roverlay.depres.channels.EbuildJobChannel
+ NONGREEDY_DEPRES_CHANNEL = roverlay.depres.channels.NonGreedyDepresChannel
+
+ def __init__ ( self, parent_interface, greedy=None, want_tuple=False ):
"""Initializes the depdency resolution interface.
arguments:
* parent_interface -- parent interface that provides shared functionality
like logging and config
+ * greedy -- whether to use greedy depres channels by default
+ or not. See get_channel() for details.
+ Defaults to None (=greedy if dep resolver uses
+ threads, else not greedy).
+ * want_tuple -- when do_resolve() with preserve_order=True:
+ return resolved deps as tuples not list
+ Defaults to False.
"""
super ( DepresInterface, self ).__init__ (
parent_interface=parent_interface
@@ -56,6 +66,9 @@ class DepresInterface ( roverlay.interface.generic.RoverlaySubInterface ):
self._resolver = roverlay.depres.depresolver.DependencyResolver (
err_queue=self.err_queue
)
+ self.set_greedy ( greedy )
+ self.want_tuple = bool ( want_tuple )
+
## log everything
self._resolver.set_logmask ( -1 )
## disable passing events to listeners
@@ -89,6 +102,18 @@ class DepresInterface ( roverlay.interface.generic.RoverlaySubInterface ):
"""Index of the topmost rule pool (-1 if no rule pool active)"""
return self._pool_id
+ def set_greedy ( self, greedy ):
+ if greedy is None:
+ self.default_depres_channel = (
+ self.GREEDY_DEPRES_CHANNEL if self._resolver.get_threadcount()
+ else self.NONGREEDY_DEPRES_CHANNEL
+ )
+ elif greedy:
+ self.default_depres_channel = self.GREEDY_DEPRES_CHANNEL
+ else:
+ self.default_depres_channel = self.NONGREEDY_DEPRES_CHANNEL
+ # --- end of set_greedy (...) ---
+
def _update_resolver ( self ):
"""Updates the resolver.
@@ -431,7 +456,7 @@ class DepresInterface ( roverlay.interface.generic.RoverlaySubInterface ):
)
# --- end of visualize_pools (...) ---
- def get_channel ( self, channel_name="channel" ):
+ def get_channel ( self, channel_name="channel", greedy=None ):
"""Creates, registers and returns an EbuildJobChannel suitable for
dependency resolution.
@@ -440,15 +465,25 @@ class DepresInterface ( roverlay.interface.generic.RoverlaySubInterface ):
arguments:
* channel_name -- name of the channel (defaults to "channel")
+ * greedy -- whether to return a greedy or non-greedy depres
+ channel. The greedy one stops if a mandatory dep
+ cannot be resolved, whereas the non-greedy one keeps
+ going until all deps have been processed.
+ Defaults to None (=use default channel).
"""
- channel = roverlay.depres.channels.EbuildJobChannel (
- err_queue=self.err_queue, name=channel_name
- )
+ if greedy is None:
+ channel_cls = self.default_depres_channel
+ elif greedy:
+ channel_cls = self.GREEDY_DEPRES_CHANNEL
+ else:
+ channel_cls = self.NONGREEDY_DEPRES_CHANNEL
+
+ channel = channel_cls ( err_queue=self.err_queue, name=channel_name )
self._resolver.register_channel ( channel )
return channel
# --- end of get_channel (...) ---
- def do_resolve ( self, deps, with_deptype=DEFAULT_DEPTYPE ):
+ def do_resolve ( self, deps, with_deptype=DEFAULT_DEPTYPE, greedy=None ):
"""Performs dependency resolution for the given dependency list and
returns the result, which is None (=not resolved) or a 2-tuple
(<resolved deps>, <unresolvable, but optional deps>).
@@ -459,6 +494,8 @@ class DepresInterface ( roverlay.interface.generic.RoverlaySubInterface ):
arguments:
* deps -- dependency string list
* with_deptype -- dependency type (optional, defaults to DEFAULT_DEPTYPE)
+ * greedy -- whether to use a greedy depres channel or not
+ Defaults to None.
"""
channel = self.get_channel()
# FIXME/COULDFIX: once again, hardcoded deptype
@@ -467,7 +504,8 @@ class DepresInterface ( roverlay.interface.generic.RoverlaySubInterface ):
channel_result = channel.satisfy_request (
close_if_unresolvable=False,
- preserve_order=True
+ preserve_order=True,
+ want_tuple=self.want_tuple,
)
finally:
channel.close()
@@ -475,6 +513,23 @@ class DepresInterface ( roverlay.interface.generic.RoverlaySubInterface ):
return channel_result
# --- end of do_resolve (...) ---
+ def _do_resolve_weak_greedy ( self, deps, kw, greedy=True ):
+ """Calls do_resolve ( deps, **kw ) with the given greedy mode unless
+ greedy is in kw.
+
+ Passes do_resolve()'s return value.
+
+ arguments:
+ * deps --
+ * kw --
+ * greedy -- defaults to True
+ """
+ if 'greedy' in kw:
+ return self.do_resolve ( deps, **kw )
+ else:
+ return self.do_resolve ( deps, greedy=greedy, **kw )
+ # --- end of _do_resolve_weak_greedy (...) ---
+
def resolve ( self, *deps, **kw ):
"""Like do_resolve(), but accepts the dependency string list in var-args
form and returns None (=not resolved) or a list of resolved dependencies.
@@ -499,7 +554,9 @@ class DepresInterface ( roverlay.interface.generic.RoverlaySubInterface ):
* *deps --
* **kw --
"""
- return self.do_resolve ( deps, **kw ) is not None
+ return (
+ self._do_resolve_weak_greedy ( deps, kw, greedy=True ) is not None
+ )
# --- end of can_resolve (...) ---
def cannot_resolve ( self, *deps, **kw ):
@@ -510,7 +567,7 @@ class DepresInterface ( roverlay.interface.generic.RoverlaySubInterface ):
* *deps --
* **kw --
"""
- return self.do_resolve ( deps, **kw ) is None
+ return self._do_resolve_weak_greedy ( deps, kw, greedy=True ) is None
# --- end of cannot_resolve (...) ---
# --- end of DepresInterface ---
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [gentoo-commits] proj/R_overlay:master commit in: roverlay/interface/
@ 2014-06-05 22:09 André Erdmann
0 siblings, 0 replies; 12+ messages in thread
From: André Erdmann @ 2014-06-05 22:09 UTC (permalink / raw
To: gentoo-commits
commit: 5111d8d0b0a604a22731cd3c7e5d32e8b93b8acc
Author: André Erdmann <dywi <AT> mailerd <DOT> de>
AuthorDate: Wed May 7 01:31:55 2014 +0000
Commit: André Erdmann <dywi <AT> mailerd <DOT> de>
CommitDate: Wed May 7 01:34:01 2014 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/R_overlay.git;a=commit;h=5111d8d0
roverlay/interface: new_standalone()
Allows to create standalone interfaces, which use a dummy config by default.
---
roverlay/interface/generic.py | 43 +++++++++++++++++++++++++++++++++++++++++++
roverlay/interface/root.py | 21 +++++++++++++++++++++
2 files changed, 64 insertions(+)
diff --git a/roverlay/interface/generic.py b/roverlay/interface/generic.py
index 8fc7239..66b6cb8 100644
--- a/roverlay/interface/generic.py
+++ b/roverlay/interface/generic.py
@@ -134,6 +134,49 @@ class RoverlaySubInterface ( RoverlayInterface ):
a parent interface.
"""
+ # we don't know anything about concrete root interfaces in this module
+ ROOT_INTERFACE_CLS = NotImplemented
+
+ @classmethod
+ def get_standalone_root_interface (
+ cls, is_installed, config, config_file, **kwargs
+ ):
+ assert cls.ROOT_INTERFACE_CLS is not NotImplemented
+
+ if config or config_file:
+ return cls.ROOT_INTERFACE_CLS (
+ config=config, config_file=config_file,
+ is_installed=is_installed,
+ **kwargs
+ )
+ else:
+ return cls.ROOT_INTERFACE_CLS (
+ config=False, is_installed=is_installed, **kwargs
+ )
+ # --- end of get_standalone_root_interface (...) ---
+
+ @classmethod
+ def new_standalone (
+ cls,
+ is_installed=False, config=None, config_file=None,
+ **kwargs
+ ):
+ """Creates a new interface with an anonymous parent interface.
+
+ arguments:
+ * is_installed -- passed to get_standalone_root_interface()
+ * config -- passed to get_standalone_root_interface()
+ * config_file -- passed to get_standalone_root_interface()
+ * **kwargs -- passed to __init__()
+ """
+ return cls (
+ cls.get_standalone_root_interface (
+ is_installed, config, config_file
+ ),
+ **kwargs
+ )
+ # --- end of new_standalone (...) ---
+
def __init__ ( self, parent_interface ):
"""Initializes the subinterface. Creates references to shared objects
like logger and config as well as a ref to the parent interface.
diff --git a/roverlay/interface/root.py b/roverlay/interface/root.py
index 1ea4ef1..6f6afc9 100644
--- a/roverlay/interface/root.py
+++ b/roverlay/interface/root.py
@@ -9,12 +9,18 @@ import logging
import roverlay.core
import roverlay.errorqueue
import roverlay.hook
+import roverlay.config.tree
import roverlay.interface.generic
# does nothing if already initialized
roverlay.core.setup_initial_logger()
+
+def get_dummy_config():
+ return roverlay.config.tree.ConfigTree()
+# --- end of get_dummy_config (...) ---
+
class RootInterface ( roverlay.interface.generic.RoverlayInterface ):
"""Root interfaces for accessing roverlay interfaces.
@@ -43,6 +49,17 @@ class RootInterface ( roverlay.interface.generic.RoverlayInterface ):
return False
# --- end of register_interface (...) ---
+ @classmethod
+ def new_unconfigured ( cls, **kwargs ):
+ """Creates a new root interface with a dummy config tree.
+
+ arguments:
+ * **kwargs -- passed to __init__()
+ """
+ kwargs ['config'] = False
+ return cls ( **kwargs )
+ # --- end of new_unconfigured (...) ---
+
def __init__ ( self,
config_file=None, config=None, additional_config=None, is_installed=None
):
@@ -55,6 +72,8 @@ class RootInterface ( roverlay.interface.generic.RoverlayInterface ):
* config_file -- path to the config file
* config -- config tree or None
takes precedence over config_file
+ A dummy config tree will be created if this
+ arg is False.
* additional_config -- when loading the config file: extra config dict
* is_installed -- whether roverlay has been installed or not
Defaults to None.
@@ -66,6 +85,8 @@ class RootInterface ( roverlay.interface.generic.RoverlayInterface ):
if getattr ( self, 'config', None ):
pass
+ elif config is False:
+ self.config = get_dummy_config()
elif config is not None:
self.config = config
elif config_file is not None:
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [gentoo-commits] proj/R_overlay:master commit in: roverlay/interface/
@ 2014-06-05 22:09 André Erdmann
0 siblings, 0 replies; 12+ messages in thread
From: André Erdmann @ 2014-06-05 22:09 UTC (permalink / raw
To: gentoo-commits
commit: 5df0c6b4892aa5ea2a98c59e56be34aac8ea3301
Author: André Erdmann <dywi <AT> mailerd <DOT> de>
AuthorDate: Wed May 7 01:34:43 2014 +0000
Commit: André Erdmann <dywi <AT> mailerd <DOT> de>
CommitDate: Wed May 7 01:34:43 2014 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/R_overlay.git;a=commit;h=5df0c6b4
DepresInterface: push/pop pools, handle rule objects
---
roverlay/interface/depres.py | 112 ++++++++++++++++++++++++++++++++++---------
1 file changed, 90 insertions(+), 22 deletions(-)
diff --git a/roverlay/interface/depres.py b/roverlay/interface/depres.py
index c7ba95c..ae005e8 100644
--- a/roverlay/interface/depres.py
+++ b/roverlay/interface/depres.py
@@ -9,6 +9,7 @@
import errno
import roverlay.interface.generic
+import roverlay.interface.root
import roverlay.depres.channels
@@ -29,7 +30,8 @@ class DepresInterface ( roverlay.interface.generic.RoverlaySubInterface ):
This class provides:
* rule creation (from text/text files)
- * manage dependency rule pools (stack-like discard_pool()/get_new_pool())
+ * manage dependency rule pools
+ (stack-like discard_pool()/get_[new_]pool(), pop_pool()/push_pool())
* resolve dependencies:
-> do_resolve(<deps>) for "raw" depres results
-> resolve(<deps>) for generic purpose results (list of resolved deps)
@@ -43,9 +45,11 @@ class DepresInterface ( roverlay.interface.generic.RoverlaySubInterface ):
GREEDY_DEPRES_CHANNEL = roverlay.depres.channels.EbuildJobChannel
NONGREEDY_DEPRES_CHANNEL = roverlay.depres.channels.NonGreedyDepresChannel
+ ROOT_INTERFACE_CLS = roverlay.interface.root.RootInterface
+
def __init__ ( self, parent_interface, greedy=None, want_tuple=False ):
- """Initializes the depdency resolution interface.
+ """Initializes the dependency resolution interface.
arguments:
* parent_interface -- parent interface that provides shared functionality
@@ -179,6 +183,38 @@ class DepresInterface ( roverlay.interface.generic.RoverlaySubInterface ):
return self.get_new_pool ( force=True )
# --- end of get_pool (...) ---
+ def _add_pool ( self, pool ):
+ """Pushes a rule pool back to the poolstack, making it the topmost one.
+
+ Returns: None (implicit)
+
+ arguments:
+ * pool -- a dependency rule pool
+ """
+ self._pool_id += 1
+ try:
+ self._poolstack.append ( pool )
+ except:
+ self._pool_id -= 1
+ raise
+
+ self._update_resolver()
+ # --- end of _add_pool (...) ---
+
+ def push_pool ( self, pool ):
+ """Pushes a rule pool back to the poolstack, making it the topmost one.
+
+ Returns: topmost rule pool (should be the given pool)
+
+ arguments:
+ * pool -- a dependency rule pool
+ """
+ # COULDFIX: pool name possibly not unique when reinserting pools
+ assert isinstance ( pool, roverlay.depres.simpledeprule.pool.SimpleDependencyRulePool )
+ self._add_pool ( pool )
+ return self._poolstack[-1]
+ # --- end of push_pool (...) ---
+
def get_new_pool ( self, force=False, with_deptype=DEFAULT_DEPTYPE ):
"""Creates a new pool, adds it to the pool stack and returns it.
@@ -188,36 +224,38 @@ class DepresInterface ( roverlay.interface.generic.RoverlaySubInterface ):
* with_deptype -- dependency type of the new pool (optional)
"""
if force or not self._poolstack or not self._poolstack[-1].empty():
- self._pool_id += 1
- try:
- pool = roverlay.depres.simpledeprule.pool.SimpleDependencyRulePool (
+ self._add_pool (
+ roverlay.depres.simpledeprule.pool.SimpleDependencyRulePool (
"pool" + str ( self._pool_id ),
- deptype_mask=DEFAULT_DEPTYPE
+ deptype_mask=with_deptype
)
- self.poolstack.append ( pool )
- except:
- self._pool_id -= 1
- raise
-
- self._update_resolver()
+ )
# -- end if force or ...
return self._poolstack[-1]
# --- end of get_new_pool (...) ---
+ def pop_pool ( self ):
+ """Discards the topmost rule pool and returns it.
+
+ Returns: dependency rule pool or None (=no pool removed).
+ """
+ try:
+ pool = self._poolstack.pop()
+ except IndexError:
+ # poolstack is empty
+ return None
+
+ self._pool_id -= 1
+ assert self._pool_id >= -1, self._pool_id
+ return pool
+ # --- end of pop_pool (...) ---
+
def discard_pool ( self ):
"""Discards the topmost rule pool.
Returns: True if a pool has been removed, else False.
"""
- try:
- self._poolstack.pop()
- self._pool_id -= 1
- assert self._pool_id >= -1, self._pool_id
- return True
- except AssertionError:
- raise
- except:
- return False
+ return self.pop_pool() is not None
# --- end of discard_pool (...) ---
def discard_pools ( self, count ):
@@ -310,6 +348,36 @@ class DepresInterface ( roverlay.interface.generic.RoverlaySubInterface ):
return True if ret is None else ret
# --- end of load_rule_files (...) ---
+ def add_rule_objects ( self, rules ):
+ """Adds SimpleDependencyRule objects to the topmost rule pool.
+
+ update() has to be called manually.
+
+ Returns: True
+
+ arguments:
+ * rule_objects -- iterable containing dependency rules
+ """
+ pool = self.get_pool()
+ # pool validates the rules' type
+ for deprule in rules:
+ pool.add ( deprule )
+ return True
+ # --- end of add_rule_objects (...) ---
+
+ def add_rule_object ( self, rule ):
+ """Adds a single SimpleDependencyRule object to the topmost rule pool.
+
+ update() has to be called manually.
+
+ arguments:
+ * rule -- dependency rule
+ """
+ # the rule pool validates the rule's type
+ self.get_pool().add ( rule )
+ return True
+ # --- end of add_rule_object (...) ---
+
def add_rule ( self, rule_str ):
"""Sends a text line to the rule parser.
@@ -395,7 +463,7 @@ class DepresInterface ( roverlay.interface.generic.RoverlaySubInterface ):
return True
except:
if new_pool:
- # this could discard (previosly) empty pools, too
+ # this could discard (previously) empty pools, too
# (side-effect of "optimizations" in get_new_pool())
#
self.discard_pool()
^ permalink raw reply related [flat|nested] 12+ messages in thread
end of thread, other threads:[~2014-06-05 22:09 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-07-23 7:51 [gentoo-commits] proj/R_overlay:master commit in: roverlay/interface/ André Erdmann
2013-07-19 18:00 ` [gentoo-commits] proj/R_overlay:gsoc13/next " André Erdmann
-- strict thread matches above, loose matches on Subject: below --
2014-06-05 22:09 [gentoo-commits] proj/R_overlay:master " André Erdmann
2014-06-05 22:09 André Erdmann
2013-08-20 21:46 André Erdmann
2013-07-24 9:54 André Erdmann
2013-07-24 9:54 André Erdmann
2013-07-24 9:54 André Erdmann
2013-07-23 7:51 André Erdmann
2013-07-18 19:25 [gentoo-commits] proj/R_overlay:gsoc13/next " André Erdmann
2013-07-23 7:51 ` [gentoo-commits] proj/R_overlay:master " André Erdmann
2013-07-16 16:36 André Erdmann
2013-07-03 10:05 André Erdmann
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox