Skip to content

Commit 85e2415

Browse files
committed
Add tests
1 parent 1aa718a commit 85e2415

6 files changed

Lines changed: 75 additions & 5 deletions

File tree

micropip/_commands/install.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,11 +124,11 @@ async def install(
124124
)
125125

126126
# uninstall packages that are installed
127-
uninstall_packages = set([pkg.name for pkg in transaction.wheels]) | set(
127+
packages_all = set([pkg.name for pkg in transaction.wheels]) | set(
128128
[pkg.name for pkg in transaction.pyodide_packages]
129129
)
130130

131-
uninstall(uninstall_packages, _ignore_missing=True)
131+
uninstall(packages_all, ignore_missing=True)
132132

133133
wheel_promises = []
134134
# Install built-in packages

micropip/_commands/uninstall.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from .._utils import get_files_in_distribution, get_root
99

1010

11-
def uninstall(packages: str | Iterable[str], *, _ignore_missing: bool = False) -> None:
11+
def uninstall(packages: str | Iterable[str], *, ignore_missing: bool = False) -> None:
1212
"""Uninstall the given packages.
1313
1414
This function only supports uninstalling packages that are installed
@@ -37,7 +37,7 @@ def uninstall(packages: str | Iterable[str], *, _ignore_missing: bool = False) -
3737
dist = importlib.metadata.distribution(package)
3838
distributions.append(dist)
3939
except importlib.metadata.PackageNotFoundError:
40-
if not _ignore_missing: # TODO: Can we utilize log level here?
40+
if not ignore_missing: # TODO: Can we utilize log level here?
4141
warnings.warn(
4242
f"WARNING: Skipping '{package}' as it is not installed.",
4343
stacklevel=1,

micropip/transaction.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -358,7 +358,7 @@ def eval_marker(e: dict[str, str]) -> bool:
358358
else:
359359
return
360360

361-
if self.check_version_satisfied(req):
361+
if not self.force_reinstall and self.check_version_satisfied(req):
362362
# Maybe while we were downloading pypi_json some other branch
363363
# installed the wheel?
364364
return

tests/conftest.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,10 +108,20 @@ def _mock_importlib_version(name: str) -> str:
108108
def _mock_importlib_distributions():
109109
return (Distribution.at(p) for p in wheel_base.glob("*.dist-info")) # type: ignore[union-attr]
110110

111+
def _mock_importlib_distribution(name: str) -> Distribution:
112+
for dist in _mock_importlib_distributions():
113+
if dist.name == name:
114+
return dist
115+
116+
raise PackageNotFoundError(name)
117+
111118
monkeypatch.setattr(importlib.metadata, "version", _mock_importlib_version)
112119
monkeypatch.setattr(
113120
importlib.metadata, "distributions", _mock_importlib_distributions
114121
)
122+
monkeypatch.setattr(
123+
importlib.metadata, "distribution", _mock_importlib_distribution
124+
)
115125

116126

117127
class Wildcard:

tests/test_install.py

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -360,3 +360,62 @@ async def run_test(selenium, url, wheel_name):
360360
]
361361

362362
run_test(selenium_standalone_micropip, url, SNOWBALL_WHEEL)
363+
364+
365+
@pytest.mark.asyncio
366+
async def test_reinstall_different_version(
367+
mock_fetch: mock_fetch_cls,
368+
mock_importlib,
369+
) -> None:
370+
import importlib.metadata
371+
372+
dummy = "dummy"
373+
version_old = "1.0.0"
374+
version_new = "2.0.0"
375+
376+
mock_fetch.add_pkg_version(dummy, version_old)
377+
mock_fetch.add_pkg_version(dummy, version_new)
378+
379+
await micropip.install(f"{dummy}=={version_old}")
380+
assert micropip.list()[dummy].version == version_old
381+
assert importlib.metadata.version(dummy) == version_old
382+
383+
await micropip.install(f"{dummy}=={version_new}")
384+
assert micropip.list()[dummy].version == version_new
385+
assert importlib.metadata.version(dummy) == version_new
386+
387+
await micropip.install(f"{dummy}=={version_old}")
388+
assert micropip.list()[dummy].version == version_old
389+
assert importlib.metadata.version(dummy) == version_old
390+
391+
392+
@pytest.mark.asyncio
393+
async def test_force_reinstall(
394+
mock_fetch: mock_fetch_cls,
395+
mock_importlib,
396+
) -> None:
397+
import importlib.metadata
398+
399+
dummy = "dummy"
400+
version_old = "1.0.0"
401+
402+
mock_fetch.add_pkg_version(dummy, version_old)
403+
404+
await micropip.install(f"{dummy}=={version_old}")
405+
assert micropip.list()[dummy].version == version_old
406+
assert importlib.metadata.version(dummy) == version_old
407+
408+
dist_path = importlib.metadata.distribution(dummy)._path # type: ignore[attr-defined]
409+
assert dist_path.exists()
410+
411+
# create a dummy file in the dist_info directory, then force reinstall
412+
# the package. The dummy file should be removed.
413+
dummy_file = dist_path / "dummy"
414+
dummy_file.touch()
415+
assert dummy_file.exists()
416+
417+
await micropip.install(f"{dummy}=={version_old}", force_reinstall=True)
418+
assert micropip.list()[dummy].version == version_old
419+
assert importlib.metadata.version(dummy) == version_old
420+
421+
assert not dummy_file.exists()

tests/test_transaction.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ def create_transaction(Transaction):
6363
ctx={},
6464
ctx_extras=[],
6565
fetch_kwargs={},
66+
force_reinstall=False,
6667
)
6768

6869

0 commit comments

Comments
 (0)