11import gzip
22import hashlib
3+ import inspect
34import shutil
45import sys
56import tarfile
2728
2829[gui_scripts]
2930guithing = a.b:c
30- """
31- METADATA = """\
32- Metadata-Version: 2.1
33- Name: CMake.Example
34- Version: 0.0.1
35- Requires-Python: >=3.7
36- Provides-Extra: test
37- Requires-Dist: pytest>=6.0; extra == "test"
38-
3931"""
4032
4133mark_hashes_different = pytest .mark .xfail (
@@ -52,6 +44,19 @@ def compute_uncompressed_hash(inp: Path) -> str:
5244
5345@pytest .mark .usefixtures ("package_simple_pyproject_ext" )
5446def test_pep517_sdist ():
47+ expected_metadata = (
48+ inspect .cleandoc (
49+ """
50+ Metadata-Version: 2.1
51+ Name: CMake.Example
52+ Version: 0.0.1
53+ Requires-Python: >=3.7
54+ Provides-Extra: test
55+ Requires-Dist: pytest>=6.0; extra == "test"
56+ """
57+ )
58+ + "\n \n "
59+ )
5560 dist = Path ("dist" )
5661 out = build_sdist ("dist" )
5762
@@ -74,7 +79,7 @@ def test_pep517_sdist():
7479 pkg_info = f .extractfile ("cmake_example-0.0.1/PKG-INFO" )
7580 assert pkg_info
7681 pkg_info_contents = pkg_info .read ().decode ()
77- assert pkg_info_contents == METADATA
82+ assert pkg_info_contents == expected_metadata
7883
7984
8085@mark_hashes_different
@@ -360,3 +365,82 @@ def test_prepare_metdata_for_build_wheel_by_hand(tmp_path):
360365 assert metadata .get (k , None ) == b
361366
362367 assert len (metadata ) == len (answer )
368+
369+
370+ @pytest .mark .usefixtures ("package_pep639_pure" )
371+ def test_pep639_license_files_metadata ():
372+ metadata = build .util .project_wheel_metadata (str (Path .cwd ()), isolated = False )
373+ answer = {
374+ "Metadata-Version" : ["2.4" ],
375+ "Name" : ["pep639_pure" ],
376+ "Version" : ["0.1.0" ],
377+ "License-Expression" : ["MIT" ],
378+ "License-File" : ["LICENSE1.txt" , "nested/more/LICENSE2.txt" ],
379+ }
380+
381+ for k , b in answer .items ():
382+ assert metadata .get_all (k , None ) == b
383+
384+ assert len (metadata ) == sum (len (v ) for v in answer .values ())
385+
386+
387+ @pytest .mark .usefixtures ("package_pep639_pure" )
388+ def test_pep639_license_files_sdist ():
389+ expected_metadata = (
390+ inspect .cleandoc (
391+ """
392+ Metadata-Version: 2.4
393+ Name: pep639_pure
394+ Version: 0.1.0
395+ License-Expression: MIT
396+ License-File: LICENSE1.txt
397+ License-File: nested/more/LICENSE2.txt
398+ """
399+ )
400+ + "\n \n "
401+ )
402+
403+ dist = Path ("dist" )
404+ out = build_sdist ("dist" )
405+
406+ (sdist ,) = dist .iterdir ()
407+ assert sdist .name == "pep639_pure-0.1.0.tar.gz"
408+ assert sdist == dist / out
409+
410+ with tarfile .open (sdist ) as f :
411+ file_names = set (f .getnames ())
412+ assert file_names == {
413+ f"pep639_pure-0.1.0/{ x } "
414+ for x in (
415+ "pyproject.toml" ,
416+ "PKG-INFO" ,
417+ "LICENSE1.txt" ,
418+ "nested/more/LICENSE2.txt" ,
419+ )
420+ }
421+ pkg_info = f .extractfile ("pep639_pure-0.1.0/PKG-INFO" )
422+ assert pkg_info
423+ pkg_info_contents = pkg_info .read ().decode ()
424+ assert pkg_info_contents == expected_metadata
425+
426+
427+ @pytest .mark .usefixtures ("package_pep639_pure" )
428+ def test_pep639_license_files_wheel ():
429+ dist = Path ("dist" )
430+ out = build_wheel ("dist" , {})
431+ (wheel ,) = dist .glob ("pep639_pure-0.1.0-*.whl" )
432+ assert wheel == dist / out
433+
434+ with zipfile .ZipFile (wheel ) as zf :
435+ file_paths = {Path (p ) for p in zf .namelist ()}
436+ with zf .open ("pep639_pure-0.1.0.dist-info/METADATA" ) as f :
437+ metadata = f .read ().decode ("utf-8" )
438+
439+ assert Path ("pep639_pure-0.1.0.dist-info/licenses/LICENSE1.txt" ) in file_paths
440+ assert (
441+ Path ("pep639_pure-0.1.0.dist-info/licenses/nested/more/LICENSE2.txt" )
442+ in file_paths
443+ )
444+
445+ assert "LICENSE1.txt" in metadata
446+ assert "nested/more/LICENSE2.txt" in metadata
0 commit comments