From 853b66fb2a713b75d788fcf3f1a3fa7c7efc5c2a Mon Sep 17 00:00:00 2001 From: Sebastian Wagner Date: Sat, 30 Nov 2024 11:47:39 +0100 Subject: [PATCH 1/2] Raise minimum Python version to 3.8 Debian 11 bullseye has Python 3.9 Ubuntu 20.04 has Python 3.8 --- .github/workflows/unittests.yml | 2 +- CHANGELOG.md | 1 + NEWS.md | 7 ++++--- setup.py | 7 +++---- 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/.github/workflows/unittests.yml b/.github/workflows/unittests.yml index 1dee5735f..5dd966bdf 100644 --- a/.github/workflows/unittests.yml +++ b/.github/workflows/unittests.yml @@ -18,7 +18,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ['3.7', '3.8', '3.9', '3.10', '3.11'] + python-version: ['3.8', '3.9', '3.10', '3.11', '3.12', '3.13'] type: ['full', 'basic'] services: diff --git a/CHANGELOG.md b/CHANGELOG.md index 7b31d7035..567716f19 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ ### Configuration ### Core +- Python 3.8 or newer is required (PR#2541 by Sebastian Wagner). ### Development diff --git a/NEWS.md b/NEWS.md index 6f79b6ea7..29549fadc 100644 --- a/NEWS.md +++ b/NEWS.md @@ -14,6 +14,7 @@ Please refer to the change log for a full list of changes. --------------------------------- ### Requirements +Python 3.8 or newer is required ### Tools @@ -36,7 +37,7 @@ No changes are required by administrators. ---------------------------------- ### Documentation -The documentation is now available at [docs.intelmq.org](https://docs.intelmq.org/). Documentation has been updated and restructured into User, Administrator and Developer Guide. It provides modern look with various quality of life improvements. Big thanks to to @gethvi. +The documentation is now available at [docs.intelmq.org](https://docs.intelmq.org/). Documentation has been updated and restructured into User, Administrator and Developer Guide. It provides modern look with various quality of life improvements. Big thanks to to @gethvi. We now have a slick, modern mkdocs based documentation. Please do check it out! @@ -55,7 +56,7 @@ Shadowserver adds new scans on a nearly weekly basis. IntelMQ's release cycle an We therefore (thanks to @eslif2) move the shadowserver reports collector and parser to a new, dynamic system. It can: - fetch the shadowserver schema from shadowserver (https://interchange.shadowserver.org/intelmq/v1/schema) - - dynamically collect new reports (see also https://docs.intelmq.org/latest/user/bots/?h=shadow#shadowserver-reports-api) + - dynamically collect new reports (see also https://docs.intelmq.org/latest/user/bots/?h=shadow#shadowserver-reports-api) - parse the new reports **Note well**: if your IntelMQ system runs in an airgapped environment or if it may only reach out to specific IPs/sites, you should read the notes here: @@ -86,7 +87,7 @@ Quite a few changes (thanks to Kamil, @gethvi) on AMQP ### General changes and bug fixes Digital Trust Center fixed a bug where the config was loaded twice in intelmqctl which created quite some speedups. Thanks! -This speeds up IntelMQ API calls. +This speeds up IntelMQ API calls. ### Data Format diff --git a/setup.py b/setup.py index 7bbe279fc..55725c37e 100644 --- a/setup.py +++ b/setup.py @@ -17,7 +17,6 @@ 'redis>=2.10', 'requests>=2.2.0', 'ruamel.yaml', - 'importlib-metadata; python_version < "3.8"' ] TESTS_REQUIRES = [ @@ -56,7 +55,7 @@ version=__version__, # noqa: F821 maintainer='Sebastian Wagner', maintainer_email='intelmq-dev@lists.cert.at', - python_requires='>=3.7', + python_requires='>=3.8', install_requires=REQUIRES, tests_require=TESTS_REQUIRES, test_suite='intelmq.tests', @@ -85,11 +84,11 @@ 'Operating System :: POSIX :: Linux', 'Programming Language :: Python', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.7', - 'Programming Language :: Python :: 3.8', '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', 'Programming Language :: Python :: Implementation :: CPython', 'Topic :: Security', From 15d0439392012a9b4e80f51598b34912d8b95294 Mon Sep 17 00:00:00 2001 From: Sebastian Wagner Date: Sun, 1 Dec 2024 10:04:56 +0100 Subject: [PATCH 2/2] Upgrade python syntax to 3.8+ Using pyupgrade. --- .github/workflows/python/github.py | 6 +++--- .github/workflows/python/pycodestyle_comment.py | 4 ++-- NEWS.md | 2 +- contrib/example-extension-package/setup.py | 2 +- intelmq/bots/collectors/rsync/collector_rsync.py | 2 +- intelmq/bots/experts/modify/expert.py | 5 +---- intelmq/bots/outputs/smtp_batch/output.py | 2 +- 7 files changed, 10 insertions(+), 13 deletions(-) diff --git a/.github/workflows/python/github.py b/.github/workflows/python/github.py index 89e72b599..1abbbb03c 100644 --- a/.github/workflows/python/github.py +++ b/.github/workflows/python/github.py @@ -31,20 +31,20 @@ def __init__(self): def get_reviews(self): """ Get a list of reviews on a Github pull request as json object """ - reviews = self.session.get(self.api + 'repos/{}/pulls/{}/reviews'.format(self.github_repository, self.pr_id)) + reviews = self.session.get(self.api + f'repos/{self.github_repository}/pulls/{self.pr_id}/reviews') reviews.raise_for_status() return reviews.json() def update_review(self, review_id, body): """ Update a review given by `review_id` and set its body to `body` """ payload = {'body': body} - resp = self.session.put(self.api + 'repos/{}/pulls/{}/reviews/{}'.format(self.github_repository, self.pr_id, review_id), json=payload) + resp = self.session.put(self.api + f'repos/{self.github_repository}/pulls/{self.pr_id}/reviews/{review_id}', json=payload) resp.raise_for_status() return resp.json() def post_review(self, body): """ Post a pull request review containing `body` and requesting changes """ payload = {'body': body, 'event': "REQUEST_CHANGES"} - resp = self.session.post(self.api + 'repos/{}/pulls/{}/reviews'.format(self.github_repository, self.pr_id), json=payload) + resp = self.session.post(self.api + f'repos/{self.github_repository}/pulls/{self.pr_id}/reviews', json=payload) resp.raise_for_status() return resp.json() diff --git a/.github/workflows/python/pycodestyle_comment.py b/.github/workflows/python/pycodestyle_comment.py index 89eca1936..4cce4d402 100644 --- a/.github/workflows/python/pycodestyle_comment.py +++ b/.github/workflows/python/pycodestyle_comment.py @@ -34,7 +34,7 @@ def style_error_format(style_error_list) -> str: """ Format the list of pycodestyle errors and return them a one string. """ ret = '' for error in style_error_list: - ret += '* {}\n'.format(error) + ret += f'* {error}\n' return ret @@ -45,7 +45,7 @@ def style_error_format(style_error_list) -> str: style_errors = list_style_errors() if style_errors: - print("Found {} errors.".format(len(style_errors))) + print(f"Found {len(style_errors)} errors.") gh = github.Github() diff --git a/NEWS.md b/NEWS.md index 29549fadc..35db89ab4 100644 --- a/NEWS.md +++ b/NEWS.md @@ -14,7 +14,7 @@ Please refer to the change log for a full list of changes. --------------------------------- ### Requirements -Python 3.8 or newer is required +Python 3.8 or newer is required. ### Tools diff --git a/contrib/example-extension-package/setup.py b/contrib/example-extension-package/setup.py index 3d6774693..d662eca34 100644 --- a/contrib/example-extension-package/setup.py +++ b/contrib/example-extension-package/setup.py @@ -28,7 +28,7 @@ entry_point = '.'.join(file.with_suffix('').parts) file = Path(str(file).replace('intelmq/bots', 'mybots/bots')) module = '.'.join(file.with_suffix('').parts) - BOTS.append('{0} = {1}:BOT.run'.format(entry_point, module)) + BOTS.append(f'{entry_point} = {module}:BOT.run') setup( name='intelmq-example-extension', diff --git a/intelmq/bots/collectors/rsync/collector_rsync.py b/intelmq/bots/collectors/rsync/collector_rsync.py index 112deb1f1..3829c8a3f 100644 --- a/intelmq/bots/collectors/rsync/collector_rsync.py +++ b/intelmq/bots/collectors/rsync/collector_rsync.py @@ -13,7 +13,7 @@ from intelmq.lib.bot import CollectorBot -class Time(object): +class Time: def __init__(self, delta=None): """ Delta is a datetime.timedelta JSON string, ex: '{days=-1}'. """ self.time = datetime.now() diff --git a/intelmq/bots/experts/modify/expert.py b/intelmq/bots/experts/modify/expert.py index a9945449a..f6cdbbb43 100644 --- a/intelmq/bots/experts/modify/expert.py +++ b/intelmq/bots/experts/modify/expert.py @@ -17,10 +17,7 @@ def is_re_pattern(value): """ Checks if the given value is a re compiled pattern """ - if sys.version_info > (3, 7): - return isinstance(value, re.Pattern) - else: - return hasattr(value, "pattern") + return isinstance(value, re.Pattern) class MatchGroupMapping: diff --git a/intelmq/bots/outputs/smtp_batch/output.py b/intelmq/bots/outputs/smtp_batch/output.py index d24d11467..5661ea733 100644 --- a/intelmq/bots/outputs/smtp_batch/output.py +++ b/intelmq/bots/outputs/smtp_batch/output.py @@ -123,7 +123,7 @@ def cli_run(self): with open(self.mail_template) as f: self.mail_contents = f.read() if self.alternative_mails: - with open(self.alternative_mails, "r") as f: + with open(self.alternative_mails) as f: self.alternative_mail = {row[0]: row[1] for row in csv.reader(f, delimiter=",")} print("Preparing mail queue...")