Make mtlib Python 3 compatible
Most changes were generated using `futurize`:
$ futurize --stage1 --all-imports --write --nobackups mtlib/**/*.py
Then the `__future__` imports were sorted, an issue with `Path` division
overloading fixed, and a few out-of-date imports replaced or removed.
TEST=Run `mtedit` on a local ZIP file using 2.7; where imports have been
changed, check that objects in those files can still be imported in
a 2.7 REPL. Check that `import mtlib` in a Python 3 REPL doesn't
fail with any errors in mtlib. (It will fail with errors in
`touch_firmware_test/`, but that's out of scope of this CL.)
BUG=None
Change-Id: I208ac77516ce96118e3d51d226f990693b9a3931
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/mttools/+/2018104
Tested-by: Harry Cutts <hcutts@chromium.org>
Reviewed-by: Sean O'Brien <seobrien@chromium.org>
Commit-Queue: Harry Cutts <hcutts@chromium.org>
diff --git a/mtlib/__init__.py b/mtlib/__init__.py
index 0470330..e9ed28c 100644
--- a/mtlib/__init__.py
+++ b/mtlib/__init__.py
@@ -1,3 +1,5 @@
-from log import Log
-from platform import PlatformProperties, PlatformDatabase
-from cros_remote import CrOSRemote
\ No newline at end of file
+from __future__ import absolute_import
+
+from .log import Log
+from .platform import PlatformProperties, PlatformDatabase
+from .cros_remote import CrOSRemote
diff --git a/mtlib/cros_info.py b/mtlib/cros_info.py
index 813c876..b226fc1 100644
--- a/mtlib/cros_info.py
+++ b/mtlib/cros_info.py
@@ -3,6 +3,8 @@
# found in the LICENSE file.
"""Classes to extract information about chromebooks and their touch devices."""
+from __future__ import absolute_import
+from __future__ import division
from __future__ import print_function
import os
diff --git a/mtlib/cros_remote.py b/mtlib/cros_remote.py
index f3f20a1..f28f39d 100755
--- a/mtlib/cros_remote.py
+++ b/mtlib/cros_remote.py
@@ -4,9 +4,11 @@
"""This module defines a class for remotely accessing a Chromebook."""
+from __future__ import absolute_import
+from __future__ import division
from __future__ import print_function
-from cros_info import CrOSDeviceInfo
+from .cros_info import CrOSDeviceInfo
from mtlib.util import Execute, SafeExecute, AskUser
import os
import tempfile
diff --git a/mtlib/feedback.py b/mtlib/feedback.py
index caf3970..f7aa771 100644
--- a/mtlib/feedback.py
+++ b/mtlib/feedback.py
@@ -2,9 +2,10 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import absolute_import
+from __future__ import division
from __future__ import print_function
-import cookielib
import datetime
import time
import getpass
@@ -14,9 +15,10 @@
import re
import subprocess
import sys
-import urllib
-import urllib2
-import StringIO
+try:
+ from StringIO import StringIO
+except ImportError:
+ from io import StringIO
import multiprocessing
import random
import errno
@@ -186,7 +188,7 @@
time.sleep(sleep_time)
data_line = None
system_log = None
- for count, line in enumerate(StringIO.StringIO(report)):
+ for count, line in enumerate(StringIO(report)):
if 'name: "system_logs.zip"' in line:
data_line = count + 2
elif data_line and data_line == count:
@@ -204,7 +206,7 @@
FeedbackDownloader.SCREENSHOT_FIELD)
data_line = None
screenshot = None
- for count, line in enumerate(StringIO.StringIO(report)):
+ for count, line in enumerate(StringIO(report)):
if 'screenshot <' in line:
data_line = count + 2
elif data_line and data_line == count:
diff --git a/mtlib/firmware.py b/mtlib/firmware.py
index 65a0bc4..d061715 100644
--- a/mtlib/firmware.py
+++ b/mtlib/firmware.py
@@ -4,6 +4,8 @@
"""Provides tools for packaging, installing and testing firmware."""
+from __future__ import absolute_import
+from __future__ import division
from __future__ import print_function
from mtlib.util import Path, RequiredRegex, Execute, SafeExecute, GitRepo
@@ -174,7 +176,7 @@
path = tar_name + str(binary.device_file)
info = tarfile.TarInfo(path)
info.size = len(binary.data)
- info.mode = 0755
+ info.mode = 0o755
info.uid = 0
info.gid = 0
info.mtime = time.time()
diff --git a/mtlib/gesture_log.py b/mtlib/gesture_log.py
index 081b2e5..ef8aa74 100755
--- a/mtlib/gesture_log.py
+++ b/mtlib/gesture_log.py
@@ -2,6 +2,8 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import absolute_import
+from __future__ import division
from __future__ import print_function
import decimal
diff --git a/mtlib/log.py b/mtlib/log.py
index 73ada15..2835d11 100644
--- a/mtlib/log.py
+++ b/mtlib/log.py
@@ -2,12 +2,17 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import absolute_import
+from __future__ import division
from __future__ import print_function
from gzip import GzipFile
from mtlib.feedback import FeedbackDownloader
-from StringIO import StringIO
-from cros_remote import CrOSRemote
+try:
+ from StringIO import StringIO
+except ImportError:
+ from io import StringIO
+from .cros_remote import CrOSRemote
import base64
import bz2
import imghdr
diff --git a/mtlib/platform.py b/mtlib/platform.py
index 0f30bf3..932c3c3 100755
--- a/mtlib/platform.py
+++ b/mtlib/platform.py
@@ -4,6 +4,8 @@
#
""" This module manages the platform properties in mttools/platforms. """
+from __future__ import absolute_import
+from __future__ import division
from __future__ import print_function
from collections import namedtuple
@@ -12,9 +14,10 @@
import re
import sys
-from cros_remote import CrOSRemote
-from util import AskUser, ExecuteException
-from xorg_conf import XorgInputClassParser
+from .cros_remote import CrOSRemote
+from .util import AskUser, ExecuteException
+from .xorg_conf import XorgInputClassParser
+from functools import reduce
# path to current script directory
script_dir = os.path.dirname(os.path.realpath(__file__))
diff --git a/mtlib/util.py b/mtlib/util.py
index 51585ae..052a3f4 100644
--- a/mtlib/util.py
+++ b/mtlib/util.py
@@ -8,6 +8,8 @@
repositories, shell commands, and user interaction via command line.
"""
+from __future__ import absolute_import
+from __future__ import division
from __future__ import print_function
import os
@@ -158,6 +160,9 @@
def __div__(self, other):
return self.Join(other)
+ def __truediv__(self, other):
+ return self.Join(other)
+
def __bool__(self):
return self.exists
@@ -398,7 +403,7 @@
if validate:
try:
reply = validate(reply)
- except Exception, e:
+ except Exception as e:
print(e)
continue
return reply
diff --git a/mtlib/xorg_conf.py b/mtlib/xorg_conf.py
index b5379d4..9cbd5fc 100644
--- a/mtlib/xorg_conf.py
+++ b/mtlib/xorg_conf.py
@@ -2,6 +2,8 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+from __future__ import absolute_import
+from __future__ import division
from __future__ import print_function
import math