Gentoo Archives: gentoo-commits

From: "André Erdmann" <dywi@×××××××.de>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] proj/R_overlay:master commit in: roverlay/util/
Date: Thu, 29 Aug 2013 12:36:38
Message-Id: 1377767677.c5c196a9a80e19a1f61379db1c9b9592cf6a1fc6.dywi@gentoo
1 commit: c5c196a9a80e19a1f61379db1c9b9592cf6a1fc6
2 Author: André Erdmann <dywi <AT> mailerd <DOT> de>
3 AuthorDate: Thu Aug 29 09:14:37 2013 +0000
4 Commit: André Erdmann <dywi <AT> mailerd <DOT> de>
5 CommitDate: Thu Aug 29 09:14:37 2013 +0000
6 URL: http://git.overlays.gentoo.org/gitweb/?p=proj/R_overlay.git;a=commit;h=c5c196a9
7
8 roverlay/util/objects: weak-referenced object view
9
10 expose a (sub-)set of an object's information without depending on its existence
11 (= keeping it in memory due to reference count).
12
13 ---
14 roverlay/util/objects.py | 39 +++++++++++++++++++++++++++++++++++++++
15 1 file changed, 39 insertions(+)
16
17 diff --git a/roverlay/util/objects.py b/roverlay/util/objects.py
18 index dd19046..28cc4e8 100644
19 --- a/roverlay/util/objects.py
20 +++ b/roverlay/util/objects.py
21 @@ -4,6 +4,8 @@
22 # Distributed under the terms of the GNU General Public License;
23 # either version 2 of the License, or (at your option) any later version.
24
25 +import weakref
26 +
27 class MethodNotImplementedError ( NotImplementedError ):
28 def __init__ ( self, obj, method, msg=None ):
29 if isinstance ( obj, str ):
30 @@ -67,3 +69,40 @@ def abstractmethod ( func=None ):
31 def not_implemented ( func=None ):
32 return _get_exception_wrapper ( MethodNotImplementedError, func )
33 # --- end of not_implemented (...) ---
34 +
35 +
36 +class ObjectView ( object ):
37 +
38 + class ObjectDisappeared ( Exception ):
39 + pass
40 + # --- end of ObjectDisappeared ---
41 +
42 + def __init__ ( self, obj ):
43 + super ( ObjectView, self ).__init__()
44 + self.obj_ref = weakref.ref ( obj ) if obj is not None else None
45 + # --- end of __init__ (...) ---
46 +
47 + def __bool__ ( self ):
48 + return ( self.obj_ref is not None and self.obj_ref() is not None )
49 + # --- end of __bool__ (...) ---
50 +
51 + def deref_unsafe ( self ):
52 + return None if self.obj_ref is None else self.obj_ref()
53 + # --- end of deref_unsafe (...) ---
54 +
55 + def deref_safe ( self ):
56 + obj = None if self.obj_ref is None else self.obj_ref()
57 + if obj is None:
58 + raise self.__class__.ObjectDisappeared()
59 + else:
60 + return obj
61 + # --- end of deref_safe (...) ---
62 +
63 + deref = deref_safe
64 +
65 + @abstractmethod
66 + def update ( self ):
67 + pass
68 + # --- end of update (...) ---
69 +
70 +# --- end of ObjectView ---