summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/util.py
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2008-08-28 18:21:42 +0000
committerMike Bayer <mike_mp@zzzcomputing.com>2008-08-28 18:21:42 +0000
commita18035cfb16d8b55e460a9f3752c3b9f697e7729 (patch)
treecb975fd218e3a81d88b2f97310e5cadd9433b4ed /lib/sqlalchemy/util.py
parentaf342bba5600fc312f8efc1d3942301c57ca845f (diff)
downloadsqlalchemy-a18035cfb16d8b55e460a9f3752c3b9f697e7729.tar.gz
- starargs_as_list was not actually issuing SAPendingDeprecationWarning, fixed
- implemented code cleanup from [ticket:1152] but not including using the decorators module
Diffstat (limited to 'lib/sqlalchemy/util.py')
-rw-r--r--lib/sqlalchemy/util.py157
1 files changed, 47 insertions, 110 deletions
diff --git a/lib/sqlalchemy/util.py b/lib/sqlalchemy/util.py
index 24ac0a97e..32d6e3efa 100644
--- a/lib/sqlalchemy/util.py
+++ b/lib/sqlalchemy/util.py
@@ -94,7 +94,6 @@ except ImportError:
return 'defaultdict(%s, %s)' % (self.default_factory,
dict.__repr__(self))
-
def to_list(x, default=None):
if x is None:
return default
@@ -103,6 +102,15 @@ def to_list(x, default=None):
else:
return x
+def to_set(x):
+ if x is None:
+ return set()
+ if not isinstance(x, set):
+ return set(to_list(x))
+ else:
+ return x
+
+
try:
from functools import update_wrapper
except ImportError:
@@ -121,44 +129,31 @@ def accepts_a_list_as_starargs(list_deprecation=None):
spec = inspect.getargspec(fn)
assert spec[1], 'Decorated function does not accept *args'
- meta = format_argspec_plus(spec)
- meta['name'] = fn.func_name
- meta['varg'] = spec[1]
- scratch = list(spec)
- scratch[1] = '(%s[0])' % scratch[1]
- meta['unpacked_pos'] = format_argspec_plus(scratch)['apply_pos']
-
def _deprecate():
if list_deprecation:
if list_deprecation == 'pending':
warning_type = exc.SAPendingDeprecationWarning
else:
warning_type = exc.SADeprecationWarning
- msg = (
- "%s%s now accepts multiple %s arguments as a "
- "variable argument list. Supplying %s as a single "
- "list is deprecated and support will be removed "
- "in a future release." % (
- fn.func_name,
- inspect.formatargspec(*spec),
- spec[1], spec[1]))
- warnings.warn(msg, warning_type, stacklevel=3)
-
- code = "\n".join((
- "def %(name)s%(args)s:",
- " if len(%(varg)s) == 1 and isinstance(%(varg)s[0], list):",
- " _deprecate()",
- " return fn%(unpacked_pos)s",
- " else:",
- " return fn%(apply_pos)s")) % meta
-
- env = locals().copy()
- exec code in env
- decorated = env[fn.func_name]
- decorated.func_defaults = fn.func_defaults
- update_wrapper(decorated, fn)
- decorated.generated_src = code
- return decorated
+ msg = (
+ "%s%s now accepts multiple %s arguments as a "
+ "variable argument list. Supplying %s as a single "
+ "list is deprecated and support will be removed "
+ "in a future release." % (
+ fn.func_name,
+ inspect.formatargspec(*spec),
+ spec[1], spec[1]))
+ warnings.warn(msg, warning_type, stacklevel=3)
+
+ def go(fn, *args, **kw):
+ if isinstance(args[-1], list):
+ _deprecate()
+ return fn(*(list(args[0:-1]) + args[-1]), **kw)
+ else:
+ return fn(*args, **kw)
+
+ return decorator(go)(fn)
+
return decorate
def unique_symbols(used, *bases):
@@ -193,23 +188,6 @@ def decorator(target):
return update_wrapper(decorated, fn)
return update_wrapper(decorate, target)
-def to_set(x):
- if x is None:
- return set()
- if not isinstance(x, set):
- return set(to_list(x))
- else:
- return x
-
-def to_ascii(x):
- """Convert Unicode or a string with unknown encoding into ASCII."""
-
- if isinstance(x, str):
- return x.encode('string_escape')
- elif isinstance(x, unicode):
- return x.encode('unicode_escape')
- else:
- raise TypeError
if sys.version_info >= (2, 5):
def decode_slice(slc):
@@ -583,42 +561,6 @@ def monkeypatch_proxied_specials(into_cls, from_cls, skip=None, only=None,
pass
setattr(into_cls, method, env[method])
-class SimpleProperty(object):
- """A *default* property accessor."""
-
- def __init__(self, key):
- self.key = key
-
- def __set__(self, obj, value):
- setattr(obj, self.key, value)
-
- def __delete__(self, obj):
- delattr(obj, self.key)
-
- def __get__(self, obj, owner):
- if obj is None:
- return self
- else:
- return getattr(obj, self.key)
-
-
-class NotImplProperty(object):
- """a property that raises ``NotImplementedError``."""
-
- def __init__(self, doc):
- self.__doc__ = doc
-
- def __set__(self, obj, value):
- raise NotImplementedError()
-
- def __delete__(self, obj):
- raise NotImplementedError()
-
- def __get__(self, obj, owner):
- if obj is None:
- return self
- else:
- raise NotImplementedError()
class OrderedProperties(object):
"""An object that maintains the order in which attributes are set upon it.
@@ -1087,7 +1029,7 @@ class OrderedIdentitySet(IdentitySet):
class UniqueAppender(object):
- """Only adds items to a collection once.
+ """Appends items to a collection ensuring uniqueness.
Additional appends() of the same object are ignored. Membership is
determined by identity (``is a``) not equality (``==``).
@@ -1344,21 +1286,20 @@ def function_named(fn, name):
fn.func_defaults, fn.func_closure)
return fn
-def cache_decorator(func):
+@decorator
+def memoize(fn, self):
"""apply caching to the return value of a function."""
- name = '_cached_' + func.__name__
+ name = '_cached_' + fn.__name__
- def do_with_cache(self, *args, **kwargs):
- try:
- return getattr(self, name)
- except AttributeError:
- value = func(self, *args, **kwargs)
- setattr(self, name, value)
- return value
- return do_with_cache
+ try:
+ return getattr(self, name)
+ except AttributeError:
+ value = fn(self)
+ setattr(self, name, value)
+ return value
-def reset_cached(instance, name):
+def reset_memoized(instance, name):
try:
delattr(instance, '_cached_' + name)
except AttributeError:
@@ -1438,18 +1379,14 @@ class WeakIdentityMapping(weakref.WeakKeyDictionary):
del self.by_id[key]
except (KeyError, AttributeError): # pragma: no cover
pass # pragma: no cover
- if sys.version_info < (2, 4): # pragma: no cover
- def _ref(self, object):
- oid = id(object)
- return weakref.ref(object, lambda wr: self._cleanup(wr, oid))
- else:
- class _keyed_weakref(weakref.ref):
- def __init__(self, object, callback):
- weakref.ref.__init__(self, object, callback)
- self.key = id(object)
-
- def _ref(self, object):
- return self._keyed_weakref(object, self._cleanup)
+
+ class _keyed_weakref(weakref.ref):
+ def __init__(self, object, callback):
+ weakref.ref.__init__(self, object, callback)
+ self.key = id(object)
+
+ def _ref(self, object):
+ return self._keyed_weakref(object, self._cleanup)
def warn(msg):