From 95908d4ef6ed82a21f442a3e19ab4dd045d53c33 Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Sat, 20 Mar 2021 02:44:39 -0700 Subject: [PATCH] Minor improvements to micropip (from #1340) (#1347) --- packages/micropip/micropip/micropip.py | 32 +++++---------- packages/micropip/test_micropip.py | 56 +++++++++++++++++--------- 2 files changed, 47 insertions(+), 41 deletions(-) diff --git a/packages/micropip/micropip/micropip.py b/packages/micropip/micropip/micropip.py index 2530776dc..af350b397 100644 --- a/packages/micropip/micropip/micropip.py +++ b/packages/micropip/micropip/micropip.py @@ -12,7 +12,12 @@ from distlib import markers, util, version import sys # Provide stubs for testing in native python -IN_BROWSER = "js" in sys.modules +try: + from js import pyodide as js_pyodide + + IN_BROWSER = True +except ImportError: + IN_BROWSER = False if IN_BROWSER: # In practice, this is the `site-packages` directory. @@ -41,23 +46,6 @@ else: return io.BytesIO(content) -if IN_BROWSER: - from js import pyodide as js_pyodide -else: - - class js_pyodide: # type: ignore - """A mock object to allow import of this package outside pyodide - Report that all dependencies are empty. - """ - - class _module: - class packages: - class dependencies: - @staticmethod - def object_entries(): - return [] - - if IN_BROWSER: from asyncio import gather else: @@ -132,10 +120,10 @@ class _PackageManager: version_scheme = version.get_scheme("normalized") def __init__(self): - self.builtin_packages = {} - self.builtin_packages.update( - js_pyodide._module.packages.dependencies.object_entries() - ) + if IN_BROWSER: + self.builtin_packages = js_pyodide._module.packages.dependencies.to_py() + else: + self.builtin_packages = {} self.installed_packages = {} async def install(self, requirements: Union[str, List[str]], ctx=None): diff --git a/packages/micropip/test_micropip.py b/packages/micropip/test_micropip.py index 9955de996..c46ecd0a9 100644 --- a/packages/micropip/test_micropip.py +++ b/packages/micropip/test_micropip.py @@ -7,22 +7,38 @@ import pytest sys.path.append(str(Path(__file__).resolve().parent / "micropip")) -def test_install_simple(selenium_standalone): - assert ( - selenium_standalone.run_js( - """ - let result = await pyodide.runPythonAsync(` - import os - import micropip - # Package 'pyodide-micropip-test' has dependency on 'snowballstemmer' - # It is used to test markers support - await micropip.install('pyodide-micropip-test') - import snowballstemmer - stemmer = snowballstemmer.stemmer('english') - stemmer.stemWords('go going goes gone'.split()) - `); - return result.toJs(); +@pytest.fixture +def selenium_standalone_micropip(selenium_standalone): + """Import micropip before entering test so that global initialization of + micropip doesn't count towards hiwire refcount. + """ + selenium_standalone.run_js( """ + await languagePluginLoader; + await pyodide.loadPackage("micropip"); + await pyodide.runPythonAsync("import micropip"); + """ + ) + yield selenium_standalone + + +def test_install_simple(selenium_standalone_micropip): + selenium = selenium_standalone_micropip + assert ( + selenium.run_js( + """ + let result = await pyodide.runPythonAsync(` + import os + import micropip + # Package 'pyodide-micropip-test' has dependency on 'snowballstemmer' + # It is used to test markers support + await micropip.install('pyodide-micropip-test') + import snowballstemmer + stemmer = snowballstemmer.stemmer('english') + stemmer.stemWords('go going goes gone'.split()) + `); + return result.toJs(); + """ ) == ["go", "go", "goe", "gone"] ) @@ -57,11 +73,12 @@ def test_parse_wheel_url(): assert wheel["platform"] == "macosx_10_9_intel" -def test_install_custom_url(selenium_standalone, web_server_tst_data): +def test_install_custom_url(selenium_standalone_micropip, web_server_tst_data): + selenium = selenium_standalone_micropip server_hostname, server_port, server_log = web_server_tst_data base_url = f"http://{server_hostname}:{server_port}/" url = base_url + "snowballstemmer-2.0.0-py2.py3-none-any.whl" - selenium_standalone.run_js( + selenium.run_js( f""" await pyodide.runPythonAsync(` import micropip @@ -101,14 +118,15 @@ def test_add_requirement_relative_url(): assert req["url"] == "./snowballstemmer-2.0.0-py2.py3-none-any.whl" -def test_install_custom_relative_url(selenium_standalone): +def test_install_custom_relative_url(selenium_standalone_micropip): + selenium = selenium_standalone_micropip root = Path(__file__).resolve().parents[2] src = root / "src" / "tests" / "data" target = root / "build" / "test_data" target.symlink_to(src, True) url = "./test_data/snowballstemmer-2.0.0-py2.py3-none-any.whl" try: - selenium_standalone.run_js( + selenium.run_js( f""" await pyodide.runPythonAsync(` import micropip