|
a/Allura/allura/lib/utils.py |
|
b/Allura/allura/lib/utils.py |
|
... |
|
... |
7 |
from pylons import response
|
7 |
from pylons import response
|
8 |
from pkg_resources import iter_entry_points
|
8 |
from pkg_resources import iter_entry_points
|
9 |
from paste.httpheaders import CACHE_CONTROL, EXPIRES
|
9 |
from paste.httpheaders import CACHE_CONTROL, EXPIRES
|
10 |
|
10 |
|
11 |
from ming.utils import LazyProperty
|
11 |
from ming.utils import LazyProperty
|
12 |
|
|
|
13 |
class exceptionless(object):
|
|
|
14 |
'''Decorator making the decorated function return 'error_result' on any
|
|
|
15 |
exceptions rather than propagating exceptions up the stack
|
|
|
16 |
'''
|
|
|
17 |
|
|
|
18 |
def __init__(self, error_result, log=None):
|
|
|
19 |
self.error_result = error_result
|
|
|
20 |
self.log = log
|
|
|
21 |
|
|
|
22 |
def __call__(self, fun):
|
|
|
23 |
fname = 'exceptionless(%s)' % fun.__name__
|
|
|
24 |
def inner(*args, **kwargs):
|
|
|
25 |
try:
|
|
|
26 |
return fun(*args, **kwargs)
|
|
|
27 |
except:
|
|
|
28 |
if self.log:
|
|
|
29 |
self.log.exception('Error calling %s', fname)
|
|
|
30 |
return self.error_result
|
|
|
31 |
inner.__name__ = fname
|
|
|
32 |
return inner
|
|
|
33 |
|
12 |
|
34 |
def cache_forever():
|
13 |
def cache_forever():
|
35 |
headers = [
|
14 |
headers = [
|
36 |
(k,v) for k,v in response.headers.items()
|
15 |
(k,v) for k,v in response.headers.items()
|
37 |
if k.lower() not in ('pragma', 'cache-control') ]
|
16 |
if k.lower() not in ('pragma', 'cache-control') ]
|
|
... |
|
... |
107 |
record.kwpairs = ','.join(
|
86 |
record.kwpairs = ','.join(
|
108 |
'%s=%s' % (k,v) for k,v in sorted(kwpairs.iteritems())
|
87 |
'%s=%s' % (k,v) for k,v in sorted(kwpairs.iteritems())
|
109 |
if v is not None)
|
88 |
if v is not None)
|
110 |
record.exc_info = None # Never put tracebacks in the rtstats log
|
89 |
record.exc_info = None # Never put tracebacks in the rtstats log
|
111 |
WatchedFileHandler.emit(self, record)
|
90 |
WatchedFileHandler.emit(self, record)
|
112 |
|
|
|
113 |
def task(func):
|
|
|
114 |
'''Decorator to add some methods to task functions'''
|
|
|
115 |
def post(*args, **kwargs):
|
|
|
116 |
from allura import model as M
|
|
|
117 |
return M.MonQTask.post(func, *args, **kwargs)
|
|
|
118 |
func.post = post
|
|
|
119 |
return func
|
|
|
120 |
|
|
|
121 |
_event_listeners = None
|
|
|
122 |
def event_listeners(event_type):
|
|
|
123 |
global _event_listeners
|
|
|
124 |
if _event_listeners is None:
|
|
|
125 |
l = defaultdict(list)
|
|
|
126 |
for ep in iter_entry_points('allura'):
|
|
|
127 |
tool = ep.load()
|
|
|
128 |
for name, listeners in tool.event_listeners:
|
|
|
129 |
_event_listeners[name] += listeners
|
|
|
130 |
_event_listeners = l
|
|
|
131 |
return _event_listeners[event_type]
|
|
|