Skip to content
This repository was archived by the owner on Oct 23, 2023. It is now read-only.

Commit 8530ba1

Browse files
chebee7iashwoods
authored andcommitted
Move generic utils from __init__.py to basic.py.
1 parent f4f512d commit 8530ba1

2 files changed

Lines changed: 88 additions & 80 deletions

File tree

raven/utils/__init__.py

Lines changed: 3 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -7,51 +7,18 @@
77
"""
88
from __future__ import absolute_import
99

10-
from raven.utils.compat import iteritems, string_types
1110
import logging
12-
import threading
13-
from functools import update_wrapper
1411
try:
1512
import pkg_resources
1613
except ImportError:
1714
pkg_resources = None # NOQA
1815
import sys
1916

20-
logger = logging.getLogger('raven.errors')
17+
from raven.utils.compat import iteritems, string_types
18+
from raven.utils.basic import merge_dicts, varmap, memoize, once
2119

2220

23-
def merge_dicts(*dicts):
24-
out = {}
25-
for d in dicts:
26-
if not d:
27-
continue
28-
29-
for k, v in iteritems(d):
30-
out[k] = v
31-
return out
32-
33-
34-
def varmap(func, var, context=None, name=None):
35-
"""
36-
Executes ``func(key_name, value)`` on all values
37-
recurisively discovering dict and list scoped
38-
values.
39-
"""
40-
if context is None:
41-
context = {}
42-
objid = id(var)
43-
if objid in context:
44-
return func(name, '<...>')
45-
context[objid] = 1
46-
if isinstance(var, (list, tuple)):
47-
ret = [varmap(func, f, context, name) for f in var]
48-
else:
49-
ret = func(name, var)
50-
if isinstance(ret, dict):
51-
ret = dict((k, varmap(func, v, context, k))
52-
for k, v in iteritems(var))
53-
del context[objid]
54-
return ret
21+
logger = logging.getLogger('raven.errors')
5522

5623

5724
# We store a cache of module_name->version string to avoid
@@ -144,47 +111,3 @@ def get_auth_header(protocol, timestamp, client, api_key,
144111
header.append(('sentry_secret', api_secret))
145112

146113
return 'Sentry %s' % ', '.join('%s=%s' % (k, v) for k, v in header)
147-
148-
149-
class memoize(object):
150-
"""
151-
Memoize the result of a property call.
152-
153-
>>> class A(object):
154-
>>> @memoize
155-
>>> def func(self):
156-
>>> return 'foo'
157-
"""
158-
159-
def __init__(self, func):
160-
self.__name__ = func.__name__
161-
self.__module__ = func.__module__
162-
self.__doc__ = func.__doc__
163-
self.func = func
164-
165-
def __get__(self, obj, type=None):
166-
if obj is None:
167-
return self
168-
d, n = vars(obj), self.__name__
169-
if n not in d:
170-
d[n] = self.func(obj)
171-
return d[n]
172-
173-
174-
def once(func):
175-
"""Runs a thing once and once only."""
176-
lock = threading.Lock()
177-
178-
def new_func(*args, **kwargs):
179-
if new_func.called:
180-
return
181-
with lock:
182-
if new_func.called:
183-
return
184-
rv = func(*args, **kwargs)
185-
new_func.called = True
186-
return rv
187-
188-
new_func = update_wrapper(new_func, func)
189-
new_func.called = False
190-
return new_func

raven/utils/basic.py

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
from __future__ import absolute_import
2+
3+
from functools import update_wrapper
4+
import threading
5+
6+
from raven.utils.compat import iteritems
7+
8+
9+
def merge_dicts(*dicts):
10+
out = {}
11+
for d in dicts:
12+
if not d:
13+
continue
14+
15+
for k, v in iteritems(d):
16+
out[k] = v
17+
return out
18+
19+
20+
def varmap(func, var, context=None, name=None):
21+
"""
22+
Executes ``func(key_name, value)`` on all values
23+
recurisively discovering dict and list scoped
24+
values.
25+
"""
26+
if context is None:
27+
context = {}
28+
objid = id(var)
29+
if objid in context:
30+
return func(name, '<...>')
31+
context[objid] = 1
32+
33+
if isinstance(var, (list, tuple)):
34+
ret = [varmap(func, f, context, name) for f in var]
35+
else:
36+
ret = func(name, var)
37+
if isinstance(ret, dict):
38+
ret = dict((k, varmap(func, v, context, k))
39+
for k, v in iteritems(var))
40+
del context[objid]
41+
return ret
42+
43+
44+
class memoize(object):
45+
"""
46+
Memoize the result of a property call.
47+
48+
>>> class A(object):
49+
>>> @memoize
50+
>>> def func(self):
51+
>>> return 'foo'
52+
"""
53+
54+
def __init__(self, func):
55+
self.__name__ = func.__name__
56+
self.__module__ = func.__module__
57+
self.__doc__ = func.__doc__
58+
self.func = func
59+
60+
def __get__(self, obj, type=None):
61+
if obj is None:
62+
return self
63+
d, n = vars(obj), self.__name__
64+
if n not in d:
65+
d[n] = self.func(obj)
66+
return d[n]
67+
68+
69+
def once(func):
70+
"""Runs a thing once and once only."""
71+
lock = threading.Lock()
72+
73+
def new_func(*args, **kwargs):
74+
if new_func.called:
75+
return
76+
with lock:
77+
if new_func.called:
78+
return
79+
rv = func(*args, **kwargs)
80+
new_func.called = True
81+
return rv
82+
83+
new_func = update_wrapper(new_func, func)
84+
new_func.called = False
85+
return new_func

0 commit comments

Comments
 (0)