Import ABCs from collections.abc

Python 3 has moved all collection abstract base classes to
collections.abc. Python 3.7 started to deprecate the old aliases.

The whole import block needs to be protected with import-error and
no-name-in-module, because Python 2 doesn't have collections.abc module and
collections.abc.Mapping, while Python 3 doesn't have collections.Mapping.

Fixes: https://pagure.io/freeipa/issue/7609
Signed-off-by: Christian Heimes <cheimes@redhat.com>
Reviewed-By: Fraser Tweedale <ftweedal@redhat.com>
This commit is contained in:
Christian Heimes 2018-07-04 10:07:49 +02:00
parent 53c5496647
commit 198a2c6112
8 changed files with 71 additions and 17 deletions

View File

@ -2,7 +2,6 @@
# Copyright (C) 2016 FreeIPA Contributors see COPYING for license # Copyright (C) 2016 FreeIPA Contributors see COPYING for license
# #
import collections
import errno import errno
import json import json
import locale import locale
@ -10,16 +9,25 @@ import logging
import os import os
import time import time
import six
from . import compat from . import compat
from . import schema from . import schema
from ipaclient.plugins.rpcclient import rpcclient from ipaclient.plugins.rpcclient import rpcclient
from ipalib.constants import USER_CACHE_PATH from ipalib.constants import USER_CACHE_PATH
from ipapython.dnsutil import DNSName from ipapython.dnsutil import DNSName
# pylint: disable=no-name-in-module, import-error
if six.PY3:
from collections.abc import MutableMapping
else:
from collections import MutableMapping
# pylint: enable=no-name-in-module, import-error
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
class ServerInfo(collections.MutableMapping): class ServerInfo(MutableMapping):
_DIR = os.path.join(USER_CACHE_PATH, 'ipa', 'servers') _DIR = os.path.join(USER_CACHE_PATH, 'ipa', 'servers')
def __init__(self, api): def __init__(self, api):

View File

@ -2,7 +2,6 @@
# Copyright (C) 2016 FreeIPA Contributors see COPYING for license # Copyright (C) 2016 FreeIPA Contributors see COPYING for license
# #
import collections
import errno import errno
import json import json
import logging import logging
@ -27,6 +26,13 @@ from ipapython.ipautil import fsdecode
from ipapython.dn import DN from ipapython.dn import DN
from ipapython.dnsutil import DNSName from ipapython.dnsutil import DNSName
# pylint: disable=no-name-in-module, import-error
if six.PY3:
from collections.abc import Mapping, Sequence
else:
from collections import Mapping, Sequence
# pylint: enable=no-name-in-module, import-error
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
FORMAT = '1' FORMAT = '1'
@ -39,7 +45,7 @@ _TYPES = {
'DNSName': DNSName, 'DNSName': DNSName,
'Principal': unicode, 'Principal': unicode,
'NoneType': type(None), 'NoneType': type(None),
'Sequence': collections.Sequence, 'Sequence': Sequence,
'bool': bool, 'bool': bool,
'dict': dict, 'dict': dict,
'int': int, 'int': int,
@ -315,7 +321,7 @@ class _SchemaObjectPlugin(_SchemaPlugin):
schema_key = 'classes' schema_key = 'classes'
class _SchemaNameSpace(collections.Mapping): class _SchemaNameSpace(Mapping):
def __init__(self, schema, name): def __init__(self, schema, name):
self.name = name self.name = name

View File

@ -51,6 +51,13 @@ from ipapython.ipa_log_manager import (
LOGGING_FORMAT_STDERR) LOGGING_FORMAT_STDERR)
from ipapython.version import VERSION, API_VERSION, DEFAULT_PLUGINS from ipapython.version import VERSION, API_VERSION, DEFAULT_PLUGINS
# pylint: disable=no-name-in-module, import-error
if six.PY3:
from collections.abc import Mapping
else:
from collections import Mapping
# pylint: enable=no-name-in-module, import-error
if six.PY3: if six.PY3:
unicode = str unicode = str
@ -282,7 +289,7 @@ class Plugin(ReadOnly):
) )
class APINameSpace(collections.Mapping): class APINameSpace(Mapping):
def __init__(self, api, base): def __init__(self, api, base):
self.__api = api self.__api = api
self.__base = base self.__base = base

View File

@ -28,7 +28,6 @@ from __future__ import absolute_import
import os import os
import json import json
import time import time
import collections
import logging import logging
import warnings import warnings
@ -37,6 +36,12 @@ import six
from ipapython import ipautil from ipapython import ipautil
from ipaplatform.paths import paths from ipaplatform.paths import paths
# pylint: disable=no-name-in-module, import-error
if six.PY3:
from collections.abc import Mapping
else:
from collections import Mapping
# pylint: enable=no-name-in-module, import-error
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -62,7 +67,7 @@ wellknownports = {
SERVICE_POLL_INTERVAL = 0.1 # seconds SERVICE_POLL_INTERVAL = 0.1 # seconds
class KnownServices(collections.Mapping): class KnownServices(Mapping):
""" """
KnownServices is an abstract class factory that should give out instances KnownServices is an abstract class factory that should give out instances
of well-known platform services. Actual implementation must create these of well-known platform services. Actual implementation must create these

View File

@ -27,7 +27,6 @@ import datetime
from decimal import Decimal from decimal import Decimal
from copy import deepcopy from copy import deepcopy
import contextlib import contextlib
import collections
import os import os
import pwd import pwd
import warnings import warnings
@ -53,6 +52,13 @@ from ipapython.dn import DN
from ipapython.dnsutil import DNSName from ipapython.dnsutil import DNSName
from ipapython.kerberos import Principal from ipapython.kerberos import Principal
# pylint: disable=no-name-in-module, import-error
if six.PY3:
from collections.abc import MutableMapping
else:
from collections import MutableMapping
# pylint: enable=no-name-in-module, import-error
if six.PY3: if six.PY3:
unicode = str unicode = str
@ -213,7 +219,7 @@ class SchemaCache(object):
schema_cache = SchemaCache() schema_cache = SchemaCache()
class LDAPEntry(collections.MutableMapping): class LDAPEntry(MutableMapping):
__slots__ = ('_conn', '_dn', '_names', '_nice', '_raw', '_sync', __slots__ = ('_conn', '_dn', '_names', '_nice', '_raw', '_sync',
'_not_list', '_orig_raw', '_raw_view', '_not_list', '_orig_raw', '_raw_view',
'_single_value_view') '_single_value_view')
@ -577,7 +583,7 @@ class LDAPEntry(collections.MutableMapping):
return iter(self._nice) return iter(self._nice)
class LDAPEntryView(collections.MutableMapping): class LDAPEntryView(MutableMapping):
__slots__ = ('_entry',) __slots__ = ('_entry',)
def __init__(self, entry): def __init__(self, entry):

View File

@ -5,10 +5,11 @@
from __future__ import print_function, absolute_import from __future__ import print_function, absolute_import
from binascii import hexlify from binascii import hexlify
import collections
import logging import logging
from pprint import pprint from pprint import pprint
import six
import ipalib import ipalib
from ipaplatform.paths import paths from ipaplatform.paths import paths
from ipapython.dn import DN from ipapython.dn import DN
@ -23,6 +24,13 @@ from ipaserver.dnssec.abshsm import (
from ipaserver import p11helper as _ipap11helper from ipaserver import p11helper as _ipap11helper
import uuid import uuid
# pylint: disable=no-name-in-module, import-error
if six.PY3:
from collections.abc import MutableMapping
else:
from collections import MutableMapping
# pylint: enable=no-name-in-module, import-error
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -122,7 +130,7 @@ def str_hexlify(data):
return out return out
class Key(collections.MutableMapping): class Key(MutableMapping):
"""abstraction to hide LDAP entry weirdnesses: """abstraction to hide LDAP entry weirdnesses:
- non-normalized attribute names - non-normalized attribute names
- boolean attributes returned as strings - boolean attributes returned as strings

View File

@ -5,10 +5,11 @@
from __future__ import print_function, absolute_import from __future__ import print_function, absolute_import
import collections
import os import os
from pprint import pprint from pprint import pprint
import six
from ipalib.constants import SOFTHSM_DNSSEC_TOKEN_LABEL from ipalib.constants import SOFTHSM_DNSSEC_TOKEN_LABEL
from ipaplatform.paths import paths from ipaplatform.paths import paths
from ipaserver import p11helper as _ipap11helper from ipaserver import p11helper as _ipap11helper
@ -17,6 +18,13 @@ from ipaserver.dnssec.abshsm import (attrs_name2id, attrs_id2name, AbstractHSM,
ldap2p11helper_api_params) ldap2p11helper_api_params)
from ipaserver.dnssec.ldapkeydb import str_hexlify from ipaserver.dnssec.ldapkeydb import str_hexlify
# pylint: disable=no-name-in-module, import-error
if six.PY3:
from collections.abc import MutableMapping
else:
from collections import MutableMapping
# pylint: enable=no-name-in-module, import-error
private_key_api_params = set(["label", "id", "data", "unwrapping_key", private_key_api_params = set(["label", "id", "data", "unwrapping_key",
"wrapping_mech", "key_type", "cka_always_authenticate", "cka_copyable", "wrapping_mech", "key_type", "cka_always_authenticate", "cka_copyable",
@ -28,7 +36,8 @@ public_key_api_params = set(["label", "id", "data", "cka_copyable",
"cka_derive", "cka_encrypt", "cka_modifiable", "cka_private", "cka_derive", "cka_encrypt", "cka_modifiable", "cka_private",
"cka_trusted", "cka_verify", "cka_verify_recover", "cka_wrap"]) "cka_trusted", "cka_verify", "cka_verify_recover", "cka_wrap"])
class Key(collections.MutableMapping):
class Key(MutableMapping):
def __init__(self, p11, handle): def __init__(self, p11, handle):
self.p11 = p11 self.p11 = p11
self.handle = handle self.handle = handle

View File

@ -22,7 +22,6 @@ Base class for all XML-RPC tests
""" """
from __future__ import print_function from __future__ import print_function
import collections
import datetime import datetime
import inspect import inspect
import unittest import unittest
@ -34,6 +33,12 @@ from ipatests.util import assert_deepequal, Fuzzy
from ipalib import api, request, errors from ipalib import api, request, errors
from ipapython.version import API_VERSION from ipapython.version import API_VERSION
# pylint: disable=no-name-in-module, import-error
if six.PY3:
from collections.abc import Sequence
else:
from collections import Sequence
# pylint: enable=no-name-in-module, import-error
# Matches a gidnumber like '1391016742' # Matches a gidnumber like '1391016742'
# FIXME: Does it make more sense to return gidnumber, uidnumber, etc. as `int` # FIXME: Does it make more sense to return gidnumber, uidnumber, etc. as `int`
@ -57,7 +62,7 @@ fuzzy_base64 = Fuzzy('^[0-9A-Za-z/+]+={0,2}$')
def fuzzy_sequence_of(fuzzy): def fuzzy_sequence_of(fuzzy):
"""Construct a Fuzzy for a Sequence of values matching the given Fuzzy.""" """Construct a Fuzzy for a Sequence of values matching the given Fuzzy."""
def test(xs): def test(xs):
if not isinstance(xs, collections.Sequence): if not isinstance(xs, Sequence):
return False return False
else: else:
return all(fuzzy == x for x in xs) return all(fuzzy == x for x in xs)