Commit 56ee2e68 authored by Michael Droettboom's avatar Michael Droettboom Committed by GitHub

Merge pull request #136 from rth/load-packages-multiple

Load multiple packages in pyodide.loadPackage
parents ac970e74 c14147b3
......@@ -61,6 +61,11 @@ When you request a package from the official repository, all of that package's
dependencies are also loaded. Dependency resolution is not yet implemented
when loading packages from custom URLs.
Multiple packages can also be loaded in a single call,
```js
pyodide.loadPackage(['cycler', 'pytz'])
```
`pyodide.loadPackage` returns a `Promise`.
```javascript
......
......@@ -49,6 +49,11 @@ When you request a package from the official repository, all of that package's
dependencies are also loaded. Dependency resolution is not yet implemented
when loading packages from custom URLs.
Multiple packages can also be loaded in a single call,
```js
pyodide.loadPackage(['cycler', 'pytz'])
```
`pyodide.loadPackage` returns a `Promise`.
```javascript
......
......@@ -36,7 +36,7 @@ var languagePluginLoader = new Promise((resolve, reject) => {
let loadPackage = (names) => {
// DFS to find all dependencies of the requested packages
let packages = window.pyodide.packages.dependencies;
let queue = new Array(names);
let queue = [].concat(names || []);
let toLoad = new Array();
while (queue.length) {
let package_uri = queue.pop();
......@@ -49,8 +49,6 @@ var languagePluginLoader = new Promise((resolve, reject) => {
package_uri = 'default channel';
}
console.log(`Loading ${package} from ${package_uri}`);
if (package in loadedPackages) {
if (package_uri != loadedPackages[package]) {
throw new Error(
......@@ -58,7 +56,16 @@ var languagePluginLoader = new Promise((resolve, reject) => {
`${package} from ${package_uri} while it is already ` +
`loaded from ${loadedPackages[package]}!`);
}
} else if (package in toLoad) {
if (package_uri != toLoad[package]) {
throw new Error(
`URI mismatch, attempting to load package ` +
`${package} from ${package_uri} while it is already ` +
`being loaded from ${toLoad[package]}!`);
}
} else {
console.log(`Loading ${package} from ${package_uri}`);
toLoad[package] = package_uri;
if (packages.hasOwnProperty(package)) {
packages[package].forEach((subpackage) => {
......
......@@ -34,3 +34,18 @@ def test_invalid_package_name(selenium):
with pytest.raises(WebDriverException,
match="Invalid package name or URI"):
selenium.load_package('tcp://some_url')
@pytest.mark.parametrize('packages', [['pyparsing', 'pytz'],
['pyparsing', 'matplotlib']],
ids='-'.join)
def test_load_packages_multiple(selenium_standalone, packages):
selenium = selenium_standalone
selenium.load_package(packages)
selenium.run(f'import {packages[0]}')
selenium.run(f'import {packages[1]}')
# The long must show that each package is loaded exactly once,
# including when one package is a dependency of the other
# ('pyparsing' and 'matplotlib')
assert selenium.logs.count(f'Loading {packages[0]}') == 1
assert selenium.logs.count(f'Loading {packages[1]}') == 1
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment