From 31bf9b7e71c3fee3b7866ffdc0f70f4525a490d9 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Wed, 27 Jun 2018 15:30:54 +0200 Subject: [PATCH] Import abstract base classes from collections.abc In Python 3.7, importing ABCs directly from the `collections` module shows a warning (and in Python 3.8 it will stop working) - see https://github.com/python/cpython/commit/c66f9f8d3909f588c251957d499599a1680e2320 This fixes various DeprecationWarnings such as those: ``` .../jinja2/utils.py:485: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working from collections import MutableMapping .../jinja2/runtime.py:318: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working from collections import Mapping ``` --- docs/jinjaext.py | 4 ++-- jinja2/_compat.py | 6 ++++++ jinja2/runtime.py | 9 ++------- jinja2/sandbox.py | 12 +++++------- jinja2/tests.py | 5 ++--- jinja2/utils.py | 9 ++------- 6 files changed, 19 insertions(+), 26 deletions(-) diff --git a/docs/jinjaext.py b/docs/jinjaext.py index bb508089..fd38ee8f 100644 --- a/docs/jinjaext.py +++ b/docs/jinjaext.py @@ -8,7 +8,6 @@ :copyright: Copyright 2008 by Armin Ronacher. :license: BSD. """ -import collections import os import re import inspect @@ -26,6 +25,7 @@ from pygments.token import Keyword, Name, Comment, String, Error, \ Number, Operator, Generic from jinja2 import Environment, FileSystemLoader +from jinja2._compat import abc def parse_rst(state, content_offset, doc): @@ -160,7 +160,7 @@ def walk(node, indent): members = [] for key, name in node.__dict__.items(): if not key.startswith('_') and \ - not hasattr(node.__base__, key) and isinstance(name, collections.Callable): + not hasattr(node.__base__, key) and isinstance(name, abc.Callable): members.append(key) if members: members.sort() diff --git a/jinja2/_compat.py b/jinja2/_compat.py index 61d85301..4dbf6ea0 100644 --- a/jinja2/_compat.py +++ b/jinja2/_compat.py @@ -97,3 +97,9 @@ def __new__(cls, name, this_bases, d): from urllib.parse import quote_from_bytes as url_quote except ImportError: from urllib import quote as url_quote + + +try: + from collections import abc +except ImportError: + import collections as abc diff --git a/jinja2/runtime.py b/jinja2/runtime.py index f9d7a680..5e313369 100644 --- a/jinja2/runtime.py +++ b/jinja2/runtime.py @@ -20,7 +20,7 @@ TemplateNotFound from jinja2._compat import imap, text_type, iteritems, \ implements_iterator, implements_to_string, string_types, PY2, \ - with_metaclass + with_metaclass, abc # these variables are exported to the template runtime @@ -313,12 +313,7 @@ def __repr__(self): ) -# register the context as mapping if possible -try: - from collections import Mapping - Mapping.register(Context) -except ImportError: - pass +abc.Mapping.register(Context) class BlockReference(object): diff --git a/jinja2/sandbox.py b/jinja2/sandbox.py index 03aaebd2..8015ee0c 100644 --- a/jinja2/sandbox.py +++ b/jinja2/sandbox.py @@ -14,10 +14,9 @@ """ import types import operator -from collections import Mapping from jinja2.environment import Environment from jinja2.exceptions import SecurityError -from jinja2._compat import string_types, PY2 +from jinja2._compat import string_types, PY2, abc from jinja2.utils import Markup from markupsafe import EscapeFormatter @@ -79,10 +78,9 @@ pass #: register Python 2.6 abstract base classes -from collections import MutableSet, MutableMapping, MutableSequence -_mutable_set_types += (MutableSet,) -_mutable_mapping_types += (MutableMapping,) -_mutable_sequence_types += (MutableSequence,) +_mutable_set_types += (abc.MutableSet,) +_mutable_mapping_types += (abc.MutableMapping,) +_mutable_sequence_types += (abc.MutableSequence,) _mutable_spec = ( @@ -103,7 +101,7 @@ ) -class _MagicFormatMapping(Mapping): +class _MagicFormatMapping(abc.Mapping): """This class implements a dummy wrapper to fix a bug in the Python standard library for string formatting. diff --git a/jinja2/tests.py b/jinja2/tests.py index 0adc3d4d..bc99d66c 100644 --- a/jinja2/tests.py +++ b/jinja2/tests.py @@ -10,9 +10,8 @@ """ import operator import re -from collections import Mapping from jinja2.runtime import Undefined -from jinja2._compat import text_type, string_types, integer_types +from jinja2._compat import text_type, string_types, integer_types, abc import decimal number_re = re.compile(r'^-?\d+(\.\d+)?$') @@ -84,7 +83,7 @@ def test_mapping(value): .. versionadded:: 2.6 """ - return isinstance(value, Mapping) + return isinstance(value, abc.Mapping) def test_number(value): diff --git a/jinja2/utils.py b/jinja2/utils.py index 083ea274..538b7745 100644 --- a/jinja2/utils.py +++ b/jinja2/utils.py @@ -14,7 +14,7 @@ from collections import deque from threading import Lock from jinja2._compat import text_type, string_types, implements_iterator, \ - url_quote + url_quote, abc _word_split_re = re.compile(r'(\s+)') @@ -480,12 +480,7 @@ def __reversed__(self): __copy__ = copy -# register the LRU cache as mutable mapping if possible -try: - from collections import MutableMapping - MutableMapping.register(LRUCache) -except ImportError: - pass +abc.MutableMapping.register(LRUCache) def select_autoescape(enabled_extensions=('html', 'htm', 'xml'),