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

Fix encoding warnings with PEP 597 enabled #8893

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
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
3 changes: 3 additions & 0 deletions .github/workflows/tests.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@ defaults:
run:
shell: bash

env:
PYTHONWARNDEFAULTENCODING: 'true'

jobs:
changes:
name: Detect changed files
Expand Down
7 changes: 4 additions & 3 deletions src/poetry/masonry/builders/editable.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import csv
import hashlib
import json
import locale
import os

from base64 import urlsafe_b64encode
Expand All @@ -16,6 +15,7 @@

from poetry.utils._compat import WINDOWS
from poetry.utils._compat import decode
from poetry.utils._compat import getencoding
from poetry.utils.env import build_environment
from poetry.utils.helpers import is_dir_writable
from poetry.utils.pip import pip_install
Expand Down Expand Up @@ -125,7 +125,7 @@ def _add_pth(self) -> list[Path]:

try:
pth_file = self._env.site_packages.write_text(
pth_file, content, encoding=locale.getpreferredencoding()
pth_file, content, encoding=getencoding()
)
self._debug(
f" - Adding <c2>{pth_file.name}</c2> to <b>{pth_file.parent}</b> for"
Expand Down Expand Up @@ -252,7 +252,8 @@ def _add_dist_info(self, added_files: list[Path]) -> None:
"dir_info": {"editable": True},
"url": self._poetry.file.path.parent.absolute().as_uri(),
}
)
),
encoding="utf-8",
)
added_files.append(direct_url_json)

Expand Down
3 changes: 2 additions & 1 deletion src/poetry/repositories/installed_repository.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
from poetry.core.utils.helpers import module_name

from poetry.repositories.repository import Repository
from poetry.utils._compat import getencoding
from poetry.utils._compat import metadata


Expand Down Expand Up @@ -58,7 +59,7 @@ def get_package_paths(cls, env: Env, name: str) -> set[Path]:
if not pth_file.exists():
continue

with pth_file.open() as f:
with pth_file.open(encoding=getencoding()) as f:
for line in f:
line = line.strip()
if line and not line.startswith(("#", "import ", "import\t")):
Expand Down
9 changes: 9 additions & 0 deletions src/poetry/utils/_compat.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from __future__ import annotations

import locale
import sys

from contextlib import suppress
Expand Down Expand Up @@ -52,6 +53,13 @@ def encode(string: str, encodings: list[str] | None = None) -> bytes:
return string.encode(encodings[0], errors="ignore")


def getencoding() -> str:
if sys.version_info < (3, 11):
return locale.getpreferredencoding()
else:
return locale.getencoding()


def is_relative_to(this: Path, other: Path) -> bool:
"""
Return whether `this` path is relative to the `other` path. This is compatibility wrapper around
Expand All @@ -72,6 +80,7 @@ def is_relative_to(this: Path, other: Path) -> bool:
"WINDOWS",
"decode",
"encode",
"getencoding",
"is_relative_to",
"metadata",
"tomllib",
Expand Down
3 changes: 2 additions & 1 deletion src/poetry/utils/env/base_env.py
Original file line number Diff line number Diff line change
Expand Up @@ -330,8 +330,9 @@ def _run(self, cmd: list[str], **kwargs: Any) -> str:
subprocess.check_call(cmd, stderr=stderr, env=env, **kwargs)
output = ""
else:
encoding = "locale" if sys.version_info >= (3, 10) else None
output = subprocess.check_output(
cmd, stderr=stderr, env=env, text=True, **kwargs
cmd, stderr=stderr, env=env, text=True, encoding=encoding, **kwargs
)
except CalledProcessError as e:
raise EnvCommandError(e)
Expand Down
2 changes: 1 addition & 1 deletion src/poetry/utils/env/virtual_env.py
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ def includes_system_site_packages(self) -> bool:
return pyvenv_cfg.exists() and (
re.search(
r"^\s*include-system-site-packages\s*=\s*true\s*$",
pyvenv_cfg.read_text(),
pyvenv_cfg.read_text(encoding="utf-8"),
re.IGNORECASE | re.MULTILINE,
)
is not None
Expand Down
Empty file.
3 changes: 2 additions & 1 deletion src/poetry/vcs/git/system.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,12 +40,13 @@ def run(*args: Any, **kwargs: Any) -> None:
git_command = find_git_command()
env = os.environ.copy()
env["GIT_TERMINAL_PROMPT"] = "0"
subprocess.check_call(
subprocess.check_call( # type: ignore[call-arg]
git_command + list(args),
stderr=subprocess.DEVNULL,
stdout=subprocess.DEVNULL,
env=env,
text=True,
encoding="utf-8",
)

@staticmethod
Expand Down
13 changes: 9 additions & 4 deletions tests/console/commands/env/test_remove.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,13 +76,18 @@ def test_remove_all(
if envs_file == "empty":
envs_file_path.touch()
elif envs_file == "self":
envs_file_path.write_text(f'[{venv_name}]\nminor = "3.9"\npatch = "3.9.1"\n')
envs_file_path.write_text(
f'[{venv_name}]\nminor = "3.9"\npatch = "3.9.1"\n', encoding="utf-8"
)
elif envs_file == "other":
envs_file_path.write_text('[other-abcdefgh]\nminor = "3.9"\npatch = "3.9.1"\n')
envs_file_path.write_text(
'[other-abcdefgh]\nminor = "3.9"\npatch = "3.9.1"\n', encoding="utf-8"
)
elif envs_file == "self_and_other":
envs_file_path.write_text(
f'[{venv_name}]\nminor = "3.9"\npatch = "3.9.1"\n'
'[other-abcdefgh]\nminor = "3.9"\npatch = "3.9.1"\n'
'[other-abcdefgh]\nminor = "3.9"\npatch = "3.9.1"\n',
encoding="utf-8",
)
else:
# no envs file -> nothing to prepare
Expand All @@ -97,7 +102,7 @@ def test_remove_all(

if envs_file is not None:
assert envs_file_path.exists()
envs_file_content = envs_file_path.read_text()
envs_file_content = envs_file_path.read_text(encoding="utf-8")
assert venv_name not in envs_file_content
if "other" in envs_file:
assert "other-abcdefgh" in envs_file_content
Expand Down
2 changes: 1 addition & 1 deletion tests/console/commands/self/test_install.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ def test_self_install(
assert isinstance(command, SelfInstallCommand)
pyproject_path = command.system_pyproject
if pyproject_content:
pyproject_path.write_text(pyproject_content)
pyproject_path.write_text(pyproject_content, encoding="utf-8")
else:
assert not pyproject_path.exists()

Expand Down
12 changes: 8 additions & 4 deletions tests/console/commands/self/test_self_command.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,11 @@ def test_generate_system_pyproject_trailing_newline(
example_system_pyproject: str,
) -> None:
cmd = SelfCommand()
cmd.system_pyproject.write_text(example_system_pyproject + "\n" * existing_newlines)
cmd.system_pyproject.write_text(
example_system_pyproject + "\n" * existing_newlines, encoding="utf-8"
)
cmd.generate_system_pyproject()
generated = cmd.system_pyproject.read_text()
generated = cmd.system_pyproject.read_text(encoding="utf-8")

assert len(generated) - len(generated.rstrip("\n")) == existing_newlines

Expand All @@ -40,10 +42,12 @@ def test_generate_system_pyproject_carriage_returns(
example_system_pyproject: str,
) -> None:
cmd = SelfCommand()
cmd.system_pyproject.write_text(example_system_pyproject + "\n")
cmd.system_pyproject.write_text(example_system_pyproject + "\n", encoding="utf-8")
cmd.generate_system_pyproject()

with open(cmd.system_pyproject, newline="") as f: # do not translate newlines
with open(
cmd.system_pyproject, newline="", encoding="utf-8"
) as f: # do not translate newlines
generated = f.read()

assert "\r\r" not in generated
24 changes: 14 additions & 10 deletions tests/console/commands/test_init.py
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ def test_noninteractive(
assert tester.io.fetch_output() == expected
assert tester.io.fetch_error() == ""

toml_content = (tmp_path / "pyproject.toml").read_text()
toml_content = (tmp_path / "pyproject.toml").read_text(encoding="utf-8")
assert 'name = "my-package"' in toml_content
assert 'pytest = "^3.6.0"' in toml_content

Expand Down Expand Up @@ -853,9 +853,11 @@ def test_init_existing_pyproject_simple(
[tool.black]
line-length = 88
"""
pyproject_file.write_text(existing_section)
pyproject_file.write_text(existing_section, encoding="utf-8")
tester.execute(inputs=init_basic_inputs)
assert f"{existing_section}\n{init_basic_toml}" in pyproject_file.read_text()
assert f"{existing_section}\n{init_basic_toml}" in pyproject_file.read_text(
encoding="utf-8"
)


@pytest.mark.parametrize("linesep", ["\n", "\r\n"])
Expand All @@ -871,10 +873,10 @@ def test_init_existing_pyproject_consistent_linesep(
[tool.black]
line-length = 88
""".replace("\n", linesep)
with open(pyproject_file, "w", newline="") as f:
with open(pyproject_file, "w", newline="", encoding="utf-8") as f:
f.write(existing_section)
tester.execute(inputs=init_basic_inputs)
with open(pyproject_file, newline="") as f:
with open(pyproject_file, newline="", encoding="utf-8") as f:
content = f.read()
init_basic_toml = init_basic_toml.replace("\n", linesep)
assert f"{existing_section}{linesep}{init_basic_toml}" in content
Expand All @@ -891,7 +893,7 @@ def test_init_non_interactive_existing_pyproject_add_dependency(
[tool.black]
line-length = 88
"""
pyproject_file.write_text(existing_section)
pyproject_file.write_text(existing_section, encoding="utf-8")

repo.add_package(get_package("foo", "1.19.2"))

Expand All @@ -915,7 +917,9 @@ def test_init_non_interactive_existing_pyproject_add_dependency(
python = "^3.6"
foo = "^1.19.2"
"""
assert f"{existing_section}\n{expected}" in pyproject_file.read_text()
assert f"{existing_section}\n{expected}" in pyproject_file.read_text(
encoding="utf-8"
)


def test_init_existing_pyproject_with_build_system_fails(
Expand All @@ -927,13 +931,13 @@ def test_init_existing_pyproject_with_build_system_fails(
requires = ["setuptools >= 40.6.0", "wheel"]
build-backend = "setuptools.build_meta"
"""
pyproject_file.write_text(existing_section)
pyproject_file.write_text(existing_section, encoding="utf-8")
tester.execute(inputs=init_basic_inputs)
assert (
tester.io.fetch_error().strip()
== "A pyproject.toml file with a defined build-system already exists."
)
assert existing_section in pyproject_file.read_text()
assert existing_section in pyproject_file.read_text(encoding="utf-8")


@pytest.mark.parametrize(
Expand Down Expand Up @@ -1069,7 +1073,7 @@ def mock_check_output(cmd: str, *_: Any, **__: Any) -> str:
python = "^{python}"
"""

assert expected in pyproject_file.read_text()
assert expected in pyproject_file.read_text(encoding="utf-8")


def test_get_pool(mocker: MockerFixture, source_dir: Path) -> None:
Expand Down
2 changes: 1 addition & 1 deletion tests/console/commands/test_new.py
Original file line number Diff line number Diff line change
Expand Up @@ -228,7 +228,7 @@ def mock_check_output(cmd: str, *_: Any, **__: Any) -> str:
python = "^{python}"
"""

assert expected in pyproject_file.read_text()
assert expected in pyproject_file.read_text(encoding="utf-8")


def test_basic_interactive_new(
Expand Down
4 changes: 2 additions & 2 deletions tests/console/commands/test_version.py
Original file line number Diff line number Diff line change
Expand Up @@ -126,9 +126,9 @@ def test_phase_version_update(tester: CommandTester) -> None:

def test_dry_run(tester: CommandTester) -> None:
assert isinstance(tester.command, VersionCommand)
old_pyproject = tester.command.poetry.file.path.read_text()
old_pyproject = tester.command.poetry.file.path.read_text(encoding="utf-8")
tester.execute("--dry-run major")

new_pyproject = tester.command.poetry.file.path.read_text()
new_pyproject = tester.command.poetry.file.path.read_text(encoding="utf-8")
assert tester.io.fetch_output() == "Bumping version from 1.2.3 to 2.0.0\n"
assert old_pyproject == new_pyproject
21 changes: 14 additions & 7 deletions tests/inspection/test_info.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,8 @@ def demo_setup(source_dir: Path) -> Path:
"from setuptools import setup; "
'setup(name="demo", '
'version="0.1.0", '
'install_requires=["package"])'
'install_requires=["package"])',
encoding="utf-8",
)
return source_dir

Expand All @@ -77,7 +78,8 @@ def demo_setup_cfg(source_dir: Path) -> Path:
"[options]",
"install_requires = package",
]
)
),
encoding="utf-8",
)
return source_dir

Expand All @@ -89,15 +91,18 @@ def demo_setup_complex(source_dir: Path) -> Path:
"from setuptools import setup; "
'setup(name="demo", '
'version="0.1.0", '
'install_requires=[i for i in ["package"]])'
'install_requires=[i for i in ["package"]])',
encoding="utf-8",
)
return source_dir


@pytest.fixture
def demo_setup_complex_pep517_legacy(demo_setup_complex: Path) -> Path:
pyproject_toml = demo_setup_complex / "pyproject.toml"
pyproject_toml.write_text('[build-system]\nrequires = ["setuptools", "wheel"]')
pyproject_toml.write_text(
'[build-system]\nrequires = ["setuptools", "wheel"]', encoding="utf-8"
)
return demo_setup_complex


Expand All @@ -115,7 +120,8 @@ def demo_setup_complex_calls_script(
[build-system]
requires = ["setuptools", "scripts @ {scripts_dir.as_uri()}"]
build-backend = "setuptools.build_meta:__legacy__"
"""
""",
encoding="utf-8",
)

setup_py = source_dir / "setup.py"
Expand All @@ -126,7 +132,8 @@ def demo_setup_complex_calls_script(
if subprocess.call(["exit-code"]) != 42:
raise RuntimeError("Wrong exit code.")
setup(name="demo", version="0.1.0", install_requires=[i for i in ["package"]])
"""
""",
encoding="utf-8",
)

return source_dir
Expand Down Expand Up @@ -359,7 +366,7 @@ def test_info_setup_missing_mandatory_should_trigger_pep517(
setup += ")"

setup_py = source_dir / "setup.py"
setup_py.write_text(setup)
setup_py.write_text(setup, encoding="utf-8")

spy = mocker.spy(ProjectBuilder, "from_isolated_env")
_ = PackageInfo.from_directory(source_dir)
Expand Down
2 changes: 1 addition & 1 deletion tests/installation/test_wheel_installer.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ def test_default_installation_dist_info_dir_content(default_installation: Path)

def test_installer_file_contains_valid_version(default_installation: Path) -> None:
installer_file = default_installation / "demo-0.1.0.dist-info" / "INSTALLER"
with open(installer_file) as f:
with open(installer_file, encoding="utf-8") as f:
installer_content = f.read()
match = re.match(r"Poetry (?P<version>.*)", installer_content)
assert match
Expand Down
Loading
Loading