From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from lists.gentoo.org (pigeon.gentoo.org [208.92.234.80]) by finch.gentoo.org (Postfix) with ESMTP id 744521381F3 for ; Thu, 29 Aug 2013 12:36:38 +0000 (UTC) Received: from pigeon.gentoo.org (localhost [127.0.0.1]) by pigeon.gentoo.org (Postfix) with SMTP id 75549E0B74; Thu, 29 Aug 2013 12:36:37 +0000 (UTC) Received: from smtp.gentoo.org (smtp.gentoo.org [140.211.166.183]) (using TLSv1 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by pigeon.gentoo.org (Postfix) with ESMTPS id D1525E0B6A for ; Thu, 29 Aug 2013 12:36:36 +0000 (UTC) Received: from hornbill.gentoo.org (hornbill.gentoo.org [94.100.119.163]) (using TLSv1 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by smtp.gentoo.org (Postfix) with ESMTPS id AE88533ECFD for ; Thu, 29 Aug 2013 12:36:35 +0000 (UTC) Received: from localhost.localdomain (localhost [127.0.0.1]) by hornbill.gentoo.org (Postfix) with ESMTP id 9411EE5467 for ; Thu, 29 Aug 2013 12:36:33 +0000 (UTC) From: "André Erdmann" To: gentoo-commits@lists.gentoo.org Content-Transfer-Encoding: 8bit Content-type: text/plain; charset=UTF-8 Reply-To: gentoo-dev@lists.gentoo.org, "André Erdmann" Message-ID: <1377779094.758592e4107cae1a93c936062f0bda2bc9fc6dd5.dywi@gentoo> Subject: [gentoo-commits] proj/R_overlay:master commit in: roverlay/util/ X-VCS-Repository: proj/R_overlay X-VCS-Files: roverlay/util/objects.py X-VCS-Directories: roverlay/util/ X-VCS-Committer: dywi X-VCS-Committer-Name: André Erdmann X-VCS-Revision: 758592e4107cae1a93c936062f0bda2bc9fc6dd5 X-VCS-Branch: master Date: Thu, 29 Aug 2013 12:36:33 +0000 (UTC) Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-Id: Gentoo Linux mail X-BeenThere: gentoo-commits@lists.gentoo.org X-Archives-Salt: ad6127a1-cfb2-4655-8aa7-668ab33ed2a5 X-Archives-Hash: ea3f9f453aa104fe827e9e3c067c0ba2 commit: 758592e4107cae1a93c936062f0bda2bc9fc6dd5 Author: André Erdmann mailerd de> AuthorDate: Thu Aug 29 12:24:54 2013 +0000 Commit: André Erdmann mailerd de> CommitDate: Thu Aug 29 12:24:54 2013 +0000 URL: http://git.overlays.gentoo.org/gitweb/?p=proj/R_overlay.git;a=commit;h=758592e4 roverlay/util/objects: more weak referencing This functionality will (primarily) be used for handling distmap/mirror directory file collisions. --- roverlay/util/objects.py | 154 +++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 135 insertions(+), 19 deletions(-) diff --git a/roverlay/util/objects.py b/roverlay/util/objects.py index 28cc4e8..ce4eccb 100644 --- a/roverlay/util/objects.py +++ b/roverlay/util/objects.py @@ -6,6 +6,85 @@ import weakref +class ObjectDisappeared ( Exception ): + pass +# --- end of ObjectDisappeared --- + +class SafeWeakRef ( weakref.ref ): + + def deref_unsafe ( self ): + return super ( SafeWeakRef, self ).__call__() + # --- end of deref_unsafe (...) --- + + def deref_safe ( self ): + obj = super ( SafeWeakRef, self ).__call__() + if obj is not None: + return obj + else: + raise ObjectDisappeared() + # --- end of deref_safe (...) --- + + __call__ = deref_safe + deref = deref_safe + + def __bool__ ( self ): + return self.deref_unsafe() is not None + # --- end of __bool__ (...) --- + + def __repr__ ( self ): + obj = self.deref_unsafe() + if obj: + return "<{} at 0x{:x} to {!r} at 0x{:x}>".format ( + self.__class__.__name__, id ( self ), + obj.__class__.__name__, id ( obj ) + ) + else: + return "<{} at 0x{:x} to None>".format ( + self.__class__.__name__, id ( self ) + ) + # --- end of __repr__ (...) --- + +# --- end of SafeWeakRef --- + + +class NoneRef ( object ): + + def __init__ ( self, obj=None ): + super ( NoneRef, self ).__init__() + assert obj is None + # --- end of NoneRef (...) --- + + def deref_unsafe ( self ): + return None + # --- end of deref_unsafe (...) --- + + def deref_safe ( self ): + raise ObjectDisappeared() + # --- end of deref_safe (...) --- + + __call__ = deref_safe + deref = deref_safe + + def __bool__ ( self ): + return False + # --- end of __bool__ (...) --- + + def __repr__ ( self ): + return "".format ( id ( self ) ) + # --- end of __repr__ (...) --- + +# --- end of NoneRef --- + +def get_object_ref ( obj ): + if obj is None: + return NoneRef() + elif hasattr ( obj, 'get_ref' ): + return obj.get_ref() + else: + return SafeWeakRef ( obj ) +# --- end of get_object_ref (...) --- + + class MethodNotImplementedError ( NotImplementedError ): def __init__ ( self, obj, method, msg=None ): if isinstance ( obj, str ): @@ -71,35 +150,72 @@ def not_implemented ( func=None ): # --- end of not_implemented (...) --- +class Referenceable ( object ): + + CACHE_REF = False + + def __init__ ( self, *args, **kwargs ): + super ( Referenceable, self ).__init__() + self._cached_selfref = None + if self.CACHE_REF: + self.cache_ref() + # --- end of __init__ (...) --- + + def cache_ref ( self ): + self._cached_selfref = self.get_new_ref() + self.get_ref = self._get_cached_ref + # --- end of cache_ref (...) --- + + def _get_cached_ref ( self ): + return self._cached_selfref + # --- end of _get_cached_ref (...) --- + + def get_new_ref ( self ): + return SafeWeakRef ( self ) + # --- end of get_new_ref (...) --- + + get_ref = get_new_ref + +# --- end of Referenceable --- + + +class ReferenceTree ( Referenceable ): + + def __init__ ( self, parent ): + super ( ReferenceTree, self ).__init__() + self.parent_ref = None + self.set_parent ( parent ) + # --- end of __init__ (...) --- + + def set_parent ( self, parent ): + self.parent_ref = get_object_ref ( parent ) + # --- end of set_parent (...) --- + + def get_parent ( self ): + return self.parent_ref.deref_safe() + # --- end of get_parent (...) --- + + get_upper = get_parent + +# --- end of ReferenceTree --- + + class ObjectView ( object ): - class ObjectDisappeared ( Exception ): - pass - # --- end of ObjectDisappeared --- + ObjectDisappeared = ObjectDisappeared def __init__ ( self, obj ): super ( ObjectView, self ).__init__() - self.obj_ref = weakref.ref ( obj ) if obj is not None else None + self.obj_ref = get_object_ref ( obj ) + self.deref_unsafe = self.obj_ref.deref_unsafe + self.deref_safe = self.obj_ref.deref_safe + self.deref = self.obj_ref.deref_safe # --- end of __init__ (...) --- def __bool__ ( self ): - return ( self.obj_ref is not None and self.obj_ref() is not None ) + return bool ( self.obj_ref ) # --- end of __bool__ (...) --- - def deref_unsafe ( self ): - return None if self.obj_ref is None else self.obj_ref() - # --- end of deref_unsafe (...) --- - - def deref_safe ( self ): - obj = None if self.obj_ref is None else self.obj_ref() - if obj is None: - raise self.__class__.ObjectDisappeared() - else: - return obj - # --- end of deref_safe (...) --- - - deref = deref_safe - @abstractmethod def update ( self ): pass