diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 959b654822..14192cfec6 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -16,6 +16,9 @@ on: ref: description: "Enter a tag or commit to package" default: "" + gvsbuild-tag: + description: "Use an alternative gvsbuild release for the windows build. Defaults to latest." + default: "latest" jobs: windows_package: @@ -24,8 +27,8 @@ jobs: strategy: matrix: arch: [x64, x86] - python: ["3.9"] - libtorrent: [2.0.7, 1.2.19] + python: ["3.7", "3.10"] + libtorrent: [2.0.8, 1.2.19] steps: # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it @@ -49,12 +52,20 @@ jobs: cache: pip - name: Prepare pip - run: python -m pip install wheel setuptools==68.* + run: python -m pip install wheel setuptools==70.* + + - name: Determine gvsbuild release URL + id: gvsbuild-url + shell: bash + run: | + test -z "${{ github.event.inputs.gvsbuild-tag }}" && tag=latest || tag="${{ github.event.inputs.gvsbuild-tag }}" + if [[ "$tag" == "latest" ]]; then URL="https://github.com/${{ github.repository_owner }}/gvsbuild-release/releases/$tag/download"; else URL="https://github.com/${{ github.repository_owner }}/gvsbuild-release/releases/download/$tag" ; fi + echo "gvsbuild-release-url=$URL" >> $GITHUB_OUTPUT - name: Install GTK run: | $WebClient = New-Object System.Net.WebClient - $WebClient.DownloadFile("https://github.com/deluge-torrent/gvsbuild-release/releases/download/latest/gvsbuild-py${{ matrix.python }}-vs16-${{ matrix.arch }}.zip","C:\GTK.zip") + $WebClient.DownloadFile("${{ steps.gvsbuild-url.outputs.gvsbuild-release-url }}/gvsbuild-py${{ matrix.python-version }}-vs17-${{matrix.arch}}.zip","C:\GTK.zip") 7z x C:\GTK.zip -oc:\GTK echo "C:\GTK\release\lib" | Out-File -FilePath $env:GITHUB_PATH -Append echo "C:\GTK\release\bin" | Out-File -FilePath $env:GITHUB_PATH -Append @@ -77,7 +88,6 @@ jobs: working-directory: deluge_src run: | python -m pip install . - python setup.py install_scripts - name: Freeze Deluge working-directory: packaging/win diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d648ba1dfd..17d4262b23 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,13 +10,19 @@ on: core-dump: description: "Set to 1 to enable retrieving core dump from crashes" default: "0" + gvsbuild-tag: + description: "Use an alternative gvsbuild release for the windows build. Defaults to latest." + default: "latest" jobs: test-linux: - runs-on: ubuntu-22.04 strategy: matrix: - python-version: ["3.7", "3.10"] - + python-version: ["3.9", "3.10"] + os: ["ubuntu-24.04"] + include: + - os: ubuntu-22.04 + python-version: 3.7 + runs-on: ${{ matrix.os }} steps: # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - uses: actions/checkout@v4 @@ -36,6 +42,7 @@ jobs: - name: Install dependencies run: | + sudo apt-get install libcairo2-dev libgirepository1.0-dev pip install --upgrade pip wheel setuptools pip install -r requirements-ci.txt pip install -e . @@ -74,7 +81,8 @@ jobs: runs-on: windows-2022 strategy: matrix: - python-version: ["3.7", "3.10"] + python-version: ["3.7", "3.9", "3.10"] + arch: ["x64"] steps: # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it @@ -89,6 +97,24 @@ jobs: cache: "pip" cache-dependency-path: "requirements*.txt" + - name: Determine gvsbuild release URL + id: gvsbuild-url + shell: bash + run: | + test -z "${{ github.event.inputs.gvsbuild-tag }}" && tag=latest || tag="${{ github.event.inputs.gvsbuild-tag }}" + if [[ "$tag" == "latest" ]]; then URL="https://github.com/${{ github.repository_owner }}/gvsbuild-release/releases/$tag/download"; else URL="https://github.com/${{ github.repository_owner }}/gvsbuild-release/releases/download/$tag" ; fi + echo "gvsbuild-release-url=$URL" >> $GITHUB_OUTPUT + + - name: Install GTK + run: | + $WebClient = New-Object System.Net.WebClient + $WebClient.DownloadFile("${{ steps.gvsbuild-url.outputs.gvsbuild-release-url }}/gvsbuild-py${{ matrix.python-version }}-vs17-${{matrix.arch}}.zip","C:\GTK.zip") + 7z x C:\GTK.zip -oc:\GTK + echo "C:\GTK\release\lib" | Out-File -FilePath $env:GITHUB_PATH -Append + echo "C:\GTK\release\bin" | Out-File -FilePath $env:GITHUB_PATH -Append + echo "C:\GTK\release" | Out-File -FilePath $env:GITHUB_PATH -Append + python -m pip install --no-index --find-links="C:\GTK\release\python" pycairo PyGObject + - name: Install dependencies run: | pip install --upgrade pip wheel setuptools diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index a23e264b81..f6f36e2392 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -29,7 +29,7 @@ jobs: run: | pip install --upgrade pip wheel pip install tox - sudo apt-get install enchant-2 + sudo apt-get install enchant-2 libgirepository1.0-dev - name: Build docs with tox env: diff --git a/deluge/tests/common.py b/deluge/tests/common.py index b5941568d3..af221de2d5 100644 --- a/deluge/tests/common.py +++ b/deluge/tests/common.py @@ -11,6 +11,7 @@ import traceback import pytest +import pytest_twisted from twisted.internet import defer, protocol, reactor from twisted.internet.defer import Deferred from twisted.internet.error import CannotListenError @@ -130,7 +131,7 @@ def outConnectionLost(self): # NOQA: N802 with open(self.logfile, 'w') as f: f.write(self.log_output) - @defer.inlineCallbacks + @pytest_twisted.inlineCallbacks def kill(self): """Kill the running process. @@ -296,7 +297,7 @@ def start_core( if extra_callbacks: callbacks.extend(extra_callbacks) - @defer.inlineCallbacks + @pytest_twisted.inlineCallbacks def shutdown_daemon(): username, password = get_localhost_auth() client = Client() diff --git a/deluge/tests/daemon_base.py b/deluge/tests/daemon_base.py index 707570f174..56dba574fd 100644 --- a/deluge/tests/daemon_base.py +++ b/deluge/tests/daemon_base.py @@ -5,7 +5,7 @@ # import pytest -from twisted.internet import defer +import pytest_twisted from twisted.internet.error import CannotListenError import deluge.component as component @@ -29,7 +29,7 @@ def terminate_core(self, *args): d = self.core.kill() return d - @defer.inlineCallbacks + @pytest_twisted.inlineCallbacks def start_core( self, arg, diff --git a/deluge/tests/test_maybe_coroutine.py b/deluge/tests/test_maybe_coroutine.py index afaf171ba2..302b3f888b 100644 --- a/deluge/tests/test_maybe_coroutine.py +++ b/deluge/tests/test_maybe_coroutine.py @@ -6,19 +6,19 @@ import pytest import pytest_twisted import twisted.python.failure -from twisted.internet import defer, reactor, task +from twisted.internet import reactor, task from twisted.internet.defer import maybeDeferred from deluge.decorators import maybe_coroutine -@defer.inlineCallbacks +@pytest_twisted.inlineCallbacks def inline_func(): result = yield task.deferLater(reactor, 0, lambda: 'function_result') return result -@defer.inlineCallbacks +@pytest_twisted.inlineCallbacks def inline_error(): raise Exception('function_error') yield @@ -35,13 +35,13 @@ async def coro_error(): raise Exception('function_error') -@defer.inlineCallbacks +@pytest_twisted.inlineCallbacks def coro_func_from_inline(): result = yield coro_func() return result -@defer.inlineCallbacks +@pytest_twisted.inlineCallbacks def coro_error_from_inline(): result = yield coro_error() return result diff --git a/deluge/tests/test_ui_entry.py b/deluge/tests/test_ui_entry.py index b0948f4672..0f77ab3ab4 100644 --- a/deluge/tests/test_ui_entry.py +++ b/deluge/tests/test_ui_entry.py @@ -13,7 +13,6 @@ import pytest import pytest_twisted -from twisted.internet import defer import deluge import deluge.component as component @@ -353,7 +352,8 @@ def test_console_command_add(self): fd = StringFileDescriptor(sys.stdout) self.patch(sys, 'stdout', fd) - yield self.exec_command() + with mock.patch('deluge.ui.console.main.ConsoleUI.quit', autospec=True): + yield self.exec_command() std_output = fd.out.getvalue() assert ( @@ -377,7 +377,8 @@ def test_console_command_add_move_completed(self): fd = StringFileDescriptor(sys.stdout) self.patch(sys, 'stdout', fd) - yield self.exec_command() + with mock.patch('deluge.ui.console.main.ConsoleUI.quit', autospec=True): + yield self.exec_command() std_output = fd.out.getvalue() assert std_output.endswith( @@ -391,19 +392,22 @@ async def test_console_command_status(self): self.patch_arg_command(['status']) self.patch(sys, 'stdout', fd) - await self.exec_command() + with mock.patch('deluge.ui.console.main.ConsoleUI.quit', autospec=True): + await self.exec_command() std_output = fd.out.getvalue() assert std_output.startswith('Total upload: ') assert std_output.endswith(' Moving: 0\n') - @defer.inlineCallbacks + @pytest_twisted.inlineCallbacks def test_console_command_config_set_download_location(self): fd = StringFileDescriptor(sys.stdout) self.patch_arg_command(['config --set download_location /downloads']) self.patch(sys, 'stdout', fd) - yield self.exec_command() + with mock.patch('deluge.ui.console.main.ConsoleUI.quit', autospec=True): + yield self.exec_command() + std_output = fd.out.getvalue() assert std_output.startswith('Setting "download_location" to: \'/downloads\'') assert std_output.endswith('Configuration value successfully updated.\n') diff --git a/deluge/tests/test_web_api.py b/deluge/tests/test_web_api.py index eac7163770..695d60aec8 100644 --- a/deluge/tests/test_web_api.py +++ b/deluge/tests/test_web_api.py @@ -11,7 +11,7 @@ import pytest import pytest_twisted -from twisted.internet import defer, reactor +from twisted.internet import reactor from twisted.web.client import Agent, FileBodyProducer from twisted.web.http_headers import Headers from twisted.web.static import File @@ -45,7 +45,7 @@ def on_connect(result): def test_disconnect(self): d = self.deluge_web.web_api.connect(self.host_id) - @defer.inlineCallbacks + @pytest_twisted.inlineCallbacks def on_connect(result): assert self.deluge_web.web_api.connected() yield self.deluge_web.web_api.disconnect() @@ -76,7 +76,7 @@ def test_set_config(self): assert config['pwd_sha1'] != web_config['pwd_sha1'] assert config['sessions'] != web_config['sessions'] - @defer.inlineCallbacks + @pytest_twisted.inlineCallbacks def get_host_status(self): host = list(self.deluge_web.web_api.hostlist.get_host_info(self.host_id)) host[3] = 'Online' diff --git a/deluge/ui/gtk3/gtkui.py b/deluge/ui/gtk3/gtkui.py index a0c5d8942f..75cab4f308 100644 --- a/deluge/ui/gtk3/gtkui.py +++ b/deluge/ui/gtk3/gtkui.py @@ -21,13 +21,13 @@ # isort:imports-thirdparty from gi.repository.GLib import set_prgname from gi.repository.Gtk import Builder, ResponseType -from twisted.internet import defer, gtk3reactor +from twisted.internet import defer, gireactor from twisted.internet.error import ReactorAlreadyInstalledError from twisted.internet.task import LoopingCall try: # Install twisted reactor, before any other modules import reactor. - reactor = gtk3reactor.install() + reactor = gireactor.install() except ReactorAlreadyInstalledError: # Running unit tests so already installed a rector from twisted.internet import reactor diff --git a/requirements-ci.txt b/requirements-ci.txt index 0ebcd6077f..efc66a4118 100644 --- a/requirements-ci.txt +++ b/requirements-ci.txt @@ -1,4 +1,4 @@ -r requirements.txt -r requirements-tests.txt +pytest libtorrent==2.0.7 -pytest==7.4.2 diff --git a/requirements-tests.txt b/requirements-tests.txt index 346a27500e..89203f829f 100644 --- a/requirements-tests.txt +++ b/requirements-tests.txt @@ -1,4 +1,4 @@ -libtorrent +libtorrent==2.0.7 pytest pytest-twisted pytest-cov