From 2926b4af7121c28898c076ee569fc38373d1404f Mon Sep 17 00:00:00 2001 From: Laurens Valk Date: Sat, 30 May 2026 09:40:09 +0200 Subject: [PATCH] npm/jedi: Build pybricks-api from source. Now that we use a single release pipeline, the API itself might not yet be on PyPI by the time we build jedi, so we build it locally. We'll still keep the API docs on PyPI so users can have local autocomplete, but that path is no longer a dependency for building jedi. Also explain CHANGELOG synchronization with firmware repo. --- .github/workflows/publish-jedi.yml | 9 +- .gitignore | 1 + CHANGELOG.md | 340 +---------------------------- build-all.sh | 13 +- {npm/jedi => jedi}/README.md | 0 {npm/jedi => jedi}/build.py | 45 ++-- jedi/pyproject.toml | 3 +- pyproject.toml | 2 +- 8 files changed, 46 insertions(+), 367 deletions(-) rename {npm/jedi => jedi}/README.md (100%) rename {npm/jedi => jedi}/build.py (75%) mode change 100755 => 100644 diff --git a/.github/workflows/publish-jedi.yml b/.github/workflows/publish-jedi.yml index a293fb9..b0604d9 100644 --- a/.github/workflows/publish-jedi.yml +++ b/.github/workflows/publish-jedi.yml @@ -30,11 +30,14 @@ jobs: - name: Set pybricks-jedi version run: poetry version "$VERSION" working-directory: jedi + - name: Set pybricks version and update jedi dependency pin + run: | + poetry version "$VERSION" + sed -i "s/^pybricks = \".*\"/pybricks = \"$VERSION\"/" jedi/pyproject.toml - uses: actions/setup-node@v4 with: node-version: '24' registry-url: 'https://registry.npmjs.org' - - run: ./build.py "$NPM_VERSION" - working-directory: npm/jedi + - run: python jedi/build.py "$NPM_VERSION" - run: npm publish --tag "$NPM_TAG" - working-directory: npm/jedi/build + working-directory: jedi/npm-build diff --git a/.gitignore b/.gitignore index 93232f3..a0999f2 100644 --- a/.gitignore +++ b/.gitignore @@ -25,6 +25,7 @@ build/ build-*/ _build/ +npm-build/ # Tests ###################### diff --git a/CHANGELOG.md b/CHANGELOG.md index c1814a6..b2a30a8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,339 +1,13 @@ # Changelog - +See [pybricks-micropython/CHANGELOG.md][changelog] for the changes in each release. -## Unreleased +This repository is frequently updated to stay in sync with the implementation. -## 4.0.0b4 - 2026-05-29 +Major and minor versions are synchronized with `pybricks-micropython`, which +leads. Patch versions and prerelease version numbers may differ, as they may +be bumped for every small change or typo in the docs. -### Changed +The version for this repository is also used for the `@pybricks/jedi` and `@pybricks/ide-docs` npm packages. -- Tag npm prereleases. - -## 4.0.0b4 - 2026-05-29 - -### Changed - -- Bump node version. - -## 4.0.0b3 - 2026-05-29 - -### Changed - -- Fixed NPM publishing permissions. - -## 4.0.0b2 - 2026-05-29 - -### Changed - -- Change NPM publishing to trusted publishers. - - -## 4.0.0b1 - 2026-05-29 - -### Changed - -- Updated API for firmware 4.0.0bx. See upstream changelog for details. -- Updated release pipeline to publish rtd, npm/docs and npm/jedi on tag. - -### Fixed - -- Fixed `DriveBase.angle` reporting an incorrect return type. - -## 3.6.1 - 2025-05-01 - -### Fixed - -- Fixed missing `hub.system.info` method on some hubs. - -## 3.6.0 - 2025-03-11 - -### Changed - -- Update API for firmware 3.6.0. See upstream changelog for details. - -## 3.6.0b5 - 2025-02-26 - -### Changed - -- Update API for firmware 3.6.0b5. See upstream changelog for details. - -## 3.5.0 - 2024-04-11 - -### Changed -- Bump version to 3.5.0 without additional changes. - -## 3.5.0b2 - 2024-04-05 - -### Added - -- Added `pybricks.pupdevices.Remote.disconnect` method. -- Added blocks for `up`, `ready` and `stationary` for IMUs. -- Added `last` and `chr` parameters to `read_input_byte` and add blocks. -- Added block for the `in` operation. -- Add double ternary block. - -## 3.5.0b1 - 2024-03-11 - -### Added - -- Added `XboxController.rumble` method. -- Added block icons for `hub.system.set_stop_button` and `hub.system.shutdown`. -- Added program stop block (`raise SystemExit`). - -## 3.4.1 - 2024-03-11 - -### Fixed - -- Fixed Read The Docs virtual environment workflow. - -## 3.4.0 - 2024-03-11 - -### Changed - -- Update list block screenshots to match implementation. - -## 3.4.0b5 - 2024-03-05 - -### Changed - -- Updates for v3.4.0b3 firmware (out of sync with docs). -- Changed `hub.button` to `hub.buttons` on single button hubs. Access via - `hub.button` will keep working in the firmware for backwards compatibility. - -## 3.4.0b4 - 2024-02-14 - -### Added - -- Added `pybricks.iodevices.XboxController` class. - -### Changed - -- Changed `buttons.pressed` return type to set. - -## 3.4.0b3 - 2024-01-30 - -### Added - -- Added `pybricks.robotics.Car` class. - -### Changed - -- Changed `pybricks.robotics.DriveBase` icon to two wheels instead of steering - wheel, which will be used for the new car class. - -## 3.4.0b2 - 2023-11-28 - -### Changed -- Include first batch of block coding images. - -## 3.3.0 - 2023-11-24 - -### Changed -- Bump beta version to release version with no further changes. - -## 3.3.0c1 - 2023-11-20 - -### Added -- Enabled tilt and orientation config for `MoveHub()`. -- Documented `Motor.close()` - -## Fixed -- Fixed missing awaitable for `Remote.light` and LWP3 writes. - -## 3.3.0b9 - 2023-10-26 - -### Changed -- Changed the beta feature for using the hub's gyro. Gyro control can now be - toggled using `use_gyro` instead of using a separate `GyroDriveBase` class. -- Documentation updates to match firmware 3.3.0b5--3.3.0b9 updates. - -### Added -- Added `set` to `ubuiltins` module. -- Basic multitasking docs. -- Awaitable keyword for awaitable methods and functions. - -## 3.3.0b5 - 2023-05-16 - -### Added -- Documented new `hub.ble` methods. - -## 3.3.0b4 - 2023-04-21 - -### Added -- Documented `integral_deadzone` in `Control.pid()`. -- Documented `Motor.model`. This can be used to view the estimated motor - state and change its settings. -- Added `rotation`, `orientation`, `ready`, `stationary` and `settings` methods - to `IMU` class. -- Added `GyroDriveBase` class to `pybricks.robotics`. - -### Changed -- Change implementation status of `IMU.heading` and `IMU.reset_heading`. They - are now implemented, with some limitations as noted in a note box. -- Moved `Matrix` and `vector` from `pybricks.geometry` to `pybricks.tools`. -- Moved `Axis` from `pybricks.geometry` to `pybricks.parameters`. - -### Removed -- Removed `pybricks.geometry` module. - -## 3.2.0 - 2022-12-20 - -### Changed -- Changed module TOC headings to make it easier to find things. - -## 3.2.0c1 - 2022-12-09 - -### Changed -- Updated "front" side of the Technic Hub to be consistent with - the Prime Hub. - -## 3.2.0b6 - 2022-12-02 - -### Added -- Documented ``Stop.NONE`` and ``Stop.COAST_SMART``. -- Documented ``ujson`` module. -- Added `done` and `stalled` methods for `DriveBase`. - -### Changed -- Changed `PrimeHub.display.image()` to `PrimeHub.display.icon()` and renamed - its kwarg from `image` to `icon`. -- Improved presentation and docstrings of the ``ubuiltins`` and other - MicroPython modules -- Moved the random numbers example for Move Hub to the Move Hub page. -- Moved `done()`, `stalled()`, `load()` from `Control` to `Motor` object. - -## 3.2.0b5 - 2022-11-11 - -### Fixed -- Fixed Jedi code completion for `Color` and `Icon` classes in `pybricks.parameters`. - -## 3.2.0b4 - 2022-10-21 - -### Added -- Code auto-completion for `EssentialHub`. -- Added `System.storage` method. - -### Fixed -- Fixed some type hints in `parameters` submodule. - -## 3.2.0b1-r3 - 2022-06-26 - -### Fixed -- Fixed more type hints and improved compatibility with jedi. - -## 3.2.0b1-r2 - 2022-06-24 - -### Changed -- Moved remaining type hints from `.pyi` files to the python stub modules, and - fixed numerous errors in the type hints throughout. - -## 3.2.0b1-r1 - 2022-06-09 - -### Added -- Added `__init__.py` to `pybricks` package. - -## 3.2.0b1 - 2022-06-02 - -### Added -- Code auto-completion for `hub.charger`, `hub.imu` and `hub.system`. -- Moved typing from several `.pyi` files to the actual python modules. - -### Fixed -- Fixed code completion for `DCMotor` and `Motor` classes in MS Python VS Code extension. -- Fixed missing `DCMotor` type in `ev3devices`. -- Fixed type hint for `Motor.reset_angle()` in `pupdevices`. - -### Changed -- Setter for acceleration can now also be used to set acceleration and - deceleration to different values, using a two-valued tuple. - -## 3.1.0 - 2021-12-16 - -### Added -- Added maximum voltage setter for `DCMotor` and `Motor`. -- Documented `DriveBase.curve()` method. - -### Changed -- Removed `duty` setting from `Control.limits` method. -- Removed `integral_range` setting from `Control.pid` method. - -### Fixed -- Fixed link to Color Light Matrix page. -- Fixed link to Inventor Hub page. - -## 3.1.0rc1 - 2021-11-19 - -### Added -- Added `ColorLightMatrix` class. -- Added `LWP3Device` class. - -**NOTE: version number after this point were from JavaScript package and do -not correspond to Pybricks firmware version numbers.** - -## 1.6.0 - 2021-08-30 - -### Added -- MicroPython module documentation. -- Examples for hub system functions including stop button and shutdown. - -### Changed -- Build IDE docs as main docs with minor changes, instead of a completely - separate build. -- Moved motor control documentation to the motor page. - -## 1.5.0 - 2021-07-01 - -### Added -- Documentation for Powered Up Remote Control. - -## 1.4.0 - 2021-06-23 - -### Added -- Enabled beta content that was hidden for the 3.0 release. -- Added notice about using the latest beta version. - -## 1.3.3 - 2021-05-21 - -### Changed -- Match example snippet styling to IDE. -- Add more examples. - -## 1.3.2 - 2021-04-26 - -### Changed -- Theme style fixes. -- Example code fixes -- Match doc version to firmware version. - -## 1.3.1 - 2021-04-12 - -### Changed -- Upgrade sphinx and rtd-theme to fix style issues. - -## 1.3.0 - 2021-04-12 - -### Removed -- Removed features which not be in the official 3.0 release. These features - are still in beta. They'll come back in future releases once tested. - -## 1.2.0 - 2021-04-09 - -### Changed -- Moved installation guide to external site. - -## 1.1.1 - 2021-02-14 - -### Added -- Added installation guide. -- Various documentation fixes. - -## 1.1.0 - 2021-01-28 - -### Added -- Scrollbar styling. - -## 1.0.0 - 2021-01-25 - -### Added -- Sphinx build output. +[changelog]: https://github.com/pybricks/pybricks-micropython/blob/master/CHANGELOG.md diff --git a/build-all.sh b/build-all.sh index d4ec940..97d9977 100755 --- a/build-all.sh +++ b/build-all.sh @@ -19,20 +19,15 @@ cd "$REPO_ROOT" flake8 doc8 -# pybricks-jedi wheel (from local source) +# pybricks-jedi tests echo "==> Testing pybricks-jedi" cd "$REPO_ROOT/jedi" poetry run pytest -vv -echo "==> Building pybricks-jedi wheel" -cd "$REPO_ROOT/jedi" -rm -rf dist/ -poetry build --format=wheel - # @pybricks/jedi npm package echo "==> Building @pybricks/jedi" -cd "$REPO_ROOT" -python3 npm/jedi/build.py "$NPM_VERSION" +cd "$REPO_ROOT/jedi" +python3 build.py "$NPM_VERSION" # @pybricks/ide-docs npm package echo "==> Building @pybricks/ide-docs" @@ -43,5 +38,5 @@ yarn build echo "" echo "Build complete." -echo " jedi npm package : npm/jedi/build/" +echo " jedi npm package : jedi/npm-build/" echo " ide-docs : npm/ide-docs/html/" diff --git a/npm/jedi/README.md b/jedi/README.md similarity index 100% rename from npm/jedi/README.md rename to jedi/README.md diff --git a/npm/jedi/build.py b/jedi/build.py old mode 100755 new mode 100644 similarity index 75% rename from npm/jedi/build.py rename to jedi/build.py index 99f3274..d0285a1 --- a/npm/jedi/build.py +++ b/jedi/build.py @@ -1,4 +1,5 @@ #!/usr/bin/env python3 +# Builds the @pybricks/jedi npm package into npm-build/. import email.parser import json @@ -6,6 +7,7 @@ import pathlib import shutil import subprocess import sys +import tomllib import zipfile if len(sys.argv) != 2: @@ -15,8 +17,8 @@ if len(sys.argv) != 2: VERSION = sys.argv[1] ROOT_DIR = pathlib.Path(__file__).parent.resolve() -JEDI_SRC_DIR = (ROOT_DIR / ".." / ".." / "jedi").resolve() -BUILD_DIR = (ROOT_DIR / "build").resolve() +REPO_ROOT_DIR = (ROOT_DIR / "..").resolve() +BUILD_DIR = ROOT_DIR / "npm-build" package_json = { "name": "@pybricks/jedi", @@ -25,7 +27,7 @@ package_json = { "repository": { "type": "git", "url": "git+https://github.com/pybricks/pybricks-api.git", - "directory": "npm/jedi", + "directory": "jedi", }, "publishConfig": {"registry": "https://registry.npmjs.org", "access": "public"}, } @@ -38,24 +40,28 @@ whl_map: dict[str, str] = {} shutil.rmtree(BUILD_DIR, True) BUILD_DIR.mkdir() -# build pybricks-jedi wheel from local source -subprocess.check_call(["poetry", "build", "--format=wheel"], cwd=JEDI_SRC_DIR) +# build pybricks api wheel from local source so pip uses it instead of fetching from PyPI +subprocess.check_call(["poetry", "build", "--format=wheel"], cwd=REPO_ROOT_DIR) -# copy locally built wheel to build dir -for whl in (JEDI_SRC_DIR / "dist").glob("pybricks_jedi-*.whl"): +# copy locally built pybricks wheel to build dir +for whl in (REPO_ROOT_DIR / "dist").glob("pybricks-*.whl"): shutil.copy(whl, BUILD_DIR) -# download transitive dependencies from PyPI, using the local wheel to satisfy pybricks-jedi itself +# build pybricks-jedi wheel from local source +subprocess.check_call(["poetry", "build", "--format=wheel"], cwd=ROOT_DIR) + +# copy locally built wheel to build dir +for whl in (ROOT_DIR / "dist").glob("pybricks_jedi-*.whl"): + shutil.copy(whl, BUILD_DIR) + +# download transitive dependencies using versions pinned in poetry.lock +transitive_packages = ["jedi", "parso", "docstring-parser", "typing-extensions"] +with open(ROOT_DIR / "poetry.lock", "rb") as f: + lock = tomllib.load(f) +lock_versions = {pkg["name"]: pkg["version"] for pkg in lock["package"]} +transitive = [f"{pkg}=={lock_versions[pkg]}" for pkg in transitive_packages] subprocess.check_call( - [ - sys.executable, - "-m", - "pip", - "download", - "--only-binary=any", - f"--find-links={BUILD_DIR}", - "pybricks-jedi", - ], + [sys.executable, "-m", "pip", "download", "--only-binary=any"] + transitive, cwd=BUILD_DIR, ) @@ -96,7 +102,7 @@ for whl in BUILD_DIR.glob("*.whl"): license_identifiers.add(license) if whl.name.startswith("pybricks_jedi-"): - with open(JEDI_SRC_DIR / "LICENSE") as lf: + with open(ROOT_DIR / "LICENSE") as lf: license_text[whl.name] = lf.read() else: try: @@ -137,5 +143,4 @@ with open(BUILD_DIR / "LICENSE", "w") as f: # copy additional files -for file in ("README.md",): - shutil.copy(ROOT_DIR / file, BUILD_DIR / file) +shutil.copy(ROOT_DIR / "README.md", BUILD_DIR / "README.md") diff --git a/jedi/pyproject.toml b/jedi/pyproject.toml index 840a9f1..8635aff 100644 --- a/jedi/pyproject.toml +++ b/jedi/pyproject.toml @@ -8,7 +8,8 @@ license = "MIT" [tool.poetry.dependencies] python = ">= 3.10, < 3.12" -pybricks = "3.6.0b5" +# Version is set automatically at build time from the root pyproject.toml. Do not edit. +pybricks = "0.0.0" jedi = "0.18.1" typing-extensions = "4.2.0" docstring-parser = "0.14.1" diff --git a/pyproject.toml b/pyproject.toml index 7419a27..fdc703d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "pybricks" -version = "4.0.0b5" +version = "4.0.0b9" description = "Documentation and user-API stubs for Pybricks MicroPython" authors = ["The Pybricks Authors "] maintainers = ["Laurens Valk ", "David Lechner " ]