From 0dfe239f016d2a2ac9a0ff2429ce8a5b24b59c5c Mon Sep 17 00:00:00 2001
From: Oliver Smith <ollieparanoid@postmarketos.org>
Date: Sun, 24 Nov 2024 14:15:54 +0100
Subject: [PATCH] community/py3-mygpoclient: upgrade to 1.10

---
 community/py3-mygpoclient/APKBUILD          |  10 +-
 community/py3-mygpoclient/python-3.12.patch | 707 --------------------
 2 files changed, 4 insertions(+), 713 deletions(-)
 delete mode 100644 community/py3-mygpoclient/python-3.12.patch

diff --git a/community/py3-mygpoclient/APKBUILD b/community/py3-mygpoclient/APKBUILD
index 87d0a27bf91a..8d23a05a1ca5 100644
--- a/community/py3-mygpoclient/APKBUILD
+++ b/community/py3-mygpoclient/APKBUILD
@@ -1,8 +1,8 @@
 # Maintainer: Oliver Smith <ollieparanoid@postmarketos.org>
 # Contributor: Johannes Marbach <n0-0ne+gitlab@mailbox.org>
 pkgname=py3-mygpoclient
-pkgver=1.9
-pkgrel=3
+pkgver=1.10
+pkgrel=0
 pkgdesc="Python Client Library for gpodder.net"
 url="https://github.com/gpodder/mygpoclient"
 arch="noarch"
@@ -11,8 +11,7 @@ depends="python3"
 makedepends="py3-setuptools"
 checkdepends="py3-nose py3-pytest py3-pytest-cov py3-minimock"
 subpackages="$pkgname-doc $pkgname-pyc"
-source="$pkgname-$pkgver.tar.gz::https://github.com/gpodder/mygpoclient/archive/$pkgver.tar.gz
-	python-3.12.patch"
+source="$pkgname-$pkgver.tar.gz::https://github.com/gpodder/mygpoclient/archive/$pkgver.tar.gz"
 builddir="$srcdir/mygpoclient-$pkgver"
 
 build() {
@@ -28,6 +27,5 @@ package() {
 }
 
 sha512sums="
-57502295725d3a1351e877998442141dd596927215d3746786c12db061ebe3bdf8282e8b2d554997515a558f608c0815e4caad311ad3f1ea9f5b62321e8d6635  py3-mygpoclient-1.9.tar.gz
-46c598d84b12720f0ff949722eca4b3f93cccb3f3b970e0a10ea52183621dfe804647dd3d7dafa7385b2eaf1170d6ec678cb0672ede14bf6415a36b0b8112ef2  python-3.12.patch
+65af230ad86da9dd93023b17737774fcdbd1622c7623cf1934cb63a3e63fad642faecfd2f00461830e492fe14cc61cc47f92a0b0e3970961be1714cffb71255d  py3-mygpoclient-1.10.tar.gz
 "
diff --git a/community/py3-mygpoclient/python-3.12.patch b/community/py3-mygpoclient/python-3.12.patch
deleted file mode 100644
index baf8d7f5eb72..000000000000
--- a/community/py3-mygpoclient/python-3.12.patch
+++ /dev/null
@@ -1,707 +0,0 @@
-From 83883fed6fc93c6fbd73d8350e5251b633f9f028 Mon Sep 17 00:00:00 2001
-From: Gwyn Ciesla <gwync@protonmail.com>
-Date: Tue, 5 Sep 2023 10:53:04 -0500
-Subject: [PATCH 1/3] Python 3.12 unittest fixes.
-
----
- mygpoclient/api_test.py     | 206 ++++++++++++++++++------------------
- mygpoclient/http_test.py    |  12 +--
- mygpoclient/json_test.py    |   6 +-
- mygpoclient/locator_test.py |  10 +-
- mygpoclient/public_test.py  |  24 ++---
- mygpoclient/simple_test.py  |  12 +--
- 6 files changed, 135 insertions(+), 135 deletions(-)
-
-diff --git a/mygpoclient/api_test.py b/mygpoclient/api_test.py
-index 738c719..3ff2847 100644
---- a/mygpoclient/api_test.py
-+++ b/mygpoclient/api_test.py
-@@ -48,9 +48,9 @@ class Test_SubscriptionChanges(unittest.TestCase):
- 
-     def test_initSetsCorrectAttributes(self):
-         changes = api.SubscriptionChanges(self.ADD, self.REMOVE, self.SINCE)
--        self.assertEquals(changes.add, self.ADD)
--        self.assertEquals(changes.remove, self.REMOVE)
--        self.assertEquals(changes.since, self.SINCE)
-+        self.assertEqual(changes.add, self.ADD)
-+        self.assertEqual(changes.remove, self.REMOVE)
-+        self.assertEqual(changes.since, self.SINCE)
- 
- 
- class Test_EpisodeActionChanges(unittest.TestCase):
-@@ -63,8 +63,8 @@ class Test_EpisodeActionChanges(unittest.TestCase):
- 
-     def test_initSetsCorrectAttributes(self):
-         changes = api.EpisodeActionChanges(self.ACTIONS, self.SINCE)
--        self.assertEquals(changes.actions, self.ACTIONS)
--        self.assertEquals(changes.since, self.SINCE)
-+        self.assertEqual(changes.actions, self.ACTIONS)
-+        self.assertEqual(changes.since, self.SINCE)
- 
- 
- class Test_PodcastDevice(unittest.TestCase):
-@@ -72,10 +72,10 @@ class Test_PodcastDevice(unittest.TestCase):
- 
-     def test_initSetsCorrectAttributes(self):
-         device = api.PodcastDevice(DEVICE_ID_1, self.CAPTION, 'mobile', 42)
--        self.assertEquals(device.device_id, DEVICE_ID_1)
--        self.assertEquals(device.caption, self.CAPTION)
--        self.assertEquals(device.type, 'mobile')
--        self.assertEquals(device.subscriptions, 42)
-+        self.assertEqual(device.device_id, DEVICE_ID_1)
-+        self.assertEqual(device.caption, self.CAPTION)
-+        self.assertEqual(device.type, 'mobile')
-+        self.assertEqual(device.subscriptions, 42)
- 
-     def test_invalidDeviceType_raisesValueError(self):
-         self.assertRaises(ValueError,
-@@ -98,14 +98,14 @@ def test_initSetsCorrectAttributes(self):
-         action = api.EpisodeAction(FEED_URL_1, EPISODE_URL_1, 'play',
-                                    DEVICE_ID_1, self.XML_TIMESTAMP, self.VALID_STARTED,
-                                    self.VALID_POSITION, self.VALID_TOTAL)
--        self.assertEquals(action.podcast, FEED_URL_1)
--        self.assertEquals(action.episode, EPISODE_URL_1)
--        self.assertEquals(action.action, 'play')
--        self.assertEquals(action.device, DEVICE_ID_1)
--        self.assertEquals(action.timestamp, self.XML_TIMESTAMP)
--        self.assertEquals(action.started, self.VALID_STARTED)
--        self.assertEquals(action.position, self.VALID_POSITION)
--        self.assertEquals(action.total, self.VALID_TOTAL)
-+        self.assertEqual(action.podcast, FEED_URL_1)
-+        self.assertEqual(action.episode, EPISODE_URL_1)
-+        self.assertEqual(action.action, 'play')
-+        self.assertEqual(action.device, DEVICE_ID_1)
-+        self.assertEqual(action.timestamp, self.XML_TIMESTAMP)
-+        self.assertEqual(action.started, self.VALID_STARTED)
-+        self.assertEqual(action.position, self.VALID_POSITION)
-+        self.assertEqual(action.total, self.VALID_TOTAL)
- 
-     def test_invalidAction_raisesValueError(self):
-         self.assertRaises(ValueError,
-@@ -155,36 +155,36 @@ def test_invalidTotalFormat_raisesValueError(self):
-     def test_toDictionary_containsMandatoryAttributes(self):
-         action = api.EpisodeAction(FEED_URL_1, EPISODE_URL_1, 'play')
-         dictionary = action.to_dictionary()
--        self.assertEquals(len(list(dictionary.keys())), 3)
--        self.assert_('podcast' in dictionary)
--        self.assert_('episode' in dictionary)
--        self.assert_('action' in dictionary)
--        self.assertEquals(dictionary['podcast'], FEED_URL_1)
--        self.assertEquals(dictionary['episode'], EPISODE_URL_1)
--        self.assertEquals(dictionary['action'], 'play')
-+        self.assertEqual(len(list(dictionary.keys())), 3)
-+        self.assertTrue('podcast' in dictionary)
-+        self.assertTrue('episode' in dictionary)
-+        self.assertTrue('action' in dictionary)
-+        self.assertEqual(dictionary['podcast'], FEED_URL_1)
-+        self.assertEqual(dictionary['episode'], EPISODE_URL_1)
-+        self.assertEqual(dictionary['action'], 'play')
- 
-     def test_toDictionary_containsAllAttributes(self):
-         action = api.EpisodeAction(FEED_URL_3, EPISODE_URL_4, 'play',
-                                    DEVICE_ID_1, self.XML_TIMESTAMP, self.VALID_STARTED,
-                                    self.VALID_POSITION, self.VALID_TOTAL)
-         dictionary = action.to_dictionary()
--        self.assertEquals(len(list(dictionary.keys())), 8)
--        self.assert_('podcast' in dictionary)
--        self.assert_('episode' in dictionary)
--        self.assert_('action' in dictionary)
--        self.assert_('device' in dictionary)
--        self.assert_('timestamp' in dictionary)
--        self.assert_('started' in dictionary)
--        self.assert_('position' in dictionary)
--        self.assert_('total' in dictionary)
--        self.assertEquals(dictionary['podcast'], FEED_URL_3)
--        self.assertEquals(dictionary['episode'], EPISODE_URL_4)
--        self.assertEquals(dictionary['action'], 'play')
--        self.assertEquals(dictionary['device'], DEVICE_ID_1)
--        self.assertEquals(dictionary['timestamp'], self.XML_TIMESTAMP)
--        self.assertEquals(dictionary['started'], self.VALID_STARTED)
--        self.assertEquals(dictionary['position'], self.VALID_POSITION)
--        self.assertEquals(dictionary['total'], self.VALID_TOTAL)
-+        self.assertEqual(len(list(dictionary.keys())), 8)
-+        self.assertTrue('podcast' in dictionary)
-+        self.assertTrue('episode' in dictionary)
-+        self.assertTrue('action' in dictionary)
-+        self.assertTrue('device' in dictionary)
-+        self.assertTrue('timestamp' in dictionary)
-+        self.assertTrue('started' in dictionary)
-+        self.assertTrue('position' in dictionary)
-+        self.assertTrue('total' in dictionary)
-+        self.assertEqual(dictionary['podcast'], FEED_URL_3)
-+        self.assertEqual(dictionary['episode'], EPISODE_URL_4)
-+        self.assertEqual(dictionary['action'], 'play')
-+        self.assertEqual(dictionary['device'], DEVICE_ID_1)
-+        self.assertEqual(dictionary['timestamp'], self.XML_TIMESTAMP)
-+        self.assertEqual(dictionary['started'], self.VALID_STARTED)
-+        self.assertEqual(dictionary['position'], self.VALID_POSITION)
-+        self.assertEqual(dictionary['total'], self.VALID_TOTAL)
- 
- 
- class Test_MygPodderClient(unittest.TestCase):
-@@ -222,14 +222,14 @@ def setUp(self):
-     def set_http_response_value(self, value):
-         self.fake_client.response_value = value
- 
--    def assert_http_request_count(self, count):
--        self.assertEquals(len(self.fake_client.requests), count)
-+    def assertTruehttp_request_count(self, count):
-+        self.assertEqual(len(self.fake_client.requests), count)
- 
-     def has_put_json_data(self, data, required_method='PUT'):
-         """Returns True if the FakeJsonClient has received the given data"""
-         for method, uri, sent in self.fake_client.requests:
-             if method == required_method:
--                self.assertEquals(sent, data)
-+                self.assertEqual(sent, data)
-                 return True
- 
-         return False
-@@ -241,17 +241,17 @@ def has_posted_json_data(self, data):
-     def test_getSubscriptions_withPodcastDevice(self):
-         self.set_http_response_value(b'[]')
-         device = api.PodcastDevice('manatee', 'My Device', 'mobile', 20)
--        self.assertEquals(self.client.get_subscriptions(device), [])
--        self.assert_http_request_count(1)
-+        self.assertEqual(self.client.get_subscriptions(device), [])
-+        self.assertTruehttp_request_count(1)
- 
-     def test_putSubscriptions_withPodcastDevice(self):
-         self.set_http_response_value(b'')
-         device = api.PodcastDevice('manatee', 'My Device', 'mobile', 20)
--        self.assertEquals(
-+        self.assertEqual(
-             self.client.put_subscriptions(
-                 device, self.ADD), True)
--        self.assert_http_request_count(1)
--        self.assert_(self.has_put_json_data(self.ADD))
-+        self.assertTruehttp_request_count(1)
-+        self.assertTrue(self.has_put_json_data(self.ADD))
- 
-     def test_updateSubscriptions_raisesValueError_onInvalidAddList(self):
-         self.assertRaises(ValueError,
-@@ -334,12 +334,12 @@ def test_updateSubscriptions_returnsUpdateResult(self):
-         result = self.client.update_subscriptions(DEVICE_ID_1,
-                                                   self.ADD, self.REMOVE)
-         # result is a UpdateResult object
--        self.assert_(hasattr(result, 'since'))
--        self.assert_(hasattr(result, 'update_urls'))
--        self.assertEquals(result.since, self.SINCE)
--        self.assertEquals(result.update_urls, update_urls_expected)
--        self.assert_http_request_count(1)
--        self.assert_(self.has_posted_json_data(self.ADD_REMOVE_AS_JSON_UPLOAD))
-+        self.assertTrue(hasattr(result, 'since'))
-+        self.assertTrue(hasattr(result, 'update_urls'))
-+        self.assertEqual(result.since, self.SINCE)
-+        self.assertEqual(result.update_urls, update_urls_expected)
-+        self.assertTruehttp_request_count(1)
-+        self.assertTrue(self.has_posted_json_data(self.ADD_REMOVE_AS_JSON_UPLOAD))
- 
-     def test_pullSubscriptions_raisesInvalidResponse_onEmptyResponse(self):
-         self.set_http_response_value(b'')
-@@ -442,10 +442,10 @@ def test_pullSubscriptions_returnsChangesListAndTimestamp(self):
-         "timestamp": 1262103016}
-         """)
-         changes = self.client.pull_subscriptions(DEVICE_ID_2)
--        self.assertEquals(changes.add, [FEED_URL_1, FEED_URL_2])
--        self.assertEquals(changes.remove, [FEED_URL_3, FEED_URL_4])
--        self.assertEquals(changes.since, self.SINCE)
--        self.assert_http_request_count(1)
-+        self.assertEqual(changes.add, [FEED_URL_1, FEED_URL_2])
-+        self.assertEqual(changes.remove, [FEED_URL_3, FEED_URL_4])
-+        self.assertEqual(changes.since, self.SINCE)
-+        self.assertTruehttp_request_count(1)
- 
-     def test_uploadEpisodeActions_raisesInvalidResponse_onEmptyResponse(self):
-         self.set_http_response_value(b'')
-@@ -471,9 +471,9 @@ def test_uploadEpisodeActions_returnsTimestamp(self):
-         {"timestamp": 1262103016}
-         """)
-         result = self.client.upload_episode_actions(self.ACTIONS)
--        self.assertEquals(result, self.SINCE)
--        self.assert_http_request_count(1)
--        self.assert_(self.has_posted_json_data(self.ACTIONS_AS_JSON_UPLOAD))
-+        self.assertEqual(result, self.SINCE)
-+        self.assertTruehttp_request_count(1)
-+        self.assertTrue(self.has_posted_json_data(self.ACTIONS_AS_JSON_UPLOAD))
- 
-     def test_downloadEpisodeActions_raisesInvalidResponse_onEmptyResponse(
-             self):
-@@ -535,47 +535,47 @@ def test_downloadEpisodeActions_returnsActionList(self):
-         ], "timestamp": 1262103016}
-         """)
-         changes = self.client.download_episode_actions()
--        self.assertEquals(len(changes.actions), 2)
-+        self.assertEqual(len(changes.actions), 2)
-         action1, action2 = changes.actions
--        self.assertEquals(action1.podcast, 'a')
--        self.assertEquals(action1.episode, 'b')
--        self.assertEquals(action1.action, 'download')
--        self.assertEquals(action2.podcast, 'x')
--        self.assertEquals(action2.episode, 'y')
--        self.assertEquals(action2.action, 'play')
--        self.assertEquals(changes.since, self.SINCE)
--        self.assert_http_request_count(1)
-+        self.assertEqual(action1.podcast, 'a')
-+        self.assertEqual(action1.episode, 'b')
-+        self.assertEqual(action1.action, 'download')
-+        self.assertEqual(action2.podcast, 'x')
-+        self.assertEqual(action2.episode, 'y')
-+        self.assertEqual(action2.action, 'play')
-+        self.assertEqual(changes.since, self.SINCE)
-+        self.assertTruehttp_request_count(1)
- 
-     def test_updateDeviceSettings_withNothing(self):
-         self.set_http_response_value(b'')
-         result = self.client.update_device_settings(DEVICE_ID_1)
--        self.assertEquals(result, True)
--        self.assert_http_request_count(1)
--        self.assert_(self.has_posted_json_data({}))
-+        self.assertEqual(result, True)
-+        self.assertTruehttp_request_count(1)
-+        self.assertTrue(self.has_posted_json_data({}))
- 
-     def test_updateDeviceSettings_withCaption(self):
-         self.set_http_response_value(b'')
-         result = self.client.update_device_settings(DEVICE_ID_1,
-                                                     caption='Poodonkis')
--        self.assertEquals(result, True)
--        self.assert_http_request_count(1)
--        self.assert_(self.has_posted_json_data({'caption': 'Poodonkis'}))
-+        self.assertEqual(result, True)
-+        self.assertTruehttp_request_count(1)
-+        self.assertTrue(self.has_posted_json_data({'caption': 'Poodonkis'}))
- 
-     def test_updateDeviceSettings_withType(self):
-         self.set_http_response_value(b'')
-         result = self.client.update_device_settings(DEVICE_ID_1,
-                                                     type='desktop')
--        self.assertEquals(result, True)
--        self.assert_http_request_count(1)
--        self.assert_(self.has_posted_json_data({'type': 'desktop'}))
-+        self.assertEqual(result, True)
-+        self.assertTruehttp_request_count(1)
-+        self.assertTrue(self.has_posted_json_data({'type': 'desktop'}))
- 
-     def test_updateDeviceSettings_withCaptionAndType(self):
-         self.set_http_response_value(b'')
-         result = self.client.update_device_settings(DEVICE_ID_1,
-                                                     'My Unit Testing Device', 'desktop')
--        self.assertEquals(result, True)
--        self.assert_http_request_count(1)
--        self.assert_(self.has_posted_json_data({
-+        self.assertEqual(result, True)
-+        self.assertTruehttp_request_count(1)
-+        self.assertTrue(self.has_posted_json_data({
-             'caption': 'My Unit Testing Device',
-             'type': 'desktop'}))
- 
-@@ -610,17 +610,17 @@ def test_getDevices_returnsDeviceList(self):
-         ]
-         """)
-         devices = self.client.get_devices()
--        self.assertEquals(len(devices), 2)
-+        self.assertEqual(len(devices), 2)
-         device1, device2 = devices
--        self.assertEquals(device1.device_id, DEVICE_ID_1)
--        self.assertEquals(device1.caption, 'Phone')
--        self.assertEquals(device1.type, 'mobile')
--        self.assertEquals(device1.subscriptions, 42)
--        self.assertEquals(device2.device_id, DEVICE_ID_2)
--        self.assertEquals(device2.caption, 'The Lappy')
--        self.assertEquals(device2.type, 'laptop')
--        self.assertEquals(device2.subscriptions, 4711)
--        self.assert_http_request_count(1)
-+        self.assertEqual(device1.device_id, DEVICE_ID_1)
-+        self.assertEqual(device1.caption, 'Phone')
-+        self.assertEqual(device1.type, 'mobile')
-+        self.assertEqual(device1.subscriptions, 42)
-+        self.assertEqual(device2.device_id, DEVICE_ID_2)
-+        self.assertEqual(device2.caption, 'The Lappy')
-+        self.assertEqual(device2.type, 'laptop')
-+        self.assertEqual(device2.subscriptions, 4711)
-+        self.assertTruehttp_request_count(1)
- 
-     def test_getFavoriteEpisodes_returnsEpisodeList(self):
-         self.set_http_response_value(b"""
-@@ -644,24 +644,24 @@ def test_getFavoriteEpisodes_returnsEpisodeList(self):
-         ]
-         """)
-         favorites = self.client.get_favorite_episodes()
--        self.assertEquals(len(favorites), 2)
-+        self.assertEqual(len(favorites), 2)
-         episode1, episode2 = favorites
--        self.assertEquals(episode1.title, 'TWiT 245: No Hitler For You')
--        self.assertEquals(
-+        self.assertEqual(episode1.title, 'TWiT 245: No Hitler For You')
-+        self.assertEqual(
-             episode1.url,
-             'http://www.podtrac.com/pts/redirect.mp3/aolradio.podcast.aol.com/twit/twit0245.mp3')
--        self.assertEquals(
-+        self.assertEqual(
-             episode1.podcast_title,
-             'this WEEK in TECH - MP3 Edition')
--        self.assertEquals(episode1.podcast_url, 'http://leo.am/podcasts/twit')
--        self.assertEquals(episode1.description, '[...]')
--        self.assertEquals(
-+        self.assertEqual(episode1.podcast_url, 'http://leo.am/podcasts/twit')
-+        self.assertEqual(episode1.description, '[...]')
-+        self.assertEqual(
-             episode1.website,
-             'http://www.podtrac.com/pts/redirect.mp3/aolradio.podcast.aol.com/twit/twit0245.mp3')
--        self.assertEquals(episode1.released, '2010-12-25T00:30:00')
--        self.assertEquals(
-+        self.assertEqual(episode1.released, '2010-12-25T00:30:00')
-+        self.assertEqual(
-             episode1.mygpo_link,
-             'http://gpodder.net/episode/1046492')
--        self.assertEquals(
-+        self.assertEqual(
-             episode2.website,
-             'http://feedproxy.google.com/~r/coverville/~3/5UK8-PZmmMQ/')
-diff --git a/mygpoclient/http_test.py b/mygpoclient/http_test.py
-index 0bb9491..478ba2b 100644
---- a/mygpoclient/http_test.py
-+++ b/mygpoclient/http_test.py
-@@ -171,12 +171,12 @@ def test_BadRequest(self):
-     def test_GET(self):
-         client = HttpClient()
-         path = self.URI_BASE + '/noauth'
--        self.assertEquals(client.GET(path), self.RESPONSE)
-+        self.assertEqual(client.GET(path), self.RESPONSE)
- 
-     def test_authenticated_GET(self):
-         client = HttpClient(self.USERNAME, self.PASSWORD)
-         path = self.URI_BASE + '/auth'
--        self.assertEquals(client.GET(path), self.RESPONSE)
-+        self.assertEqual(client.GET(path), self.RESPONSE)
- 
-     def test_unauthenticated_GET(self):
-         client = HttpClient()
-@@ -186,7 +186,7 @@ def test_unauthenticated_GET(self):
-     def test_POST(self):
-         client = HttpClient()
-         path = self.URI_BASE + '/noauth'
--        self.assertEquals(
-+        self.assertEqual(
-             client.POST(
-                 path, self.DUMMYDATA), codecs.encode(
-                 self.DUMMYDATA.decode('utf-8'), 'rot-13').encode('utf-8'))
-@@ -194,7 +194,7 @@ def test_POST(self):
-     def test_authenticated_POST(self):
-         client = HttpClient(self.USERNAME, self.PASSWORD)
-         path = self.URI_BASE + '/auth'
--        self.assertEquals(
-+        self.assertEqual(
-             client.POST(
-                 path, self.DUMMYDATA), codecs.encode(
-                 self.DUMMYDATA.decode('utf-8'), 'rot-13').encode('utf-8'))
-@@ -207,14 +207,14 @@ def test_unauthenticated_POST(self):
-     def test_PUT(self):
-         client = HttpClient()
-         path = self.URI_BASE + '/noauth'
--        self.assertEquals(client.PUT(path, self.DUMMYDATA), b'PUT OK')
-+        self.assertEqual(client.PUT(path, self.DUMMYDATA), b'PUT OK')
- 
-     def test_GET_after_PUT(self):
-         client = HttpClient()
-         for i in range(10):
-             path = self.URI_BASE + '/file.%(i)d.txt' % locals()
-             client.PUT(path, self.RESPONSE + str(i).encode('utf-8'))
--            self.assertEquals(
-+            self.assertEqual(
-                 client.GET(path),
-                 self.RESPONSE +
-                 str(i).encode('utf-8'))
-diff --git a/mygpoclient/json_test.py b/mygpoclient/json_test.py
-index 8517b56..a8a370a 100644
---- a/mygpoclient/json_test.py
-+++ b/mygpoclient/json_test.py
-@@ -61,17 +61,17 @@ def test_parseResponse_worksWithDictionary(self):
-         client = json.JsonClient(self.USERNAME, self.PASSWORD)
-         self.mock_setHttpResponse(b'{"a": "B", "c": "D"}')
-         items = list(sorted(client.GET(self.URI_BASE + '/').items()))
--        self.assertEquals(items, [('a', 'B'), ('c', 'D')])
-+        self.assertEqual(items, [('a', 'B'), ('c', 'D')])
- 
-     def test_parseResponse_worksWithIntegerList(self):
-         client = json.JsonClient(self.USERNAME, self.PASSWORD)
-         self.mock_setHttpResponse(b'[1,2,3,6,7]')
--        self.assertEquals(client.GET(self.URI_BASE + '/'), [1, 2, 3, 6, 7])
-+        self.assertEqual(client.GET(self.URI_BASE + '/'), [1, 2, 3, 6, 7])
- 
-     def test_parseResponse_emptyString_returnsNone(self):
-         client = json.JsonClient(self.USERNAME, self.PASSWORD)
-         self.mock_setHttpResponse(b'')
--        self.assertEquals(client.GET(self.URI_BASE + '/'), None)
-+        self.assertEqual(client.GET(self.URI_BASE + '/'), None)
- 
-     def test_invalidContent_raisesJsonException(self):
-         client = json.JsonClient(self.USERNAME, self.PASSWORD)
-diff --git a/mygpoclient/locator_test.py b/mygpoclient/locator_test.py
-index f9e30fd..57eca59 100644
---- a/mygpoclient/locator_test.py
-+++ b/mygpoclient/locator_test.py
-@@ -81,28 +81,28 @@ def test_unsupported_settings_uri_exception2(self):
- 
-     def test_subscriptions_uri_no_device(self):
-         """Test that no device returns user subscriptions"""
--        self.assertEquals(self.locator.subscriptions_uri(),
-+        self.assertEqual(self.locator.subscriptions_uri(),
-                           'http://gpodder.net/subscriptions/jane.opml')
- 
-     def test_root_uri(self):
-         """Test that root_uri trivially works"""
--        self.assertEquals(self.locator.root_uri(),
-+        self.assertEqual(self.locator.root_uri(),
-                           'http://gpodder.net')
- 
-     def test_create_with_url(self):
-         """Test locator creation with a root URL instead of host"""
-         loc = locator.Locator('hello', 'https://gpo.self.hosted/my')
--        self.assertEquals(loc.toplist_uri(),
-+        self.assertEqual(loc.toplist_uri(),
-                           'https://gpo.self.hosted/my/toplist/50.opml')
- 
-     def test_create_with_url_slash(self):
-         """Test locator creation with a root URL ending with a slash"""
-         loc = locator.Locator('hello', 'https://gpo.self.hosted/my/')
--        self.assertEquals(loc.toplist_uri(),
-+        self.assertEqual(loc.toplist_uri(),
-                           'https://gpo.self.hosted/my/toplist/50.opml')
- 
-     def test_create_with_host(self):
-         """Test locator creation with a host"""
-         loc = locator.Locator('hello', 'gpo.self.hosted')
--        self.assertEquals(loc.toplist_uri(),
-+        self.assertEqual(loc.toplist_uri(),
-                           'http://gpo.self.hosted/toplist/50.opml')
-diff --git a/mygpoclient/public_test.py b/mygpoclient/public_test.py
-index 602c834..8287204 100644
---- a/mygpoclient/public_test.py
-+++ b/mygpoclient/public_test.py
-@@ -172,38 +172,38 @@ def setUp(self):
-     def test_getToplist(self):
-         self.fake_client.response_value = self.TOPLIST_JSON
-         result = self.client.get_toplist()
--        self.assertEquals(result, self.TOPLIST)
--        self.assertEquals(len(self.fake_client.requests), 1)
-+        self.assertEqual(result, self.TOPLIST)
-+        self.assertEqual(len(self.fake_client.requests), 1)
- 
-     def test_searchPodcasts(self):
-         self.fake_client.response_value = self.SEARCHRESULT_JSON
-         result = self.client.search_podcasts('wicked')
--        self.assertEquals(result, self.SEARCHRESULT)
--        self.assertEquals(len(self.fake_client.requests), 1)
-+        self.assertEqual(result, self.SEARCHRESULT)
-+        self.assertEqual(len(self.fake_client.requests), 1)
- 
-     def test_getPodcastsOfATag(self):
-         self.fake_client.response_value = self.SEARCHRESULT_JSON
-         result = self.client.get_podcasts_of_a_tag('wicked')
--        self.assertEquals(result, self.SEARCHRESULT)
--        self.assertEquals(len(self.fake_client.requests), 1)
-+        self.assertEqual(result, self.SEARCHRESULT)
-+        self.assertEqual(len(self.fake_client.requests), 1)
- 
-     def test_getTopTags(self):
-         self.fake_client.response_value = self.TOPTAGS_JSON
-         result = self.client.get_toptags()
--        self.assertEquals(result, self.TOPTAGS)
--        self.assertEquals(len(self.fake_client.requests), 1)
-+        self.assertEqual(result, self.TOPTAGS)
-+        self.assertEqual(len(self.fake_client.requests), 1)
- 
-     def test_getPodcastData(self):
-         self.fake_client.response_value = self.PODCAST_JSON
-         result = self.client.get_podcast_data(
-             'http://feeds.feedburner.com/linuxoutlaws')
--        self.assertEquals(result, self.PODCAST)
--        self.assertEquals(len(self.fake_client.requests), 1)
-+        self.assertEqual(result, self.PODCAST)
-+        self.assertEqual(len(self.fake_client.requests), 1)
- 
-     def test_getEpisodeData(self):
-         self.fake_client.response_value = self.EPISODE_JSON
-         result = self.client.get_episode_data(
-             'http://leo.am/podcasts/twit',
-             'http://www.podtrac.com/pts/redirect.mp3/aolradio.podcast.aol.com/twit/twit0245.mp3')
--        self.assertEquals(result, self.EPISODE)
--        self.assertEquals(len(self.fake_client.requests), 1)
-+        self.assertEqual(result, self.EPISODE)
-+        self.assertEqual(len(self.fake_client.requests), 1)
-diff --git a/mygpoclient/simple_test.py b/mygpoclient/simple_test.py
-index 6b97361..d93235f 100644
---- a/mygpoclient/simple_test.py
-+++ b/mygpoclient/simple_test.py
-@@ -87,20 +87,20 @@ def test_putSubscriptions(self):
-         self.fake_client.response_value = b''
-         result = self.client.put_subscriptions(
-             self.DEVICE_NAME, self.SUBSCRIPTIONS)
--        self.assertEquals(result, True)
--        self.assertEquals(len(self.fake_client.requests), 1)
-+        self.assertEqual(result, True)
-+        self.assertEqual(len(self.fake_client.requests), 1)
- 
-     def test_getSubscriptions(self):
-         self.fake_client.response_value = self.SUBSCRIPTIONS_JSON
-         subscriptions = self.client.get_subscriptions(self.DEVICE_NAME)
--        self.assertEquals(subscriptions, self.SUBSCRIPTIONS)
--        self.assertEquals(len(self.fake_client.requests), 1)
-+        self.assertEqual(subscriptions, self.SUBSCRIPTIONS)
-+        self.assertEqual(len(self.fake_client.requests), 1)
- 
-     def test_getSuggestions(self):
-         self.fake_client.response_value = self.SUGGESTIONS_JSON
-         suggestions = self.client.get_suggestions(50)
--        self.assertEquals(suggestions, self.SUGGESTIONS)
--        self.assertEquals(len(self.fake_client.requests), 1)
-+        self.assertEqual(suggestions, self.SUGGESTIONS)
-+        self.assertEqual(len(self.fake_client.requests), 1)
- 
- 
- class Test_MissingCredentials(unittest.TestCase):
-
-From a24248f45ab21dfb010d5993eab320be990a7798 Mon Sep 17 00:00:00 2001
-From: Gwyn Ciesla <gwync@protonmail.com>
-Date: Wed, 6 Sep 2023 08:23:10 -0500
-Subject: [PATCH 2/3] Add python versions
-
----
- .github/workflows/publish.yml | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml
-index 085bea4..194a005 100644
---- a/.github/workflows/publish.yml
-+++ b/.github/workflows/publish.yml
-@@ -14,7 +14,7 @@ jobs:
-       github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name
-     strategy:
-       matrix:
--        python-version: ['2.7', '3.6', '3.8', '3.9', '3.10']
-+        python-version: ['2.7', '3.6', '3.8', '3.9', '3.10', '3.11', '3.12']
- 
-     steps:
-       - uses: actions/checkout@v3
-
-From 6a2f7d7d8e873916b3d745281b454b5267bbcaf4 Mon Sep 17 00:00:00 2001
-From: Gwyn Ciesla <gwync@protonmail.com>
-Date: Thu, 7 Sep 2023 08:49:34 -0500
-Subject: [PATCH 3/3] Correct erroneous change.
-
----
- mygpoclient/api_test.py | 24 ++++++++++++------------
- 1 file changed, 12 insertions(+), 12 deletions(-)
-
-diff --git a/mygpoclient/api_test.py b/mygpoclient/api_test.py
-index 3ff2847..50efb68 100644
---- a/mygpoclient/api_test.py
-+++ b/mygpoclient/api_test.py
-@@ -222,7 +222,7 @@ def setUp(self):
-     def set_http_response_value(self, value):
-         self.fake_client.response_value = value
- 
--    def assertTruehttp_request_count(self, count):
-+    def assert_http_request_count(self, count):
-         self.assertEqual(len(self.fake_client.requests), count)
- 
-     def has_put_json_data(self, data, required_method='PUT'):
-@@ -242,7 +242,7 @@ def test_getSubscriptions_withPodcastDevice(self):
-         self.set_http_response_value(b'[]')
-         device = api.PodcastDevice('manatee', 'My Device', 'mobile', 20)
-         self.assertEqual(self.client.get_subscriptions(device), [])
--        self.assertTruehttp_request_count(1)
-+        self.assert_http_request_count(1)
- 
-     def test_putSubscriptions_withPodcastDevice(self):
-         self.set_http_response_value(b'')
-@@ -250,7 +250,7 @@ def test_putSubscriptions_withPodcastDevice(self):
-         self.assertEqual(
-             self.client.put_subscriptions(
-                 device, self.ADD), True)
--        self.assertTruehttp_request_count(1)
-+        self.assert_http_request_count(1)
-         self.assertTrue(self.has_put_json_data(self.ADD))
- 
-     def test_updateSubscriptions_raisesValueError_onInvalidAddList(self):
-@@ -338,7 +338,7 @@ def test_updateSubscriptions_returnsUpdateResult(self):
-         self.assertTrue(hasattr(result, 'update_urls'))
-         self.assertEqual(result.since, self.SINCE)
-         self.assertEqual(result.update_urls, update_urls_expected)
--        self.assertTruehttp_request_count(1)
-+        self.assert_http_request_count(1)
-         self.assertTrue(self.has_posted_json_data(self.ADD_REMOVE_AS_JSON_UPLOAD))
- 
-     def test_pullSubscriptions_raisesInvalidResponse_onEmptyResponse(self):
-@@ -445,7 +445,7 @@ def test_pullSubscriptions_returnsChangesListAndTimestamp(self):
-         self.assertEqual(changes.add, [FEED_URL_1, FEED_URL_2])
-         self.assertEqual(changes.remove, [FEED_URL_3, FEED_URL_4])
-         self.assertEqual(changes.since, self.SINCE)
--        self.assertTruehttp_request_count(1)
-+        self.assert_http_request_count(1)
- 
-     def test_uploadEpisodeActions_raisesInvalidResponse_onEmptyResponse(self):
-         self.set_http_response_value(b'')
-@@ -472,7 +472,7 @@ def test_uploadEpisodeActions_returnsTimestamp(self):
-         """)
-         result = self.client.upload_episode_actions(self.ACTIONS)
-         self.assertEqual(result, self.SINCE)
--        self.assertTruehttp_request_count(1)
-+        self.assert_http_request_count(1)
-         self.assertTrue(self.has_posted_json_data(self.ACTIONS_AS_JSON_UPLOAD))
- 
-     def test_downloadEpisodeActions_raisesInvalidResponse_onEmptyResponse(
-@@ -544,13 +544,13 @@ def test_downloadEpisodeActions_returnsActionList(self):
-         self.assertEqual(action2.episode, 'y')
-         self.assertEqual(action2.action, 'play')
-         self.assertEqual(changes.since, self.SINCE)
--        self.assertTruehttp_request_count(1)
-+        self.assert_http_request_count(1)
- 
-     def test_updateDeviceSettings_withNothing(self):
-         self.set_http_response_value(b'')
-         result = self.client.update_device_settings(DEVICE_ID_1)
-         self.assertEqual(result, True)
--        self.assertTruehttp_request_count(1)
-+        self.assert_http_request_count(1)
-         self.assertTrue(self.has_posted_json_data({}))
- 
-     def test_updateDeviceSettings_withCaption(self):
-@@ -558,7 +558,7 @@ def test_updateDeviceSettings_withCaption(self):
-         result = self.client.update_device_settings(DEVICE_ID_1,
-                                                     caption='Poodonkis')
-         self.assertEqual(result, True)
--        self.assertTruehttp_request_count(1)
-+        self.assert_http_request_count(1)
-         self.assertTrue(self.has_posted_json_data({'caption': 'Poodonkis'}))
- 
-     def test_updateDeviceSettings_withType(self):
-@@ -566,7 +566,7 @@ def test_updateDeviceSettings_withType(self):
-         result = self.client.update_device_settings(DEVICE_ID_1,
-                                                     type='desktop')
-         self.assertEqual(result, True)
--        self.assertTruehttp_request_count(1)
-+        self.assert_http_request_count(1)
-         self.assertTrue(self.has_posted_json_data({'type': 'desktop'}))
- 
-     def test_updateDeviceSettings_withCaptionAndType(self):
-@@ -574,7 +574,7 @@ def test_updateDeviceSettings_withCaptionAndType(self):
-         result = self.client.update_device_settings(DEVICE_ID_1,
-                                                     'My Unit Testing Device', 'desktop')
-         self.assertEqual(result, True)
--        self.assertTruehttp_request_count(1)
-+        self.assert_http_request_count(1)
-         self.assertTrue(self.has_posted_json_data({
-             'caption': 'My Unit Testing Device',
-             'type': 'desktop'}))
-@@ -620,7 +620,7 @@ def test_getDevices_returnsDeviceList(self):
-         self.assertEqual(device2.caption, 'The Lappy')
-         self.assertEqual(device2.type, 'laptop')
-         self.assertEqual(device2.subscriptions, 4711)
--        self.assertTruehttp_request_count(1)
-+        self.assert_http_request_count(1)
- 
-     def test_getFavoriteEpisodes_returnsEpisodeList(self):
-         self.set_http_response_value(b"""
-- 
GitLab