diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4ed307b68..3a74047c3 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -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 diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index c3dc435c8..98393b326 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -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 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index f36a18548..bb005bf9a 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -12,20 +12,14 @@ jobs: 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'] - 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' + python-version: ['3.7', '3.8', '3.9', '3.10', '3.11', '3.12'] fail-fast: false runs-on: ${{ matrix.os }} name: Test Py ${{ matrix.python-version }} - ${{ matrix.os }} steps: - uses: actions/checkout@v4 - name: Set up Python - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} - name: Display Python info @@ -37,11 +31,6 @@ 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] @@ -49,7 +38,7 @@ jobs: 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' @@ -100,7 +89,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - docker-tag: ['stretch-2018-03-13', 'buster-2021-05-28', 'buster-legacy-2022-04-07'] + docker-tag: ['buster-2021-05-28', 'buster-legacy-2022-04-07', 'bullseye-2022-04-07'] fail-fast: false services: rpios: @@ -112,7 +101,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 @@ -126,18 +115,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 @@ -147,22 +126,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 @@ -175,12 +156,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 diff --git a/mu/wheels/__init__.py b/mu/wheels/__init__.py index f731cc480..8ff8be13b 100644 --- a/mu/wheels/__init__.py +++ b/mu/wheels/__init__.py @@ -42,14 +42,9 @@ class WheelsBuildError(WheelsError): ("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",)), ] diff --git a/setup.py b/setup.py index 2a0e5dc82..da2465fcb 100644 --- a/setup.py +++ b/setup.py @@ -25,26 +25,21 @@ # The core 'install_requires' should only be things # which are needed for the main editor to function. # - "PyQt5==5.13.2" + "PyQt5==5.15.10" + ';"arm" not in platform_machine and "aarch" not in platform_machine', - "QScintilla==2.11.3" + "QScintilla==2.14.1" + ';"arm" not in platform_machine and "aarch" not in platform_machine', - "PyQtChart==5.13.1" + "PyQtChart==5.15.6" + ';"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", - # + # ipykernel has to be < v6 for macOS 10.13 compatibility (v6 depends on + # debugpy package), v5.5.6 resolves issue ipython/ipykernel#759. + # Full line can be removed after Mu v1.3 release as PyQt6 drops old macOS. + # ipykernel version has to be mirrored in mu/wheels/__init__.py + "ipykernel>=5.5.6,<6", + "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", @@ -58,7 +53,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 @@ -75,6 +70,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", ] @@ -128,7 +126,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"]}, diff --git a/tests/interface/test_editor.py b/tests/interface/test_editor.py index 4c9486230..ba460219a 100644 --- a/tests/interface/test_editor.py +++ b/tests/interface/test_editor.py @@ -935,6 +935,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"