diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2008-08-28 18:21:42 +0000 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2008-08-28 18:21:42 +0000 |
commit | a18035cfb16d8b55e460a9f3752c3b9f697e7729 (patch) | |
tree | cb975fd218e3a81d88b2f97310e5cadd9433b4ed /lib/sqlalchemy/util.py | |
parent | af342bba5600fc312f8efc1d3942301c57ca845f (diff) | |
download | sqlalchemy-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.py | 157 |
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): |