diff --git a/fdroidserver/index.py b/fdroidserver/index.py index 5a174d51..096ace12 100644 --- a/fdroidserver/index.py +++ b/fdroidserver/index.py @@ -28,6 +28,7 @@ import os import re import ruamel.yaml import shutil +import sys import tempfile import urllib.parse import zipfile @@ -1309,6 +1310,29 @@ def make_v0(apps, apks, repodir, repodict, requestsdict, fdroid_signing_key_fing os.remove(siglinkname) os.symlink(sigfile_path, siglinkname) + if sys.version_info.minor >= 13: + # Python 3.13 changed minidom so it no longer converts " to an XML entity. + # https://github.com/python/cpython/commit/154477be722ae5c4e18d22d0860e284006b09c4f + # This just puts back the previous implementation, with black code format. + import inspect + import xml.dom.minidom + + def _write_data(writer, text, attr): # pylint: disable=unused-argument + if text: + text = ( + text.replace('&', '&') + .replace('<', '<') + .replace('"', '"') + .replace('>', '>') + ) + writer.write(text) + + argnames = tuple(inspect.signature(xml.dom.minidom._write_data).parameters) + if argnames == ('writer', 'text', 'attr'): + xml.dom.minidom._write_data = _write_data + else: + logging.warning('Failed to monkey patch minidom for index.xml support!') + if common.options.pretty: output = doc.toprettyxml(encoding='utf-8') else: diff --git a/setup.py b/setup.py index 0631fd6e..422a5962 100755 --- a/setup.py +++ b/setup.py @@ -116,8 +116,13 @@ setup( # Some requires are only needed for very limited cases: # * biplist is only used for parsing Apple .ipa files # * pycountry is only for linting config/mirrors.yml + # * python-magic is preferred when libmagic is available, but its not in pypi.org extras_require={ - 'optional': ['biplist', 'pycountry'], + 'optional': [ + 'biplist', + 'pycountry', + 'python-magic', + ], 'test': ['pyjks', 'html5print'], 'docs': [ 'sphinx', @@ -127,7 +132,7 @@ setup( ], }, classifiers=[ - 'Development Status :: 4 - Beta', + 'Development Status :: 5 - Production/Stable', 'Intended Audience :: Developers', 'Intended Audience :: Information Technology', 'Intended Audience :: System Administrators', @@ -136,6 +141,13 @@ setup( 'Operating System :: POSIX', 'Operating System :: MacOS :: MacOS X', 'Operating System :: Unix', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.9', + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", + 'Programming Language :: Python :: 3 :: Only', 'Topic :: Utilities', ], ) diff --git a/tests/test_common.py b/tests/test_common.py index 5ad5a771..4ae55c73 100755 --- a/tests/test_common.py +++ b/tests/test_common.py @@ -2394,11 +2394,9 @@ class CommonTest(unittest.TestCase): def test_auto_install_ndk_mock_dl(self): """Test NDK installs by actually calling sdkmanager""" import sdkmanager - import pkg_resources + import importlib.metadata - sdkmanager_version = LooseVersion( - pkg_resources.get_distribution('sdkmanager').version - ) + sdkmanager_version = LooseVersion(importlib.metadata.version('sdkmanager')) if sdkmanager_version < LooseVersion('0.6.4'): raise unittest.SkipTest('needs fdroid sdkmanager >= 0.6.4')