diff --git a/changelog.d/1466.change.rst b/changelog.d/1466.change.rst new file mode 100644 index 0000000000..7818bfc10d --- /dev/null +++ b/changelog.d/1466.change.rst @@ -0,0 +1 @@ +Fix handling of Unicode arguments in PEP 517 backend diff --git a/setuptools/build_meta.py b/setuptools/build_meta.py index 609ea1e510..fb657a5462 100644 --- a/setuptools/build_meta.py +++ b/setuptools/build_meta.py @@ -61,6 +61,19 @@ def patch(cls): distutils.core.Distribution = orig +def _to_str(s): + """ + Convert a filename to a string (on Python 2, explicitly + a byte string, not Unicode) as distutils checks for the + exact type str. + """ + if sys.version_info[0] == 2 and not isinstance(s, str): + # Assume it's Unicode, as that's what the PEP says + # should be provided. + return s.encode(sys.getfilesystemencoding()) + return s + + def _run_setup(setup_script='setup.py'): # Note that we can reuse our build directory between calls # Correctness comes first, then optimization later @@ -109,7 +122,7 @@ def get_requires_for_build_sdist(config_settings=None): def prepare_metadata_for_build_wheel(metadata_directory, config_settings=None): - sys.argv = sys.argv[:1] + ['dist_info', '--egg-base', metadata_directory] + sys.argv = sys.argv[:1] + ['dist_info', '--egg-base', _to_str(metadata_directory)] _run_setup() dist_info_directory = metadata_directory diff --git a/setuptools/tests/test_build_meta.py b/setuptools/tests/test_build_meta.py index b39b7b8f90..c1be3eda92 100644 --- a/setuptools/tests/test_build_meta.py +++ b/setuptools/tests/test_build_meta.py @@ -126,3 +126,12 @@ def test_prepare_metadata_for_build_wheel(build_backend): dist_info = build_backend.prepare_metadata_for_build_wheel(dist_dir) assert os.path.isfile(os.path.join(dist_dir, dist_info, 'METADATA')) + + +def test_prepare_metadata_for_build_wheel_with_unicode(build_backend): + dist_dir = os.path.abspath(u'pip-dist-info') + os.makedirs(dist_dir) + + dist_info = build_backend.prepare_metadata_for_build_wheel(dist_dir) + + assert os.path.isfile(os.path.join(dist_dir, dist_info, 'METADATA'))