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: Fri, 30 Aug 2013 14:49:40
Message-Id: 1377866254.7830c41f7b9838d1c204837b50448cded7a3087b.dywi@gentoo
1 commit: 7830c41f7b9838d1c204837b50448cded7a3087b
2 Author: André Erdmann <dywi <AT> mailerd <DOT> de>
3 AuthorDate: Fri Aug 30 12:37:34 2013 +0000
4 Commit: André Erdmann <dywi <AT> mailerd <DOT> de>
5 CommitDate: Fri Aug 30 12:37:34 2013 +0000
6 URL: http://git.overlays.gentoo.org/gitweb/?p=proj/R_overlay.git;a=commit;h=7830c41f
7
8 roverlay/util/objects: more meaningful error messages
9
10 include parameter list in MethodNotImplementedError/AbstractMethodError (if
11 given).
12
13 ---
14 roverlay/util/objects.py | 94 ++++++++++++++++++++++++++++++++++++++++--------
15 1 file changed, 79 insertions(+), 15 deletions(-)
16
17 diff --git a/roverlay/util/objects.py b/roverlay/util/objects.py
18 index 2bcb7e4..95e63f0 100644
19 --- a/roverlay/util/objects.py
20 +++ b/roverlay/util/objects.py
21 @@ -109,7 +109,48 @@ def get_object_ref ( obj ):
22
23
24 class MethodNotImplementedError ( NotImplementedError ):
25 - def __init__ ( self, obj, method, msg=None ):
26 +
27 + def __init__ ( self, obj, method, msg=None, params=None ):
28 + """Constructor for MethodNotImplementedError.
29 +
30 + arguments:
31 + * obj -- object/class to which the method is bound
32 + * method -- method that is not implemented
33 + * msg -- additional information (if set)
34 + * params -- an iterable of parameters (args/kwargs) that the method
35 + accepts (used for generating more meaningful messages)
36 + """
37 + super ( MethodNotImplementedError, self ).__init__ (
38 + self._get_error_message ( obj, method, msg, params )
39 + )
40 + # --- end of __init__ (...) ---
41 +
42 + # or staticmethod, unbound, ...
43 + @classmethod
44 + def _compare_arg_count ( self, params, method ):
45 + if (
46 + hasattr ( method, '__code__' ) and
47 + hasattr ( method.__code__, 'co_argcount' )
48 + ):
49 + plen = len ( params )
50 + if (
51 + plen != method.__code__.co_argcount and (
52 + params[0] in { 'self', 'cls' } or
53 + ( plen + 1 ) != method.__code__.co_argcount
54 + )
55 + ):
56 + raise AssertionError (
57 + "params, arg count mismatch: {:d} != {:d}".format (
58 + len ( params ), method.__code__.co_argcount
59 + )
60 + )
61 + del plen
62 + # -- end if __debug__
63 + # --- end of _compare_arg_count (...) ---
64 +
65 + @classmethod
66 + def _get_error_message ( cls, obj, method, msg=None, params=None ):
67 + # obj_name =
68 if isinstance ( obj, str ):
69 obj_name = obj
70 elif hasattr ( obj, '__class__' ):
71 @@ -119,6 +160,7 @@ class MethodNotImplementedError ( NotImplementedError ):
72 else:
73 obj_name = repr ( obj )
74
75 + # method_name =
76 if isinstance ( method, str ):
77 method_name = method
78 elif hasattr ( method, '__name__' ):
79 @@ -126,15 +168,23 @@ class MethodNotImplementedError ( NotImplementedError ):
80 else:
81 method_name = repr ( method )
82
83 - method_str = "{}.{}()".format ( obj_name, method_name )
84 + # method str =
85 + if params:
86 + if __debug__:
87 + cls._compare_arg_count ( params, method )
88
89 - if msg:
90 - super ( MethodNotImplementedError, self ).__init__ (
91 - method_str + ': ' + str ( msg )
92 + method_str = "{}.{} ( {} )".format (
93 + obj_name, method_name, ', '.join ( params )
94 )
95 else:
96 - super ( MethodNotImplementedError, self ).__init__ ( method_str )
97 - # --- end of __init__ (...) ---
98 + method_str = "{}.{}()".format ( obj_name, method_name )
99 +
100 + # method_str +=
101 + if msg:
102 + return method_str + ': ' + str ( msg )
103 + else:
104 + return method_str
105 + # --- end of _get_error_message (...) ---
106
107 # --- end of MethodNotImplementedError ---
108
109 @@ -144,14 +194,15 @@ class MethodNotImplemented ( MethodNotImplementedError ):
110 # --- end of MethodNotImplemented ---
111
112 class AbstractMethodError ( MethodNotImplementedError ):
113 - def __init__ ( self, obj, method ):
114 + def __init__ ( self, obj, method, params=None ):
115 super ( AbstractMethodError, self ).__init__ (
116 - obj, method, "has to be implemented by derived classes"
117 + obj, method, "has to be implemented by derived classes",
118 + params=params,
119 )
120
121 # --- end of AbstractMethodError ---
122
123 -def _get_exception_wrapper ( err_cls, func ):
124 +def _create_exception_wrapper ( err_cls, func, err_args=(), err_kwargs={} ):
125 """Returns a method that raises the given exception when called.
126
127 arguments:
128 @@ -162,7 +213,7 @@ def _get_exception_wrapper ( err_cls, func ):
129 * func -- function to be wrapped
130 """
131 def wrapped ( obj, *args, **kwargs ):
132 - raise err_cls ( obj, func )
133 + raise err_cls ( obj, func, *err_args, **err_kwargs )
134 # --- end of wrapped (...) ---
135
136 if func is not None:
137 @@ -170,14 +221,27 @@ def _get_exception_wrapper ( err_cls, func ):
138 wrapped.__doc__ = func.__doc__
139 wrapped.__dict__.update ( func.__dict__ )
140 return wrapped
141 +# --- end of _create_exception_wrapper (...) ---
142 +
143 +def _get_exception_wrapper ( err_cls, func=None, err_args=(), err_kwargs={} ):
144 + if func is None:
145 + return lambda real_func: _create_exception_wrapper (
146 + err_cls, real_func, err_args, err_kwargs
147 + )
148 + else:
149 + return _create_exception_wrapper ( err_cls, func, err_args, err_kwargs )
150 # --- end of _get_exception_wrapper (...) ---
151
152 -def abstractmethod ( func=None ):
153 - return _get_exception_wrapper ( AbstractMethodError, func )
154 +def abstractmethod ( func=None, **kwargs ):
155 + return _get_exception_wrapper (
156 + AbstractMethodError, func, err_kwargs=kwargs
157 + )
158 # --- end of abstractmethod (...) ---
159
160 -def not_implemented ( func=None ):
161 - return _get_exception_wrapper ( MethodNotImplementedError, func )
162 +def not_implemented ( func=None, **kwargs ):
163 + return _get_exception_wrapper (
164 + MethodNotImplementedError, func, err_kwargs=kwargs
165 + )
166 # --- end of not_implemented (...) ---