diff -Nru ubiquity-24.04.3/debian/changelog ubiquity-24.04.5/debian/changelog --- ubiquity-24.04.3/debian/changelog 2024-02-12 16:57:10.000000000 +0000 +++ ubiquity-24.04.5/debian/changelog 2024-04-14 18:21:18.000000000 +0000 @@ -1,3 +1,17 @@ +ubiquity (24.04.5) noble; urgency=medium + + [ Dave Jones ] + * plugins/ubi-timezone.py: Update to support libsoup3 API (LP: #1987454) + + -- Steve Langasek Sun, 14 Apr 2024 11:21:18 -0700 + +ubiquity (24.04.4) noble; urgency=medium + + * Bump webkit gir dependency to 4.1. + * Bump soup usage to libsoup3.0. + + -- Steve Langasek Mon, 08 Apr 2024 17:00:03 -0700 + ubiquity (24.04.3) noble; urgency=medium * Fix unit tests compatibilty with python3.12. diff -Nru ubiquity-24.04.3/debian/control ubiquity-24.04.5/debian/control --- ubiquity-24.04.3/debian/control 2023-10-05 16:22:09.000000000 +0000 +++ ubiquity-24.04.5/debian/control 2024-04-08 23:58:41.000000000 +0000 @@ -17,9 +17,9 @@ dh-python, dpkg-dev (>= 1.16.1~), gir1.2-nma-1.0, - gir1.2-soup-2.4, + gir1.2-soup-3.0, gir1.2-timezonemap-1.0, - gir1.2-webkit2-4.0, + gir1.2-webkit2-4.1, gir1.2-xkl-1.0, gobject-introspection, imagemagick, @@ -135,10 +135,10 @@ gir1.2-gtk-3.0 (>= 3.20), gir1.2-nma-1.0, gir1.2-pango-1.0, - gir1.2-soup-2.4, + gir1.2-soup-3.0, gir1.2-timezonemap-1.0, gir1.2-vte-2.91, - gir1.2-webkit2-4.0, + gir1.2-webkit2-4.1, gir1.2-xkl-1.0, iso-codes, metacity | marco | xfwm4 | matchbox-window-manager | openbox | gnome-shell | budgie-core, diff -Nru ubiquity-24.04.3/tests/test_timezone.py ubiquity-24.04.5/tests/test_timezone.py --- ubiquity-24.04.3/tests/test_timezone.py 2023-10-05 16:04:46.000000000 +0000 +++ ubiquity-24.04.5/tests/test_timezone.py 2024-04-08 23:48:42.000000000 +0000 @@ -24,7 +24,7 @@ controller.dbfilter = self.ubi_timezone.Page(None, db=db) self.gtk = self.ubi_timezone.PageGtk(controller) - @mock.patch('gi.repository.Soup.SessionAsync') + @mock.patch('gi.repository.Soup.Session') @mock.patch('gi.repository.Soup.Message') @mock.patch('json.loads') def test_city_entry(self, json_mock, *args): diff -Nru ubiquity-24.04.3/ubiquity/frontend/gtk_ui.py ubiquity-24.04.5/ubiquity/frontend/gtk_ui.py --- ubiquity-24.04.3/ubiquity/frontend/gtk_ui.py 2023-10-05 16:04:46.000000000 +0000 +++ ubiquity-24.04.5/ubiquity/frontend/gtk_ui.py 2024-04-14 18:18:16.000000000 +0000 @@ -963,7 +963,7 @@ return True def on_slideshow_link_clicked(self, web_view, decision, decision_type): - gi.require_version('WebKit2', '4.0') + gi.require_version('WebKit2', '4.1') from gi.repository import WebKit2 if decision_type == WebKit2.PolicyDecisionType.NEW_WINDOW_ACTION: request = decision.get_request() @@ -1000,7 +1000,7 @@ slides = 'file://%s#%s' % (slideshow_main, parameters_encoded) - gi.require_version('WebKit2', '4.0') + gi.require_version('WebKit2', '4.1') from gi.repository import WebKit2 # We have no significant browsing interface, so there isn't much point # in WebKit creating a memory-hungry cache. diff -Nru ubiquity-24.04.3/ubiquity/plugins/ubi-timezone.py ubiquity-24.04.5/ubiquity/plugins/ubi-timezone.py --- ubiquity-24.04.3/ubiquity/plugins/ubi-timezone.py 2023-10-05 16:04:46.000000000 +0000 +++ ubiquity-24.04.5/ubiquity/plugins/ubi-timezone.py 2024-04-14 18:18:23.000000000 +0000 @@ -94,8 +94,8 @@ def changed(self, entry): import gi - gi.require_version('Soup', '2.4') - from gi.repository import Gtk, GObject, GLib, Soup + gi.require_version('Soup', '3.0') + from gi.repository import Gtk, GObject, GLib, Gio, Soup text = misc.utf8(self.city_entry.get_text()) if not text: @@ -111,18 +111,20 @@ GObject.TYPE_STRING) if self.geoname_session is None: - self.geoname_session = Soup.SessionAsync() + self.geoname_session = Soup.Session() url = _geoname_url % (quote(text), misc.get_release().version) message = Soup.Message.new('GET', url) - message.request_headers.append('User-agent', 'Ubiquity/1.0') + message.get_request_headers().replace('User-agent', 'Ubiquity/1.0') self.geoname_session.abort() if self.geoname_timeout_id is not None: GLib.source_remove(self.geoname_timeout_id) + cancellable = Gio.Cancellable() self.geoname_timeout_id = \ GLib.timeout_add_seconds(2, self.geoname_timeout, - (text, model)) - self.geoname_session.queue_message(message, self.geoname_cb, - (text, model)) + (text, model, cancellable)) + self.geoname_session.send_and_read_async( + message, GLib.PRIORITY_DEFAULT, cancellable, self.geoname_cb, + (text, model)) def geoname_add_tzdb(self, text, model): if len(model): @@ -147,16 +149,17 @@ str(loc.latitude), str(loc.longitude)]) def geoname_timeout(self, user_data): - text, model = user_data + text, model, cancellable = user_data + cancellable.cancel() self.geoname_add_tzdb(text, model) self.geoname_timeout_id = None self.city_entry.get_completion().set_model(model) return False - def geoname_cb(self, session, message, user_data): + def geoname_cb(self, session, result, user_data): import syslog import json - from gi.repository import GLib, Soup + from gi.repository import GLib, Gio, Soup text, model = user_data @@ -165,27 +168,37 @@ self.geoname_timeout_id = None self.geoname_add_tzdb(text, model) - if message.status_code == Soup.KnownStatusCode.CANCELLED: - # Silently ignore cancellation. - pass - elif message.status_code != Soup.KnownStatusCode.OK: - # Log but otherwise ignore failures. - syslog.syslog( - 'Geoname lookup for "%s" failed: %d %s' % - (text, message.status_code, message.reason_phrase)) + message = session.get_async_result_message(result) + try: + response = session.send_and_read_finish(result) + except GLib.GError as err: + if err.code == Gio.IOErrorEnum.CANCELLED: + # Silently ignore cancellation. + pass + else: + # Log but otherwise ignore failures. + syslog.syslog( + 'Geoname lookup for "%s" failed: %s' % (text, err.message)) else: - try: - for result in json.loads(message.response_body.data): - model.append([ - result['name'], result['admin1'], result['country'], - result['latitude'], result['longitude']]) - - # Only cache positive results. - self.geoname_cache[text] = model - - except ValueError: + if message.get_status() != Soup.Status.OK: + # Log but otherwise ignore failures syslog.syslog( - 'Server return does not appear to be valid JSON.') + 'Geoname lookup for "%s" failed: %s %s' % + (text, message.get_status(), message.get_reason_phrase())) + else: + try: + for result in json.loads(response.get_data().decode()): + model.append([ + result['name'], result['admin1'], + result['country'], result['latitude'], + result['longitude']]) + + # Only cache positive results. + self.geoname_cache[text] = model + + except ValueError: + syslog.syslog( + 'Server return does not appear to be valid JSON.') self.city_entry.get_completion().set_model(model)