56 from cubicweb.cwconfig import CubicWebConfiguration |
56 from cubicweb.cwconfig import CubicWebConfiguration |
57 from cubicweb.schema import split_expression |
57 from cubicweb.schema import split_expression |
58 |
58 |
59 # helpers for debugging selectors |
59 # helpers for debugging selectors |
60 SELECTOR_LOGGER = logging.getLogger('cubicweb.selectors') |
60 SELECTOR_LOGGER = logging.getLogger('cubicweb.selectors') |
61 TRACED_OIDS = () |
61 TRACED_OIDS = None |
|
62 |
|
63 def _trace_selector(cls, ret): |
|
64 # /!\ lltrace decorates pure function or __call__ method, this |
|
65 # means argument order may be different |
|
66 if isinstance(cls, Selector): |
|
67 selname = str(cls) |
|
68 vobj = args[0] |
|
69 else: |
|
70 selname = selector.__name__ |
|
71 vobj = cls |
|
72 if TRACED_OIDS == 'all' or class_regid(vobj) in TRACED_OIDS: |
|
73 #SELECTOR_LOGGER.warning('selector %s returned %s for %s', selname, ret, cls) |
|
74 print '%s -> %s for %s(%s)' % (selname, ret, vobj, vobj.__regid__) |
62 |
75 |
63 def lltrace(selector): |
76 def lltrace(selector): |
64 # don't wrap selectors if not in development mode |
77 # don't wrap selectors if not in development mode |
65 if CubicWebConfiguration.mode == 'system': # XXX config.debug |
78 if CubicWebConfiguration.mode == 'system': # XXX config.debug |
66 return selector |
79 return selector |
67 def traced(cls, *args, **kwargs): |
80 def traced(cls, *args, **kwargs): |
68 # /!\ lltrace decorates pure function or __call__ method, this |
|
69 # means argument order may be different |
|
70 if isinstance(cls, Selector): |
|
71 selname = str(cls) |
|
72 vobj = args[0] |
|
73 else: |
|
74 selname = selector.__name__ |
|
75 vobj = cls |
|
76 oid = class_regid(vobj) |
|
77 ret = selector(cls, *args, **kwargs) |
81 ret = selector(cls, *args, **kwargs) |
78 if TRACED_OIDS == 'all' or oid in TRACED_OIDS: |
82 if TRACED_OIDS is not None: |
79 #SELECTOR_LOGGER.warning('selector %s returned %s for %s', selname, ret, cls) |
83 _trace_selector(cls, ret) |
80 print '%s -> %s for %s(%s)' % (selname, ret, vobj, vobj.__regid__) |
|
81 return ret |
84 return ret |
82 traced.__name__ = selector.__name__ |
85 traced.__name__ = selector.__name__ |
83 traced.__doc__ = selector.__doc__ |
86 traced.__doc__ = selector.__doc__ |
84 return traced |
87 return traced |
85 |
88 |
106 global TRACED_OIDS |
109 global TRACED_OIDS |
107 TRACED_OIDS = self.traced |
110 TRACED_OIDS = self.traced |
108 |
111 |
109 def __exit__(self, exctype, exc, traceback): |
112 def __exit__(self, exctype, exc, traceback): |
110 global TRACED_OIDS |
113 global TRACED_OIDS |
111 TRACED_OIDS = () |
114 TRACED_OIDS = None |
112 return traceback is None |
115 return traceback is None |
113 |
116 |
114 |
117 |
115 def score_interface(etypesreg, cls_or_inst, cls, iface): |
118 def score_interface(etypesreg, cls_or_inst, cls, iface): |
116 """Return XXX if the give object (maybe an instance or class) implements |
119 """Return XXX if the give object (maybe an instance or class) implements |