cros lint: upgrade to pylint-1.7

This includes some more Python 3 related compat checks.

Disable the no-else-return check as we're OK with the style.

BUG=chromium:980619
TEST=`cros lint` is unchanged

Change-Id: I4ed3c3877795ea00db89fcf3f005e397e8ed784f
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/chromite/+/1849355
Tested-by: Mike Frysinger <vapier@chromium.org>
Commit-Queue: Mike Frysinger <vapier@chromium.org>
Reviewed-by: Chris McDonald <cjmcdonald@chromium.org>
diff --git a/api/field_handler.py b/api/field_handler.py
index e6c1418..a9caff1 100644
--- a/api/field_handler.py
+++ b/api/field_handler.py
@@ -21,7 +21,10 @@
 from chromite.lib import cros_logging as logging
 from chromite.lib import osutils
 
+# TODO(vapier): Re-enable check once we upgrade to pylint-1.8+.
+# pylint: disable=no-name-in-module
 from google.protobuf import message as protobuf_message
+# pylint: enable=no-name-in-module
 
 
 class Error(Exception):
diff --git a/api/router.py b/api/router.py
index 32f7b98..db0403a 100644
--- a/api/router.py
+++ b/api/router.py
@@ -14,8 +14,11 @@
 import importlib
 import os
 
+# TODO(vapier): Re-enable check once we upgrade to pylint-1.8+.
+# pylint: disable=no-name-in-module
 from google.protobuf import json_format
 from google.protobuf import symbol_database
+# pylint: enable=no-name-in-module
 
 from chromite.api import controller
 from chromite.api import field_handler
diff --git a/api/router_unittest.py b/api/router_unittest.py
index 742ed69..2375e73 100644
--- a/api/router_unittest.py
+++ b/api/router_unittest.py
@@ -9,7 +9,10 @@
 
 import os
 
+# TODO(vapier): Re-enable check once we upgrade to pylint-1.8+.
+# pylint: disable=no-name-in-module
 from google.protobuf import json_format
+# pylint: enable=no-name-in-module
 
 from chromite.api import api_config
 from chromite.api import router
diff --git a/api/validate.py b/api/validate.py
index f924d11..f3659b8 100644
--- a/api/validate.py
+++ b/api/validate.py
@@ -19,7 +19,10 @@
 from chromite.lib import cros_build_lib
 from chromite.lib import cros_logging as logging
 
+# TODO(vapier): Re-enable check once we upgrade to pylint-1.8+.
+# pylint: disable=no-name-in-module
 from google.protobuf import message as protobuf_message
+# pylint: enable=no-name-in-module
 
 
 def _value(field, message):
diff --git a/cbuildbot/commands.py b/cbuildbot/commands.py
index eeea3f6..7071fa7 100644
--- a/cbuildbot/commands.py
+++ b/cbuildbot/commands.py
@@ -52,7 +52,10 @@
 from chromite.scripts import pushimage
 from chromite.service import artifacts as artifacts_service
 
+# TODO(vapier): Re-enable check once we upgrade to pylint-1.8+.
+# pylint: disable=no-name-in-module
 from google.protobuf import json_format
+# pylint: enable=no-name-in-module
 
 
 _PACKAGE_FILE = '%(buildroot)s/src/scripts/cbuildbot_package.list'
diff --git a/cbuildbot/stages/artifact_stages.py b/cbuildbot/stages/artifact_stages.py
index 3b80342..4ee4dc4 100644
--- a/cbuildbot/stages/artifact_stages.py
+++ b/cbuildbot/stages/artifact_stages.py
@@ -41,6 +41,8 @@
 class NothingToArchiveException(Exception):
   """Thrown if ArchiveStage found nothing to archive."""
 
+  # We duplicate __init__ to specify a default for message.
+  # pylint: disable=useless-super-delegation
   def __init__(self, message='No images found to archive.'):
     super(NothingToArchiveException, self).__init__(message)
 
diff --git a/cbuildbot/stages/completion_stages_unittest.py b/cbuildbot/stages/completion_stages_unittest.py
index 29e7bdd..c75f8af 100644
--- a/cbuildbot/stages/completion_stages_unittest.py
+++ b/cbuildbot/stages/completion_stages_unittest.py
@@ -538,7 +538,7 @@
   BOT_ID = 'master-release'
 
   # We duplicate __init__ to specify a default for bot_id.
-  # pylint: disable=arguments-differ
+  # pylint: disable=arguments-differ,useless-super-delegation
   def _Prepare(self, bot_id=BOT_ID, **kwargs):
     super(CanaryCompletionStageTest, self)._Prepare(bot_id, **kwargs)
 
diff --git a/cli/cros/cros_lint.py b/cli/cros/cros_lint.py
index 3025c01..a7ac77e 100644
--- a/cli/cros/cros_lint.py
+++ b/cli/cros/cros_lint.py
@@ -159,7 +159,7 @@
 
 def _PylintFile(path, output_format, debug):
   """Returns result of running pylint on |path|."""
-  pylint = os.path.join(constants.DEPOT_TOOLS_DIR, 'pylint-1.6')
+  pylint = os.path.join(constants.DEPOT_TOOLS_DIR, 'pylint-1.7')
   pylintrc = _GetPylintrc(path)
   cmd = [pylint, '--rcfile=%s' % pylintrc]
   if output_format != 'default':
diff --git a/cli/cros/lint.py b/cli/cros/lint.py
index 20a101d..611533e 100644
--- a/cli/cros/lint.py
+++ b/cli/cros/lint.py
@@ -596,7 +596,7 @@
         if name == 'print_function':
           self.seen_print_func = True
 
-  def visit_from(self, node):
+  def visit_importfrom(self, node):
     """Process 'from' statements"""
     self.saw_imports = True
     self._check_print_function(node)
@@ -646,11 +646,11 @@
 
   def visit_module(self, node):
     """Called when the whole file has been read"""
-    stream = node.file_stream
-    st = os.fstat(stream.fileno())
-    self._check_shebang(node, stream, st)
-    self._check_encoding(node, stream, st)
-    self._check_module_name(node)
+    with node.stream() as stream:
+      st = os.fstat(stream.fileno())
+      self._check_shebang(node, stream, st)
+      self._check_encoding(node, stream, st)
+      self._check_module_name(node)
 
   def _check_shebang(self, _node, stream, st):
     """Verify the shebang is version specific"""
diff --git a/cli/deploy.py b/cli/deploy.py
index c8a66f1..97306b2 100644
--- a/cli/deploy.py
+++ b/cli/deploy.py
@@ -1092,6 +1092,8 @@
   lsb_release = None
   sysroot = None
   try:
+    # Somewhat confusing to clobber, but here we are.
+    # pylint: disable=redefined-argument-from-local
     with remote_access.ChromiumOSDeviceHandler(
         hostname, port=port, username=username, private_key=ssh_private_key,
         base_dir=_DEVICE_BASE_DIR, ping=ping) as device:
diff --git a/config/config_skew_unittest.py b/config/config_skew_unittest.py
index 5dbc9a4..5dae44c 100644
--- a/config/config_skew_unittest.py
+++ b/config/config_skew_unittest.py
@@ -14,7 +14,12 @@
 from chromite.lib import constants
 from chromite.lib import cros_test_lib
 from chromite.lib import osutils
+
+# TODO(vapier): Re-enable check once we upgrade to pylint-1.8+.
+# pylint: disable=no-name-in-module
 from google.protobuf import json_format
+# pylint: enable=no-name-in-module
+
 
 BUILDER_CONFIG_FILENAME = os.path.join(
     constants.SOURCE_ROOT, 'infra/config/generated/builder_configs.cfg')
diff --git a/lib/buildbot_annotations.py b/lib/buildbot_annotations.py
index 2caa7ff..b1b25ca 100644
--- a/lib/buildbot_annotations.py
+++ b/lib/buildbot_annotations.py
@@ -62,6 +62,9 @@
   """STEP_LINK annotation."""
   ANNOTATION_NAME = 'STEP_LINK'
 
+  # Some callers pass in text/url by kwarg.  We leave the full signature here
+  # so the API is a bit cleaner/more obvious.
+  # pylint: disable=useless-super-delegation
   def __init__(self, text, url):
     super(StepLink, self).__init__(text, url)
 
diff --git a/lib/buildbucket_v2.py b/lib/buildbucket_v2.py
index 9de1d35..467689c 100644
--- a/lib/buildbucket_v2.py
+++ b/lib/buildbucket_v2.py
@@ -17,7 +17,10 @@
 import ast
 import socket
 
+# TODO(vapier): Re-enable check once we upgrade to pylint-1.8+.
+# pylint: disable=no-name-in-module
 from google.protobuf import field_mask_pb2
+# pylint: enable=no-name-in-module
 
 from chromite.lib import constants
 from chromite.lib import cros_logging as logging
diff --git a/lib/buildbucket_v2_unittest.py b/lib/buildbucket_v2_unittest.py
index 32f1d56..a823911 100644
--- a/lib/buildbucket_v2_unittest.py
+++ b/lib/buildbucket_v2_unittest.py
@@ -9,9 +9,12 @@
 
 from datetime import datetime, date
 
+# TODO(vapier): Re-enable check once we upgrade to pylint-1.8+.
+# pylint: disable=no-name-in-module
 from google.protobuf import field_mask_pb2
 from google.protobuf.struct_pb2 import Struct, Value
 from google.protobuf.timestamp_pb2 import Timestamp
+# pylint: enable=no-name-in-module
 
 from chromite.lib import buildbucket_v2
 from chromite.lib import constants
diff --git a/lib/cloud_trace.py b/lib/cloud_trace.py
index 4a3b8f5..9bf78bd 100644
--- a/lib/cloud_trace.py
+++ b/lib/cloud_trace.py
@@ -14,7 +14,10 @@
 import random
 import re
 
+# TODO(vapier): Re-enable check once we upgrade to pylint-1.8+.
+# pylint: disable=no-name-in-module
 import google.protobuf.internal.well_known_types as types
+# pylint: enable=no-name-in-module
 from infra_libs import ts_mon
 
 from chromite.lib import cros_logging as log
diff --git a/lib/cros_test_lib.py b/lib/cros_test_lib.py
index ebe0562..8b49da1 100644
--- a/lib/cros_test_lib.py
+++ b/lib/cros_test_lib.py
@@ -1367,6 +1367,8 @@
   SORT_STATS_KEYS = ()
 
   def run(self, test):
+    # TODO(vapier): Drop this after we upgrade past pylint-1.7.
+    # pylint: disable=bad-python3-import
     import cProfile
     profiler = cProfile.Profile(**self.PROFILE_KWARGS)
     ret = profiler.runcall(unittest.TextTestRunner.run, self, test)
diff --git a/lib/gob_util.py b/lib/gob_util.py
index 2c3f0a8..8dd01a6 100644
--- a/lib/gob_util.py
+++ b/lib/gob_util.py
@@ -222,7 +222,7 @@
     except httplib2.ServerNotFoundError as e:
       pass
 
-  if not 'Authorization' in headers:
+  if 'Authorization' not in headers:
     logging.debug('No netrc file or Appengine credentials found.')
   if 'Cookie' not in headers:
     cookies = GetCookies(host, path)
diff --git a/lib/locking.py b/lib/locking.py
index fa970b5..38f65df 100644
--- a/lib/locking.py
+++ b/lib/locking.py
@@ -338,6 +338,8 @@
     pipe2 = getattr(os, 'pipe2', None)
     if pipe2:
       cloexec = getattr(os, 'O_CLOEXEC', 0)
+      # Pylint-1.7 is unable to handle this conditional logic.
+      # pylint: disable=not-callable
       pipes = pipe2(cloexec)
     else:
       pipes = os.pipe()
diff --git a/lib/luci/prpc/client.py b/lib/luci/prpc/client.py
index 96780fe..aed4d6d 100644
--- a/lib/luci/prpc/client.py
+++ b/lib/luci/prpc/client.py
@@ -15,7 +15,10 @@
 
 import collections
 
+# TODO(vapier): Re-enable check once we upgrade to pylint-1.8+.
+# pylint: disable=no-name-in-module
 from google.protobuf import symbol_database
+# pylint: enable=no-name-in-module
 
 from chromite.lib.luci import net
 from chromite.lib.luci.prpc import codes, encoding
diff --git a/lib/luci/prpc/client_unittest.py b/lib/luci/prpc/client_unittest.py
index e5234b2..5e3f801 100644
--- a/lib/luci/prpc/client_unittest.py
+++ b/lib/luci/prpc/client_unittest.py
@@ -11,7 +11,10 @@
 import sys
 import unittest
 
+# TODO(vapier): Re-enable check once we upgrade to pylint-1.8+.
+# pylint: disable=no-name-in-module
 from google.protobuf import empty_pb2
+# pylint: enable=no-name-in-module
 
 import mock
 from chromite.lib.luci import net
diff --git a/lib/luci/prpc/encoding.py b/lib/luci/prpc/encoding.py
index 8e68823..f7047b6 100644
--- a/lib/luci/prpc/encoding.py
+++ b/lib/luci/prpc/encoding.py
@@ -7,7 +7,10 @@
 
 from __future__ import print_function
 
+# TODO(vapier): Re-enable check once we upgrade to pylint-1.8+.
+# pylint: disable=no-name-in-module
 from google.protobuf import json_format, text_format
+# pylint: enable=no-name-in-module
 
 
 class Encoding(object):
diff --git a/lib/luci/utils.py b/lib/luci/utils.py
index 0d01601..3599d99 100644
--- a/lib/luci/utils.py
+++ b/lib/luci/utils.py
@@ -23,7 +23,10 @@
 import sys
 import threading
 
+# TODO(vapier): Re-enable check once we upgrade to pylint-1.8+.
+# pylint: disable=no-name-in-module
 from google.protobuf import timestamp_pb2
+# pylint: enable=no-name-in-module
 import six
 from six.moves import urllib
 
diff --git a/lib/luci/utils_unittest.py b/lib/luci/utils_unittest.py
index f973272..b8a2cf3 100644
--- a/lib/luci/utils_unittest.py
+++ b/lib/luci/utils_unittest.py
@@ -9,7 +9,10 @@
 
 from datetime import datetime, date
 
+# TODO(vapier): Re-enable check once we upgrade to pylint-1.8+.
+# pylint: disable=no-name-in-module
 from google.protobuf.timestamp_pb2 import Timestamp
+# pylint: enable=no-name-in-module
 
 from chromite.lib import cros_test_lib
 from chromite.lib.luci import utils
diff --git a/lib/patch.py b/lib/patch.py
index a6e90ea..eac1f50 100644
--- a/lib/patch.py
+++ b/lib/patch.py
@@ -1677,6 +1677,8 @@
       # remote:   https://chromium-review.googlesource.com/36756 Enforce a ...
       if 'New Changes:' in line:
         urls = []
+        # We're exiting the loop after this point.
+        # pylint: disable=redefined-outer-name
         for line in lines[num + 1:]:
           line = line.split()
           if len(line) < 2 or not line[1].startswith('http'):
diff --git a/lib/paygen/paygen_build_lib.py b/lib/paygen/paygen_build_lib.py
index 25c55ab..f0e65a8 100644
--- a/lib/paygen/paygen_build_lib.py
+++ b/lib/paygen/paygen_build_lib.py
@@ -38,7 +38,11 @@
 from chromite.lib.paygen import paygen_payload_lib
 from chromite.lib.paygen import utils
 
+# TODO(vapier): Re-enable check once we upgrade to pylint-1.8+.
+# pylint: disable=no-name-in-module
 from google.protobuf import json_format
+# pylint: enable=no-name-in-module
+
 
 # For crostools access.
 sys.path.insert(0, constants.SOURCE_ROOT)
diff --git a/pylintrc b/pylintrc
index c51a9f3..6e0f83e 100644
--- a/pylintrc
+++ b/pylintrc
@@ -134,6 +134,7 @@
     locally-enabled,
     missing-docstring,
     no-member,
+    no-else-return,
     no-self-use,
     redefined-variable-type,
     relative-import,
@@ -165,6 +166,9 @@
 # CHANGE: No report.
 reports=no
 
+# Activate the evaluation score.
+score=no
+
 # Python expression which should return a note less than 10 (10 is the highest
 # note). You have access to the variables errors warning, statement which
 # respectively contain the number of errors / warnings messages and the total
diff --git a/scripts/export_to_cloud_trace.py b/scripts/export_to_cloud_trace.py
index b0a0b36..f54f234 100644
--- a/scripts/export_to_cloud_trace.py
+++ b/scripts/export_to_cloud_trace.py
@@ -13,8 +13,11 @@
 import pprint
 import time
 
+# TODO(vapier): Re-enable check once we upgrade to pylint-1.8+.
+# pylint: disable=no-name-in-module
 from googleapiclient import discovery
 import google.protobuf.internal.well_known_types as types
+# pylint: enable=no-name-in-module
 from infra_libs import ts_mon
 import inotify_simple  # pylint: disable=import-error
 from oauth2client.client import GoogleCredentials
diff --git a/scripts/fwgdb.py b/scripts/fwgdb.py
index f2691bb..b1aa91f 100644
--- a/scripts/fwgdb.py
+++ b/scripts/fwgdb.py
@@ -43,13 +43,13 @@
 
 def GetGdbForElf(elf):
   """Return the correct C compiler prefix for the target ELF file."""
-  with open(elf, 'rb') as elf:
+  with open(elf, 'rb') as fp:
     return {
         'EM_386': 'x86_64-cros-linux-gnu-gdb',
         'EM_X86_64': 'x86_64-cros-linux-gnu-gdb',
         'EM_ARM': 'armv7a-cros-linux-gnueabihf-gdb',
         'EM_AARCH64': 'aarch64-cros-linux-gnu-gdb',
-    }[ELFFile(elf).header.e_machine]
+    }[ELFFile(fp).header.e_machine]
 
 
 def ParseArgs(argv):