summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/util
diff options
context:
space:
mode:
Diffstat (limited to 'lib/sqlalchemy/util')
-rw-r--r--lib/sqlalchemy/util/__init__.py170
-rw-r--r--lib/sqlalchemy/util/_collections.py122
-rw-r--r--lib/sqlalchemy/util/compat.py100
-rw-r--r--lib/sqlalchemy/util/deprecations.py35
-rw-r--r--lib/sqlalchemy/util/langhelpers.py423
-rw-r--r--lib/sqlalchemy/util/queue.py2
-rw-r--r--lib/sqlalchemy/util/topological.py12
7 files changed, 546 insertions, 318 deletions
diff --git a/lib/sqlalchemy/util/__init__.py b/lib/sqlalchemy/util/__init__.py
index d8c28d6af..103225e2a 100644
--- a/lib/sqlalchemy/util/__init__.py
+++ b/lib/sqlalchemy/util/__init__.py
@@ -5,42 +5,146 @@
# This module is part of SQLAlchemy and is released under
# the MIT License: http://www.opensource.org/licenses/mit-license.php
-from .compat import callable, cmp, reduce, \
- threading, py3k, py33, py36, py2k, jython, pypy, cpython, win32, \
- pickle, dottedgetter, parse_qsl, namedtuple, next, reraise, \
- raise_from_cause, text_type, safe_kwarg, string_types, int_types, \
- binary_type, nested, \
- quote_plus, with_metaclass, print_, itertools_filterfalse, u, ue, b,\
- unquote_plus, unquote, b64decode, b64encode, byte_buffer, itertools_filter,\
- iterbytes, StringIO, inspect_getargspec, zip_longest
+from .compat import (
+ callable,
+ cmp,
+ reduce,
+ threading,
+ py3k,
+ py33,
+ py36,
+ py2k,
+ jython,
+ pypy,
+ cpython,
+ win32,
+ pickle,
+ dottedgetter,
+ parse_qsl,
+ namedtuple,
+ next,
+ reraise,
+ raise_from_cause,
+ text_type,
+ safe_kwarg,
+ string_types,
+ int_types,
+ binary_type,
+ nested,
+ quote_plus,
+ with_metaclass,
+ print_,
+ itertools_filterfalse,
+ u,
+ ue,
+ b,
+ unquote_plus,
+ unquote,
+ b64decode,
+ b64encode,
+ byte_buffer,
+ itertools_filter,
+ iterbytes,
+ StringIO,
+ inspect_getargspec,
+ zip_longest,
+)
-from ._collections import KeyedTuple, ImmutableContainer, immutabledict, \
- Properties, OrderedProperties, ImmutableProperties, OrderedDict, \
- OrderedSet, IdentitySet, OrderedIdentitySet, column_set, \
- column_dict, ordered_column_set, populate_column_dict, unique_list, \
- UniqueAppender, PopulateDict, EMPTY_SET, to_list, to_set, \
- to_column_set, update_copy, flatten_iterator, has_intersection, \
- LRUCache, ScopedRegistry, ThreadLocalRegistry, WeakSequence, \
- coerce_generator_arg, lightweight_named_tuple, collections_abc, \
- has_dupes
+from ._collections import (
+ KeyedTuple,
+ ImmutableContainer,
+ immutabledict,
+ Properties,
+ OrderedProperties,
+ ImmutableProperties,
+ OrderedDict,
+ OrderedSet,
+ IdentitySet,
+ OrderedIdentitySet,
+ column_set,
+ column_dict,
+ ordered_column_set,
+ populate_column_dict,
+ unique_list,
+ UniqueAppender,
+ PopulateDict,
+ EMPTY_SET,
+ to_list,
+ to_set,
+ to_column_set,
+ update_copy,
+ flatten_iterator,
+ has_intersection,
+ LRUCache,
+ ScopedRegistry,
+ ThreadLocalRegistry,
+ WeakSequence,
+ coerce_generator_arg,
+ lightweight_named_tuple,
+ collections_abc,
+ has_dupes,
+)
-from .langhelpers import iterate_attributes, class_hierarchy, \
- portable_instancemethod, unbound_method_to_callable, \
- getargspec_init, format_argspec_init, format_argspec_plus, \
- get_func_kwargs, get_cls_kwargs, decorator, as_interface, \
- memoized_property, memoized_instancemethod, md5_hex, \
- group_expirable_memoized_property, dependencies, decode_slice, \
- monkeypatch_proxied_specials, asbool, bool_or_str, coerce_kw_type,\
- duck_type_collection, assert_arg_type, symbol, dictlike_iteritems,\
- classproperty, set_creation_order, warn_exception, warn, NoneType,\
- constructor_copy, methods_equivalent, chop_traceback, asint,\
- generic_repr, counter, PluginLoader, hybridproperty, hybridmethod, \
- safe_reraise, quoted_token_parser,\
- get_callable_argspec, only_once, attrsetter, ellipses_string, \
- warn_limited, map_bits, MemoizedSlots, EnsureKWArgType, wrap_callable
+from .langhelpers import (
+ iterate_attributes,
+ class_hierarchy,
+ portable_instancemethod,
+ unbound_method_to_callable,
+ getargspec_init,
+ format_argspec_init,
+ format_argspec_plus,
+ get_func_kwargs,
+ get_cls_kwargs,
+ decorator,
+ as_interface,
+ memoized_property,
+ memoized_instancemethod,
+ md5_hex,
+ group_expirable_memoized_property,
+ dependencies,
+ decode_slice,
+ monkeypatch_proxied_specials,
+ asbool,
+ bool_or_str,
+ coerce_kw_type,
+ duck_type_collection,
+ assert_arg_type,
+ symbol,
+ dictlike_iteritems,
+ classproperty,
+ set_creation_order,
+ warn_exception,
+ warn,
+ NoneType,
+ constructor_copy,
+ methods_equivalent,
+ chop_traceback,
+ asint,
+ generic_repr,
+ counter,
+ PluginLoader,
+ hybridproperty,
+ hybridmethod,
+ safe_reraise,
+ quoted_token_parser,
+ get_callable_argspec,
+ only_once,
+ attrsetter,
+ ellipses_string,
+ warn_limited,
+ map_bits,
+ MemoizedSlots,
+ EnsureKWArgType,
+ wrap_callable,
+)
-from .deprecations import warn_deprecated, warn_pending_deprecation, \
- deprecated, pending_deprecation, inject_docstring_text
+from .deprecations import (
+ warn_deprecated,
+ warn_pending_deprecation,
+ deprecated,
+ pending_deprecation,
+ inject_docstring_text,
+)
# things that used to be not always available,
# but are now as of current support Python versions
diff --git a/lib/sqlalchemy/util/_collections.py b/lib/sqlalchemy/util/_collections.py
index 43440134a..67be0e6bf 100644
--- a/lib/sqlalchemy/util/_collections.py
+++ b/lib/sqlalchemy/util/_collections.py
@@ -10,8 +10,13 @@
from __future__ import absolute_import
import weakref
import operator
-from .compat import threading, itertools_filterfalse, string_types, \
- binary_types, collections_abc
+from .compat import (
+ threading,
+ itertools_filterfalse,
+ string_types,
+ binary_types,
+ collections_abc,
+)
from . import py2k
import types
@@ -77,7 +82,7 @@ class KeyedTuple(AbstractKeyedTuple):
t.__dict__.update(zip(labels, vals))
else:
labels = []
- t.__dict__['_labels'] = labels
+ t.__dict__["_labels"] = labels
return t
@property
@@ -139,8 +144,7 @@ class ImmutableContainer(object):
class immutabledict(ImmutableContainer, dict):
- clear = pop = popitem = setdefault = \
- update = ImmutableContainer._immutable
+ clear = pop = popitem = setdefault = update = ImmutableContainer._immutable
def __new__(cls, *args):
new = dict.__new__(cls)
@@ -151,7 +155,7 @@ class immutabledict(ImmutableContainer, dict):
pass
def __reduce__(self):
- return immutabledict, (dict(self), )
+ return immutabledict, (dict(self),)
def union(self, d):
if not d:
@@ -173,10 +177,10 @@ class immutabledict(ImmutableContainer, dict):
class Properties(object):
"""Provide a __getattr__/__setattr__ interface over a dict."""
- __slots__ = '_data',
+ __slots__ = ("_data",)
def __init__(self, data):
- object.__setattr__(self, '_data', data)
+ object.__setattr__(self, "_data", data)
def __len__(self):
return len(self._data)
@@ -185,7 +189,9 @@ class Properties(object):
return iter(list(self._data.values()))
def __dir__(self):
- return dir(super(Properties, self)) + [str(k) for k in self._data.keys()]
+ return dir(super(Properties, self)) + [
+ str(k) for k in self._data.keys()
+ ]
def __add__(self, other):
return list(self) + list(other)
@@ -203,10 +209,10 @@ class Properties(object):
self._data[key] = obj
def __getstate__(self):
- return {'_data': self._data}
+ return {"_data": self._data}
def __setstate__(self, state):
- object.__setattr__(self, '_data', state['_data'])
+ object.__setattr__(self, "_data", state["_data"])
def __getattr__(self, key):
try:
@@ -266,7 +272,7 @@ class ImmutableProperties(ImmutableContainer, Properties):
class OrderedDict(dict):
"""A dict that returns keys/values/items in the order they were added."""
- __slots__ = '_list',
+ __slots__ = ("_list",)
def __reduce__(self):
return OrderedDict, (self.items(),)
@@ -294,7 +300,7 @@ class OrderedDict(dict):
def update(self, ____sequence=None, **kwargs):
if ____sequence is not None:
- if hasattr(____sequence, 'keys'):
+ if hasattr(____sequence, "keys"):
for key in ____sequence.keys():
self.__setitem__(key, ____sequence[key])
else:
@@ -323,6 +329,7 @@ class OrderedDict(dict):
return [(key, self[key]) for key in self._list]
if py2k:
+
def itervalues(self):
return iter(self.values())
@@ -402,7 +409,7 @@ class OrderedSet(set):
return self.union(other)
def __repr__(self):
- return '%s(%r)' % (self.__class__.__name__, self._list)
+ return "%s(%r)" % (self.__class__.__name__, self._list)
__str__ = __repr__
@@ -502,13 +509,13 @@ class IdentitySet(object):
pair = self._members.popitem()
return pair[1]
except KeyError:
- raise KeyError('pop from an empty set')
+ raise KeyError("pop from an empty set")
def clear(self):
self._members.clear()
def __cmp__(self, other):
- raise TypeError('cannot compare sets using cmp()')
+ raise TypeError("cannot compare sets using cmp()")
def __eq__(self, other):
if isinstance(other, IdentitySet):
@@ -527,8 +534,9 @@ class IdentitySet(object):
if len(self) > len(other):
return False
- for m in itertools_filterfalse(other._members.__contains__,
- iter(self._members.keys())):
+ for m in itertools_filterfalse(
+ other._members.__contains__, iter(self._members.keys())
+ ):
return False
return True
@@ -548,8 +556,9 @@ class IdentitySet(object):
if len(self) < len(other):
return False
- for m in itertools_filterfalse(self._members.__contains__,
- iter(other._members.keys())):
+ for m in itertools_filterfalse(
+ self._members.__contains__, iter(other._members.keys())
+ ):
return False
return True
@@ -635,7 +644,8 @@ class IdentitySet(object):
members = self._member_id_tuples()
other = _iter_id(iterable)
result._members.update(
- self._working_set(members).symmetric_difference(other))
+ self._working_set(members).symmetric_difference(other)
+ )
return result
def _member_id_tuples(self):
@@ -667,10 +677,10 @@ class IdentitySet(object):
return iter(self._members.values())
def __hash__(self):
- raise TypeError('set objects are unhashable')
+ raise TypeError("set objects are unhashable")
def __repr__(self):
- return '%s(%r)' % (type(self).__name__, list(self._members.values()))
+ return "%s(%r)" % (type(self).__name__, list(self._members.values()))
class WeakSequence(object):
@@ -689,8 +699,9 @@ class WeakSequence(object):
return len(self._storage)
def __iter__(self):
- return (obj for obj in
- (ref() for ref in self._storage) if obj is not None)
+ return (
+ obj for obj in (ref() for ref in self._storage) if obj is not None
+ )
def __getitem__(self, index):
try:
@@ -732,6 +743,7 @@ class PopulateDict(dict):
self[key] = val = self.creator(key)
return val
+
# Define collections that are capable of storing
# ColumnElement objects as hashable keys/elements.
# At this point, these are mostly historical, things
@@ -745,20 +757,21 @@ populate_column_dict = PopulateDict
_getters = PopulateDict(operator.itemgetter)
_property_getters = PopulateDict(
- lambda idx: property(operator.itemgetter(idx)))
+ lambda idx: property(operator.itemgetter(idx))
+)
def unique_list(seq, hashfunc=None):
seen = set()
seen_add = seen.add
if not hashfunc:
- return [x for x in seq
- if x not in seen
- and not seen_add(x)]
+ return [x for x in seq if x not in seen and not seen_add(x)]
else:
- return [x for x in seq
- if hashfunc(x) not in seen
- and not seen_add(hashfunc(x))]
+ return [
+ x
+ for x in seq
+ if hashfunc(x) not in seen and not seen_add(hashfunc(x))
+ ]
class UniqueAppender(object):
@@ -773,9 +786,9 @@ class UniqueAppender(object):
self._unique = {}
if via:
self._data_appender = getattr(data, via)
- elif hasattr(data, 'append'):
+ elif hasattr(data, "append"):
self._data_appender = data.append
- elif hasattr(data, 'add'):
+ elif hasattr(data, "add"):
self._data_appender = data.add
def append(self, item):
@@ -798,8 +811,9 @@ def coerce_generator_arg(arg):
def to_list(x, default=None):
if x is None:
return default
- if not isinstance(x, collections_abc.Iterable) or \
- isinstance(x, string_types + binary_types):
+ if not isinstance(x, collections_abc.Iterable) or isinstance(
+ x, string_types + binary_types
+ ):
return [x]
elif isinstance(x, list):
return x
@@ -815,9 +829,7 @@ def has_intersection(set_, iterable):
"""
# TODO: optimize, write in C, etc.
- return bool(
- set_.intersection([i for i in iterable if i.__hash__])
- )
+ return bool(set_.intersection([i for i in iterable if i.__hash__]))
def to_set(x):
@@ -854,7 +866,7 @@ def flatten_iterator(x):
"""
for elem in x:
- if not isinstance(elem, str) and hasattr(elem, '__iter__'):
+ if not isinstance(elem, str) and hasattr(elem, "__iter__"):
for y in flatten_iterator(elem):
yield y
else:
@@ -871,9 +883,9 @@ class LRUCache(dict):
"""
- __slots__ = 'capacity', 'threshold', 'size_alert', '_counter', '_mutex'
+ __slots__ = "capacity", "threshold", "size_alert", "_counter", "_mutex"
- def __init__(self, capacity=100, threshold=.5, size_alert=None):
+ def __init__(self, capacity=100, threshold=0.5, size_alert=None):
self.capacity = capacity
self.threshold = threshold
self.size_alert = size_alert
@@ -929,10 +941,10 @@ class LRUCache(dict):
if size_alert:
size_alert = False
self.size_alert(self)
- by_counter = sorted(dict.values(self),
- key=operator.itemgetter(2),
- reverse=True)
- for item in by_counter[self.capacity:]:
+ by_counter = sorted(
+ dict.values(self), key=operator.itemgetter(2), reverse=True
+ )
+ for item in by_counter[self.capacity :]:
try:
del self[item[0]]
except KeyError:
@@ -946,17 +958,22 @@ _lw_tuples = LRUCache(100)
def lightweight_named_tuple(name, fields):
- hash_ = (name, ) + tuple(fields)
+ hash_ = (name,) + tuple(fields)
tp_cls = _lw_tuples.get(hash_)
if tp_cls:
return tp_cls
tp_cls = type(
- name, (_LW,),
- dict([
- (field, _property_getters[idx])
- for idx, field in enumerate(fields) if field is not None
- ] + [('__slots__', ())])
+ name,
+ (_LW,),
+ dict(
+ [
+ (field, _property_getters[idx])
+ for idx, field in enumerate(fields)
+ if field is not None
+ ]
+ + [("__slots__", ())]
+ ),
)
tp_cls._real_fields = fields
@@ -1077,6 +1094,7 @@ def has_dupes(sequence, target):
return True
return False
+
# .index version. the two __contains__ calls as well
# as .index() and isinstance() slow this down.
# def has_dupes(sequence, target):
diff --git a/lib/sqlalchemy/util/compat.py b/lib/sqlalchemy/util/compat.py
index b01471edf..553624b49 100644
--- a/lib/sqlalchemy/util/compat.py
+++ b/lib/sqlalchemy/util/compat.py
@@ -20,9 +20,9 @@ py32 = sys.version_info >= (3, 2)
py3k = sys.version_info >= (3, 0)
py2k = sys.version_info < (3, 0)
py265 = sys.version_info >= (2, 6, 5)
-jython = sys.platform.startswith('java')
-pypy = hasattr(sys, 'pypy_version_info')
-win32 = sys.platform.startswith('win')
+jython = sys.platform.startswith("java")
+pypy = hasattr(sys, "pypy_version_info")
+win32 = sys.platform.startswith("win")
cpython = not pypy and not jython # TODO: something better for this ?
contextmanager = contextlib.contextmanager
@@ -30,8 +30,9 @@ dottedgetter = operator.attrgetter
namedtuple = collections.namedtuple
next = next
-ArgSpec = collections.namedtuple("ArgSpec",
- ["args", "varargs", "keywords", "defaults"])
+ArgSpec = collections.namedtuple(
+ "ArgSpec", ["args", "varargs", "keywords", "defaults"]
+)
try:
import threading
@@ -58,40 +59,43 @@ if py3k:
from io import BytesIO as byte_buffer
from io import StringIO
from itertools import zip_longest
- from urllib.parse import (quote_plus, unquote_plus, parse_qsl, quote, unquote)
-
- string_types = str,
- binary_types = bytes,
+ from urllib.parse import (
+ quote_plus,
+ unquote_plus,
+ parse_qsl,
+ quote,
+ unquote,
+ )
+
+ string_types = (str,)
+ binary_types = (bytes,)
binary_type = bytes
text_type = str
- int_types = int,
+ int_types = (int,)
iterbytes = iter
itertools_filterfalse = itertools.filterfalse
itertools_filter = filter
itertools_imap = map
- exec_ = getattr(builtins, 'exec')
- import_ = getattr(builtins, '__import__')
+ exec_ = getattr(builtins, "exec")
+ import_ = getattr(builtins, "__import__")
print_ = getattr(builtins, "print")
def b(s):
return s.encode("latin-1")
def b64decode(x):
- return base64.b64decode(x.encode('ascii'))
-
+ return base64.b64decode(x.encode("ascii"))
def b64encode(x):
- return base64.b64encode(x).decode('ascii')
+ return base64.b64encode(x).decode("ascii")
def cmp(a, b):
return (a > b) - (a < b)
def inspect_getargspec(func):
- return ArgSpec(
- *inspect_getfullargspec(func)[0:4]
- )
+ return ArgSpec(*inspect_getfullargspec(func)[0:4])
def reraise(tp, value, tb=None, cause=None):
if cause is not None:
@@ -110,8 +114,11 @@ if py3k:
if py32:
callable = callable
else:
+
def callable(fn):
- return hasattr(fn, '__call__')
+ return hasattr(fn, "__call__")
+
+
else:
import base64
import ConfigParser as configparser
@@ -129,8 +136,8 @@ else:
except ImportError:
import pickle
- string_types = basestring,
- binary_types = bytes,
+ string_types = (basestring,)
+ binary_types = (bytes,)
binary_type = str
text_type = unicode
int_types = int, long
@@ -153,9 +160,9 @@ else:
def exec_(func_text, globals_, lcl=None):
if lcl is None:
- exec('exec func_text in globals_')
+ exec("exec func_text in globals_")
else:
- exec('exec func_text in globals_, lcl')
+ exec("exec func_text in globals_, lcl")
def iterbytes(buf):
return (ord(byte) for byte in buf)
@@ -186,24 +193,32 @@ else:
# not as nice as that of Py3K, but at least preserves
# the code line where the issue occurred
- exec("def reraise(tp, value, tb=None, cause=None):\n"
- " if cause is not None:\n"
- " assert cause is not value, 'Same cause emitted'\n"
- " raise tp, value, tb\n")
+ exec(
+ "def reraise(tp, value, tb=None, cause=None):\n"
+ " if cause is not None:\n"
+ " assert cause is not value, 'Same cause emitted'\n"
+ " raise tp, value, tb\n"
+ )
if py35:
from inspect import formatannotation
def inspect_formatargspec(
- args, varargs=None, varkw=None, defaults=None,
- kwonlyargs=(), kwonlydefaults={}, annotations={},
- formatarg=str,
- formatvarargs=lambda name: '*' + name,
- formatvarkw=lambda name: '**' + name,
- formatvalue=lambda value: '=' + repr(value),
- formatreturns=lambda text: ' -> ' + text,
- formatannotation=formatannotation):
+ args,
+ varargs=None,
+ varkw=None,
+ defaults=None,
+ kwonlyargs=(),
+ kwonlydefaults={},
+ annotations={},
+ formatarg=str,
+ formatvarargs=lambda name: "*" + name,
+ formatvarkw=lambda name: "**" + name,
+ formatvalue=lambda value: "=" + repr(value),
+ formatreturns=lambda text: " -> " + text,
+ formatannotation=formatannotation,
+ ):
"""Copy formatargspec from python 3.7 standard library.
Python 3 has deprecated formatargspec and requested that Signature
@@ -221,7 +236,7 @@ if py35:
def formatargandannotation(arg):
result = formatarg(arg)
if arg in annotations:
- result += ': ' + formatannotation(annotations[arg])
+ result += ": " + formatannotation(annotations[arg])
return result
specs = []
@@ -237,7 +252,7 @@ if py35:
specs.append(formatvarargs(formatargandannotation(varargs)))
else:
if kwonlyargs:
- specs.append('*')
+ specs.append("*")
if kwonlyargs:
for kwonlyarg in kwonlyargs:
@@ -249,10 +264,12 @@ if py35:
if varkw is not None:
specs.append(formatvarkw(formatargandannotation(varkw)))
- result = '(' + ', '.join(specs) + ')'
- if 'return' in annotations:
- result += formatreturns(formatannotation(annotations['return']))
+ result = "(" + ", ".join(specs) + ")"
+ if "return" in annotations:
+ result += formatreturns(formatannotation(annotations["return"]))
return result
+
+
else:
from inspect import formatargspec as inspect_formatargspec
@@ -330,4 +347,5 @@ def with_metaclass(meta, *bases):
if this_bases is None:
return type.__new__(cls, name, (), d)
return meta(name, bases, d)
- return metaclass('temporary_class', None, {})
+
+ return metaclass("temporary_class", None, {})
diff --git a/lib/sqlalchemy/util/deprecations.py b/lib/sqlalchemy/util/deprecations.py
index 9000cc795..e6612f075 100644
--- a/lib/sqlalchemy/util/deprecations.py
+++ b/lib/sqlalchemy/util/deprecations.py
@@ -40,8 +40,7 @@ def deprecated(version, message=None, add_deprecation_to_docstring=True):
"""
if add_deprecation_to_docstring:
- header = ".. deprecated:: %s %s" % \
- (version, (message or ''))
+ header = ".. deprecated:: %s %s" % (version, (message or ""))
else:
header = None
@@ -50,13 +49,18 @@ def deprecated(version, message=None, add_deprecation_to_docstring=True):
def decorate(fn):
return _decorate_with_warning(
- fn, exc.SADeprecationWarning,
- message % dict(func=fn.__name__), header)
+ fn,
+ exc.SADeprecationWarning,
+ message % dict(func=fn.__name__),
+ header,
+ )
+
return decorate
-def pending_deprecation(version, message=None,
- add_deprecation_to_docstring=True):
+def pending_deprecation(
+ version, message=None, add_deprecation_to_docstring=True
+):
"""Decorates a function and issues a pending deprecation warning on use.
:param version:
@@ -74,8 +78,7 @@ def pending_deprecation(version, message=None,
"""
if add_deprecation_to_docstring:
- header = ".. deprecated:: %s (pending) %s" % \
- (version, (message or ''))
+ header = ".. deprecated:: %s (pending) %s" % (version, (message or ""))
else:
header = None
@@ -84,8 +87,12 @@ def pending_deprecation(version, message=None,
def decorate(fn):
return _decorate_with_warning(
- fn, exc.SAPendingDeprecationWarning,
- message % dict(func=fn.__name__), header)
+ fn,
+ exc.SAPendingDeprecationWarning,
+ message % dict(func=fn.__name__),
+ header,
+ )
+
return decorate
@@ -95,7 +102,8 @@ def _sanitize_restructured_text(text):
if type_ in ("func", "meth"):
name += "()"
return name
- return re.sub(r'\:(\w+)\:`~?\.?(.+?)`', repl, text)
+
+ return re.sub(r"\:(\w+)\:`~?\.?(.+?)`", repl, text)
def _decorate_with_warning(func, wtype, message, docstring_header=None):
@@ -108,7 +116,7 @@ def _decorate_with_warning(func, wtype, message, docstring_header=None):
warnings.warn(message, wtype, stacklevel=3)
return fn(*args, **kwargs)
- doc = func.__doc__ is not None and func.__doc__ or ''
+ doc = func.__doc__ is not None and func.__doc__ or ""
if docstring_header is not None:
docstring_header %= dict(func=func.__name__)
@@ -118,6 +126,7 @@ def _decorate_with_warning(func, wtype, message, docstring_header=None):
decorated.__doc__ = doc
return decorated
+
import textwrap
@@ -135,7 +144,7 @@ def _dedent_docstring(text):
def inject_docstring_text(doctext, injecttext, pos):
doctext = _dedent_docstring(doctext or "")
- lines = doctext.split('\n')
+ lines = doctext.split("\n")
injectlines = textwrap.dedent(injecttext).split("\n")
if injectlines[0]:
injectlines.insert(0, "")
diff --git a/lib/sqlalchemy/util/langhelpers.py b/lib/sqlalchemy/util/langhelpers.py
index 7e387f4f2..6a286998b 100644
--- a/lib/sqlalchemy/util/langhelpers.py
+++ b/lib/sqlalchemy/util/langhelpers.py
@@ -25,7 +25,7 @@ from . import _collections
def md5_hex(x):
if compat.py3k:
- x = x.encode('utf-8')
+ x = x.encode("utf-8")
m = hashlib.md5()
m.update(x)
return m.hexdigest()
@@ -49,7 +49,7 @@ class safe_reraise(object):
"""
- __slots__ = ('warn_only', '_exc_info')
+ __slots__ = ("warn_only", "_exc_info")
def __init__(self, warn_only=False):
self.warn_only = warn_only
@@ -61,7 +61,7 @@ class safe_reraise(object):
# see #2703 for notes
if type_ is None:
exc_type, exc_value, exc_tb = self._exc_info
- self._exc_info = None # remove potential circular references
+ self._exc_info = None # remove potential circular references
if not self.warn_only:
compat.reraise(exc_type, exc_value, exc_tb)
else:
@@ -71,8 +71,9 @@ class safe_reraise(object):
warn(
"An exception has occurred during handling of a "
"previous exception. The previous exception "
- "is:\n %s %s\n" % (self._exc_info[0], self._exc_info[1]))
- self._exc_info = None # remove potential circular references
+ "is:\n %s %s\n" % (self._exc_info[0], self._exc_info[1])
+ )
+ self._exc_info = None # remove potential circular references
compat.reraise(type_, value, traceback)
@@ -84,7 +85,7 @@ def decode_slice(slc):
"""
ret = []
for x in slc.start, slc.stop, slc.step:
- if hasattr(x, '__index__'):
+ if hasattr(x, "__index__"):
x = x.__index__()
ret.append(x)
return tuple(ret)
@@ -93,9 +94,10 @@ def decode_slice(slc):
def _unique_symbols(used, *bases):
used = set(used)
for base in bases:
- pool = itertools.chain((base,),
- compat.itertools_imap(lambda i: base + str(i),
- range(1000)))
+ pool = itertools.chain(
+ (base,),
+ compat.itertools_imap(lambda i: base + str(i), range(1000)),
+ )
for sym in pool:
if sym not in used:
used.add(sym)
@@ -122,21 +124,25 @@ def decorator(target):
raise Exception("not a decoratable function")
spec = compat.inspect_getfullargspec(fn)
names = tuple(spec[0]) + spec[1:3] + (fn.__name__,)
- targ_name, fn_name = _unique_symbols(names, 'target', 'fn')
+ targ_name, fn_name = _unique_symbols(names, "target", "fn")
metadata = dict(target=targ_name, fn=fn_name)
metadata.update(format_argspec_plus(spec, grouped=False))
- metadata['name'] = fn.__name__
- code = """\
+ metadata["name"] = fn.__name__
+ code = (
+ """\
def %(name)s(%(args)s):
return %(target)s(%(fn)s, %(apply_kw)s)
-""" % metadata
- decorated = _exec_code_in_env(code,
- {targ_name: target, fn_name: fn},
- fn.__name__)
- decorated.__defaults__ = getattr(fn, 'im_func', fn).__defaults__
+"""
+ % metadata
+ )
+ decorated = _exec_code_in_env(
+ code, {targ_name: target, fn_name: fn}, fn.__name__
+ )
+ decorated.__defaults__ = getattr(fn, "im_func", fn).__defaults__
decorated.__wrapped__ = fn
return update_wrapper(decorated, fn)
+
return update_wrapper(decorate, target)
@@ -155,31 +161,38 @@ def public_factory(target, location):
if isinstance(target, type):
fn = target.__init__
callable_ = target
- doc = "Construct a new :class:`.%s` object. \n\n"\
- "This constructor is mirrored as a public API function; "\
- "see :func:`~%s` "\
- "for a full usage and argument description." % (
- target.__name__, location, )
+ doc = (
+ "Construct a new :class:`.%s` object. \n\n"
+ "This constructor is mirrored as a public API function; "
+ "see :func:`~%s` "
+ "for a full usage and argument description."
+ % (target.__name__, location)
+ )
else:
fn = callable_ = target
- doc = "This function is mirrored; see :func:`~%s` "\
+ doc = (
+ "This function is mirrored; see :func:`~%s` "
"for a description of arguments." % location
+ )
location_name = location.split(".")[-1]
spec = compat.inspect_getfullargspec(fn)
del spec[0][0]
metadata = format_argspec_plus(spec, grouped=False)
- metadata['name'] = location_name
- code = """\
+ metadata["name"] = location_name
+ code = (
+ """\
def %(name)s(%(args)s):
return cls(%(apply_kw)s)
-""" % metadata
- env = {'cls': callable_, 'symbol': symbol}
+"""
+ % metadata
+ )
+ env = {"cls": callable_, "symbol": symbol}
exec(code, env)
decorated = env[location_name]
decorated.__doc__ = fn.__doc__
decorated.__module__ = "sqlalchemy" + location.rsplit(".", 1)[0]
- if compat.py2k or hasattr(fn, '__func__'):
+ if compat.py2k or hasattr(fn, "__func__"):
fn.__func__.__doc__ = doc
else:
fn.__doc__ = doc
@@ -187,7 +200,6 @@ def %(name)s(%(args)s):
class PluginLoader(object):
-
def __init__(self, group, auto_fn=None):
self.group = group
self.impls = {}
@@ -211,14 +223,13 @@ class PluginLoader(object):
except ImportError:
pass
else:
- for impl in pkg_resources.iter_entry_points(
- self.group, name):
+ for impl in pkg_resources.iter_entry_points(self.group, name):
self.impls[name] = impl.load
return impl.load()
raise exc.NoSuchModuleError(
- "Can't load plugin: %s:%s" %
- (self.group, name))
+ "Can't load plugin: %s:%s" % (self.group, name)
+ )
def register(self, name, modulepath, objname):
def load():
@@ -226,6 +237,7 @@ class PluginLoader(object):
for token in modulepath.split(".")[1:]:
mod = getattr(mod, token)
return getattr(mod, objname)
+
self.impls[name] = load
@@ -245,10 +257,13 @@ def get_cls_kwargs(cls, _set=None):
if toplevel:
_set = set()
- ctr = cls.__dict__.get('__init__', False)
+ ctr = cls.__dict__.get("__init__", False)
- has_init = ctr and isinstance(ctr, types.FunctionType) and \
- isinstance(ctr.__code__, types.CodeType)
+ has_init = (
+ ctr
+ and isinstance(ctr, types.FunctionType)
+ and isinstance(ctr.__code__, types.CodeType)
+ )
if has_init:
names, has_kw = inspect_func_args(ctr)
@@ -262,7 +277,7 @@ def get_cls_kwargs(cls, _set=None):
if get_cls_kwargs(c, _set) is None:
break
- _set.discard('self')
+ _set.discard("self")
return _set
@@ -278,7 +293,9 @@ try:
has_kw = bool(co.co_flags & CO_VARKEYWORDS)
return args, has_kw
+
except ImportError:
+
def inspect_func_args(fn):
names, _, has_kw, _ = compat.inspect_getargspec(fn)
return names, bool(has_kw)
@@ -309,23 +326,26 @@ def get_callable_argspec(fn, no_self=False, _is_init=False):
elif inspect.isfunction(fn):
if _is_init and no_self:
spec = compat.inspect_getargspec(fn)
- return compat.ArgSpec(spec.args[1:], spec.varargs,
- spec.keywords, spec.defaults)
+ return compat.ArgSpec(
+ spec.args[1:], spec.varargs, spec.keywords, spec.defaults
+ )
else:
return compat.inspect_getargspec(fn)
elif inspect.ismethod(fn):
if no_self and (_is_init or fn.__self__):
spec = compat.inspect_getargspec(fn.__func__)
- return compat.ArgSpec(spec.args[1:], spec.varargs,
- spec.keywords, spec.defaults)
+ return compat.ArgSpec(
+ spec.args[1:], spec.varargs, spec.keywords, spec.defaults
+ )
else:
return compat.inspect_getargspec(fn.__func__)
elif inspect.isclass(fn):
return get_callable_argspec(
- fn.__init__, no_self=no_self, _is_init=True)
- elif hasattr(fn, '__func__'):
+ fn.__init__, no_self=no_self, _is_init=True
+ )
+ elif hasattr(fn, "__func__"):
return compat.inspect_getargspec(fn.__func__)
- elif hasattr(fn, '__call__'):
+ elif hasattr(fn, "__call__"):
if inspect.ismethod(fn.__call__):
return get_callable_argspec(fn.__call__, no_self=no_self)
else:
@@ -375,13 +395,14 @@ def format_argspec_plus(fn, grouped=True):
if spec[0]:
self_arg = spec[0][0]
elif spec[1]:
- self_arg = '%s[0]' % spec[1]
+ self_arg = "%s[0]" % spec[1]
else:
self_arg = None
if compat.py3k:
apply_pos = compat.inspect_formatargspec(
- spec[0], spec[1], spec[2], None, spec[4])
+ spec[0], spec[1], spec[2], None, spec[4]
+ )
num_defaults = 0
if spec[3]:
num_defaults += len(spec[3])
@@ -396,19 +417,31 @@ def format_argspec_plus(fn, grouped=True):
name_args = spec[0]
if num_defaults:
- defaulted_vals = name_args[0 - num_defaults:]
+ defaulted_vals = name_args[0 - num_defaults :]
else:
defaulted_vals = ()
apply_kw = compat.inspect_formatargspec(
- name_args, spec[1], spec[2], defaulted_vals,
- formatvalue=lambda x: '=' + x)
+ name_args,
+ spec[1],
+ spec[2],
+ defaulted_vals,
+ formatvalue=lambda x: "=" + x,
+ )
if grouped:
- return dict(args=args, self_arg=self_arg,
- apply_pos=apply_pos, apply_kw=apply_kw)
+ return dict(
+ args=args,
+ self_arg=self_arg,
+ apply_pos=apply_pos,
+ apply_kw=apply_kw,
+ )
else:
- return dict(args=args[1:-1], self_arg=self_arg,
- apply_pos=apply_pos[1:-1], apply_kw=apply_kw[1:-1])
+ return dict(
+ args=args[1:-1],
+ self_arg=self_arg,
+ apply_pos=apply_pos[1:-1],
+ apply_kw=apply_kw[1:-1],
+ )
def format_argspec_init(method, grouped=True):
@@ -422,14 +455,17 @@ def format_argspec_init(method, grouped=True):
"""
if method is object.__init__:
- args = grouped and '(self)' or 'self'
+ args = grouped and "(self)" or "self"
else:
try:
return format_argspec_plus(method, grouped=grouped)
except TypeError:
- args = (grouped and '(self, *args, **kwargs)'
- or 'self, *args, **kwargs')
- return dict(self_arg='self', args=args, apply_pos=args, apply_kw=args)
+ args = (
+ grouped
+ and "(self, *args, **kwargs)"
+ or "self, *args, **kwargs"
+ )
+ return dict(self_arg="self", args=args, apply_pos=args, apply_kw=args)
def getargspec_init(method):
@@ -445,9 +481,9 @@ def getargspec_init(method):
return compat.inspect_getargspec(method)
except TypeError:
if method is object.__init__:
- return (['self'], None, None, None)
+ return (["self"], None, None, None)
else:
- return (['self'], 'args', 'kwargs', None)
+ return (["self"], "args", "kwargs", None)
def unbound_method_to_callable(func_or_cls):
@@ -479,8 +515,9 @@ def generic_repr(obj, additional_kw=(), to_inspect=None, omit_kwarg=()):
vargs = None
for i, insp in enumerate(to_inspect):
try:
- (_args, _vargs, vkw, defaults) = \
- compat.inspect_getargspec(insp.__init__)
+ (_args, _vargs, vkw, defaults) = compat.inspect_getargspec(
+ insp.__init__
+ )
except TypeError:
continue
else:
@@ -493,16 +530,17 @@ def generic_repr(obj, additional_kw=(), to_inspect=None, omit_kwarg=()):
else:
pos_args.extend(_args[1:])
else:
- kw_args.update([
- (arg, missing) for arg in _args[1:-default_len]
- ])
+ kw_args.update(
+ [(arg, missing) for arg in _args[1:-default_len]]
+ )
if default_len:
- kw_args.update([
- (arg, default)
- for arg, default
- in zip(_args[-default_len:], defaults)
- ])
+ kw_args.update(
+ [
+ (arg, default)
+ for arg, default in zip(_args[-default_len:], defaults)
+ ]
+ )
output = []
output.extend(repr(getattr(obj, arg, None)) for arg in pos_args)
@@ -516,7 +554,7 @@ def generic_repr(obj, additional_kw=(), to_inspect=None, omit_kwarg=()):
try:
val = getattr(obj, arg, missing)
if val is not missing and val != defval:
- output.append('%s=%r' % (arg, val))
+ output.append("%s=%r" % (arg, val))
except Exception:
pass
@@ -525,7 +563,7 @@ def generic_repr(obj, additional_kw=(), to_inspect=None, omit_kwarg=()):
try:
val = getattr(obj, arg, missing)
if val is not missing and val != defval:
- output.append('%s=%r' % (arg, val))
+ output.append("%s=%r" % (arg, val))
except Exception:
pass
@@ -538,16 +576,19 @@ class portable_instancemethod(object):
"""
- __slots__ = 'target', 'name', 'kwargs', '__weakref__'
+ __slots__ = "target", "name", "kwargs", "__weakref__"
def __getstate__(self):
- return {'target': self.target, 'name': self.name,
- 'kwargs': self.kwargs}
+ return {
+ "target": self.target,
+ "name": self.name,
+ "kwargs": self.kwargs,
+ }
def __setstate__(self, state):
- self.target = state['target']
- self.name = state['name']
- self.kwargs = state.get('kwargs', ())
+ self.target = state["target"]
+ self.name = state["name"]
+ self.kwargs = state.get("kwargs", ())
def __init__(self, meth, kwargs=()):
self.target = meth.__self__
@@ -583,8 +624,11 @@ def class_hierarchy(cls):
if compat.py2k:
if isinstance(c, types.ClassType):
continue
- bases = (_ for _ in c.__bases__
- if _ not in hier and not isinstance(_, types.ClassType))
+ bases = (
+ _
+ for _ in c.__bases__
+ if _ not in hier and not isinstance(_, types.ClassType)
+ )
else:
bases = (_ for _ in c.__bases__ if _ not in hier)
@@ -593,11 +637,12 @@ def class_hierarchy(cls):
hier.add(b)
if compat.py3k:
- if c.__module__ == 'builtins' or not hasattr(c, '__subclasses__'):
+ if c.__module__ == "builtins" or not hasattr(c, "__subclasses__"):
continue
else:
- if c.__module__ == '__builtin__' or not hasattr(
- c, '__subclasses__'):
+ if c.__module__ == "__builtin__" or not hasattr(
+ c, "__subclasses__"
+ ):
continue
for s in [_ for _ in c.__subclasses__() if _ not in hier]:
@@ -622,26 +667,45 @@ def iterate_attributes(cls):
break
-def monkeypatch_proxied_specials(into_cls, from_cls, skip=None, only=None,
- name='self.proxy', from_instance=None):
+def monkeypatch_proxied_specials(
+ into_cls,
+ from_cls,
+ skip=None,
+ only=None,
+ name="self.proxy",
+ from_instance=None,
+):
"""Automates delegation of __specials__ for a proxying type."""
if only:
dunders = only
else:
if skip is None:
- skip = ('__slots__', '__del__', '__getattribute__',
- '__metaclass__', '__getstate__', '__setstate__')
- dunders = [m for m in dir(from_cls)
- if (m.startswith('__') and m.endswith('__') and
- not hasattr(into_cls, m) and m not in skip)]
+ skip = (
+ "__slots__",
+ "__del__",
+ "__getattribute__",
+ "__metaclass__",
+ "__getstate__",
+ "__setstate__",
+ )
+ dunders = [
+ m
+ for m in dir(from_cls)
+ if (
+ m.startswith("__")
+ and m.endswith("__")
+ and not hasattr(into_cls, m)
+ and m not in skip
+ )
+ ]
for method in dunders:
try:
fn = getattr(from_cls, method)
- if not hasattr(fn, '__call__'):
+ if not hasattr(fn, "__call__"):
continue
- fn = getattr(fn, 'im_func', fn)
+ fn = getattr(fn, "im_func", fn)
except AttributeError:
continue
try:
@@ -649,11 +713,13 @@ def monkeypatch_proxied_specials(into_cls, from_cls, skip=None, only=None,
fn_args = compat.inspect_formatargspec(spec[0])
d_args = compat.inspect_formatargspec(spec[0][1:])
except TypeError:
- fn_args = '(self, *args, **kw)'
- d_args = '(*args, **kw)'
+ fn_args = "(self, *args, **kw)"
+ d_args = "(*args, **kw)"
- py = ("def %(method)s%(fn_args)s: "
- "return %(name)s.%(method)s%(d_args)s" % locals())
+ py = (
+ "def %(method)s%(fn_args)s: "
+ "return %(name)s.%(method)s%(d_args)s" % locals()
+ )
env = from_instance is not None and {name: from_instance} or {}
compat.exec_(py, env)
@@ -667,8 +733,9 @@ def monkeypatch_proxied_specials(into_cls, from_cls, skip=None, only=None,
def methods_equivalent(meth1, meth2):
"""Return True if the two methods are the same implementation."""
- return getattr(meth1, '__func__', meth1) is getattr(
- meth2, '__func__', meth2)
+ return getattr(meth1, "__func__", meth1) is getattr(
+ meth2, "__func__", meth2
+ )
def as_interface(obj, cls=None, methods=None, required=None):
@@ -705,12 +772,12 @@ def as_interface(obj, cls=None, methods=None, required=None):
"""
if not cls and not methods:
- raise TypeError('a class or collection of method names are required')
+ raise TypeError("a class or collection of method names are required")
if isinstance(cls, type) and isinstance(obj, cls):
return obj
- interface = set(methods or [m for m in dir(cls) if not m.startswith('_')])
+ interface = set(methods or [m for m in dir(cls) if not m.startswith("_")])
implemented = set(dir(obj))
complies = operator.ge
@@ -727,15 +794,17 @@ def as_interface(obj, cls=None, methods=None, required=None):
# No dict duck typing here.
if not isinstance(obj, dict):
- qualifier = complies is operator.gt and 'any of' or 'all of'
- raise TypeError("%r does not implement %s: %s" % (
- obj, qualifier, ', '.join(interface)))
+ qualifier = complies is operator.gt and "any of" or "all of"
+ raise TypeError(
+ "%r does not implement %s: %s"
+ % (obj, qualifier, ", ".join(interface))
+ )
class AnonymousInterface(object):
"""A callable-holding shell."""
if cls:
- AnonymousInterface.__name__ = 'Anonymous' + cls.__name__
+ AnonymousInterface.__name__ = "Anonymous" + cls.__name__
found = set()
for method, impl in dictlike_iteritems(obj):
@@ -749,8 +818,10 @@ def as_interface(obj, cls=None, methods=None, required=None):
if complies(found, required):
return AnonymousInterface
- raise TypeError("dictionary does not contain required keys %s" %
- ', '.join(required - found))
+ raise TypeError(
+ "dictionary does not contain required keys %s"
+ % ", ".join(required - found)
+ )
class memoized_property(object):
@@ -791,6 +862,7 @@ def memoized_instancemethod(fn):
memo.__doc__ = fn.__doc__
self.__dict__[fn.__name__] = memo
return result
+
return update_wrapper(oneshot, fn)
@@ -831,14 +903,14 @@ class MemoizedSlots(object):
raise AttributeError(key)
def __getattr__(self, key):
- if key.startswith('_memoized'):
+ if key.startswith("_memoized"):
raise AttributeError(key)
- elif hasattr(self, '_memoized_attr_%s' % key):
- value = getattr(self, '_memoized_attr_%s' % key)()
+ elif hasattr(self, "_memoized_attr_%s" % key):
+ value = getattr(self, "_memoized_attr_%s" % key)()
setattr(self, key, value)
return value
- elif hasattr(self, '_memoized_method_%s' % key):
- fn = getattr(self, '_memoized_method_%s' % key)
+ elif hasattr(self, "_memoized_method_%s" % key):
+ fn = getattr(self, "_memoized_method_%s" % key)
def oneshot(*args, **kw):
result = fn(*args, **kw)
@@ -847,6 +919,7 @@ class MemoizedSlots(object):
memo.__doc__ = fn.__doc__
setattr(self, key, memo)
return result
+
oneshot.__doc__ = fn.__doc__
return oneshot
else:
@@ -859,12 +932,14 @@ def dependency_for(modulename, add_to_all=False):
# unfortunately importlib doesn't work that great either
tokens = modulename.split(".")
mod = compat.import_(
- ".".join(tokens[0:-1]), globals(), locals(), [tokens[-1]])
+ ".".join(tokens[0:-1]), globals(), locals(), [tokens[-1]]
+ )
mod = getattr(mod, tokens[-1])
setattr(mod, obj.__name__, obj)
if add_to_all and hasattr(mod, "__all__"):
mod.__all__.append(obj.__name__)
return obj
+
return decorate
@@ -891,10 +966,7 @@ class dependencies(object):
for dep in deps:
tokens = dep.split(".")
self.import_deps.append(
- dependencies._importlater(
- ".".join(tokens[0:-1]),
- tokens[-1]
- )
+ dependencies._importlater(".".join(tokens[0:-1]), tokens[-1])
)
def __call__(self, fn):
@@ -902,7 +974,7 @@ class dependencies(object):
spec = compat.inspect_getfullargspec(fn)
spec_zero = list(spec[0])
- hasself = spec_zero[0] in ('self', 'cls')
+ hasself = spec_zero[0] in ("self", "cls")
for i in range(len(import_deps)):
spec[0][i + (1 if hasself else 0)] = "import_deps[%r]" % i
@@ -915,13 +987,13 @@ class dependencies(object):
outer_spec = format_argspec_plus(spec, grouped=False)
- code = 'lambda %(args)s: fn(%(apply_kw)s)' % {
- "args": outer_spec['args'],
- "apply_kw": inner_spec['apply_kw']
+ code = "lambda %(args)s: fn(%(apply_kw)s)" % {
+ "args": outer_spec["args"],
+ "apply_kw": inner_spec["apply_kw"],
}
decorated = eval(code, locals())
- decorated.__defaults__ = getattr(fn, 'im_func', fn).__defaults__
+ decorated.__defaults__ = getattr(fn, "im_func", fn).__defaults__
return update_wrapper(decorated, fn)
@classmethod
@@ -961,26 +1033,27 @@ class dependencies(object):
raise ImportError(
"importlater.resolve_all() hasn't "
"been called (this is %s %s)"
- % (self._il_path, self._il_addtl))
+ % (self._il_path, self._il_addtl)
+ )
return getattr(self._initial_import, self._il_addtl)
def _resolve(self):
dependencies._unresolved.discard(self)
self._initial_import = compat.import_(
- self._il_path, globals(), locals(),
- [self._il_addtl])
+ self._il_path, globals(), locals(), [self._il_addtl]
+ )
def __getattr__(self, key):
- if key == 'module':
- raise ImportError("Could not resolve module %s"
- % self._full_path)
+ if key == "module":
+ raise ImportError(
+ "Could not resolve module %s" % self._full_path
+ )
try:
attr = getattr(self.module, key)
except AttributeError:
raise AttributeError(
- "Module %s has no attribute '%s'" %
- (self._full_path, key)
+ "Module %s has no attribute '%s'" % (self._full_path, key)
)
self.__dict__[key] = attr
return attr
@@ -990,9 +1063,9 @@ class dependencies(object):
def asbool(obj):
if isinstance(obj, compat.string_types):
obj = obj.strip().lower()
- if obj in ['true', 'yes', 'on', 'y', 't', '1']:
+ if obj in ["true", "yes", "on", "y", "t", "1"]:
return True
- elif obj in ['false', 'no', 'off', 'n', 'f', '0']:
+ elif obj in ["false", "no", "off", "n", "f", "0"]:
return False
else:
raise ValueError("String is not true/false: %r" % obj)
@@ -1004,11 +1077,13 @@ def bool_or_str(*text):
boolean, or one of a set of "alternate" string values.
"""
+
def bool_or_value(obj):
if obj in text:
return obj
else:
return asbool(obj)
+
return bool_or_value
@@ -1026,9 +1101,11 @@ def coerce_kw_type(kw, key, type_, flexi_bool=True):
when coercing to boolean.
"""
- if key in kw and (
- not isinstance(type_, type) or not isinstance(kw[key], type_)
- ) and kw[key] is not None:
+ if (
+ key in kw
+ and (not isinstance(type_, type) or not isinstance(kw[key], type_))
+ and kw[key] is not None
+ ):
if type_ is bool and flexi_bool:
kw[key] = asbool(kw[key])
else:
@@ -1044,8 +1121,8 @@ def constructor_copy(obj, cls, *args, **kw):
names = get_cls_kwargs(cls)
kw.update(
- (k, obj.__dict__[k]) for k in names.difference(kw)
- if k in obj.__dict__)
+ (k, obj.__dict__[k]) for k in names.difference(kw) if k in obj.__dict__
+ )
return cls(*args, **kw)
@@ -1072,10 +1149,11 @@ def duck_type_collection(specimen, default=None):
property is present, return that preferentially.
"""
- if hasattr(specimen, '__emulates__'):
+ if hasattr(specimen, "__emulates__"):
# canonicalize set vs sets.Set to a standard: the builtin set
- if (specimen.__emulates__ is not None and
- issubclass(specimen.__emulates__, set)):
+ if specimen.__emulates__ is not None and issubclass(
+ specimen.__emulates__, set
+ ):
return set
else:
return specimen.__emulates__
@@ -1088,11 +1166,11 @@ def duck_type_collection(specimen, default=None):
elif isa(specimen, dict):
return dict
- if hasattr(specimen, 'append'):
+ if hasattr(specimen, "append"):
return list
- elif hasattr(specimen, 'add'):
+ elif hasattr(specimen, "add"):
return set
- elif hasattr(specimen, 'set'):
+ elif hasattr(specimen, "set"):
return dict
else:
return default
@@ -1104,41 +1182,43 @@ def assert_arg_type(arg, argtype, name):
else:
if isinstance(argtype, tuple):
raise exc.ArgumentError(
- "Argument '%s' is expected to be one of type %s, got '%s'" %
- (name, ' or '.join("'%s'" % a for a in argtype), type(arg)))
+ "Argument '%s' is expected to be one of type %s, got '%s'"
+ % (name, " or ".join("'%s'" % a for a in argtype), type(arg))
+ )
else:
raise exc.ArgumentError(
- "Argument '%s' is expected to be of type '%s', got '%s'" %
- (name, argtype, type(arg)))
+ "Argument '%s' is expected to be of type '%s', got '%s'"
+ % (name, argtype, type(arg))
+ )
def dictlike_iteritems(dictlike):
"""Return a (key, value) iterator for almost any dict-like object."""
if compat.py3k:
- if hasattr(dictlike, 'items'):
+ if hasattr(dictlike, "items"):
return list(dictlike.items())
else:
- if hasattr(dictlike, 'iteritems'):
+ if hasattr(dictlike, "iteritems"):
return dictlike.iteritems()
- elif hasattr(dictlike, 'items'):
+ elif hasattr(dictlike, "items"):
return iter(dictlike.items())
- getter = getattr(dictlike, '__getitem__', getattr(dictlike, 'get', None))
+ getter = getattr(dictlike, "__getitem__", getattr(dictlike, "get", None))
if getter is None:
- raise TypeError(
- "Object '%r' is not dict-like" % dictlike)
+ raise TypeError("Object '%r' is not dict-like" % dictlike)
+
+ if hasattr(dictlike, "iterkeys"):
- if hasattr(dictlike, 'iterkeys'):
def iterator():
for key in dictlike.iterkeys():
yield key, getter(key)
+
return iterator()
- elif hasattr(dictlike, 'keys'):
+ elif hasattr(dictlike, "keys"):
return iter((key, getter(key)) for key in dictlike.keys())
else:
- raise TypeError(
- "Object '%r' is not dict-like" % dictlike)
+ raise TypeError("Object '%r' is not dict-like" % dictlike)
class classproperty(property):
@@ -1207,7 +1287,8 @@ class _symbol(int):
def __repr__(self):
return "symbol(%r)" % self.name
-_symbol.__name__ = 'symbol'
+
+_symbol.__name__ = "symbol"
class symbol(object):
@@ -1231,6 +1312,7 @@ class symbol(object):
``doc`` here.
"""
+
symbols = {}
_lock = compat.threading.Lock()
@@ -1292,9 +1374,11 @@ class _hash_limit_string(compat.text_type):
"""
+
def __new__(cls, value, num, args):
- interpolated = (value % args) + \
- (" (this warning may be suppressed after %d occurrences)" % num)
+ interpolated = (value % args) + (
+ " (this warning may be suppressed after %d occurrences)" % num
+ )
self = super(_hash_limit_string, cls).__new__(cls, interpolated)
self._hash = hash("%s_%d" % (value, hash(interpolated) % num))
return self
@@ -1340,8 +1424,8 @@ def only_once(fn):
return go
-_SQLA_RE = re.compile(r'sqlalchemy/([a-z_]+/){0,2}[a-z_]+\.py')
-_UNITTEST_RE = re.compile(r'unit(?:2|test2?/)')
+_SQLA_RE = re.compile(r"sqlalchemy/([a-z_]+/){0,2}[a-z_]+\.py")
+_UNITTEST_RE = re.compile(r"unit(?:2|test2?/)")
def chop_traceback(tb, exclude_prefix=_UNITTEST_RE, exclude_suffix=_SQLA_RE):
@@ -1363,18 +1447,17 @@ def chop_traceback(tb, exclude_prefix=_UNITTEST_RE, exclude_suffix=_SQLA_RE):
start += 1
while start <= end and exclude_suffix.search(tb[end]):
end -= 1
- return tb[start:end + 1]
+ return tb[start : end + 1]
+
NoneType = type(None)
def attrsetter(attrname):
- code = \
- "def set(obj, value):"\
- " obj.%s = value" % attrname
+ code = "def set(obj, value):" " obj.%s = value" % attrname
env = locals().copy()
exec(code, env)
- return env['set']
+ return env["set"]
class EnsureKWArgType(type):
@@ -1382,6 +1465,7 @@ class EnsureKWArgType(type):
don't already.
"""
+
def __init__(cls, clsname, bases, clsdict):
fn_reg = cls.ensure_kwarg
if fn_reg:
@@ -1396,9 +1480,9 @@ class EnsureKWArgType(type):
super(EnsureKWArgType, cls).__init__(clsname, bases, clsdict)
def _wrap_w_kw(self, fn):
-
def wrap(*arg, **kw):
return fn(*arg)
+
return update_wrapper(wrap, fn)
@@ -1410,15 +1494,15 @@ def wrap_callable(wrapper, fn):
object with __call__ method
"""
- if hasattr(fn, '__name__'):
+ if hasattr(fn, "__name__"):
return update_wrapper(wrapper, fn)
else:
_f = wrapper
_f.__name__ = fn.__class__.__name__
- if hasattr(fn, '__module__'):
+ if hasattr(fn, "__module__"):
_f.__module__ = fn.__module__
- if hasattr(fn.__call__, '__doc__') and fn.__call__.__doc__:
+ if hasattr(fn.__call__, "__doc__") and fn.__call__.__doc__:
_f.__doc__ = fn.__call__.__doc__
elif fn.__doc__:
_f.__doc__ = fn.__doc__
@@ -1468,4 +1552,3 @@ def quoted_token_parser(value):
idx += 1
return ["".join(token) for token in result]
-
diff --git a/lib/sqlalchemy/util/queue.py b/lib/sqlalchemy/util/queue.py
index 640f70ea9..5e56e855a 100644
--- a/lib/sqlalchemy/util/queue.py
+++ b/lib/sqlalchemy/util/queue.py
@@ -23,7 +23,7 @@ from time import time as _time
from .compat import threading
-__all__ = ['Empty', 'Full', 'Queue']
+__all__ = ["Empty", "Full", "Queue"]
class Empty(Exception):
diff --git a/lib/sqlalchemy/util/topological.py b/lib/sqlalchemy/util/topological.py
index 5f516d67e..95391c31b 100644
--- a/lib/sqlalchemy/util/topological.py
+++ b/lib/sqlalchemy/util/topological.py
@@ -10,7 +10,7 @@
from ..exc import CircularDependencyError
from .. import util
-__all__ = ['sort', 'sort_as_subsets', 'find_cycles']
+__all__ = ["sort", "sort_as_subsets", "find_cycles"]
def sort_as_subsets(tuples, allitems, deterministic_order=False):
@@ -33,7 +33,7 @@ def sort_as_subsets(tuples, allitems, deterministic_order=False):
raise CircularDependencyError(
"Circular dependency detected.",
find_cycles(tuples, allitems),
- _gen_edges(edges)
+ _gen_edges(edges),
)
todo.difference_update(output)
@@ -79,7 +79,7 @@ def find_cycles(tuples, allitems):
top = stack[-1]
for node in edges[top]:
if node in stack:
- cyc = stack[stack.index(node):]
+ cyc = stack[stack.index(node) :]
todo.difference_update(cyc)
output.update(cyc)
@@ -93,8 +93,4 @@ def find_cycles(tuples, allitems):
def _gen_edges(edges):
- return set([
- (right, left)
- for left in edges
- for right in edges[left]
- ])
+ return set([(right, left) for left in edges for right in edges[left]])