Skip to content
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

gh-116608: Apply style and compatibility changes from importlib_metadata. #123028

Merged
merged 1 commit into from
Aug 15, 2024
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
6 changes: 1 addition & 5 deletions Lib/importlib/resources/_functional.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,11 +57,7 @@ def contents(anchor, *path_names):
DeprecationWarning,
stacklevel=1,
)
return (
resource.name
for resource
in _get_resource(anchor, path_names).iterdir()
)
return (resource.name for resource in _get_resource(anchor, path_names).iterdir())


def _get_encoding_arg(path_names, encoding):
Expand Down
80 changes: 49 additions & 31 deletions Lib/test/test_importlib/resources/test_functional.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import unittest
import os

from test.support.warnings_helper import ignore_warnings, check_warnings
from test.support import warnings_helper

import importlib.resources as resources
from importlib import resources

# Since the functional API forwards to Traversable, we only test
# filesystem resources here -- not zip files, namespace packages etc.
Expand All @@ -22,8 +22,7 @@ class ModuleAnchorMixin:

class FunctionalAPIBase:
def _gen_resourcetxt_path_parts(self):
"""Yield various names of a text file in anchor02, each in a subTest
"""
"""Yield various names of a text file in anchor02, each in a subTest"""
for path_parts in (
('subdirectory', 'subsubdir', 'resource.txt'),
('subdirectory/subsubdir/resource.txt',),
Expand All @@ -36,7 +35,7 @@ def assertEndsWith(self, string, suffix):
"""Assert that `string` ends with `suffix`.

Used to ignore an architecture-specific UTF-16 byte-order mark."""
self.assertEqual(string[-len(suffix):], suffix)
self.assertEqual(string[-len(suffix) :], suffix)

def test_read_text(self):
self.assertEqual(
Expand All @@ -45,15 +44,20 @@ def test_read_text(self):
)
self.assertEqual(
resources.read_text(
self.anchor02, 'subdirectory', 'subsubdir', 'resource.txt',
self.anchor02,
'subdirectory',
'subsubdir',
'resource.txt',
encoding='utf-8',
),
'a resource',
)
for path_parts in self._gen_resourcetxt_path_parts():
self.assertEqual(
resources.read_text(
self.anchor02, *path_parts, encoding='utf-8',
self.anchor02,
*path_parts,
encoding='utf-8',
),
'a resource',
)
Expand All @@ -67,13 +71,16 @@ def test_read_text(self):
resources.read_text(self.anchor01, 'utf-16.file')
self.assertEqual(
resources.read_text(
self.anchor01, 'binary.file', encoding='latin1',
self.anchor01,
'binary.file',
encoding='latin1',
),
'\x00\x01\x02\x03',
)
self.assertEndsWith( # ignore the BOM
resources.read_text(
self.anchor01, 'utf-16.file',
self.anchor01,
'utf-16.file',
errors='backslashreplace',
),
'Hello, UTF-16 world!\n'.encode('utf-16-le').decode(
Expand All @@ -97,7 +104,8 @@ def test_open_text(self):
self.assertEqual(f.read(), 'Hello, UTF-8 world!\n')
for path_parts in self._gen_resourcetxt_path_parts():
with resources.open_text(
self.anchor02, *path_parts,
self.anchor02,
*path_parts,
encoding='utf-8',
) as f:
self.assertEqual(f.read(), 'a resource')
Expand All @@ -111,11 +119,14 @@ def test_open_text(self):
with self.assertRaises(UnicodeDecodeError):
f.read()
with resources.open_text(
self.anchor01, 'binary.file', encoding='latin1',
self.anchor01,
'binary.file',
encoding='latin1',
) as f:
self.assertEqual(f.read(), '\x00\x01\x02\x03')
with resources.open_text(
self.anchor01, 'utf-16.file',
self.anchor01,
'utf-16.file',
errors='backslashreplace',
) as f:
self.assertEndsWith( # ignore the BOM
Expand All @@ -130,16 +141,17 @@ def test_open_binary(self):
self.assertEqual(f.read(), b'Hello, UTF-8 world!\n')
for path_parts in self._gen_resourcetxt_path_parts():
with resources.open_binary(
self.anchor02, *path_parts,
self.anchor02,
*path_parts,
) as f:
self.assertEqual(f.read(), b'a resource')

def test_path(self):
with resources.path(self.anchor01, 'utf-8.file') as path:
with open(str(path)) as f:
with open(str(path), encoding='utf-8') as f:
self.assertEqual(f.read(), 'Hello, UTF-8 world!\n')
with resources.path(self.anchor01) as path:
with open(os.path.join(path, 'utf-8.file')) as f:
with open(os.path.join(path, 'utf-8.file'), encoding='utf-8') as f:
self.assertEqual(f.read(), 'Hello, UTF-8 world!\n')

def test_is_resource(self):
Expand All @@ -152,32 +164,32 @@ def test_is_resource(self):
self.assertTrue(is_resource(self.anchor02, *path_parts))

def test_contents(self):
is_resource = resources.is_resource
with check_warnings((".*contents.*", DeprecationWarning)):
with warnings_helper.check_warnings((".*contents.*", DeprecationWarning)):
c = resources.contents(self.anchor01)
self.assertGreaterEqual(
set(c),
{'utf-8.file', 'utf-16.file', 'binary.file', 'subdirectory'},
)
with (
self.assertRaises(OSError),
check_warnings((".*contents.*", DeprecationWarning)),
):
with self.assertRaises(OSError), warnings_helper.check_warnings((
".*contents.*",
DeprecationWarning,
)):
list(resources.contents(self.anchor01, 'utf-8.file'))

for path_parts in self._gen_resourcetxt_path_parts():
with (
self.assertRaises(OSError),
check_warnings((".*contents.*", DeprecationWarning)),
):
with self.assertRaises(OSError), warnings_helper.check_warnings((
".*contents.*",
DeprecationWarning,
)):
list(resources.contents(self.anchor01, *path_parts))
with check_warnings((".*contents.*", DeprecationWarning)):
with warnings_helper.check_warnings((".*contents.*", DeprecationWarning)):
c = resources.contents(self.anchor01, 'subdirectory')
self.assertGreaterEqual(
set(c),
{'binary.file'},
)

@ignore_warnings(category=DeprecationWarning)
@warnings_helper.ignore_warnings(category=DeprecationWarning)
def test_common_errors(self):
for func in (
resources.read_text,
Expand Down Expand Up @@ -208,18 +220,24 @@ def test_text_errors(self):
# Multiple path arguments need explicit encoding argument.
with self.assertRaises(TypeError):
func(
self.anchor02, 'subdirectory',
'subsubdir', 'resource.txt',
self.anchor02,
'subdirectory',
'subsubdir',
'resource.txt',
)


class FunctionalAPITest_StringAnchor(
unittest.TestCase, FunctionalAPIBase, StringAnchorMixin,
unittest.TestCase,
FunctionalAPIBase,
StringAnchorMixin,
):
pass


class FunctionalAPITest_ModuleAnchor(
unittest.TestCase, FunctionalAPIBase, ModuleAnchorMixin,
unittest.TestCase,
FunctionalAPIBase,
ModuleAnchorMixin,
):
pass
Loading