summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathaniel Knight <nknight@cfenet.ubc.ca>2018-07-31 21:59:47 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2018-08-01 12:30:29 -0400
commit4580f942fb851963ce09a05a0c3e6ad6b861ed7d (patch)
tree52b46e9baf6743377030312ff4edde99c63931ea
parent5cad77a87bbfc98999454ab5314a47895d5beded (diff)
downloadsqlalchemy-4580f942fb851963ce09a05a0c3e6ad6b861ed7d.tar.gz
Fix collections ABC access before Python 3.8
Started importing "collections" from "collections.abc" under Python 3.3 and greater for Python 3.8 compatibility. Pull request courtesy Nathaniel Knight. In Python 3.3, the abstract base classes (Iterable, Mapping, etc.) were moved from the `collections` module and put in the `collections.abc` module. They remain in the `collections` module for backwards compatibility, and will until Python 3.8. This commit adds a variable (`collections_abc`) to the `util/compat` module, which will be the `collections` module for Python < 3.3 and before, or the `collections.abc` module for Python >= 3.3. It also uses the new variable, getting rid of some deprecation warnings that were seen when running under Python 3.7. Change-Id: I2d1c0ef97c8ecac7af152cc56263422a40faa6bb Pull-request: https://github.com/zzzeek/sqlalchemy/pull/464 (cherry picked from commit a59c3b8f302a34ab037ec445b7452b1f353b91af)
-rw-r--r--doc/build/changelog/unreleased_12/pr464.rst6
-rw-r--r--lib/sqlalchemy/util/__init__.py2
-rw-r--r--lib/sqlalchemy/util/_collections.py6
-rw-r--r--lib/sqlalchemy/util/compat.py9
-rw-r--r--test/sql/test_operators.py2
5 files changed, 20 insertions, 5 deletions
diff --git a/doc/build/changelog/unreleased_12/pr464.rst b/doc/build/changelog/unreleased_12/pr464.rst
new file mode 100644
index 000000000..7f84c1916
--- /dev/null
+++ b/doc/build/changelog/unreleased_12/pr464.rst
@@ -0,0 +1,6 @@
+.. change::
+ :tags: bug, py3k
+
+ Started importing "collections" from "collections.abc" under Python 3.3 and
+ greater for Python 3.8 compatibility. Pull request courtesy Nathaniel
+ Knight.
diff --git a/lib/sqlalchemy/util/__init__.py b/lib/sqlalchemy/util/__init__.py
index 2a2d5cfc6..031376d78 100644
--- a/lib/sqlalchemy/util/__init__.py
+++ b/lib/sqlalchemy/util/__init__.py
@@ -21,7 +21,7 @@ from ._collections import KeyedTuple, ImmutableContainer, immutabledict, \
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
+ coerce_generator_arg, lightweight_named_tuple, collections_abc
from .langhelpers import iterate_attributes, class_hierarchy, \
portable_instancemethod, unbound_method_to_callable, \
diff --git a/lib/sqlalchemy/util/_collections.py b/lib/sqlalchemy/util/_collections.py
index cc084a7c7..d8e389c61 100644
--- a/lib/sqlalchemy/util/_collections.py
+++ b/lib/sqlalchemy/util/_collections.py
@@ -11,10 +11,10 @@ from __future__ import absolute_import
import weakref
import operator
from .compat import threading, itertools_filterfalse, string_types, \
- binary_types
+ binary_types, collections_abc
from . import py2k
import types
-import collections
+
EMPTY_SET = frozenset()
@@ -795,7 +795,7 @@ def coerce_generator_arg(arg):
def to_list(x, default=None):
if x is None:
return default
- if not isinstance(x, collections.Iterable) or \
+ if not isinstance(x, collections_abc.Iterable) or \
isinstance(x, string_types + binary_types):
return [x]
elif isinstance(x, list):
diff --git a/lib/sqlalchemy/util/compat.py b/lib/sqlalchemy/util/compat.py
index bc0c3e6e0..02be2b3b9 100644
--- a/lib/sqlalchemy/util/compat.py
+++ b/lib/sqlalchemy/util/compat.py
@@ -327,3 +327,12 @@ def nested(*managers):
exc = sys.exc_info()
if exc != (None, None, None):
reraise(exc[0], exc[1], exc[2])
+
+
+# Fix deprecation of accessing ABCs straight from collections module
+# (which will stop working in 3.8).
+if py33:
+ import collections.abc as collections_abc
+else:
+ import collections as collections_abc
+
diff --git a/test/sql/test_operators.py b/test/sql/test_operators.py
index f5446a856..f4b3cf584 100644
--- a/test/sql/test_operators.py
+++ b/test/sql/test_operators.py
@@ -636,7 +636,7 @@ class ExtensionOperatorTest(fixtures.TestBase, testing.AssertsCompiledSQL):
return self.op("->")(index)
col = Column('x', MyType())
- assert not isinstance(col, collections.Iterable)
+ assert not isinstance(col, util.collections_abc.Iterable)
def test_lshift(self):
class MyType(UserDefinedType):