Source code for jupyterlite_pyodide_lock.lockers.handlers.freezer
"""A ``tornado`` handler for accepting ``micropip.freeze`` output and errors."""
# Copyright (c) jupyterlite-pyodide-lock contributors.
# Distributed under the terms of the BSD-3-Clause License.
from __future__ import annotations
import json
import textwrap
from pprint import pformat
from typing import TYPE_CHECKING, Any
from jupyterlite_core.constants import JSON_FMT, UTF8
from tornado.web import RequestHandler
if TYPE_CHECKING:
from jupyterlite_pyodide_lock.lockers.browser import BrowserLocker
[docs]
class MicropipFreeze(RequestHandler):
"""Accept raw ``micropip.freeze`` output from the client and write it to disk."""
locker: BrowserLocker
[docs]
def initialize(self, locker: BrowserLocker, **kwargs: Any) -> None:
"""Initialize instance members."""
self.locker = locker
super().initialize(**kwargs)
[docs]
async def post(self) -> None:
"""Accept a ``pyodide-lock.json`` as the POST body."""
# parse and write out the re-normalized lockfile
lock_json = json.loads(self.request.body)
if "packages" in lock_json:
lockfile = self.locker.lockfile_cache
lockfile.parent.mkdir(parents=True, exist_ok=True)
lockfile.write_text(json.dumps(lock_json, **JSON_FMT), **UTF8)
self.locker.log.info("[micropip] wrote 'freeze' output to %s", lockfile)
else:
msg = pformat(lock_json)
if "error" in lock_json:
msg = lock_json["error"]
self.locker.log.error(
"[micropip] unexpected 'freeze' response:\n%s",
textwrap.indent(msg, "\t"),
)
self.locker._solve_halted = True # noqa: SLF001
await self.finish()