### Description

This adds a `find_matching_wheels` function that correctly determines which wheels the Pyodide interpreter supports according to the platform compatibility tags spec. This should fix problems with extra host platform wheels lying around or wheels built for different versions of Python (e.g., cp39 vs cp310).

### Checklists

- [x] Add / update tests

Implement more accurate wheel finding using the packaging tags module. ### Description

This adds a `find_matching_wheels` function that correctly determines which wheels the Pyodide interpreter supports according to the platform compatibility tags spec. This should fix problems with extra host platform wheels lying around or wheels built for different versions of Python (e.g., cp39 vs cp310).

### Checklists

- [x] Add / update tests

(downloading_deploying)=

# Downloading and deploying Pyodide

## Downloading Pyodide

### CDN

Pyodide packages, including the `pyodide.js` file, are available from the JsDelivr CDN,

| channel             | indexURL                                         | Comments                                                                                 | REPL                                               |
| ------------------- | ------------------------------------------------ | ---------------------------------------------------------------------------------------- | -------------------------------------------------- |
| Latest release      | `https://cdn.jsdelivr.net/pyodide/v0.19.0/full/` | Recommended, cached by the browser                                                       | [link](https://pyodide.org/en/stable/console.html) |
| Dev (`main` branch) | `https://cdn.jsdelivr.net/pyodide/dev/full/`     | Re-deployed for each commit on main, no browser caching, should only be used for testing | [link](https://pyodide.org/en/latest/console.html) |

To access a particular file, append the file name to `indexURL`. For instance,
`"${indexURL}pyodide.js"` in the case of `pyodide.js`.

```{warning}
The previous CDN `pyodide-cdn2.iodide.io` is deprecated and should not be used.
```

### GitHub releases

You can also download Pyodide packages from [GitHub
releases](https://github.com/pyodide/pyodide/releases)
(`pyodide-build-*.tar.bz2` file) serve them yourself, as explained in the
following section.

(serving_pyodide_packages)=

## Serving Pyodide packages

If you built your Pyodide distribution or downloaded the release tarball
you need to serve Pyodide files with appropriate headers.

### Serving locally

With Python 3.7.5+ you can serve Pyodide files locally by starting

```
python -m http.server
```

from the Pyodide distribution folder.

Point your WebAssembly aware browser to
[http://localhost:8000/console.html](http://localhost:8000/console.html) and open
your browser console to see the output from Python via Pyodide!

### Remote deployments

Any solution that is able to host static files and correctly sets WASM
MIME type, and CORS headers would work. For instance, you can use GitHub Pages
or similar services.

For additional suggestions for optimizing size and load times, see the [Emscripten
documentation about deployments](https://emscripten.org/docs/compiling/Deploying-Pages.html).

(downloading_deploying)=

# Downloading and deploying Pyodide

## Downloading Pyodide

### CDN

Pyodide packages, including the `pyodide.js` file, are available from the JsDelivr CDN,

| channel             | indexURL                                         | Comments                                                                                 | REPL                                               |
| ------------------- | ------------------------------------------------ | ---------------------------------------------------------------------------------------- | -------------------------------------------------- |
| Latest release      | `https://cdn.jsdelivr.net/pyodide/v0.19.0/full/` | Recommended, cached by the browser                                                       | [link](https://pyodide.org/en/stable/console.html) |
| Dev (`main` branch) | `https://cdn.jsdelivr.net/pyodide/dev/full/`     | Re-deployed for each commit on main, no browser caching, should only be used for testing | [link](https://pyodide.org/en/latest/console.html) |

To access a particular file, append the file name to `indexURL`. For instance,
`"${indexURL}pyodide.js"` in the case of `pyodide.js`.

```{warning}
The previous CDN `pyodide-cdn2.iodide.io` is deprecated and should not be used.
```

### GitHub releases

You can also download Pyodide packages from [GitHub
releases](https://github.com/pyodide/pyodide/releases)
(`pyodide-build-*.tar.bz2` file) serve them yourself, as explained in the
following section.

(serving_pyodide_packages)=

## Serving Pyodide packages

If you built your Pyodide distribution or downloaded the release tarball
you need to serve Pyodide files with appropriate headers.

### Serving locally

With Python 3.7.5+ you can serve Pyodide files locally by starting

```
python -m http.server
```

from the Pyodide distribution folder.

Point your WebAssembly aware browser to
[http://localhost:8000/console.html](http://localhost:8000/console.html) and open
your browser console to see the output from Python via Pyodide!

### Remote deployments

Any solution that is able to host static files and correctly sets WASM
MIME type, and CORS headers would work. For instance, you can use GitHub Pages
or similar services.

For additional suggestions for optimizing size and load times, see the [Emscripten
documentation about deployments](https://emscripten.org/docs/compiling/Deploying-Pages.html).
