Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Upgrade PyQt5, increases Python version compatibility #2487

Draft
wants to merge 3 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ jobs:
pip list
- run: mkdir upload
- name: Build Linux AppImage
run: xvfb-run make linux
run: QT_QPA_PLATFORM=offscreen make linux
# GitHub actions upload artifact breaks permissions, workaround using tar
# https://github.com/actions/upload-artifact/issues/38
- name: Tar AppImage to maintain permissions
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/codeql.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ jobs:
analyze:
timeout-minutes: 20
name: Analyze
runs-on: ubuntu-20.04
runs-on: ubuntu-22.04
permissions:
actions: read
contents: read
Expand Down
53 changes: 21 additions & 32 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,17 @@ jobs:
timeout-minutes: 30
strategy:
matrix:
os: [ubuntu-20.04, ubuntu-latest, macos-11, macos-latest, windows-2019, windows-latest]
python-version: ['3.5', '3.6', '3.7', '3.8']
# macos-13 is the latest release on x86, and macos-14 is arm64
os: [ubuntu-20.04, ubuntu-latest, macos-11, macos-13, macos-14, windows-2019, windows-latest]
python-version: ['3.7', '3.8', '3.9', '3.10', '3.11', '3.12']
exclude:
# Python 3.5 and 3.6 not available in the latest Ubuntu runners
- os: ubuntu-latest
python-version: '3.5'
- os: ubuntu-latest
python-version: '3.6'
# These Python versions are not available in macOS arm64
- os: macos-14
python-version: '3.7'
- os: macos-14
python-version: '3.8'
- os: macos-14
python-version: '3.9'
fail-fast: false
runs-on: ${{ matrix.os }}
name: Test Py ${{ matrix.python-version }} - ${{ matrix.os }}
Expand All @@ -37,19 +40,14 @@ jobs:
pip --version
pip config list
pip freeze
- name: Prepare Ubuntu
if: runner.os == 'Linux'
run: |
sudo apt-get update
sudo apt-get install -y libxkbcommon-x11-0 xvfb
- name: Install Mu dependencies
run: |
pip install .[dev]
pip list
timeout-minutes: 10
- name: Run tests
if: runner.os == 'Linux'
run: xvfb-run make check
run: QT_QPA_PLATFORM=offscreen python make.py check
timeout-minutes: 5
- name: Run tests
if: runner.os != 'Linux'
Expand Down Expand Up @@ -100,7 +98,7 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
docker-tag: ['stretch-2018-03-13', 'buster-2021-05-28', 'buster-legacy-2023-05-03']
docker-tag: ['buster-2021-05-28', 'buster-legacy-2023-05-03', 'bullseye-2023-05-03']
fail-fast: false
services:
rpios:
Expand All @@ -112,7 +110,7 @@ jobs:
- name: Wait 2m30s for the docker image to start up QEMU and Raspberry Pi OS
run: sleep 150
- name: Clone project & setup it as the bash entry directory
uses: appleboy/ssh-action@master
uses: appleboy/ssh-action@v1.0.0
with:
host: rpios
username: pi
Expand All @@ -126,18 +124,8 @@ jobs:
git checkout --progress FETCH_HEAD
echo "cd ~/mu" > ~/.bashrc_new && cat ~/.bashrc >> ~/.bashrc_new
rm ~/.bashrc && mv ~/.bashrc_new ~/.bashrc
# As Pi OS stretch is no longer supported the repository URL was moved and is no longer updated
- name: Update Stretch sources.list
if: ${{ matrix.docker-tag == 'stretch-2018-03-13' }}
uses: appleboy/ssh-action@master
with:
host: rpios
username: pi
password: raspberry
port: ${{ job.services.rpios.ports[5022] }}
script: echo "deb http://legacy.raspbian.org/raspbian/ stretch main contrib non-free rpi" | sudo tee /etc/apt/sources.list
- name: Install Mu extra apt dependencies
uses: appleboy/ssh-action@master
uses: appleboy/ssh-action@v1.0.0
with:
host: rpios
username: pi
Expand All @@ -147,22 +135,24 @@ jobs:
sudo apt-get update
sudo apt-get install -y python3-virtualenv
- name: Create venv and install Python dependencies
uses: appleboy/ssh-action@master
uses: appleboy/ssh-action@v1.0.0
with:
host: rpios
username: pi
password: raspberry
port: ${{ job.services.rpios.ports[5022] }}
command_timeout: 20m
# Some compiled packages take a while to be built in piwheels, so to
# avoid intermittent pip install failures we use `--prefer-binary`
script: |
python3 -m virtualenv ~/mu/.venv -v --python=python3 --system-site-packages
echo "source ~/mu/.venv/bin/activate" > ~/.bashrc_new && cat ~/.bashrc >> ~/.bashrc_new
rm ~/.bashrc && mv ~/.bashrc_new ~/.bashrc
source .venv/bin/activate
python -m pip list
python -m pip install ."[dev]"
python -m pip install ."[dev]" --prefer-binary
- name: Environment info
uses: appleboy/ssh-action@master
uses: appleboy/ssh-action@v1.0.0
with:
host: rpios
username: pi
Expand All @@ -175,12 +165,11 @@ jobs:
python3 -m pip --version
python3 -m pip list
- name: Run tests
uses: appleboy/ssh-action@master
uses: appleboy/ssh-action@v1.0.0
with:
host: rpios
username: pi
password: raspberry
port: ${{ job.services.rpios.ports[5022] }}
# The time out can be decreased to 30 min when Stretch is dropped
command_timeout: 45m
command_timeout: 30m
script: xvfb-run python make.py check
4 changes: 2 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -112,9 +112,9 @@ macos: check
# 1. Not really needed.
# 2. Previously active venv would be "gone" on venv-pup deactivation.
# Installing pup from a fork with the --pip-platform flag proof of concept
# and using it to install wheels for the `macosx_10_12_x86_64` platform
# and using it to install wheels for the `macosx_10_13_x86_64` platform
./venv-pup/bin/pip install git+https://github.com/carlosperate/pup.git@pip-platform
./venv-pup/bin/pup package --launch-module=mu --nice-name="Mu Editor" --icon-path=./package/icons/mac_icon.icns --license-path=./LICENSE --pip-platform=macosx_10_12_x86_64 .
./venv-pup/bin/pup package --launch-module=mu --nice-name="Mu Editor" --icon-path=./package/icons/mac_icon.icns --license-path=./LICENSE --pip-platform=macosx_10_13_x86_64 .
rm -r venv-pup
ls -la ./build/pup/
ls -la ./dist/
Expand Down
23 changes: 7 additions & 16 deletions mu/wheels/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,23 +37,14 @@ class WheelsBuildError(WheelsError):
# Any additional elements are passed to `pip` for specific purposes
#
mode_packages = [
# pygame is a pgzero dependency, but there is currently an issue where
# pygame versions >=2.1.3 have issues in macOS 10.x, so temporarily for
# Mu release 1.2.1 pin the max version here
# https://github.com/mu-editor/mu/issues/2423
("pgzero", ("pgzero>=1.2.1", "pygame<2.1.3")),
("pgzero", ("pgzero>=1.2.1",)),
# Lock Werkzeug to < 3.0.0: import flask fails, otherwise.
("flask", ("flask==2.0.3", "Werkzeug<3.0.0")),
# The version of ipykernel here should match to the version used by
# qtconsole at the version specified in setup.py
# FIXME: ipykernel max ver added for macOS 10.13 compatibility, min taken
# from qtconsole 4.7.7. This is mirrored in setup.py
("ipykernel", ("ipykernel>=4.1,<6",)),
# FIXME: ipykernel<6 depends on ipython_genutils, but it isn't explicitly
# declared as a dependency. It also depends on traitlets, which
# incidentally brought ipython_genutils, but in v5.1 it was dropped, so as
# a workaround we need to manually specify it here
("ipython_genutils", ("ipython_genutils>=0.2.0",)),
# ipykernel max ver added for macOS 10.13 compatibility, min taken
# from setup.py. This is version has to mirror the one from setup.py
("ipykernel", ("ipykernel>=5.5.6,<6",)),
]


Expand All @@ -66,12 +57,12 @@ def os_compatibility_flags():
an issue to be resolved before doing a Mu release.
"""
extra_flags = []
# For macOS the oldest supported version is 10.12 Sierra, as that's the
# oldest version supported by PyQt5 v5.13
# For macOS the oldest supported version is 10.13 High Sierra,
# as that's the oldest version supported by PyQt5 v5.15
if sys.platform == "darwin":
extra_flags.extend(
[
"--platform=macosx_10_12_x86_64",
"--platform=macosx_10_13_x86_64",
"--only-binary=:all:",
]
)
Expand Down
51 changes: 27 additions & 24 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,26 +25,24 @@
# The core 'install_requires' should only be things
# which are needed for the main editor to function.
#
"PyQt5==5.13.2"
+ ';"arm" not in platform_machine and "aarch" not in platform_machine',
"QScintilla==2.11.3"
+ ';"arm" not in platform_machine and "aarch" not in platform_machine',
"PyQtChart==5.13.1"
+ ';"arm" not in platform_machine and "aarch" not in platform_machine',
# FIXME: jupyter-client added for Py3.5 compatibility, to be dropped after
# Mu v1.1 release. So, qtconsole < 5 and jupyter-client < 6.2 (issue #1444)
"jupyter-client>=4.1,<6.2",
# FIXME: ipykernel max added for macOS 10.13 compatibility, min taken from
# qtconsole 4.7.7. Full line can be removed after Mu v1.1 release.
# Dependency mirrored for user venv in mu/wheels/__init__.py
"ipykernel>=4.1,<6",
# FIXME: ipykernel<6 depends on ipython_genutils, but it isn't explicitly
# declared as a dependency. It also depends on traitlets, which
# incidentally brought ipython_genutils, but in v5.1 it was dropped, so as
# a workaround we need to manually specify it here.
"ipython_genutils>=0.2.0",
"qtconsole==4.7.7",
#
"PyQt5==5.15.10"
+ '; sys_platform != "linux" '
+ 'or ("arm" not in platform_machine and "aarch" not in platform_machine)',
"QScintilla==2.14.1"
+ '; sys_platform != "linux" '
+ 'or ("arm" not in platform_machine and "aarch" not in platform_machine)',
"PyQtChart==5.15.6"
+ '; sys_platform != "linux" '
+ 'or ("arm" not in platform_machine and "aarch" not in platform_machine)',
# ipykernel has to be < v6 (<5.99 used because <6 installs v6.0.0rc2) for
# macOS 10.13 compatibility (v6+ depends on debugpy), v5.5.6 resolves
# ipython/ipykernel#759. Line can be removed with PyQt6 (macOS 10.14+).
# ipykernel version has to be mirrored in mu/wheels/__init__.py
"ipykernel>=5.5.6,<5.99",
"qtconsole~=5.4",
# In Python 3.12 the deprecated 'imp' module was removed from the stdlib.
# ipykernel only moved to importlib in v6.10, so this is a "forward-port"
"zombie_imp>=0.0.2;python_version>='3.12'",
# adafruit-board-toolkit is used to find serial ports and help identify
# CircuitPython boards in the CircuitPython mode.
"adafruit-board-toolkit~=1.1",
Expand All @@ -58,7 +56,7 @@
"flake8 >= 3.8.3",
# Clamp click max version to workaround incompatibility with black<22.1.0
"click<=8.0.4",
"black>=19.10b0,<22.1.0;python_version>'3.5'",
"black>=19.10b0,<22.1.0",
"platformdirs>=2.0.0,<3.0.0",
"semver>=2.8.0",
# virtualenv vendors pip, we need at least pip v19.3 to install some
Expand All @@ -75,6 +73,9 @@
# Needed to resolve an issue with paths in the user virtual environment
#
"pywin32; sys_platform=='win32'",
# pkg_resources has been removed in Python 3.12, until we move to importlib
# we need it via setuptools: https://github.com/mu-editor/mu/issues/2485
"setuptools",
]


Expand Down Expand Up @@ -128,7 +129,7 @@
"mu.modes.api",
"mu.wheels",
],
python_requires=">=3.5,<3.9",
python_requires=">=3.7,<3.13",
install_requires=install_requires,
extras_require=extras_require,
package_data={"mu.wheels": ["*.whl", "*.zip"]},
Expand All @@ -147,10 +148,12 @@
"Operating System :: MacOS :: MacOS X",
"Operating System :: Microsoft :: Windows",
"Programming Language :: Python :: 3 :: Only",
"Programming Language :: Python :: 3.5",
"Programming Language :: Python :: 3.6",
"Programming Language :: Python :: 3.7",
"Programming Language :: Python :: 3.8",
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Topic :: Education",
"Topic :: Games/Entertainment",
"Topic :: Software Development",
Expand Down
1 change: 1 addition & 0 deletions tests/interface/test_editor.py
Original file line number Diff line number Diff line change
Expand Up @@ -936,6 +936,7 @@ def test_EditorPane_toggle_comments_handle_crlf_newline():
"""
ep = mu.interface.editor.EditorPane(None, "test\r\nline 2\n")
ep.hasSelectedText = mock.MagicMock(return_value=False)
ep.setCursorPosition(0, 0)
ep.toggle_comments()
assert ep.text() == "# test\nline 2\n"
assert ep.selectedText() == "# test"
Expand Down
Loading