def test_get_cached_archive_for_link(config, mocker): chef = Chef( config, MockEnv( version_info=(3, 8, 3), marker_env={ "interpreter_name": "cpython", "interpreter_version": "3.8.3" }, supported_tags=[ Tag("cp38", "cp38", "macosx_10_15_x86_64"), Tag("py3", "none", "any"), ], ), ) cwd = Path.cwd() / ".pypoetrycache" mocker.patch.object( chef, "get_cached_archives_for_link", return_value=[ Link(f"file:///{cwd}demo-0.1.0-py2.py3-none-any"), Link(f"file:///{cwd}demo-0.1.0.tar.gz"), Link(f"file:///{cwd}demo-0.1.0-cp38-cp38-macosx_10_15_x86_64.whl"), Link(f"file:///{cwd}demo-0.1.0-cp37-cp37-macosx_10_15_x86_64.whl"), ], ) archive = chef.get_cached_archive_for_link( Link("https://files.python-poetry.org/demo-0.1.0.tar.gz")) assert Link(f"file:///{cwd}demo-0.1.0-cp38-cp38-macosx_10_15_x86_64.whl" ) == archive
def env(): return MockEnv( supported_tags=[ Tag("cp37", "cp37", "macosx_10_15_x86_64"), Tag("py3", "none", "any"), ] )
def test_get_cached_archive_for_link(config: Config, mocker: MockerFixture, link: str, cached: str): chef = Chef( config, MockEnv( version_info=(3, 8, 3), marker_env={ "interpreter_name": "cpython", "interpreter_version": "3.8.3" }, supported_tags=[ Tag("cp38", "cp38", "macosx_10_15_x86_64"), Tag("py3", "none", "any"), ], ), ) mocker.patch.object( chef, "get_cached_archives_for_link", return_value=[ Path("/cache/demo-0.1.0-py2.py3-none-any"), Path("/cache/demo-0.1.0.tar.gz"), Path("/cache/demo-0.1.0-cp38-cp38-macosx_10_15_x86_64.whl"), Path("/cache/demo-0.1.0-cp37-cp37-macosx_10_15_x86_64.whl"), ], ) archive = chef.get_cached_archive_for_link(Link(link)) assert Path(cached) == archive
def get_supported_tags(self) -> List[Tag]: file_path = Path(packaging.tags.__file__) if file_path.suffix == ".pyc": # Python 2 file_path = file_path.with_suffix(".py") with file_path.open(encoding="utf-8") as f: script = decode(f.read()) script = script.replace( "from ._typing import TYPE_CHECKING, cast", "TYPE_CHECKING = False\ncast = lambda type_, value: value", ) script = script.replace( "from ._typing import MYPY_CHECK_RUNNING, cast", "MYPY_CHECK_RUNNING = False\ncast = lambda type_, value: value", ) script += textwrap.dedent(""" import json print(json.dumps([(t.interpreter, t.abi, t.platform) for t in sys_tags()])) """) output = self.run("python", "-", input_=script) return [Tag(*t) for t in json.loads(output)]
def create(cls, release_dict, name=None): # type: (TReleaseUrlDict, Optional[str]) -> "ReleaseUrl" valid_digest_keys = set("{0}_digest".format(k) for k in VALID_ALGORITHMS.keys()) digest_keys = set(release_dict.keys()) & valid_digest_keys creation_kwargs = { } # type: Dict[str, Union[bool, int, str, Digest, TDigestDict]] creation_kwargs = { k: v for k, v in release_dict.items() if k not in digest_keys } if name is not None: creation_kwargs["name"] = name for k in digest_keys: digest = release_dict[k] if not isinstance(digest, six.string_types): raise TypeError( "Digests must be strings, got {!r}".format(digest)) creation_kwargs[k] = Digest.create(k.replace("_digest", ""), digest) release_url = cls(**filter_dict(creation_kwargs)) # type: ignore if release_url.is_wheel: supported_tags = [ parse_tag(Tag(*tag)) for tag in distlib.wheel.Wheel(release_url.url).tags ] release_url = attr.evolve(release_url, tags=supported_tags) return release_url
def test_chooser_chooses_system_specific_wheel_link_if_available( mock_pypi, mock_legacy, source_type, pool ): env = MockEnv( supported_tags=[Tag("cp37", "cp37m", "win32"), Tag("py3", "none", "any")] ) chooser = Chooser(pool, env) package = Package("pyyaml", "3.13.0") if source_type == "legacy": package.source_type = "legacy" package.source_reference = "foo" package.source_url = "https://foo.bar/simple/" link = chooser.choose_for(package) assert "PyYAML-3.13-cp37-cp37m-win32.whl" == link.filename
async def test_add_requirement(): pytest.importorskip("packaging") from micropip._micropip import Transaction with spawn_web_server(Path(__file__).parent / "test") as server: server_hostname, server_port, _ = server base_url = f"http://{server_hostname}:{server_port}/" url = base_url + "snowballstemmer-2.0.0-py2.py3-none-any.whl" transaction = create_transaction(Transaction) await transaction.add_requirement(url) wheel = transaction.wheels[0] assert wheel.name == "snowballstemmer" assert str(wheel.version) == "2.0.0" assert wheel.filename == "snowballstemmer-2.0.0-py2.py3-none-any.whl" assert wheel.url == url assert wheel.tags == frozenset( {Tag("py2", "none", "any"), Tag("py3", "none", "any")})
def test_parse_wheel_url(): pytest.importorskip("packaging") from micropip._micropip import WheelInfo url = "https://a/snowballstemmer-2.0.0-py2.py3-none-any.whl" wheel = WheelInfo.from_url(url) assert wheel.name == "snowballstemmer" assert str(wheel.version) == "2.0.0" assert wheel.digests is None assert wheel.filename == "snowballstemmer-2.0.0-py2.py3-none-any.whl" assert wheel.url == url assert wheel.tags == frozenset( {Tag("py2", "none", "any"), Tag("py3", "none", "any")}) msg = r"Invalid wheel filename \(wrong number of parts\)" with pytest.raises(ValueError, match=msg): url = "https://a/snowballstemmer-2.0.0-py2.whl" wheel = WheelInfo.from_url(url) url = "http://scikit_learn-0.22.2.post1-cp35-cp35m-macosx_10_9_intel.whl" wheel = WheelInfo.from_url(url) assert wheel.name == "scikit-learn" assert wheel.tags == frozenset({Tag("cp35", "cp35m", "macosx_10_9_intel")})
def __init__(self, filename: str) -> None: wheel_info = wheel_file_re.match(filename) if not wheel_info: raise InvalidWheelName(f"{filename} is not a valid wheel filename.") self.filename = filename self.name = wheel_info.group("name").replace("_", "-") self.version = wheel_info.group("ver").replace("_", "-") self.build_tag = wheel_info.group("build") self.pyversions = wheel_info.group("pyver").split(".") self.abis = wheel_info.group("abi").split(".") self.plats = wheel_info.group("plat").split(".") self.tags = { Tag(x, y, z) for x in self.pyversions for y in self.abis for z in self.plats }
@pytest.mark.parametrize(("version"), ["1.4.0", "1.0"]) def test_canonicalize_version_no_strip_trailing_zero(version): assert canonicalize_version(version, strip_trailing_zero=False) == version @pytest.mark.parametrize( ("filename", "name", "version", "build", "tags"), [ ( "foo-1.0-py3-none-any.whl", "foo", Version("1.0"), (), {Tag("py3", "none", "any")}, ), ( "some_PACKAGE-1.0-py3-none-any.whl", "some-package", Version("1.0"), (), {Tag("py3", "none", "any")}, ), ( "foo-1.0-1000-py3-none-any.whl", "foo", Version("1.0"), (1000, ""), {Tag("py3", "none", "any")}, ),