Reorganize imports to make Python 3 support easier.

This commit is contained in:
Itamar Turner-Trauring
2020-08-12 10:23:30 -04:00
parent 5dde21f966
commit e13c0cf4d3
5 changed files with 41 additions and 32 deletions

View File

@ -1,5 +1,5 @@
"""Directory Node implementation.""" """Directory Node implementation."""
import time, unicodedata import time
from zope.interface import implementer from zope.interface import implementer
from twisted.internet import defer from twisted.internet import defer
@ -18,7 +18,7 @@ from allmydata.check_results import DeepCheckResults, \
DeepCheckAndRepairResults DeepCheckAndRepairResults
from allmydata.monitor import Monitor from allmydata.monitor import Monitor
from allmydata.util import hashutil, base32, log from allmydata.util import hashutil, base32, log
from allmydata.util.encodingutil import quote_output from allmydata.util.encodingutil import quote_output, normalize
from allmydata.util.assertutil import precondition from allmydata.util.assertutil import precondition
from allmydata.util.netstring import netstring, split_netstring from allmydata.util.netstring import netstring, split_netstring
from allmydata.util.consumer import download_to_data from allmydata.util.consumer import download_to_data
@ -101,12 +101,6 @@ def update_metadata(metadata, new_metadata, now):
return metadata return metadata
# 'x' at the end of a variable name indicates that it holds a Unicode string that may not
# be NFC-normalized.
def normalize(namex):
return unicodedata.normalize('NFC', namex)
# TODO: {Deleter,MetadataSetter,Adder}.modify all start by unpacking the # TODO: {Deleter,MetadataSetter,Adder}.modify all start by unpacking the
# contents and end by repacking them. It might be better to apply them to # contents and end by repacking them. It might be better to apply them to
# the unpacked contents. # the unpacked contents.

View File

@ -13,11 +13,17 @@ from future.utils import PY2
if PY2: if PY2:
from builtins import filter, map, zip, ascii, chr, hex, input, next, oct, open, pow, round, super, bytes, dict, list, object, range, str, max, min # noqa: F401 from builtins import filter, map, zip, ascii, chr, hex, input, next, oct, open, pow, round, super, bytes, dict, list, object, range, str, max, min # noqa: F401
from past.builtins import unicode
import os import os
import time import time
import signal import signal
from twisted.internet import reactor from twisted.internet import reactor
from twisted.trial import unittest
from ..util.assertutil import precondition
from ..util.encodingutil import unicode_platform, get_filesystem_encoding
class TimezoneMixin(object): class TimezoneMixin(object):
@ -65,3 +71,20 @@ class SignalMixin(object):
if self.sigchldHandler: if self.sigchldHandler:
signal.signal(signal.SIGCHLD, self.sigchldHandler) signal.signal(signal.SIGCHLD, self.sigchldHandler)
return super(SignalMixin, self).tearDown() return super(SignalMixin, self).tearDown()
class ReallyEqualMixin(object):
def failUnlessReallyEqual(self, a, b, msg=None):
self.assertEqual(a, b, msg)
self.assertEqual(type(a), type(b), "a :: %r, b :: %r, %r" % (a, b, msg))
def skip_if_cannot_represent_filename(u):
precondition(isinstance(u, unicode))
enc = get_filesystem_encoding()
if not unicode_platform():
try:
u.encode(enc)
except UnicodeEncodeError:
raise unittest.SkipTest("A non-ASCII filename could not be encoded on this platform.")

View File

@ -9,24 +9,15 @@ from twisted.python import failure
from twisted.trial import unittest from twisted.trial import unittest
from ..util.assertutil import precondition from ..util.assertutil import precondition
from allmydata.util.encodingutil import (unicode_platform, get_filesystem_encoding, from allmydata.util.encodingutil import get_io_encoding
get_io_encoding)
from future.utils import PY2 from future.utils import PY2
if PY2: # XXX this is a hack that makes some tests pass on Python3, remove if PY2: # XXX this is a hack that makes some tests pass on Python3, remove
# in the future # in the future
from ..scripts import runner from ..scripts import runner
from .common_py3 import SignalMixin from .common_py3 import (
SignalMixin, skip_if_cannot_represent_filename, ReallyEqualMixin,
)
def skip_if_cannot_represent_filename(u):
precondition(isinstance(u, unicode))
enc = get_filesystem_encoding()
if not unicode_platform():
try:
u.encode(enc)
except UnicodeEncodeError:
raise unittest.SkipTest("A non-ASCII filename could not be encoded on this platform.")
def skip_if_cannot_represent_argv(u): def skip_if_cannot_represent_argv(u):
precondition(isinstance(u, unicode)) precondition(isinstance(u, unicode))
@ -87,12 +78,6 @@ def flip_one_bit(s, offset=0, size=None):
return result return result
class ReallyEqualMixin(object):
def failUnlessReallyEqual(self, a, b, msg=None):
self.assertEqual(a, b, msg)
self.assertEqual(type(a), type(b), "a :: %r, b :: %r, %r" % (a, b, msg))
class StallMixin(object): class StallMixin(object):
def stall(self, res=None, delay=1): def stall(self, res=None, delay=1):
d = defer.Deferred() d = defer.Deferred()

View File

@ -64,15 +64,15 @@ from twisted.trial import unittest
from twisted.python.filepath import FilePath from twisted.python.filepath import FilePath
from allmydata.test.common_util import ReallyEqualMixin from allmydata.test.common_py3 import (
ReallyEqualMixin, skip_if_cannot_represent_filename,
)
from allmydata.util import encodingutil, fileutil from allmydata.util import encodingutil, fileutil
from allmydata.util.encodingutil import argv_to_unicode, unicode_to_url, \ from allmydata.util.encodingutil import argv_to_unicode, unicode_to_url, \
unicode_to_output, quote_output, quote_path, quote_local_unicode_path, \ unicode_to_output, quote_output, quote_path, quote_local_unicode_path, \
quote_filepath, unicode_platform, listdir_unicode, FilenameEncodingError, \ quote_filepath, unicode_platform, listdir_unicode, FilenameEncodingError, \
get_io_encoding, get_filesystem_encoding, to_str, from_utf8_or_none, _reload, \ get_io_encoding, get_filesystem_encoding, to_str, from_utf8_or_none, _reload, \
to_filepath, extend_filepath, unicode_from_filepath, unicode_segments_from to_filepath, extend_filepath, unicode_from_filepath, unicode_segments_from
from allmydata.dirnode import normalize
from .common_util import skip_if_cannot_represent_filename
from twisted.python import usage from twisted.python import usage
@ -258,7 +258,7 @@ class EncodingUtil(ReallyEqualMixin):
_reload() _reload()
filenames = listdir_unicode(u'/dummy') filenames = listdir_unicode(u'/dummy')
self.failUnlessEqual(set([normalize(fname) for fname in filenames]), self.failUnlessEqual(set([encodingutil.normalize(fname) for fname in filenames]),
set(TEST_FILENAMES)) set(TEST_FILENAMES))
@ -283,7 +283,7 @@ class StdlibUnicode(unittest.TestCase):
# We only require that the listing includes a filename that is canonically equivalent # We only require that the listing includes a filename that is canonically equivalent
# to lumiere_nfc (on Mac OS X, it will be the NFD equivalent). # to lumiere_nfc (on Mac OS X, it will be the NFD equivalent).
self.failUnlessIn(lumiere_nfc + ".txt", set([normalize(fname) for fname in filenames])) self.failUnlessIn(lumiere_nfc + ".txt", set([encodingutil.normalize(fname) for fname in filenames]))
expanded = fileutil.expanduser(u"~/" + lumiere_nfc) expanded = fileutil.expanduser(u"~/" + lumiere_nfc)
self.failIfIn(u"~", expanded) self.failIfIn(u"~", expanded)

View File

@ -6,6 +6,7 @@ unicode and back.
from past.builtins import unicode from past.builtins import unicode
import sys, os, re, locale import sys, os, re, locale
import unicodedata
from allmydata.util.assertutil import precondition, _assert from allmydata.util.assertutil import precondition, _assert
from twisted.python import usage from twisted.python import usage
@ -358,3 +359,9 @@ def listdir_unicode(path):
def listdir_filepath(fp): def listdir_filepath(fp):
return listdir_unicode(unicode_from_filepath(fp)) return listdir_unicode(unicode_from_filepath(fp))
# 'x' at the end of a variable name indicates that it holds a Unicode string that may not
# be NFC-normalized.
def normalize(namex):
return unicodedata.normalize('NFC', namex)