npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

draco-pyodide

v2.0.1

Published

Pyodide distribution for Draco

Downloads

6

Readme

Draco Pyodide JavaScript Package

npm Pyodide Console PyPi

Usage

Apart from the Pyodide artifacts' location, the usage of draco-pyodide is identical to that of pyodide.

You can find tagged releases of the Draco Pyodide artifacts on our GitHub releases page and commit-specific builds as GitHub Action artifacts attached to build workflows.

Node.js

Download the Draco Pyodide artifacts from GitHub releases (pyodide-*.tar.gz) and extract its contents into a local directory (./draco-pyodide-artifacts in the example below) The version of the release needs to match exactly the version of this package.

You can automate this using the following commands:

DRACO_PYODIDE_VERSION=2.0.0  # Replace with the package version of your choice
ARTIFACT_DIR=draco-pyodide-artifacts  # Replace with the directory of your choice
TAR_NAME=pyodide-$DRACO_PYODIDE_VERSION.tar.gz
wget https://github.com/cmudig/draco2/releases/download/v$DRACO_PYODIDE_VERSION/$TAR_NAME
mkdir $ARTIFACT_DIR
tar -xzf $TAR_NAME --directory $ARTIFACT_DIR
rm $TAR_NAME

Then you can load Draco Pyodide in Node.js as follows:

// hello_draco.js
const { loadPyodide } = require("draco-pyodide");

async function hello_draco() {
  let pyodide = await loadPyodide({
    /* Draco Pyodide artifacts folder */
    indexURL: "./draco-pyodide-artifacts",
  });

  // Load our package
  await pyodide.loadPackage("draco");

  // Import the loaded `draco` package and access some attributes
  return pyodide.runPython(`
        import draco
        from draco.asp_utils import parse_blocks
        d = draco.Draco()
        
        # The final line of the code block is returned as the result
        f"Running draco version: {draco.__version__}", parse_blocks(d.hard), parse_blocks(d.soft)
      `);
}

hello_draco().then((result) => {
  // Destructure the returned list of Python objects
  const [version, hard, soft] = result;

  // Extract the constraint names from the Python `dict` objects
  const hardConstraintNames = Array.from(hard.keys()).slice(1);
  const softConstraintNames = Array.from(soft.keys()).slice(1);

  console.log(version);
  console.log(`=== Hard constraints ===\n${hardConstraintNames.join("\n")}`);
  console.log(`=== Soft constraints ===\n${softConstraintNames.join("\n")}`);
});

Client-side JavaScript

When using Draco Pyodide in the browser, you can load the draco-pyodide package from jsdelivr. You can decide whether you want to host the Draco Pyodide artifacts downloaded from GitHub releases (pyodide-*.tar.gz) yourself or use the version hosted on our GitHub Pages (indexURL: "https://dig.cmu.edu/draco2/jupyterlite/static/pyodide").

⚠️Please note that most of the time you will want to host the artifacts yourself, since the ones hosted on our GitHub Pages might be out of sync with the version of this package, caused by the fact that we redeploy the GitHub Pages site each time we merge to main, but we only release a new version of this package when we do an actual tagged release.

<!doctype html>
<html>
  <head>
    <script src="https://cdn.jsdelivr.net/npm/draco-pyodide@latest/pyodide.js"></script>
  </head>
  <body
    style="
      height: 100vh;
      display: flex;
      justify-content: center;
      align-items: center;
      background-color: #1a1c40;
    "
  >
    <script type="text/javascript">
      async function main() {
        let pyodide = await loadPyodide({
          /* Draco Pyodide artifacts folder */
          indexURL: "https://dig.cmu.edu/draco2/jupyterlite/static/pyodide",
        });

        // Load our package
        await pyodide.loadPackage("draco");

        // Import the loaded `draco` package and access some attributes
        const [version, hard, soft] = await pyodide.runPython(`
          import draco
          d = draco.Draco()
          
          # The final line of the code block is returned as the result
          f"Running draco version: {draco.__version__}", d.hard, d.soft
        `);

        // Print the result of `f"Running draco version: {draco.__version__}"`
        console.log(version);
        console.log(`Hard constraints:\n${hard}`);
        console.log(`Soft constraints:\n${soft}`);
      }
      main();
    </script>
    <h1 style="color: #ffffff">Check the console for outputs</h1>
  </body>
</html>

Further Examples

You can find a variety of examples in the draco-web-examples repository, featuring more advanced usages of Draco in web applications.

Details

The JavaScript code in this package is responsible for the following tasks:

  1. Defines the public JavaScript API
    • Package loading code to allow loading of other Python packages.
    • Can load micropip to bootstrap loading of pure Python wheels
  2. Loads the CPython interpreter and the core/pyodide emscripten application which embeds the interpreter.
  3. Injects the js/pyodide JavaScript API into sys.modules. This is the final runtime dependency for core/pyodide & py/pyodide, so after this step the interpreter is fully up and running.