pyodide / pyodide/pyodide

v0.27.x releases contain incompatible versions fo pydantic and typing-extensions

Open
#5,834 6 comments 0 reactions 0 assignees View on GitHub
bug
Dominant language
Python
Stars
14.8k
Forks
1k
Avg merge
20h 29m
Merged PRs (30d)
19

Description

## 🐛 Bug

Pyodide releases contain incompatible versions fo `pydantic` and `typing-extensions`

### To Reproduce

e.g. v0.27.7 https://cdn.jsdelivr.net/pyodide/v0.27.7/full/pyodide-lock.json contains typing-extensions==4.11.0 pydantic==2.10.5

```bash
uv pip install typing-extensions==4.11.0 pydantic==2.10.5
```

reveals

```
× No solution found when resolving dependencies:
╰─▶ Because pydantic==2.10.5 depends on typing-extensions>=4.12.2 and you require typing-extensions==4.11.0, we can conclude that your requirements
and pydantic==2.10.5 are incompatible.
And because you require pydantic==2.10.5, we can conclude that your requirements are unsatisfiable.
```

A workaround in a pure pyodide setup is to install the correct version manually
```js
await micropip.install("typing-extensions>=4.14.0")
```
see https://github.com/OO-LD/playground-python-yaml/commit/370b55cc9dba119f2191ad2d2172e590dbfd1288

However, this does not work on the python side in a jupyter-lite pyodide kernel, where
```py
await piplite.install(['typing-extensions>=4.14.0'])
```
throws
```
ValueError: Requested 'typing-extensions>=4.14.0', but typing-extensions==4.11.0 is already installed
```

Full trace

```
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
Cell In[1], line 14
3 import micropip
(...)
---> 14 await micropip.install(["typing-extensions>=4.14.0"]) # Typing extensions needs to be installed first otherwise the versions from the pyodide lockfile is used which is incompatible with the latest fastapi.
17 from typing import Optional, List

File /lib/python3.12/site-packages/micropip/package_manager.py:146, in PackageManager.install(self, requirements, keep_going, deps, credentials, pre, index_urls, constraints, verbose)
143 if constraints is None:
144 constraints = self.constraints
--> 146 return await install(
147 requirements,
148 index_urls,
149 keep_going,
150 deps,
151 credentials,
152 pre,
153 constraints=constraints,
154 verbose=verbose,
155 )

File /lib/python3.12/site-packages/micropip/install.py:52, in install(requirements, index_urls, keep_going, deps, credentials, pre, constraints, verbose)
39 wheel_base = Path(getsitepackages()[0])
41 transaction = Transaction(
42 ctx=ctx, # type: ignore[arg-type]
43 ctx_extras=[],
(...)
50 constraints=constraints,
51 )
---> 52 await transaction.gather_requirements(requirements)
54 if transaction.failed:
55 failed_requirements = ", ".join([f"'{req}'" for req in transaction.failed])

File /lib/python3.12/site-packages/micropip/transaction.py:71, in Transaction.gather_requirements(self, requirements)
63 async def gather_requirements(
64 self,
65 requirements: list[str] | list[Requirement],
66 ) -> None:
67 requirement_promises = [
68 self.add_requirement(requirement) for requirement in requirements
69 ]
---> 71 await asyncio.gather(*requirement_promises)

File /lib/python3.12/site-packages/micropip/transaction.py:84, in Transaction.add_requirement(self, req)
82 if as_req:
83 if as_req.name and len(as_req.specifier):
---> 84 return await self.add_requirement_inner(as_req)
85 if as_req.url:
86 req = as_req.url

File /lib/python3.12/site-packages/micropip/transaction.py:171, in Transaction.add_requirement_inner(self, req)
168 # Is some version of this package is already installed?
169 req.name = canonicalize_name(req.name)
--> 171 satisfied, ver = self.check_version_satisfied(req)
172 if satisfied:
173 logger.info("Requirement already satisfied: %s (%s)", req, ver)

File /lib/python3.12/site-packages/micropip/transaction.py:112, in Transaction.check_version_satisfied(self, req)
108 if req.specifier.contains(ver, prereleases=True):
109 # installed version matches, nothing to do
110 return True, ver
--> 112 raise ValueError(
113 f"Requested '{req}', " f"but {req.name}=={ver} is already installed"
114 )

ValueError: Requested 'typing-extensions>=4.14.0', but typing-extensions==4.11.0 is already installed
```

### Expected behavior

Pyodide releases

### Environment

- Pyodide Version: v0.27.6, v0.27.7

### Additional context

- Pyodide v.28.0 fixes this by bundling typing-extensions==4.14.1, but is still instable / not yet supported by jupyter-lite

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.