Skip to content

bpo-41521: Replace whitelist/blacklist with allowlist/denylist #21824

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Aug 17, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions Doc/library/test.rst
Original file line number Diff line number Diff line change
Expand Up @@ -878,7 +878,7 @@ The :mod:`test.support` module defines the following functions:
missing.


.. function:: check__all__(test_case, module, name_of_module=None, extra=(), blacklist=())
.. function:: check__all__(test_case, module, name_of_module=None, extra=(), not_exported=())

Assert that the ``__all__`` variable of *module* contains all public names.

Expand All @@ -895,8 +895,8 @@ The :mod:`test.support` module defines the following functions:
detected as "public", like objects without a proper ``__module__``
attribute. If provided, it will be added to the automatically detected ones.

The *blacklist* argument can be a set of names that must not be treated as part of
the public API even though their names indicate otherwise.
The *not_exported* argument can be a set of names that must not be treated
as part of the public API even though their names indicate otherwise.

Example use::

Expand All @@ -912,10 +912,10 @@ The :mod:`test.support` module defines the following functions:
class OtherTestCase(unittest.TestCase):
def test__all__(self):
extra = {'BAR_CONST', 'FOO_CONST'}
blacklist = {'baz'} # Undocumented name.
not_exported = {'baz'} # Undocumented name.
# bar imports part of its API from _bar.
support.check__all__(self, bar, ('bar', '_bar'),
extra=extra, blacklist=blacklist)
extra=extra, not_exported=not_exported)

.. versionadded:: 3.6

Expand Down
6 changes: 4 additions & 2 deletions Lib/test/_test_multiprocessing.py
Original file line number Diff line number Diff line change
Expand Up @@ -5581,9 +5581,11 @@ def test_namespace(self):

class MiscTestCase(unittest.TestCase):
def test__all__(self):
# Just make sure names in blacklist are excluded
# Just make sure names in not_exported are excluded
support.check__all__(self, multiprocessing, extra=multiprocessing.__all__,
blacklist=['SUBDEBUG', 'SUBWARNING'])
not_exported=['SUBDEBUG', 'SUBWARNING'])


#
# Mixins
#
Expand Down
10 changes: 5 additions & 5 deletions Lib/test/support/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -1410,7 +1410,7 @@ def detect_api_mismatch(ref_api, other_api, *, ignore=()):


def check__all__(test_case, module, name_of_module=None, extra=(),
blacklist=()):
not_exported=()):
"""Assert that the __all__ variable of 'module' contains all public names.

The module's public names (its API) are detected automatically based on
Expand All @@ -1427,7 +1427,7 @@ def check__all__(test_case, module, name_of_module=None, extra=(),
'__module__' attribute. If provided, it will be added to the
automatically detected ones.

The 'blacklist' argument can be a set of names that must not be treated
The 'not_exported' argument can be a set of names that must not be treated
as part of the public API even though their names indicate otherwise.

Usage:
Expand All @@ -1443,10 +1443,10 @@ def test__all__(self):
class OtherTestCase(unittest.TestCase):
def test__all__(self):
extra = {'BAR_CONST', 'FOO_CONST'}
blacklist = {'baz'} # Undocumented name.
not_exported = {'baz'} # Undocumented name.
# bar imports part of its API from _bar.
support.check__all__(self, bar, ('bar', '_bar'),
extra=extra, blacklist=blacklist)
extra=extra, not_exported=not_exported)

"""

Expand All @@ -1458,7 +1458,7 @@ def test__all__(self):
expected = set(extra)

for name in dir(module):
if name.startswith('_') or name in blacklist:
if name.startswith('_') or name in not_exported:
continue
obj = getattr(module, name)
if (getattr(obj, '__module__', None) in name_of_module or
Expand Down
12 changes: 6 additions & 6 deletions Lib/test/test_calendar.py
Original file line number Diff line number Diff line change
Expand Up @@ -934,12 +934,12 @@ def test_html_output_year_css(self):

class MiscTestCase(unittest.TestCase):
def test__all__(self):
blacklist = {'mdays', 'January', 'February', 'EPOCH',
'MONDAY', 'TUESDAY', 'WEDNESDAY', 'THURSDAY', 'FRIDAY',
'SATURDAY', 'SUNDAY', 'different_locale', 'c',
'prweek', 'week', 'format', 'formatstring', 'main',
'monthlen', 'prevmonth', 'nextmonth'}
support.check__all__(self, calendar, blacklist=blacklist)
not_exported = {
'mdays', 'January', 'February', 'EPOCH', 'MONDAY', 'TUESDAY',
'WEDNESDAY', 'THURSDAY', 'FRIDAY', 'SATURDAY', 'SUNDAY',
'different_locale', 'c', 'prweek', 'week', 'format',
'formatstring', 'main', 'monthlen', 'prevmonth', 'nextmonth'}
support.check__all__(self, calendar, not_exported=not_exported)


class TestSubClassingCase(unittest.TestCase):
Expand Down
7 changes: 4 additions & 3 deletions Lib/test/test_cgi.py
Original file line number Diff line number Diff line change
Expand Up @@ -553,9 +553,10 @@ def test_parse_header(self):
("form-data", {"name": "files", "filename": 'fo"o;bar'}))

def test_all(self):
blacklist = {"logfile", "logfp", "initlog", "dolog", "nolog",
"closelog", "log", "maxlen", "valid_boundary"}
support.check__all__(self, cgi, blacklist=blacklist)
not_exported = {
"logfile", "logfp", "initlog", "dolog", "nolog", "closelog", "log",
"maxlen", "valid_boundary"}
support.check__all__(self, cgi, not_exported=not_exported)


BOUNDARY = "---------------------------721837373350705526688164684"
Expand Down
3 changes: 1 addition & 2 deletions Lib/test/test_configparser.py
Original file line number Diff line number Diff line change
Expand Up @@ -2128,8 +2128,7 @@ def test_instance_assignment(self):

class MiscTestCase(unittest.TestCase):
def test__all__(self):
blacklist = {"Error"}
support.check__all__(self, configparser, blacklist=blacklist)
support.check__all__(self, configparser, not_exported={"Error"})


if __name__ == '__main__':
Expand Down
9 changes: 5 additions & 4 deletions Lib/test/test_ftplib.py
Original file line number Diff line number Diff line change
Expand Up @@ -1107,10 +1107,11 @@ def testTimeoutDirectAccess(self):

class MiscTestCase(TestCase):
def test__all__(self):
blacklist = {'MSG_OOB', 'FTP_PORT', 'MAXLINE', 'CRLF', 'B_CRLF',
'Error', 'parse150', 'parse227', 'parse229', 'parse257',
'print_line', 'ftpcp', 'test'}
support.check__all__(self, ftplib, blacklist=blacklist)
not_exported = {
'MSG_OOB', 'FTP_PORT', 'MAXLINE', 'CRLF', 'B_CRLF', 'Error',
'parse150', 'parse227', 'parse229', 'parse257', 'print_line',
'ftpcp', 'test'}
support.check__all__(self, ftplib, not_exported=not_exported)


def test_main():
Expand Down
4 changes: 2 additions & 2 deletions Lib/test/test_gettext.py
Original file line number Diff line number Diff line change
Expand Up @@ -820,8 +820,8 @@ def test_cache(self):

class MiscTestCase(unittest.TestCase):
def test__all__(self):
blacklist = {'c2py', 'ENOENT'}
support.check__all__(self, gettext, blacklist=blacklist)
support.check__all__(self, gettext,
not_exported={'c2py', 'ENOENT'})


if __name__ == '__main__':
Expand Down
12 changes: 6 additions & 6 deletions Lib/test/test_logging.py
Original file line number Diff line number Diff line change
Expand Up @@ -5342,12 +5342,12 @@ def test_basic(self):

class MiscTestCase(unittest.TestCase):
def test__all__(self):
blacklist = {'logThreads', 'logMultiprocessing',
'logProcesses', 'currentframe',
'PercentStyle', 'StrFormatStyle', 'StringTemplateStyle',
'Filterer', 'PlaceHolder', 'Manager', 'RootLogger',
'root', 'threading'}
support.check__all__(self, logging, blacklist=blacklist)
not_exported = {
'logThreads', 'logMultiprocessing', 'logProcesses', 'currentframe',
'PercentStyle', 'StrFormatStyle', 'StringTemplateStyle',
'Filterer', 'PlaceHolder', 'Manager', 'RootLogger', 'root',
'threading'}
support.check__all__(self, logging, not_exported=not_exported)


# Set the locale to the platform-dependent default. I have no idea
Expand Down
4 changes: 2 additions & 2 deletions Lib/test/test_mailbox.py
Original file line number Diff line number Diff line change
Expand Up @@ -2296,8 +2296,8 @@ def test_nonempty_maildir_both(self):

class MiscTestCase(unittest.TestCase):
def test__all__(self):
blacklist = {"linesep", "fcntl"}
support.check__all__(self, mailbox, blacklist=blacklist)
support.check__all__(self, mailbox,
not_exported={"linesep", "fcntl"})


def test_main():
Expand Down
4 changes: 2 additions & 2 deletions Lib/test/test_optparse.py
Original file line number Diff line number Diff line change
Expand Up @@ -1652,8 +1652,8 @@ def test_numeric_options(self):

class MiscTestCase(unittest.TestCase):
def test__all__(self):
blacklist = {'check_builtin', 'AmbiguousOptionError', 'NO_DEFAULT'}
support.check__all__(self, optparse, blacklist=blacklist)
not_exported = {'check_builtin', 'AmbiguousOptionError', 'NO_DEFAULT'}
support.check__all__(self, optparse, not_exported=not_exported)


def test_main():
Expand Down
57 changes: 29 additions & 28 deletions Lib/test/test_pickletools.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,34 +63,35 @@ def test_optimize_binput_and_memoize(self):

class MiscTestCase(unittest.TestCase):
def test__all__(self):
blacklist = {'bytes_types',
'UP_TO_NEWLINE', 'TAKEN_FROM_ARGUMENT1',
'TAKEN_FROM_ARGUMENT4', 'TAKEN_FROM_ARGUMENT4U',
'TAKEN_FROM_ARGUMENT8U', 'ArgumentDescriptor',
'read_uint1', 'read_uint2', 'read_int4', 'read_uint4',
'read_uint8', 'read_stringnl', 'read_stringnl_noescape',
'read_stringnl_noescape_pair', 'read_string1',
'read_string4', 'read_bytes1', 'read_bytes4',
'read_bytes8', 'read_bytearray8', 'read_unicodestringnl',
'read_unicodestring1', 'read_unicodestring4',
'read_unicodestring8', 'read_decimalnl_short',
'read_decimalnl_long', 'read_floatnl', 'read_float8',
'read_long1', 'read_long4',
'uint1', 'uint2', 'int4', 'uint4', 'uint8', 'stringnl',
'stringnl_noescape', 'stringnl_noescape_pair', 'string1',
'string4', 'bytes1', 'bytes4', 'bytes8', 'bytearray8',
'unicodestringnl', 'unicodestring1', 'unicodestring4',
'unicodestring8', 'decimalnl_short', 'decimalnl_long',
'floatnl', 'float8', 'long1', 'long4',
'StackObject',
'pyint', 'pylong', 'pyinteger_or_bool', 'pybool', 'pyfloat',
'pybytes_or_str', 'pystring', 'pybytes', 'pybytearray',
'pyunicode', 'pynone', 'pytuple', 'pylist', 'pydict',
'pyset', 'pyfrozenset', 'pybuffer', 'anyobject',
'markobject', 'stackslice', 'OpcodeInfo', 'opcodes',
'code2op',
}
support.check__all__(self, pickletools, blacklist=blacklist)
not_exported = {
'bytes_types',
'UP_TO_NEWLINE', 'TAKEN_FROM_ARGUMENT1',
'TAKEN_FROM_ARGUMENT4', 'TAKEN_FROM_ARGUMENT4U',
'TAKEN_FROM_ARGUMENT8U', 'ArgumentDescriptor',
'read_uint1', 'read_uint2', 'read_int4', 'read_uint4',
'read_uint8', 'read_stringnl', 'read_stringnl_noescape',
'read_stringnl_noescape_pair', 'read_string1',
'read_string4', 'read_bytes1', 'read_bytes4',
'read_bytes8', 'read_bytearray8', 'read_unicodestringnl',
'read_unicodestring1', 'read_unicodestring4',
'read_unicodestring8', 'read_decimalnl_short',
'read_decimalnl_long', 'read_floatnl', 'read_float8',
'read_long1', 'read_long4',
'uint1', 'uint2', 'int4', 'uint4', 'uint8', 'stringnl',
'stringnl_noescape', 'stringnl_noescape_pair', 'string1',
'string4', 'bytes1', 'bytes4', 'bytes8', 'bytearray8',
'unicodestringnl', 'unicodestring1', 'unicodestring4',
'unicodestring8', 'decimalnl_short', 'decimalnl_long',
'floatnl', 'float8', 'long1', 'long4',
'StackObject',
'pyint', 'pylong', 'pyinteger_or_bool', 'pybool', 'pyfloat',
'pybytes_or_str', 'pystring', 'pybytes', 'pybytearray',
'pyunicode', 'pynone', 'pytuple', 'pylist', 'pydict',
'pyset', 'pyfrozenset', 'pybuffer', 'anyobject',
'markobject', 'stackslice', 'OpcodeInfo', 'opcodes',
'code2op',
}
support.check__all__(self, pickletools, not_exported=not_exported)


def test_main():
Expand Down
4 changes: 2 additions & 2 deletions Lib/test/test_plistlib.py
Original file line number Diff line number Diff line change
Expand Up @@ -672,8 +672,8 @@ def test_keyed_archive_data(self):

class MiscTestCase(unittest.TestCase):
def test__all__(self):
blacklist = {"PlistFormat", "PLISTHEADER"}
support.check__all__(self, plistlib, blacklist=blacklist)
not_exported = {"PlistFormat", "PLISTHEADER"}
support.check__all__(self, plistlib, not_exported=not_exported)


if __name__ == '__main__':
Expand Down
5 changes: 2 additions & 3 deletions Lib/test/test_smtpd.py
Original file line number Diff line number Diff line change
Expand Up @@ -1003,12 +1003,11 @@ def test_multiple_emails_with_extended_command_length(self):

class MiscTestCase(unittest.TestCase):
def test__all__(self):
blacklist = {
not_exported = {
"program", "Devnull", "DEBUGSTREAM", "NEWLINE", "COMMASPACE",
"DATA_SIZE_DEFAULT", "usage", "Options", "parseargs",

}
support.check__all__(self, smtpd, blacklist=blacklist)
support.check__all__(self, smtpd, not_exported=not_exported)


if __name__ == "__main__":
Expand Down
8 changes: 4 additions & 4 deletions Lib/test/test_support.py
Original file line number Diff line number Diff line change
Expand Up @@ -391,14 +391,14 @@ def test_detect_api_mismatch__ignore(self):

def test_check__all__(self):
extra = {'tempdir'}
blacklist = {'template'}
not_exported = {'template'}
support.check__all__(self,
tempfile,
extra=extra,
blacklist=blacklist)
not_exported=not_exported)

extra = {'TextTestResult', 'installHandler'}
blacklist = {'load_tests', "TestProgram", "BaseTestSuite"}
not_exported = {'load_tests', "TestProgram", "BaseTestSuite"}

support.check__all__(self,
unittest,
Expand All @@ -407,7 +407,7 @@ def test_check__all__(self):
"unittest.main", "unittest.runner",
"unittest.signals", "unittest.async_case"),
extra=extra,
blacklist=blacklist)
not_exported=not_exported)

self.assertRaises(AssertionError, support.check__all__, self, unittest)

Expand Down
29 changes: 13 additions & 16 deletions Lib/test/test_tarfile.py
Original file line number Diff line number Diff line change
Expand Up @@ -2257,22 +2257,19 @@ def test_number_field_limits(self):
tarfile.itn(0x10000000000, 6, tarfile.GNU_FORMAT)

def test__all__(self):
blacklist = {'version', 'grp', 'pwd', 'symlink_exception',
'NUL', 'BLOCKSIZE', 'RECORDSIZE', 'GNU_MAGIC',
'POSIX_MAGIC', 'LENGTH_NAME', 'LENGTH_LINK',
'LENGTH_PREFIX', 'REGTYPE', 'AREGTYPE', 'LNKTYPE',
'SYMTYPE', 'CHRTYPE', 'BLKTYPE', 'DIRTYPE', 'FIFOTYPE',
'CONTTYPE', 'GNUTYPE_LONGNAME', 'GNUTYPE_LONGLINK',
'GNUTYPE_SPARSE', 'XHDTYPE', 'XGLTYPE', 'SOLARIS_XHDTYPE',
'SUPPORTED_TYPES', 'REGULAR_TYPES', 'GNU_TYPES',
'PAX_FIELDS', 'PAX_NAME_FIELDS', 'PAX_NUMBER_FIELDS',
'stn', 'nts', 'nti', 'itn', 'calc_chksums', 'copyfileobj',
'filemode',
'EmptyHeaderError', 'TruncatedHeaderError',
'EOFHeaderError', 'InvalidHeaderError',
'SubsequentHeaderError', 'ExFileObject',
'main'}
support.check__all__(self, tarfile, blacklist=blacklist)
not_exported = {
'version', 'grp', 'pwd', 'symlink_exception', 'NUL', 'BLOCKSIZE',
'RECORDSIZE', 'GNU_MAGIC', 'POSIX_MAGIC', 'LENGTH_NAME',
'LENGTH_LINK', 'LENGTH_PREFIX', 'REGTYPE', 'AREGTYPE', 'LNKTYPE',
'SYMTYPE', 'CHRTYPE', 'BLKTYPE', 'DIRTYPE', 'FIFOTYPE', 'CONTTYPE',
'GNUTYPE_LONGNAME', 'GNUTYPE_LONGLINK', 'GNUTYPE_SPARSE',
'XHDTYPE', 'XGLTYPE', 'SOLARIS_XHDTYPE', 'SUPPORTED_TYPES',
'REGULAR_TYPES', 'GNU_TYPES', 'PAX_FIELDS', 'PAX_NAME_FIELDS',
'PAX_NUMBER_FIELDS', 'stn', 'nts', 'nti', 'itn', 'calc_chksums',
'copyfileobj', 'filemode', 'EmptyHeaderError',
'TruncatedHeaderError', 'EOFHeaderError', 'InvalidHeaderError',
'SubsequentHeaderError', 'ExFileObject', 'main'}
support.check__all__(self, tarfile, not_exported=not_exported)


class CommandLineTest(unittest.TestCase):
Expand Down
4 changes: 2 additions & 2 deletions Lib/test/test_threading.py
Original file line number Diff line number Diff line change
Expand Up @@ -1365,9 +1365,9 @@ class BarrierTests(lock_tests.BarrierTests):
class MiscTestCase(unittest.TestCase):
def test__all__(self):
extra = {"ThreadError"}
blacklist = {'currentThread', 'activeCount'}
not_exported = {'currentThread', 'activeCount'}
support.check__all__(self, threading, ('threading', '_thread'),
extra=extra, blacklist=blacklist)
extra=extra, not_exported=not_exported)


class InterruptMainTests(unittest.TestCase):
Expand Down
3 changes: 1 addition & 2 deletions Lib/test/test_wave.py
Original file line number Diff line number Diff line change
Expand Up @@ -107,8 +107,7 @@ class WavePCM32Test(WaveTest, unittest.TestCase):

class MiscTestCase(unittest.TestCase):
def test__all__(self):
blacklist = {'WAVE_FORMAT_PCM'}
support.check__all__(self, wave, blacklist=blacklist)
support.check__all__(self, wave, not_exported={'WAVE_FORMAT_PCM'})


class WaveLowLevelTest(unittest.TestCase):
Expand Down
2 changes: 1 addition & 1 deletion Lib/test/test_xml_etree.py
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ def test_sanity(self):

def test_all(self):
names = ("xml.etree.ElementTree", "_elementtree")
support.check__all__(self, ET, names, blacklist=("HTML_EMPTY",))
support.check__all__(self, ET, names, not_exported=("HTML_EMPTY",))


def serialize(elem, to_string=True, encoding='unicode', **options):
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
:mod:`test.support`: Rename ``blacklist`` parameter of
:func:`~test.support.check__all__` to ``not_exported``.