diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2013-04-21 17:18:49 -0400 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2013-04-21 17:18:49 -0400 |
commit | 3aff498e4a96eda06f09f09f98e73e135719b388 (patch) | |
tree | f1ca2029cfd147478447d3cb98bae587a8ccb3c2 /lib/sqlalchemy/util/compat.py | |
parent | 1f6528ed8581ba63721bdc2a0593a5d39b9c27e0 (diff) | |
parent | fbcdba12f88d88c509fc34eb8aab3f501d1b705b (diff) | |
download | sqlalchemy-3aff498e4a96eda06f09f09f98e73e135719b388.tar.gz |
merge into cymysql branch...
Diffstat (limited to 'lib/sqlalchemy/util/compat.py')
-rw-r--r-- | lib/sqlalchemy/util/compat.py | 184 |
1 files changed, 32 insertions, 152 deletions
diff --git a/lib/sqlalchemy/util/compat.py b/lib/sqlalchemy/util/compat.py index 3725a8491..033a87cc7 100644 --- a/lib/sqlalchemy/util/compat.py +++ b/lib/sqlalchemy/util/compat.py @@ -54,44 +54,6 @@ else: except ImportError: import pickle - -# a controversial feature, required by MySQLdb currently -def buffer(x): - return x - -# Py2K -buffer = buffer -# end Py2K - -try: - from contextlib import contextmanager -except ImportError: - def contextmanager(fn): - return fn - -try: - from functools import update_wrapper -except ImportError: - def update_wrapper(wrapper, wrapped, - assigned=('__doc__', '__module__', '__name__'), - updated=('__dict__',)): - for attr in assigned: - setattr(wrapper, attr, getattr(wrapped, attr)) - for attr in updated: - getattr(wrapper, attr).update(getattr(wrapped, attr, ())) - return wrapper - -try: - from functools import partial -except ImportError: - def partial(func, *args, **keywords): - def newfunc(*fargs, **fkeywords): - newkeywords = keywords.copy() - newkeywords.update(fkeywords) - return func(*(args + fargs), **newkeywords) - return newfunc - - if sys.version_info < (2, 6): # emits a nasty deprecation warning # in newer pythons @@ -132,52 +94,6 @@ except ImportError: return tuptype try: - from collections import defaultdict -except ImportError: - class defaultdict(dict): - - def __init__(self, default_factory=None, *a, **kw): - if (default_factory is not None and - not hasattr(default_factory, '__call__')): - raise TypeError('first argument must be callable') - dict.__init__(self, *a, **kw) - self.default_factory = default_factory - - def __getitem__(self, key): - try: - return dict.__getitem__(self, key) - except KeyError: - return self.__missing__(key) - - def __missing__(self, key): - if self.default_factory is None: - raise KeyError(key) - self[key] = value = self.default_factory() - return value - - def __reduce__(self): - if self.default_factory is None: - args = tuple() - else: - args = self.default_factory, - return type(self), args, None, None, self.iteritems() - - def copy(self): - return self.__copy__() - - def __copy__(self): - return type(self)(self.default_factory, self) - - def __deepcopy__(self, memo): - import copy - return type(self)(self.default_factory, - copy.deepcopy(self.items())) - - def __repr__(self): - return 'defaultdict(%s, %s)' % (self.default_factory, - dict.__repr__(self)) - -try: from weakref import WeakSet except: import weakref @@ -199,79 +115,12 @@ except: def add(self, other): self._storage[other] = True - -# find or create a dict implementation that supports __missing__ -class _probe(dict): - def __missing__(self, key): - return 1 - -try: - try: - _probe()['missing'] - py25_dict = dict - except KeyError: - class py25_dict(dict): - def __getitem__(self, key): - try: - return dict.__getitem__(self, key) - except KeyError: - try: - missing = self.__missing__ - except AttributeError: - raise KeyError(key) - else: - return missing(key) -finally: - del _probe - - -try: - import hashlib - _md5 = hashlib.md5 -except ImportError: - import md5 - _md5 = md5.new - - -def md5_hex(x): - # Py3K - #x = x.encode('utf-8') - m = _md5() - m.update(x) - return m.hexdigest() - import time if win32 or jython: time_func = time.clock else: time_func = time.time -if sys.version_info >= (2, 5): - any = any -else: - def any(iterator): - for item in iterator: - if bool(item): - return True - else: - return False - -if sys.version_info >= (2, 5): - def decode_slice(slc): - """decode a slice object as sent to __getitem__. - - takes into account the 2.5 __index__() method, basically. - - """ - ret = [] - for x in slc.start, slc.stop, slc.step: - if hasattr(x, '__index__'): - x = x.__index__() - ret.append(x) - return tuple(ret) -else: - def decode_slice(slc): - return (slc.start, slc.stop, slc.step) if sys.version_info >= (2, 6): from operator import attrgetter as dottedgetter @@ -283,5 +132,36 @@ else: return obj return g +# Adapted from six.py +if py3k: + def b(s): + return s.encode("latin-1") +else: + def b(s): + return s + + +if py3k: + def reraise(tp, value, tb=None, cause=None): + if cause is not None: + value.__cause__ = cause + if value.__traceback__ is not tb: + raise value.with_traceback(tb) + raise value + + def raise_from_cause(exception, exc_info): + exc_type, exc_value, exc_tb = exc_info + reraise(type(exception), exception, tb=exc_tb, cause=exc_value) +else: + exec("def reraise(tp, value, tb=None, cause=None):\n" + " raise tp, value, tb\n") + + def raise_from_cause(exception, exc_info): + # not as nice as that of Py3K, but at least preserves + # the code line where the issue occurred + exc_type, exc_value, exc_tb = exc_info + reraise(type(exception), exception, tb=exc_tb) + + + -import decimal |