| import io | |
| import unittest | |
| from dataclasses import dataclass, field | |
| import tools.wheelmaker as wheelmaker | |
| class QuoteAllFilenamesTest(unittest.TestCase): | |
| """Tests for quote_all_filenames behavior in _WhlFile. | |
| Some wheels (like torch) have all filenames quoted in their RECORD file. | |
| When repacking, we preserve this style to minimize diffs. | |
| """ | |
| def _make_whl_file(self, quote_all: bool) -> wheelmaker._WhlFile: | |
| """Create a _WhlFile instance for testing.""" | |
| buf = io.BytesIO() | |
| return wheelmaker._WhlFile( | |
| buf, | |
| mode="w", | |
| distribution_prefix="test-1.0.0", | |
| quote_all_filenames=quote_all, | |
| ) | |
| def test_quote_all_quotes_simple_filenames(self) -> None: | |
| """When quote_all_filenames=True, all filenames are quoted.""" | |
| whl = self._make_whl_file(quote_all=True) | |
| self.assertEqual(whl._quote_filename("foo/bar.py"), '"foo/bar.py"') | |
| def test_quote_all_false_leaves_simple_filenames_unquoted(self) -> None: | |
| """When quote_all_filenames=False, simple filenames stay unquoted.""" | |
| whl = self._make_whl_file(quote_all=False) | |
| self.assertEqual(whl._quote_filename("foo/bar.py"), "foo/bar.py") | |
| def test_quote_all_quotes_filenames_with_commas(self) -> None: | |
| """Filenames with commas are always quoted, regardless of quote_all_filenames.""" | |
| whl = self._make_whl_file(quote_all=True) | |
| self.assertEqual(whl._quote_filename("foo,bar/baz.py"), '"foo,bar/baz.py"') | |
| whl = self._make_whl_file(quote_all=False) | |
| self.assertEqual(whl._quote_filename("foo,bar/baz.py"), '"foo,bar/baz.py"') | |
| @dataclass | |
| class ArcNameTestCase: | |
| name: str | |
| expected: str | |
| distribution_prefix: str = "" | |
| strip_path_prefixes: list[str] = field(default_factory=list) | |
| add_path_prefix: str = "" | |
| class ArcNameFromTest(unittest.TestCase): | |
| def test_arcname_from(self) -> None: | |
| test_cases = [ | |
| ArcNameTestCase(name="a/b/c/file.py", expected="a/b/c/file.py"), | |
| ArcNameTestCase( | |
| name="a/b/c/file.py", | |
| strip_path_prefixes=["a"], | |
| expected="/b/c/file.py", | |
| ), | |
| ArcNameTestCase( | |
| name="a/b/c/file.py", | |
| strip_path_prefixes=["a/b/"], | |
| expected="c/file.py", | |
| ), | |
| # only first found is used and it's not cumulative. | |
| ArcNameTestCase( | |
| name="a/b/c/file.py", | |
| strip_path_prefixes=["a/", "b/"], | |
| expected="b/c/file.py", | |
| ), | |
| # Examples from docs | |
| ArcNameTestCase( | |
| name="foo/bar/baz/file.py", | |
| strip_path_prefixes=["foo", "foo/bar/baz"], | |
| expected="/bar/baz/file.py", | |
| ), | |
| ArcNameTestCase( | |
| name="foo/bar/baz/file.py", | |
| strip_path_prefixes=["foo/bar/baz", "foo"], | |
| expected="/file.py", | |
| ), | |
| ArcNameTestCase( | |
| name="foo/file2.py", | |
| strip_path_prefixes=["foo/bar/baz", "foo"], | |
| expected="/file2.py", | |
| ), | |
| # Files under the distribution prefix (eg mylib-1.0.0-dist-info) | |
| # are unmodified | |
| ArcNameTestCase( | |
| name="mylib-0.0.1-dist-info/WHEEL", | |
| distribution_prefix="mylib", | |
| expected="mylib-0.0.1-dist-info/WHEEL", | |
| ), | |
| ArcNameTestCase( | |
| name="mylib/a/b/c/WHEEL", | |
| distribution_prefix="mylib", | |
| strip_path_prefixes=["mylib"], | |
| expected="mylib/a/b/c/WHEEL", | |
| ), | |
| # Check that prefixes are added | |
| ArcNameTestCase( | |
| name="a/b/c/file.py", | |
| add_path_prefix="namespace/", | |
| expected="namespace/a/b/c/file.py", | |
| ), | |
| ArcNameTestCase( | |
| name="a/b/c/file.py", | |
| strip_path_prefixes=["a"], | |
| add_path_prefix="namespace", | |
| expected="namespace/b/c/file.py", | |
| ), | |
| ArcNameTestCase( | |
| name="a/b/c/file.py", | |
| strip_path_prefixes=["a/b/"], | |
| add_path_prefix="namespace_", | |
| expected="namespace_c/file.py", | |
| ), | |
| ] | |
| for test_case in test_cases: | |
| with self.subTest( | |
| name=test_case.name, | |
| distribution_prefix=test_case.distribution_prefix, | |
| strip_path_prefixes=test_case.strip_path_prefixes, | |
| add_path_prefix=test_case.add_path_prefix, | |
| want=test_case.expected, | |
| ): | |
| got = wheelmaker.arcname_from( | |
| name=test_case.name, | |
| distribution_prefix=test_case.distribution_prefix, | |
| strip_path_prefixes=test_case.strip_path_prefixes, | |
| add_path_prefix=test_case.add_path_prefix, | |
| ) | |
| self.assertEqual(got, test_case.expected) | |
| class GetNewRequirementLineTest(unittest.TestCase): | |
| def test_requirement(self): | |
| result = wheelmaker.get_new_requirement_line("requests>=2.0", "") | |
| self.assertEqual(result, "Requires-Dist: requests>=2.0") | |
| def test_requirement_and_extra(self): | |
| result = wheelmaker.get_new_requirement_line("requests>=2.0", "extra=='dev'") | |
| self.assertEqual(result, "Requires-Dist: requests>=2.0; extra=='dev'") | |
| def test_requirement_with_url(self): | |
| result = wheelmaker.get_new_requirement_line( | |
| "requests @ git+https://github.com/psf/requests.git@3aa6386c3", "" | |
| ) | |
| self.assertEqual( | |
| result, | |
| "Requires-Dist: requests @ git+https://github.com/psf/requests.git@3aa6386c3", | |
| ) | |
| def test_requirement_with_marker(self): | |
| result = wheelmaker.get_new_requirement_line( | |
| "requests>=2.0; python_version>='3.6'", "" | |
| ) | |
| self.assertEqual( | |
| result, 'Requires-Dist: requests>=2.0; python_version >= "3.6"' | |
| ) | |
| def test_requirement_with_marker_and_extra(self): | |
| result = wheelmaker.get_new_requirement_line( | |
| "requests>=2.0; python_version>='3.6'", "extra=='dev'" | |
| ) | |
| self.assertEqual( | |
| result, | |
| "Requires-Dist: requests>=2.0; (python_version >= \"3.6\") and extra=='dev'", | |
| ) | |
| if __name__ == "__main__": | |
| unittest.main() |