URL: https://github.com/freeipa/freeipa/pull/264 Author: tiran Title: #264: Python3 pylint fixes Action: synchronized
To pull the PR as Git branch: git remote add ghfreeipa https://github.com/freeipa/freeipa git fetch ghfreeipa pull/264/head:pr264 git checkout pr264
From 07a5c1a62f2a42728544a305480b7ff1ecfac8c1 Mon Sep 17 00:00:00 2001 From: Christian Heimes <chei...@redhat.com> Date: Wed, 23 Nov 2016 10:04:43 +0100 Subject: [PATCH 1/3] Python3 pylint fixes Sprinkle 'pylint disable' comments over the code base to silence a bunch of pylint warnings on Python 3. All silenced warnings are harmless and not bugs. https://fedorahosted.org/freeipa/ticket/4985 Signed-off-by: Christian Heimes <chei...@redhat.com> --- client/ipa-client-automount | 2 +- install/tools/ipa-adtrust-install | 2 +- install/tools/ipa-compat-manage | 2 +- install/tools/ipa-csreplica-manage | 2 +- install/tools/ipa-dns-install | 2 +- install/tools/ipa-managed-entries | 2 +- install/tools/ipa-nis-manage | 2 +- install/tools/ipa-replica-conncheck | 2 ++ ipaclient/ipa_certupdate.py | 2 ++ ipalib/cli.py | 6 +++--- ipalib/plugable.py | 2 +- ipalib/rpc.py | 2 ++ ipalib/text.py | 4 +++- ipapython/admintool.py | 2 +- ipapython/config.py | 5 ++++- ipapython/install/cli.py | 2 +- ipapython/ipautil.py | 2 ++ ipaserver/install/certs.py | 6 +++++- ipaserver/install/ipa_cacert_manage.py | 2 +- ipaserver/install/ipa_replica_prepare.py | 2 ++ ipaserver/install/ipa_server_certinstall.py | 2 +- ipatests/i18n.py | 2 +- lite-server.py | 2 +- makeapi | 2 +- 24 files changed, 40 insertions(+), 21 deletions(-) diff --git a/client/ipa-client-automount b/client/ipa-client-automount index b4aa7e8..53c0537 100755 --- a/client/ipa-client-automount +++ b/client/ipa-client-automount @@ -39,7 +39,7 @@ import SSSDConfig from six.moves.urllib.parse import urlsplit # pylint: enable=import-error -from optparse import OptionParser +from optparse import OptionParser # pylint: disable=deprecated-module from ipalib import api, errors from ipapython import sysrestore from ipapython import ipautil diff --git a/install/tools/ipa-adtrust-install b/install/tools/ipa-adtrust-install index 8eed519..c8d5894 100755 --- a/install/tools/ipa-adtrust-install +++ b/install/tools/ipa-adtrust-install @@ -29,7 +29,7 @@ import ldap import six -from optparse import SUPPRESS_HELP +from optparse import SUPPRESS_HELP # pylint: disable=deprecated-module from ipaserver.install import adtrustinstance from ipaserver.install.installutils import ( diff --git a/install/tools/ipa-compat-manage b/install/tools/ipa-compat-manage index 905495f..307af1f 100755 --- a/install/tools/ipa-compat-manage +++ b/install/tools/ipa-compat-manage @@ -24,7 +24,7 @@ from __future__ import print_function import sys from ipaplatform.paths import paths try: - from optparse import OptionParser + from optparse import OptionParser # pylint: disable=deprecated-module from ipapython import ipautil, config from ipaserver.install import installutils from ipaserver.install.ldapupdate import LDAPUpdate diff --git a/install/tools/ipa-csreplica-manage b/install/tools/ipa-csreplica-manage index 532e353..a4d0a88 100755 --- a/install/tools/ipa-csreplica-manage +++ b/install/tools/ipa-csreplica-manage @@ -50,7 +50,7 @@ commands = { def parse_options(): - from optparse import OptionParser + from optparse import OptionParser # pylint: disable=deprecated-module parser = OptionParser(version=version.VERSION) parser.add_option("-H", "--host", dest="host", help="starting host") diff --git a/install/tools/ipa-dns-install b/install/tools/ipa-dns-install index 9c63e12..699749d 100755 --- a/install/tools/ipa-dns-install +++ b/install/tools/ipa-dns-install @@ -24,7 +24,7 @@ from __future__ import print_function import os import sys -from optparse import SUPPRESS_HELP +from optparse import SUPPRESS_HELP # pylint: disable=deprecated-module from ipaserver.install import bindinstance from ipaserver.install import installutils diff --git a/install/tools/ipa-managed-entries b/install/tools/ipa-managed-entries index 5761020..59f14fc 100755 --- a/install/tools/ipa-managed-entries +++ b/install/tools/ipa-managed-entries @@ -22,7 +22,7 @@ from __future__ import print_function import re import sys -from optparse import OptionParser +from optparse import OptionParser # pylint: disable=deprecated-module from ipapython import config from ipaserver.install import installutils diff --git a/install/tools/ipa-nis-manage b/install/tools/ipa-nis-manage index b72e273..fae458c 100755 --- a/install/tools/ipa-nis-manage +++ b/install/tools/ipa-nis-manage @@ -25,7 +25,7 @@ import sys import os from ipaplatform.paths import paths try: - from optparse import OptionParser + from optparse import OptionParser # pylint: disable=deprecated-module from ipapython import ipautil, config from ipaserver.install import installutils from ipaserver.install.ldapupdate import LDAPUpdate diff --git a/install/tools/ipa-replica-conncheck b/install/tools/ipa-replica-conncheck index 4045e41..7ec1ef8 100755 --- a/install/tools/ipa-replica-conncheck +++ b/install/tools/ipa-replica-conncheck @@ -27,7 +27,9 @@ from ipapython import ipautil, certdb from ipalib import api, errors, x509 from ipaserver.install import installutils import ipaclient.ipachangeconf +# pylint: disable=deprecated-module from optparse import OptionGroup, OptionValueError +# pylint: enable=deprecated-module from ipapython.ipa_log_manager import root_logger, standard_logging_setup import sys import os diff --git a/ipaclient/ipa_certupdate.py b/ipaclient/ipa_certupdate.py index 6bf9831..6e41de9 100644 --- a/ipaclient/ipa_certupdate.py +++ b/ipaclient/ipa_certupdate.py @@ -99,7 +99,9 @@ def run(self): if server_fstore.has_files(): self.update_server(certs) try: + # pylint: disable=import-error from ipaserver.install import cainstance + # pylint: enable=import-error cainstance.add_lightweight_ca_tracking_requests( self.log, lwcas) except Exception: diff --git a/ipalib/cli.py b/ipalib/cli.py index ad876ea..696be62 100644 --- a/ipalib/cli.py +++ b/ipalib/cli.py @@ -27,7 +27,7 @@ import sys import getpass import code -import optparse +import optparse # pylint: disable=deprecated-module import fcntl import termios import struct @@ -41,8 +41,8 @@ unicode = str if six.PY2: - reload(sys) # pylint: disable=reload-builtin - sys.setdefaultencoding('utf-8') # pylint: disable=no-member + reload(sys) # pylint: disable=reload-builtin, undefined-variable + sys.setdefaultencoding('utf-8') # pylint: disable=no-member from ipalib import frontend from ipalib import backend diff --git a/ipalib/plugable.py b/ipalib/plugable.py index 76fb9fd..31e2cdf 100644 --- a/ipalib/plugable.py +++ b/ipalib/plugable.py @@ -31,7 +31,7 @@ import threading import os from os import path -import optparse +import optparse # pylint: disable=deprecated-module import textwrap import collections import importlib diff --git a/ipalib/rpc.py b/ipalib/rpc.py index 7756eaf..bd13251 100644 --- a/ipalib/rpc.py +++ b/ipalib/rpc.py @@ -623,7 +623,9 @@ def single_request(self, host, handler, request_body, verbose=0): while True: if six.PY2: + # pylint: disable=no-value-for-parameter self.send_request(h, handler, request_body) + # pylint: enable=no-value-for-parameter self.send_host(h, host) self.send_user_agent(h) self.send_content(h, request_body) diff --git a/ipalib/text.py b/ipalib/text.py index 34e5f1a..f4f810c 100644 --- a/ipalib/text.py +++ b/ipalib/text.py @@ -254,7 +254,7 @@ def as_unicode(self): else: t = create_translation(self.key) if six.PY2: - return t.ugettext(self.msg) + return t.ugettext(self.msg) # pylint: disable=no-member else: return t.gettext(self.msg) @@ -409,7 +409,9 @@ def __call__(self, count): else: t = create_translation(self.key) if six.PY2: + # pylint: disable=no-member return t.ungettext(self.singular, self.plural, count) + # pylint: enable=no-member else: return t.ngettext(self.singular, self.plural, count) diff --git a/ipapython/admintool.py b/ipapython/admintool.py index ec0e7e0..78bbcec 100644 --- a/ipapython/admintool.py +++ b/ipapython/admintool.py @@ -25,7 +25,7 @@ import sys import os import traceback -from optparse import OptionGroup +from optparse import OptionGroup # pylint: disable=deprecated-module from ipapython import version from ipapython import config diff --git a/ipapython/config.py b/ipapython/config.py index 8e5708e..f71c696 100644 --- a/ipapython/config.py +++ b/ipapython/config.py @@ -17,7 +17,10 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. # -from optparse import Option, Values, OptionParser, IndentedHelpFormatter, OptionValueError +# pylint: disable=deprecated-module +from optparse import ( + Option, Values, OptionParser, IndentedHelpFormatter, OptionValueError) +# pylint: enable=deprecated-module from copy import copy from dns import resolver, rdatatype diff --git a/ipapython/install/cli.py b/ipapython/install/cli.py index 7fbb725..b6f872e 100644 --- a/ipapython/install/cli.py +++ b/ipapython/install/cli.py @@ -9,7 +9,7 @@ import collections import enum import functools -import optparse +import optparse # pylint: disable=deprecated-module import signal import six diff --git a/ipapython/ipautil.py b/ipapython/ipautil.py index f7d7537..3a827d9 100644 --- a/ipapython/ipautil.py +++ b/ipapython/ipautil.py @@ -690,7 +690,9 @@ def __contains__(self, key): if six.PY2: def has_key(self, key): + # pylint: disable=no-member return super(CIDict, self).has_key(key.lower()) + # pylint: enable=no-member def get(self, key, failobj=None): try: diff --git a/ipaserver/install/certs.py b/ipaserver/install/certs.py index 852bcec..75a0412 100644 --- a/ipaserver/install/certs.py +++ b/ipaserver/install/certs.py @@ -30,6 +30,7 @@ import time import datetime +import six from six.moves import configparser from ipapython.ipa_log_manager import root_logger @@ -720,7 +721,10 @@ def _do(self, func, owner): def _read(self, fileobj): p = configparser.RawConfigParser() - p.readfp(fileobj) + if six.PY2: + p.readfp(fileobj) # pylint: disable=deprecated-method + else: + p.read_file(fileobj) # pylint: disable=no-member try: self._locked = p.getboolean('lock', 'locked') diff --git a/ipaserver/install/ipa_cacert_manage.py b/ipaserver/install/ipa_cacert_manage.py index 0dcb70f..9a09b2a 100644 --- a/ipaserver/install/ipa_cacert_manage.py +++ b/ipaserver/install/ipa_cacert_manage.py @@ -20,7 +20,7 @@ from __future__ import print_function import os -from optparse import OptionGroup +from optparse import OptionGroup # pylint: disable=deprecated-module from cryptography.hazmat.primitives import serialization import gssapi diff --git a/ipaserver/install/ipa_replica_prepare.py b/ipaserver/install/ipa_replica_prepare.py index 227d296..1b6a961 100644 --- a/ipaserver/install/ipa_replica_prepare.py +++ b/ipaserver/install/ipa_replica_prepare.py @@ -25,7 +25,9 @@ import shutil import tempfile import time +# pylint: disable=deprecated-module from optparse import OptionGroup, SUPPRESS_HELP +# pylint: enable=deprecated-module import dns.resolver # pylint: disable=import-error diff --git a/ipaserver/install/ipa_server_certinstall.py b/ipaserver/install/ipa_server_certinstall.py index 3c30876..9cb7ed1 100644 --- a/ipaserver/install/ipa_server_certinstall.py +++ b/ipaserver/install/ipa_server_certinstall.py @@ -21,7 +21,7 @@ import os import os.path import pwd -import optparse +import optparse # pylint: disable=deprecated-module from ipaplatform.constants import constants from ipaplatform.paths import paths diff --git a/ipatests/i18n.py b/ipatests/i18n.py index 1f48e65..b86380c 100755 --- a/ipatests/i18n.py +++ b/ipatests/i18n.py @@ -23,7 +23,7 @@ # WARNING: Do not import ipa modules, this is also used as a # stand-alone script (invoked from po Makefile). -import optparse +import optparse # pylint: disable=deprecated-module import sys import gettext import re diff --git a/lite-server.py b/lite-server.py index 0e86791..cd4f09c 100755 --- a/lite-server.py +++ b/lite-server.py @@ -32,7 +32,7 @@ """ from os import path, getcwd -import optparse +import optparse # pylint: disable=deprecated-module from paste import httpserver import paste.gzipper from paste.urlmap import URLMap diff --git a/makeapi b/makeapi index a02a491..d0a7295 100755 --- a/makeapi +++ b/makeapi @@ -86,7 +86,7 @@ OUTPUT_IGNORED_ATTRIBUTES = ( ) def parse_options(): - from optparse import OptionParser + from optparse import OptionParser # pylint: disable=deprecated-module parser = OptionParser() parser.add_option("--validate", dest="validate", action="store_true", From 91cbd9e28e97cdb18bb00c05e52aea9478cdd236 Mon Sep 17 00:00:00 2001 From: Christian Heimes <chei...@redhat.com> Date: Wed, 23 Nov 2016 11:01:56 +0100 Subject: [PATCH 2/3] Fix Python 3 bugs discovered by pylint In Python 3 exception instances no longer have a message attribute. For most exceptions, str(e) or string formatting give the same result. Fix some renamed modules, module members and functions. https://fedorahosted.org/freeipa/ticket/4985 Signed-off-by: Christian Heimes <chei...@redhat.com> --- ipalib/krb_utils.py | 2 +- ipapython/ipaldap.py | 5 ++++- ipaserver/install/dns.py | 4 ++-- ipaserver/plugins/aci.py | 2 +- ipaserver/plugins/dns.py | 2 +- ipatests/i18n.py | 12 ++++++++++-- ipatests/test_integration/env_config.py | 4 ++-- ipatests/test_integration/tasks.py | 3 ++- ipatests/test_integration/test_idviews.py | 2 +- ipatests/test_xmlrpc/test_automount_plugin.py | 2 +- 10 files changed, 25 insertions(+), 13 deletions(-) diff --git a/ipalib/krb_utils.py b/ipalib/krb_utils.py index e6e277c..d005a87 100644 --- a/ipalib/krb_utils.py +++ b/ipalib/krb_utils.py @@ -161,7 +161,7 @@ def get_credentials(name=None, ccache_name=None): return gssapi.Credentials(usage='initiate', name=name, store=store) except gssapi.exceptions.GSSError as e: if e.min_code == KRB5_FCC_NOFILE: # pylint: disable=no-member - raise ValueError('"%s", ccache="%s"' % (e.message, ccache_name)) + raise ValueError('"%s", ccache="%s"' % (e, ccache_name)) raise def get_principal(ccache_name=None): diff --git a/ipapython/ipaldap.py b/ipapython/ipaldap.py index bbfc6f6..94a5e1e 100644 --- a/ipapython/ipaldap.py +++ b/ipapython/ipaldap.py @@ -27,7 +27,10 @@ import collections import os import pwd -from urlparse import urlparse + +# pylint: disable=import-error +from six.moves.urllib.parse import urlparse +# pylint: enable=import-error import ldap import ldap.sasl diff --git a/ipaserver/install/dns.py b/ipaserver/install/dns.py index 5b40c03..ecf03ed 100644 --- a/ipaserver/install/dns.py +++ b/ipaserver/install/dns.py @@ -132,7 +132,7 @@ def install_check(standalone, api, replica, options, hostname): if options.force or options.allow_zone_overlap: root_logger.warning("%s Please make sure that the domain is " "properly delegated to this IPA server.", - e.message) + e) else: raise e @@ -141,7 +141,7 @@ def install_check(standalone, api, replica, options, hostname): dnsutil.check_zone_overlap(reverse_zone) except ValueError as e: if options.force or options.allow_zone_overlap: - root_logger.warning(e.message) + root_logger.warning(six.text_type(e)) else: raise e diff --git a/ipaserver/plugins/aci.py b/ipaserver/plugins/aci.py index c353715..e09a0ab 100644 --- a/ipaserver/plugins/aci.py +++ b/ipaserver/plugins/aci.py @@ -354,7 +354,7 @@ def _aci_to_kw(ldap, a, test=False, pkey_only=False): try: targetdn = DN(target.replace('ldap:///','')) except ValueError as e: - raise errors.ValidationError(name='subtree', error=_("invalid DN (%s)") % e.message) + raise errors.ValidationError(name='subtree', error=_("invalid DN (%s)") % e) if targetdn.endswith(DN(api.env.container_group, api.env.basedn)): kw['targetgroup'] = targetdn[0]['cn'] else: diff --git a/ipaserver/plugins/dns.py b/ipaserver/plugins/dns.py index e37050a..d8d9fd7 100644 --- a/ipaserver/plugins/dns.py +++ b/ipaserver/plugins/dns.py @@ -2149,7 +2149,7 @@ def pre_callback(self, ldap, dn, entry_attrs, attrs_list, *keys, **options): try: check_zone_overlap(keys[-1], raise_on_error=False) except ValueError as e: - raise errors.InvocationError(e.message) + raise errors.InvocationError(six.text_type(e)) return dn diff --git a/ipatests/i18n.py b/ipatests/i18n.py index b86380c..b21a907 100755 --- a/ipatests/i18n.py +++ b/ipatests/i18n.py @@ -32,6 +32,8 @@ import polib from collections import namedtuple +import six + ''' We test our translations by taking the original untranslated string (e.g. msgid) and prepend a prefix character and then append a suffix @@ -607,8 +609,14 @@ def test_translations(po_file, lang, domain, locale_dir): t = gettext.translation(domain, locale_dir) - get_msgstr = t.ugettext - get_msgstr_plural = t.ungettext + if six.PY2: + # pylint: disable=no-member + get_msgstr = t.ugettext + get_msgstr_plural = t.ungettext + # pylint: enable=no-member + else: + get_msgstr = t.gettext + get_msgstr_plural = t.ngettext return po_file_iterate(po_file, get_msgstr, get_msgstr_plural) diff --git a/ipatests/test_integration/env_config.py b/ipatests/test_integration/env_config.py index 6e3770f..2a137c6 100644 --- a/ipatests/test_integration/env_config.py +++ b/ipatests/test_integration/env_config.py @@ -114,8 +114,8 @@ def config_from_env(env): try: import yaml except ImportError as e: - raise ImportError("%s, please install PyYAML package to fix it" % - e.message) + raise ImportError( + "%s, please install PyYAML package to fix it" % e) with open(env['IPATEST_YAML_CONFIG']) as file: confdict = yaml.safe_load(file) return Config.from_dict(confdict) diff --git a/ipatests/test_integration/tasks.py b/ipatests/test_integration/tasks.py index c6aab32..58b3a65 100644 --- a/ipatests/test_integration/tasks.py +++ b/ipatests/test_integration/tasks.py @@ -1032,7 +1032,8 @@ def install_topo(topo, master, replicas, clients, domain_level=None, def install_clients(servers, clients): """Install IPA clients, distributing them among the given servers""" - for server, client in itertools.izip(itertools.cycle(servers), clients): + izip = getattr(itertools, 'izip', zip) + for server, client in izip(itertools.cycle(servers), clients): log.info('Installing client %s on %s' % (server, client)) install_client(server, client) diff --git a/ipatests/test_integration/test_idviews.py b/ipatests/test_integration/test_idviews.py index 9df8c0a..8a117e0 100644 --- a/ipatests/test_integration/test_idviews.py +++ b/ipatests/test_integration/test_idviews.py @@ -68,7 +68,7 @@ def install(cls, mh): # Initialize NSS database tasks.run_certutil(master, ["-N", "-f", cls.pwname], cls.reqdir) # Now generate self-signed certs for a windows user - stdin_text = string.digits+string.letters[2:] + '\n' + stdin_text = string.digits+string.ascii_letters[2:] + '\n' tasks.run_certutil(master, ['-S', '-s', "cn=%s,dc=ad,dc=test" % cls.adcert1, '-n', cls.adcert1, '-x', '-t', 'CT,C,C', '-v', diff --git a/ipatests/test_xmlrpc/test_automount_plugin.py b/ipatests/test_xmlrpc/test_automount_plugin.py index e3ad8b4..aa39b60 100644 --- a/ipatests/test_xmlrpc/test_automount_plugin.py +++ b/ipatests/test_xmlrpc/test_automount_plugin.py @@ -106,7 +106,7 @@ def check_import_roundtrip(self): skipped=(), duplicatemaps=(), duplicatekeys=(), - )), res) + )), res) # pylint: disable=used-before-assignment self.check_tofiles() finally: res = api.Command['automountlocation_del'](self.locname)['result'] From 6089d744f5984f6d018fe506589fb409ac4bcab1 Mon Sep 17 00:00:00 2001 From: Christian Heimes <chei...@redhat.com> Date: Wed, 23 Nov 2016 11:10:16 +0100 Subject: [PATCH 3/3] [Py3] Silence import warnings for Samba bindings Python 3 Samba bindings are not available yet. Let's silence the warnings to make pylint pass under Python 3. https://fedorahosted.org/freeipa/ticket/4985 Signed-off-by: Christian Heimes <chei...@redhat.com> --- ipaserver/dcerpc.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/ipaserver/dcerpc.py b/ipaserver/dcerpc.py index 508bfab..097637f 100644 --- a/ipaserver/dcerpc.py +++ b/ipaserver/dcerpc.py @@ -35,13 +35,18 @@ import os import struct +import random + +# TODO: Remove pylint disable when Python 3 bindings are available. +# pylint: disable=import-error from samba import param from samba import credentials from samba.dcerpc import security, lsa, drsblobs, nbt, netlogon from samba.ndr import ndr_pack, ndr_print from samba import net import samba -import random +# pylint: enable=import-error + from cryptography.hazmat.primitives.ciphers import Cipher, algorithms from cryptography.hazmat.backends import default_backend import ldap as _ldap
-- Manage your subscription for the Freeipa-devel mailing list: https://www.redhat.com/mailman/listinfo/freeipa-devel Contribute to FreeIPA: http://www.freeipa.org/page/Contribute/Code