Skip to content

Commit

Permalink
Show lite initialization errors after pyodide migration
Browse files Browse the repository at this point in the history
  • Loading branch information
fzumstein committed Feb 18, 2025
1 parent 17eb609 commit ff47a5c
Showing 1 changed file with 83 additions and 54 deletions.
137 changes: 83 additions & 54 deletions app/static/js/core/xlwingsjs/lite.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,66 +2,80 @@ async function initPyodide() {
if (config.onLite === false) {
return;
}

const globalStatusAlert = document.querySelector("#global-status-alert");
if (globalStatusAlert) {
globalStatusAlert.classList.remove("d-none");
globalStatusAlert.querySelector("span").innerHTML = `
<div class="spinner-border spinner-border-sm text-alert me-1" role="status">
<span class="visually-hidden">Loading...</span>
</div>
Loading...
`;
}
const globalErrorAlert = document.querySelector("#global-error-alert");

try {
// Show loading status
if (globalStatusAlert) {
globalStatusAlert.classList.remove("d-none");
globalStatusAlert.querySelector("span").innerHTML = `
<div class="spinner-border spinner-border-sm text-alert me-1" role="status">
<span class="visually-hidden">Loading...</span>
</div>
Loading...
`;
}

let pyodide = await loadPyodide();
const pyodideConfigResponse = await fetch(
config.appPath + "/xlwings/pyodide.json",
);
const pyodideConfigData = await pyodideConfigResponse.json();
// Install dependencies
await pyodide.loadPackage("micropip");
const micropip = pyodide.pyimport("micropip");
let packages = pyodideConfigData["packages"];
await micropip.install(packages);
// Python files
const files = pyodideConfigData["files"];
function createDirectories(files) {
const createdDirs = new Set();
Object.values(files).forEach((localPath) => {
const parts = localPath.split("/");
if (parts.length > 1) {
const dirPath = parts.slice(0, parts.length - 1).join("/");
if (!createdDirs.has(dirPath)) {
try {
// Hide any previous error
if (globalErrorAlert) {
globalErrorAlert.classList.add("d-none");
}

let pyodide = await loadPyodide();

const pyodideConfigResponse = await fetch(
config.appPath + "/xlwings/pyodide.json",
);
if (!pyodideConfigResponse.ok) {
throw new Error(
`Failed to fetch pyodide config: ${pyodideConfigResponse.statusText}`,
);
}
const pyodideConfigData = await pyodideConfigResponse.json();

// Install dependencies
await pyodide.loadPackage("micropip");
const micropip = pyodide.pyimport("micropip");
let packages = pyodideConfigData["packages"];
await micropip.install(packages, { keep_going: true });

// Python files
const files = pyodideConfigData["files"];
function createDirectories(files) {
const createdDirs = new Set();
Object.values(files).forEach((localPath) => {
const parts = localPath.split("/");
if (parts.length > 1) {
const dirPath = parts.slice(0, parts.length - 1).join("/");
if (!createdDirs.has(dirPath)) {
// TODO: does this work for nested dirs? Also, ./ is probably wrong
if (dirPath !== ".") {
pyodide.FS.mkdir(dirPath);
}
} catch (err) {
console.log(err);
}
try {
if (dirPath !== ".") {
pyodide.FS.mount(pyodide.FS.filesystems.MEMFS, {}, dirPath);
}
} catch (err) {
console.log(err);
createdDirs.add(dirPath);
}
createdDirs.add(dirPath);
}
});
}

createDirectories(files);

for (const [endpoint, localPath] of Object.entries(files)) {
const response = await fetch(config.appPath + endpoint);
if (!response.ok) {
throw new Error(`Failed to fetch ${endpoint}: ${response.statusText}`);
}
});
}
createDirectories(files);
for (const [endpoint, localPath] of Object.entries(files)) {
const response = await fetch(config.appPath + endpoint);
const content = await response.text();
pyodide.FS.writeFile(localPath, content);
}
try {
const content = await response.text();
pyodide.FS.writeFile(localPath, content);
}

// Entrypoint
let mainText = pyodide.FS.readFile("./main.py", { encoding: "utf8" });
await pyodide.runPythonAsync(mainText);

// Functions
// You can't simply export them as the will be null when used in
// custom-functions-code.js (it's only assigned the function here).
Expand All @@ -78,16 +92,31 @@ async function initPyodide() {
globalThis.liteCustomFunctionsCode = pyodide.globals.get(
"custom_functions_code",
);

// Hide loading status on success
if (globalStatusAlert) {
globalStatusAlert.classList.add("d-none");
}

return pyodide;
} catch (err) {
console.log(err);
}
console.error("Pyodide initialization failed:", err);

// Loading status
if (globalStatusAlert) {
globalStatusAlert.classList.add("d-none");
}
// Hide loading status
if (globalStatusAlert) {
globalStatusAlert.classList.add("d-none");
}

// Show error alert
if (globalErrorAlert) {
globalErrorAlert.classList.remove("d-none");
globalErrorAlert.innerHTML = `
Error initializing Pyodide: ${err.message}
`;
}

return pyodide;
throw err;
}
}

// Call as follows:
Expand Down

0 comments on commit ff47a5c

Please sign in to comment.