From 40d49b1e501af03c41dc3cfb7aa41ef0c3e867f9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 27 Oct 2026 03:12:55 -0500 Subject: [PATCH] Docs: README to the short form, the rest into a docs tree The README now has the index's page, one sentence, two install commands and an example with its real output. The install details, micropython-lib usage, the generated package list and how the index is built each get a page under docs/. update_package_list.py and the refresh workflow write the package list to docs/reference/packages.md instead of README.md. --- .../workflows/deploy-mip-index-to-pages.yml | 2 +- .../process-mip-publication-request.yml | 2 +- .github/workflows/refresh-package-list.yml | 2 +- CONTRIBUTING.md | 10 +- README.md | 253 ++---------------- docs/changelog.md | 3 + docs/get-started/install.md | 59 ++++ .../install-micropython-lib-packages.md | 44 +++ docs/how-it-works/index.md | 15 ++ docs/images/index-page.png | Bin 0 -> 66882 bytes docs/index.md | 25 ++ docs/reference/packages.md | 63 +++++ scripts/update_package_list.py | 13 +- 13 files changed, 243 insertions(+), 248 deletions(-) create mode 100644 docs/changelog.md create mode 100644 docs/get-started/install.md create mode 100644 docs/guides/install-micropython-lib-packages.md create mode 100644 docs/how-it-works/index.md create mode 100644 docs/images/index-page.png create mode 100644 docs/index.md create mode 100644 docs/reference/packages.md diff --git a/.github/workflows/deploy-mip-index-to-pages.yml b/.github/workflows/deploy-mip-index-to-pages.yml index 6d0b4e839..b8a5dc54d 100644 --- a/.github/workflows/deploy-mip-index-to-pages.yml +++ b/.github/workflows/deploy-mip-index-to-pages.yml @@ -141,7 +141,7 @@ jobs: id: deployment uses: actions/deploy-pages@v5 - # The committed package list (packages.json + the README block) describes + # The committed package list (packages.json + the block in docs/reference/packages.md) describes # the index that just went live, and the site page is regenerated from it # and redeployed; see refresh-package-list.yml. contents: write is granted # to this job only, for that commit; pages: write for the redeploy. diff --git a/.github/workflows/process-mip-publication-request.yml b/.github/workflows/process-mip-publication-request.yml index 1cc3b26b1..f54161824 100644 --- a/.github/workflows/process-mip-publication-request.yml +++ b/.github/workflows/process-mip-publication-request.yml @@ -68,7 +68,7 @@ jobs: id: deployment uses: actions/deploy-pages@v5 - # The committed package list (packages.json + the README block) describes + # The committed package list (packages.json + the block in docs/reference/packages.md) describes # the index that just went live; see refresh-package-list.yml. It sits on # top of the lockfile commit the reusable workflow pushed. refresh-package-list: diff --git a/.github/workflows/refresh-package-list.yml b/.github/workflows/refresh-package-list.yml index 641338220..44aff8b9f 100644 --- a/.github/workflows/refresh-package-list.yml +++ b/.github/workflows/refresh-package-list.yml @@ -104,7 +104,7 @@ jobs: run: | git config user.name 'github-actions[bot]' git config user.email 'github-actions[bot]@users.noreply.github.com' - git add packages.json README.md .site/index.html + git add packages.json docs/reference/packages.md .site/index.html if git diff --cached --quiet -- .site/index.html; then echo "page-changed=false" >> "$GITHUB_OUTPUT" else diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index cd6451b38..8b6ce0d84 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,12 +1,12 @@ # Contributing -This repository is the **generated MIP package index** for PyDevices — see -the note at the top of the README. There is nothing to contribute here -directly: +This repository is the **generated MIP package index** for PyDevices +([how it's built](docs/how-it-works/index.md)). There is nothing to contribute +here directly: - **Package bugs** belong to the package's own repository - (github.com/PyDevices//issues — the README's package list links - each one). + (github.com/PyDevices//issues — the + [package list](docs/reference/packages.md) links each one). - **Index problems** (a wrong or missing version, a failed publication): open an issue on this repository. - **Publishing changes** happen in the component repos and diff --git a/README.md b/README.md index 8c7554dca..df6028b67 100644 --- a/README.md +++ b/README.md @@ -1,260 +1,43 @@ -# PyDevices MIP package index +![The index's web page, with a live MicroPython demo running in the browser](docs/images/index-page.png) -> **This index is generated — do not edit package trees by hand.** -> `pydevices-lock.json` is the source of truth: component repositories -> publish through a serialized dispatch queue -> (`process-mip-publication-request.yml`), each publication pins an exact -> source tag in the lockfile, and every deploy re-syncs **all** locked -> sources before publishing. Anything under the package directories is -> build output, and `packages.json` plus the "Packages in this index" -> block below are regenerated after every deploy; the only meaningful -> edits here are to the lockfile via the queue, the workflows, -> `scripts/`, and this documentation. +# PyDevices package index +A `mip` package index for MicroPython: every PyDevices library, plus all of micropython-lib, as precompiled `.mpy` files or plain `.py` source. -This micropython-lib fork builds an installable package index containing both -precompiled `.mpy` bytecode and raw `.py` source at: +## Install -```text -https://PyDevices.github.io/mip -``` - -This repository documents the package manager itself. Product repositories -document which product or board package to choose. - -## Install from a network-enabled MicroPython device +On a board with a network connection: ```python import mip - -mip.install("package-name", index="https://PyDevices.github.io/mip") -``` - -`mip` installs into the interpreter's default library destination unless `target` -is supplied. Use `mpy=False` to request portable `.py` source instead of -MicroPython bytecode. - -```python -mip.install( - "package-name", - index="https://PyDevices.github.io/mip", - target="lib", - mpy=False, -) +mip.install("palettes", index="https://PyDevices.github.io/mip") ``` -## Install with the MicroPython command line - -Hosted MicroPython ports can run the package manager as a module: +From your computer, onto a board on USB (the board needs no network): ```bash -micropython -m mip install \ - --index https://PyDevices.github.io/mip \ - package-name +mpremote mip install --index https://PyDevices.github.io/mip palettes ``` -Use `--target lib` for an explicit workspace destination and `--no-mpy` for a -source-only tree. +## Try it -## Install onto a connected device with mpremote +With the unix port of MicroPython, install a package into `lib/` and use it: ```bash -mpremote connect /dev/ttyUSB0 mip install \ - --index https://PyDevices.github.io/mip \ - package-name -``` - -`mpremote mip` resolves and transfers the package from the host, so the board -does not need its own network connection. - -## Install a raw GitHub package - -`mip` also accepts GitHub files and directories. Pass the index when a raw -package has named dependencies that should resolve here: - -```python -mip.install( - "github:OWNER/REPOSITORY/path/to/package", - index="https://PyDevices.github.io/mip", -) +micropython -m mip install --index https://PyDevices.github.io/mip --target lib palettes ``` -The live index intentionally exposes only each package's current `latest` -manifest. Releases replace the current entry rather than accumulating a public -history of versioned manifests. - -## Packages in this index - - -These are the PyDevices packages this index publishes, each built from the -source tag pinned in `pydevices-lock.json`; the micropython-lib packages the -index also carries are upstream's. - -| Package | Version | Description | Source | -| --- | --- | --- | --- | -| `pydevices` | 0.7.7 | Portable display, audio, event, and timing foundations for PyDevices | [PyDevices/pydevices @ v0.7.7](https://github.com/PyDevices/pydevices/releases/tag/v0.7.7) | -| `pydevices-desktop` | 0.7.7 | Complete PyDevices desktop stack and board configuration | [PyDevices/pydevices @ v0.7.7](https://github.com/PyDevices/pydevices/releases/tag/v0.7.7) | -| `bledev` | 0.7.7 | Portable async Bluetooth Low Energy for PyDevices, over aioble on boards | [PyDevices/pydevices @ v0.7.7](https://github.com/PyDevices/pydevices/releases/tag/v0.7.7) | -| `midiports` | 0.7.7 | MIDI ports for adafruit_midi: USB device, UART, and a computer's own MIDI ports. | [PyDevices/pydevices @ v0.7.7](https://github.com/PyDevices/pydevices/releases/tag/v0.7.7) | -| `usb-core` | 0.7.7 | usb.core and usb.util: talk to USB devices from a host board, in PyUSB's shape. | [PyDevices/pydevices @ v0.7.7](https://github.com/PyDevices/pydevices/releases/tag/v0.7.7) | -| `usb-device-audio` | 0.7.7 | USB audio (UAC2) sound card on machine.USBDevice's streaming endpoints. | [PyDevices/pydevices @ v0.7.7](https://github.com/PyDevices/pydevices/releases/tag/v0.7.7) | -| `usb-device-msc` | 0.7.7 | USB mass storage device (Bulk-Only Transport, SCSI) over a MicroPython block device. | [PyDevices/pydevices @ v0.7.7](https://github.com/PyDevices/pydevices/releases/tag/v0.7.7) | -| `usb-device-video` | 0.7.7 | USB video (UVC) webcam on machine.USBDevice's streaming endpoints. | [PyDevices/pydevices @ v0.7.7](https://github.com/PyDevices/pydevices/releases/tag/v0.7.7) | -| `usb-hid` | 0.7.7 | CircuitPython's usb_hid on MicroPython, over usb-device-hid, for adafruit_hid. | [PyDevices/pydevices @ v0.7.7](https://github.com/PyDevices/pydevices/releases/tag/v0.7.7) | -| `usb-host-audio` | 0.7.7 | Play to a USB speaker or record from a USB microphone on this board's host port, over usb.core, alone or as audiodev outputs and inputs. | [PyDevices/pydevices @ v0.7.7](https://github.com/PyDevices/pydevices/releases/tag/v0.7.7) | -| `usb-host-cdc` | 0.7.7 | Talk to a USB serial device (CDC-ACM) on this board's host port, over usb.core. | [PyDevices/pydevices @ v0.7.7](https://github.com/PyDevices/pydevices/releases/tag/v0.7.7) | -| `usb-host-hid` | 0.7.7 | Keys, mouse buttons and movement from a keyboard or mouse plugged into this board's USB host port, named the way adafruit_hid names them. | [PyDevices/pydevices @ v0.7.7](https://github.com/PyDevices/pydevices/releases/tag/v0.7.7) | -| `usb-host-msc` | 0.7.7 | Mount a USB flash drive plugged into this board's host port, over usb.core. | [PyDevices/pydevices @ v0.7.7](https://github.com/PyDevices/pydevices/releases/tag/v0.7.7) | -| `usb-host-net` | 0.7.7 | Internet over USB: a phone's USB tethering on this board's host port, as a network interface. | [PyDevices/pydevices @ v0.7.7](https://github.com/PyDevices/pydevices/releases/tag/v0.7.7) | -| `usb-host-video` | 0.7.7 | Stream a webcam plugged into this board's USB host port, over usb.core. | [PyDevices/pydevices @ v0.7.7](https://github.com/PyDevices/pydevices/releases/tag/v0.7.7) | -| `hmilink` | 0.7.7 | Any screen as a device's front panel: one document, ops, telemetry and events over any transport. | [PyDevices/pydevices @ v0.7.7](https://github.com/PyDevices/pydevices/releases/tag/v0.7.7) | -| `palettes` | 0.0.14 | Color palette toolkit for PyDevices (wheel, cube, material_design) | [PyDevices/palettes @ v0.0.14](https://github.com/PyDevices/palettes/releases/tag/v0.0.14) | -| `pdwidgets` | 0.0.24 | Cross-platform widget toolkit for PyDevices | [PyDevices/pdwidgets @ v0.0.24](https://github.com/PyDevices/pdwidgets/releases/tag/v0.0.24) | -| `pygraphics` | 0.1.1 | Pure-Python pygraphics for MicroPython/CircuitPython/CPython (FrameBuffer, Draw, fonts); import as pygraphics | [PyDevices/pygraphics @ v0.1.1](https://github.com/PyDevices/pygraphics/releases/tag/v0.1.1) | -| `audioinstruments` | 0.4.1 | 55 synthio instruments for PyDevices (drum machines and synthesizers); import as audioinstruments | [PyDevices/audiocomponents @ v0.4.1](https://github.com/PyDevices/audiocomponents/releases/tag/v0.4.1) | -| `audioeffects` | 0.4.1 | Effect classes for PyDevices audio (delay, drive, dynamics, eq, modulation, pitch, reverb); import as audioeffects | [PyDevices/audiocomponents @ v0.4.1](https://github.com/PyDevices/audiocomponents/releases/tag/v0.4.1) | - ```python -import mip +from palettes import get_palette -mip.install("pydevices", index="https://PyDevices.github.io/mip") -mip.install("pydevices-desktop", index="https://PyDevices.github.io/mip") -mip.install("bledev", index="https://PyDevices.github.io/mip") -mip.install("midiports", index="https://PyDevices.github.io/mip") -mip.install("usb-core", index="https://PyDevices.github.io/mip") -mip.install("usb-device-audio", index="https://PyDevices.github.io/mip") -mip.install("usb-device-msc", index="https://PyDevices.github.io/mip") -mip.install("usb-device-video", index="https://PyDevices.github.io/mip") -mip.install("usb-hid", index="https://PyDevices.github.io/mip") -mip.install("usb-host-audio", index="https://PyDevices.github.io/mip") -mip.install("usb-host-cdc", index="https://PyDevices.github.io/mip") -mip.install("usb-host-hid", index="https://PyDevices.github.io/mip") -mip.install("usb-host-msc", index="https://PyDevices.github.io/mip") -mip.install("usb-host-net", index="https://PyDevices.github.io/mip") -mip.install("usb-host-video", index="https://PyDevices.github.io/mip") -mip.install("hmilink", index="https://PyDevices.github.io/mip") -mip.install("palettes", index="https://PyDevices.github.io/mip") -mip.install("pdwidgets", index="https://PyDevices.github.io/mip") -mip.install("pygraphics", index="https://PyDevices.github.io/mip") -mip.install("audioinstruments", index="https://PyDevices.github.io/mip") -mip.install("audioeffects", index="https://PyDevices.github.io/mip") +wheel = get_palette(name="wheel", length=360, color_depth=16) +print("red, green, blue as RGB565: 0x%04X 0x%04X 0x%04X" % (wheel[0], wheel[120], wheel[240])) ``` -Generated by `scripts/update_package_list.py` from the index itself; -`packages.json` carries the same data. Both are rewritten after every -deploy -- do not edit by hand. - - -## Usage (Standard Upstream Packages) - -To install standard, upstream `micropython-lib` standard library or ecosystem packages, there are four main options. For more information see the [Package management documentation](https://docs.micropython.org/en/latest/reference/packages.html) documentation. - - -### On a network-enabled device - -As of MicroPython v1.20 (and nightly builds since October 2022), boards -with WiFi and Ethernet support include the `mip` package manager. - -```py ->>> import mip ->>> mip.install("package-name") -``` - -### Using `mpremote` from your PC - -`mpremote` is the officially-supported tool for interacting with a MicroPython -device and, since v0.4.0, support for installing micropython-lib packages is -provided by using the `mip` command. - -```bash -$ mpremote connect /dev/ttyUSB0 mip install package-name -``` - -See the [mpremote documentation](https://docs.micropython.org/en/latest/reference/mpremote.html). - -### Freeze into your firmware - -If you are building your own firmware, all packages in this repository include -a `manifest.py` that can be included into your board manifest via the -`require()` command. See [Manifest files](https://docs.micropython.org/en/latest/reference/manifest.html#require) for -more information. - -### Copy the files manually - -Many micropython-lib packages are just single-file modules, and you can -quickly get started by copying the relevant Python file to your device. For -example, to add the `base64` library, you can directly copy -`python-stdlib/base64/base64.py` to the `lib` directory on your device. - -This can be done using `mpremote`, for example: - -```bash -$ mpremote connect /dev/ttyUSB0 cp python-stdlib/base64/base64.py :/lib +```text +red, green, blue as RGB565: 0xF800 0x07E0 0x001F ``` -For packages that are implemented as a package directory, you'll need to copy -the directory instead. For example, to add `collections.defaultdict`, copy -`collections/collections/__init__.py` and -`collections-defaultdict/collections/defaultdict.py` to a directory named -`lib/collections` on your device. - -Note that unlike the other three approaches based on `mip` or `manifest.py`, -you will need to manually resolve dependencies. You can inspect the relevant -`manifest.py` file to view the list of dependencies for a given package. - -## Contributing - -We use [GitHub Discussions](https://github.com/micropython/micropython/discussions) -as our forum, and [Discord](https://micropython.org/discord) for chat. These -are great places to ask questions and advice from the community or to discuss your -MicroPython-based projects. - -The [MicroPython Wiki](https://github.com/micropython/micropython/wiki) is -also used for micropython-lib. - -For bugs and feature requests, please [raise an issue](https://github.com/micropython/micropython-lib/issues/new). - -We welcome pull requests to add new packages, fix bugs, or add features. -Please be sure to follow the -[Contributor's Guidelines & Code Conventions](CONTRIBUTING.md). Note that -MicroPython is licensed under the [MIT license](LICENSE) and all contributions -should follow this license. - -### Future plans (and new contributor ideas) - -* Develop a set of example programs using these packages. -* Develop more MicroPython packages for common tasks. -* Expand unit testing coverage. -* Add support for referencing remote/third-party repositories. - -What's planned next is in [ROADMAP.md](ROADMAP.md). - -## Notes on terminology - -The terms *library*, *package*, and *module* are overloaded and lead to some -confusion. The interpretation used in by the MicroPython project is that: - -A *library* is a collection of installable packages, e.g. [The Python Standard - Library](https://docs.python.org/3/library/), or micropython-lib. - -A *package* can refer to two things. The first meaning, "library package", is -something that can be installed from a library, e.g. via `mip` (or `pip` in -CPython/PyPI). Packages provide *modules* that can be imported. The ambiguity -here is that the module provided by the package does not necessarily have to -have the same name, e.g. the `pyjwt` package provides the `jwt` module. In -CPython, the `pyserial` package providing the `serial` module is another -common example. - -A *module* is something that can be imported. For example, "the *os* module". - -A module can be implemented either as a single file, typically also called -a *module* or "single-file module", or as a *package* (the second meaning), -which in this context means a directory containing multiple `.py` files -(usually at least an `__init__.py`). +[Docs](https://github.com/PyDevices/mip/blob/PyDevices/docs/index.md) · [Examples](https://pydevices.github.io/pydevices-examples/gallery/) · [Roadmap](ROADMAP.md) -In micropython-lib, we also have the concept of an *extension package* which -is a library package that extends the functionality of another package, by -adding additional files to the same package directory. These packages have -hyphenated names. For example, the `collections-defaultdict` package extends -the `collections` package to add the `defaultdict` class to the `collections` -module. +Made by [PyDevices](https://pydevices.com). diff --git a/docs/changelog.md b/docs/changelog.md new file mode 100644 index 000000000..539872eb4 --- /dev/null +++ b/docs/changelog.md @@ -0,0 +1,3 @@ +# Changelog + +The index itself has no releases. Each package's changes are in its own repository's changelog: the [package list](reference/packages.md) links the release every package was built from. Changes to how the index is built are in the [commit history](https://github.com/PyDevices/mip/commits/PyDevices). diff --git a/docs/get-started/install.md b/docs/get-started/install.md new file mode 100644 index 000000000..b2a318ab6 --- /dev/null +++ b/docs/get-started/install.md @@ -0,0 +1,59 @@ +# Install a package + +Every install names the index with `https://PyDevices.github.io/mip`. The [package list](../reference/packages.md) has every name you can install. + +## On a board with a network connection + +MicroPython 1.20 and later include `mip` on boards with Wi-Fi or Ethernet. Connect to your network, then: + +```python +import mip + +mip.install("package-name", index="https://PyDevices.github.io/mip") +``` + +The package goes into the interpreter's default library folder unless you pass `target`. You get `.mpy` bytecode by default; pass `mpy=False` for portable `.py` source: + +```python +mip.install( + "package-name", + index="https://PyDevices.github.io/mip", + target="lib", + mpy=False, +) +``` + +## From your computer, onto a board on USB + +`mpremote` fetches the package on your computer and copies it to the board, so the board doesn't need a network: + +```bash +mpremote connect /dev/ttyUSB0 mip install \ + --index https://PyDevices.github.io/mip \ + package-name +``` + +See the [mpremote documentation](https://docs.micropython.org/en/latest/reference/mpremote.html) for how to name your board's port. + +## With the unix or Windows port + +A MicroPython build for your computer can run the package manager as a module: + +```bash +micropython -m mip install \ + --index https://PyDevices.github.io/mip \ + package-name +``` + +Add `--target lib` to choose the folder and `--no-mpy` for source only. + +## From GitHub + +`mip` also takes a GitHub file or folder. Pass the index too, so the package's dependencies resolve from here: + +```python +mip.install( + "github:OWNER/REPOSITORY/path/to/package", + index="https://PyDevices.github.io/mip", +) +``` diff --git a/docs/guides/install-micropython-lib-packages.md b/docs/guides/install-micropython-lib-packages.md new file mode 100644 index 000000000..e89714c63 --- /dev/null +++ b/docs/guides/install-micropython-lib-packages.md @@ -0,0 +1,44 @@ +# Install micropython-lib packages + +This index carries micropython-lib's packages too, so `mip.install("base64", index="https://PyDevices.github.io/mip")` works. You can also get them from upstream's own index, by freezing them into firmware, or by copying files. Upstream's [package management documentation](https://docs.micropython.org/en/latest/reference/packages.html) has more. + +## From upstream's index + +Leave out `index` and `mip` uses micropython-lib's own: + +```python +import mip +mip.install("package-name") +``` + +With `mpremote`, from your computer: + +```bash +mpremote connect /dev/ttyUSB0 mip install package-name +``` + +## Freeze into your firmware + +If you build your own firmware, every package here has a `manifest.py` you can pull into your board's manifest with `require()`. See [Manifest files](https://docs.micropython.org/en/latest/reference/manifest.html#require). + +## Copy the files by hand + +Many packages are a single file. From a clone of this repository, to add `base64`, copy `python-stdlib/base64/base64.py` to `lib` on your board: + +```bash +mpremote connect /dev/ttyUSB0 cp python-stdlib/base64/base64.py :/lib +``` + +A package that is a folder needs the folder. For `collections.defaultdict`, copy `collections/collections/__init__.py` and `collections-defaultdict/collections/defaultdict.py` into `lib/collections` on the board. + +Copying by hand doesn't resolve dependencies. A package's `manifest.py` lists what else it needs. + +## Package, module, library + +micropython-lib uses these words carefully. + +A *library* is a collection of installable packages, like micropython-lib or the Python standard library. + +A *package* is something you install, with `mip` (or `pip` in CPython). It provides *modules* you import, and the names can differ: the `pyjwt` package provides the `jwt` module. "Package" also means a folder of `.py` files with an `__init__.py`, which is one way to write a module. + +An *extension package* adds files to another package's folder. These have hyphenated names: `collections-defaultdict` adds `defaultdict` to the `collections` module. diff --git a/docs/how-it-works/index.md b/docs/how-it-works/index.md new file mode 100644 index 000000000..8bdf576d7 --- /dev/null +++ b/docs/how-it-works/index.md @@ -0,0 +1,15 @@ +# How the index is built + +The index is a fork of [micropython-lib](https://github.com/micropython/micropython-lib) whose build publishes upstream's packages and PyDevices' packages together, to GitHub Pages at `https://PyDevices.github.io/mip`. Every package is built twice: as `.mpy` bytecode, and as `.py` source for `mpy=False`. + +## Nobody edits the package trees + +[`pydevices-lock.json`](../../pydevices-lock.json) is the source of truth. It pins each PyDevices package to an exact release tag in the repository that owns it. Everything under the package folders is build output. + +When a repository releases, it sends a publication request. Requests run one at a time through [`process-mip-publication-request.yml`](../../.github/workflows/process-mip-publication-request.yml), and each one updates the package's pin in the lockfile. Every deploy then syncs all the pinned sources again before it publishes, so one release can't leave another package stale. The lockfile also says which repository may publish each package, and a request from any other repository is refused. + +After each deploy, [`scripts/update_package_list.py`](../../scripts/update_package_list.py) reads the live index back and rewrites `packages.json` and the [package list](../reference/packages.md), so the list always matches what's actually being served. + +## Only the latest version + +The index lists each package's current version and nothing older. A release replaces the entry instead of adding another. diff --git a/docs/images/index-page.png b/docs/images/index-page.png new file mode 100644 index 0000000000000000000000000000000000000000..e1ec2567cb9181b800a94319e75286af189b7a1e GIT binary patch literal 66882 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

?girYi<3(pxkZAxFkcDxhH@};@Hr{tFw3X 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 +These are the PyDevices packages this index publishes, each built from the +source tag pinned in `pydevices-lock.json`; the micropython-lib packages the +index also carries are upstream's. + +| Package | Version | Description | Source | +| --- | --- | --- | --- | +| `pydevices` | 0.7.7 | Portable display, audio, event, and timing foundations for PyDevices | [PyDevices/pydevices @ v0.7.7](https://github.com/PyDevices/pydevices/releases/tag/v0.7.7) | +| `pydevices-desktop` | 0.7.7 | Complete PyDevices desktop stack and board configuration | [PyDevices/pydevices @ v0.7.7](https://github.com/PyDevices/pydevices/releases/tag/v0.7.7) | +| `bledev` | 0.7.7 | Portable async Bluetooth Low Energy for PyDevices, over aioble on boards | [PyDevices/pydevices @ v0.7.7](https://github.com/PyDevices/pydevices/releases/tag/v0.7.7) | +| `midiports` | 0.7.7 | MIDI ports for adafruit_midi: USB device, UART, and a computer's own MIDI ports. | [PyDevices/pydevices @ v0.7.7](https://github.com/PyDevices/pydevices/releases/tag/v0.7.7) | +| `usb-core` | 0.7.7 | usb.core and usb.util: talk to USB devices from a host board, in PyUSB's shape. | [PyDevices/pydevices @ v0.7.7](https://github.com/PyDevices/pydevices/releases/tag/v0.7.7) | +| `usb-device-audio` | 0.7.7 | USB audio (UAC2) sound card on machine.USBDevice's streaming endpoints. | [PyDevices/pydevices @ v0.7.7](https://github.com/PyDevices/pydevices/releases/tag/v0.7.7) | +| `usb-device-msc` | 0.7.7 | USB mass storage device (Bulk-Only Transport, SCSI) over a MicroPython block device. | [PyDevices/pydevices @ v0.7.7](https://github.com/PyDevices/pydevices/releases/tag/v0.7.7) | +| `usb-device-video` | 0.7.7 | USB video (UVC) webcam on machine.USBDevice's streaming endpoints. | [PyDevices/pydevices @ v0.7.7](https://github.com/PyDevices/pydevices/releases/tag/v0.7.7) | +| `usb-hid` | 0.7.7 | CircuitPython's usb_hid on MicroPython, over usb-device-hid, for adafruit_hid. | [PyDevices/pydevices @ v0.7.7](https://github.com/PyDevices/pydevices/releases/tag/v0.7.7) | +| `usb-host-audio` | 0.7.7 | Play to a USB speaker or record from a USB microphone on this board's host port, over usb.core, alone or as audiodev outputs and inputs. | [PyDevices/pydevices @ v0.7.7](https://github.com/PyDevices/pydevices/releases/tag/v0.7.7) | +| `usb-host-cdc` | 0.7.7 | Talk to a USB serial device (CDC-ACM) on this board's host port, over usb.core. | [PyDevices/pydevices @ v0.7.7](https://github.com/PyDevices/pydevices/releases/tag/v0.7.7) | +| `usb-host-hid` | 0.7.7 | Keys, mouse buttons and movement from a keyboard or mouse plugged into this board's USB host port, named the way adafruit_hid names them. | [PyDevices/pydevices @ v0.7.7](https://github.com/PyDevices/pydevices/releases/tag/v0.7.7) | +| `usb-host-msc` | 0.7.7 | Mount a USB flash drive plugged into this board's host port, over usb.core. | [PyDevices/pydevices @ v0.7.7](https://github.com/PyDevices/pydevices/releases/tag/v0.7.7) | +| `usb-host-net` | 0.7.7 | Internet over USB: a phone's USB tethering on this board's host port, as a network interface. | [PyDevices/pydevices @ v0.7.7](https://github.com/PyDevices/pydevices/releases/tag/v0.7.7) | +| `usb-host-video` | 0.7.7 | Stream a webcam plugged into this board's USB host port, over usb.core. | [PyDevices/pydevices @ v0.7.7](https://github.com/PyDevices/pydevices/releases/tag/v0.7.7) | +| `hmilink` | 0.7.7 | Any screen as a device's front panel: one document, ops, telemetry and events over any transport. | [PyDevices/pydevices @ v0.7.7](https://github.com/PyDevices/pydevices/releases/tag/v0.7.7) | +| `palettes` | 0.0.14 | Color palette toolkit for PyDevices (wheel, cube, material_design) | [PyDevices/palettes @ v0.0.14](https://github.com/PyDevices/palettes/releases/tag/v0.0.14) | +| `pdwidgets` | 0.0.24 | Cross-platform widget toolkit for PyDevices | [PyDevices/pdwidgets @ v0.0.24](https://github.com/PyDevices/pdwidgets/releases/tag/v0.0.24) | +| `pygraphics` | 0.1.1 | Pure-Python pygraphics for MicroPython/CircuitPython/CPython (FrameBuffer, Draw, fonts); import as pygraphics | [PyDevices/pygraphics @ v0.1.1](https://github.com/PyDevices/pygraphics/releases/tag/v0.1.1) | +| `audioinstruments` | 0.4.1 | 55 synthio instruments for PyDevices (drum machines and synthesizers); import as audioinstruments | [PyDevices/audiocomponents @ v0.4.1](https://github.com/PyDevices/audiocomponents/releases/tag/v0.4.1) | +| `audioeffects` | 0.4.1 | Effect classes for PyDevices audio (delay, drive, dynamics, eq, modulation, pitch, reverb); import as audioeffects | [PyDevices/audiocomponents @ v0.4.1](https://github.com/PyDevices/audiocomponents/releases/tag/v0.4.1) | + +```python +import mip + +mip.install("pydevices", index="https://PyDevices.github.io/mip") +mip.install("pydevices-desktop", index="https://PyDevices.github.io/mip") +mip.install("bledev", index="https://PyDevices.github.io/mip") +mip.install("midiports", index="https://PyDevices.github.io/mip") +mip.install("usb-core", index="https://PyDevices.github.io/mip") +mip.install("usb-device-audio", index="https://PyDevices.github.io/mip") +mip.install("usb-device-msc", index="https://PyDevices.github.io/mip") +mip.install("usb-device-video", index="https://PyDevices.github.io/mip") +mip.install("usb-hid", index="https://PyDevices.github.io/mip") +mip.install("usb-host-audio", index="https://PyDevices.github.io/mip") +mip.install("usb-host-cdc", index="https://PyDevices.github.io/mip") +mip.install("usb-host-hid", index="https://PyDevices.github.io/mip") +mip.install("usb-host-msc", index="https://PyDevices.github.io/mip") +mip.install("usb-host-net", index="https://PyDevices.github.io/mip") +mip.install("usb-host-video", index="https://PyDevices.github.io/mip") +mip.install("hmilink", index="https://PyDevices.github.io/mip") +mip.install("palettes", index="https://PyDevices.github.io/mip") +mip.install("pdwidgets", index="https://PyDevices.github.io/mip") +mip.install("pygraphics", index="https://PyDevices.github.io/mip") +mip.install("audioinstruments", index="https://PyDevices.github.io/mip") +mip.install("audioeffects", index="https://PyDevices.github.io/mip") +``` + +Generated by `scripts/update_package_list.py` from the index itself; +`packages.json` carries the same data. Both are rewritten after every +deploy -- do not edit by hand. + diff --git a/scripts/update_package_list.py b/scripts/update_package_list.py index b76667e81..0a1157719 100755 --- a/scripts/update_package_list.py +++ b/scripts/update_package_list.py @@ -1,10 +1,11 @@ #!/usr/bin/env python3 """Regenerate the list of PyDevices packages this index publishes. -Writes packages.json and rewrites the PACKAGES block in README.md. The set of -packages is derived from pydevices-lock.json (every profile the publication -sync builds), and the data for each -- version, description, license -- comes -from the index's own index.json, never from PyPI or TestPyPI. +Writes packages.json and rewrites the PACKAGES block in +docs/reference/packages.md. The set of packages is derived from +pydevices-lock.json (every profile the publication sync builds), and the +data for each -- version, description, license -- comes from the index's own +index.json, never from PyPI or TestPyPI. Stdlib only. The refresh-package-list workflow runs it after every deploy -- a publication or a docs push -- against the index that was just deployed; by @@ -553,7 +554,9 @@ def main() -> int: "or an http(s) URL, fetched (default: the live index). No fallback between the two.", ) parser.add_argument("--lockfile", type=Path, default=REPO_ROOT / "pydevices-lock.json") - parser.add_argument("--readme", type=Path, default=REPO_ROOT / "README.md") + parser.add_argument( + "--readme", type=Path, default=REPO_ROOT / "docs" / "reference" / "packages.md" + ) parser.add_argument("--output", type=Path, default=REPO_ROOT / "packages.json") parser.add_argument( "--self-check",