selectors.py
changeset 5121 a63d7886fcf5
parent 5094 13b7f30db0bb
child 5143 43afbdd5c8b4
equal deleted inserted replaced
5082:d6fd82a5a4e8 5121:a63d7886fcf5
    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