From 6071fb58c9cf71d681dd6c43b9c5c61408f9c66f Mon Sep 17 00:00:00 2001 From: Alex Willmer Date: Thu, 18 Sep 2025 19:01:36 +0100 Subject: [PATCH 1/8] Begin 0.3.30dev --- mitogen/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mitogen/__init__.py b/mitogen/__init__.py index 0a1e31dc..2f626053 100644 --- a/mitogen/__init__.py +++ b/mitogen/__init__.py @@ -35,7 +35,7 @@ be expected. On the slave, it is built dynamically during startup. #: Library version as a tuple. -__version__ = (0, 3, 29) +__version__ = (0, 3, 30, 'dev') #: This is :data:`False` in slave contexts. Previously it was used to prevent From 7d5f63ccbf30c3925fd1888c6a24e5307a5b1d7c Mon Sep 17 00:00:00 2001 From: Alex Willmer Date: Wed, 28 May 2025 13:30:54 +0100 Subject: [PATCH 2/8] Cleanup unused and missing imports --- ansible_mitogen/connection.py | 4 ++-- ansible_mitogen/logging.py | 1 - ansible_mitogen/planner.py | 1 + ansible_mitogen/strategy.py | 1 + docs/changelog.rst | 2 ++ mitogen/__init__.py | 3 ++- mitogen/fakessh.py | 1 - mitogen/ssh.py | 1 + mitogen/unix.py | 1 + tests/context_test.py | 1 - tests/poller_test.py | 1 - 11 files changed, 10 insertions(+), 7 deletions(-) diff --git a/ansible_mitogen/connection.py b/ansible_mitogen/connection.py index 5b9ae70b..9afb3de0 100644 --- a/ansible_mitogen/connection.py +++ b/ansible_mitogen/connection.py @@ -43,11 +43,11 @@ import ansible.errors import ansible.plugins.connection import mitogen.core +import mitogen.parent +import mitogen.service import ansible_mitogen.mixins -import ansible_mitogen.parsing import ansible_mitogen.process -import ansible_mitogen.services import ansible_mitogen.target import ansible_mitogen.transport_config import ansible_mitogen.utils.unsafe diff --git a/ansible_mitogen/logging.py b/ansible_mitogen/logging.py index 4d5647a4..70a8f15f 100644 --- a/ansible_mitogen/logging.py +++ b/ansible_mitogen/logging.py @@ -34,7 +34,6 @@ import os import ansible.utils.display -import mitogen.core import mitogen.utils diff --git a/ansible_mitogen/planner.py b/ansible_mitogen/planner.py index b4c9d9b8..5d11de3e 100644 --- a/ansible_mitogen/planner.py +++ b/ansible_mitogen/planner.py @@ -50,6 +50,7 @@ import ansible.executor.module_common import mitogen.core import mitogen.select +import mitogen.service import ansible_mitogen.loaders import ansible_mitogen.parsing diff --git a/ansible_mitogen/strategy.py b/ansible_mitogen/strategy.py index 9408ca63..c0b2ef87 100644 --- a/ansible_mitogen/strategy.py +++ b/ansible_mitogen/strategy.py @@ -41,6 +41,7 @@ except ImportError: import mitogen.core import ansible_mitogen.affinity import ansible_mitogen.loaders +import ansible_mitogen.logging import ansible_mitogen.mixins import ansible_mitogen.process diff --git a/docs/changelog.rst b/docs/changelog.rst index a5017820..15fb4272 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -21,6 +21,8 @@ To avail of fixes in an unreleased version, please download a ZIP file In progress (unreleased) ------------------------ +* :gh:issue:`1266` Import cleanups + v0.3.29 (2025-09-18) -------------------- diff --git a/mitogen/__init__.py b/mitogen/__init__.py index 2f626053..22f0e9cf 100644 --- a/mitogen/__init__.py +++ b/mitogen/__init__.py @@ -106,7 +106,8 @@ def main(log_level='INFO', profiling=_default_profiling): def wrapper(func): if func.__module__ != '__main__': return func - import mitogen.parent + import mitogen.core + import mitogen.master import mitogen.utils if profiling: mitogen.core.enable_profiling() diff --git a/mitogen/fakessh.py b/mitogen/fakessh.py index 23599903..70eacac7 100644 --- a/mitogen/fakessh.py +++ b/mitogen/fakessh.py @@ -97,7 +97,6 @@ import inspect import os import pty import shutil -import socket import subprocess import sys import tempfile diff --git a/mitogen/ssh.py b/mitogen/ssh.py index f32d2cab..c43d00da 100644 --- a/mitogen/ssh.py +++ b/mitogen/ssh.py @@ -40,6 +40,7 @@ try: except ImportError: from pipes import quote as shlex_quote +import mitogen.core import mitogen.parent from mitogen.core import b diff --git a/mitogen/unix.py b/mitogen/unix.py index 84eedc4b..71b98efd 100644 --- a/mitogen/unix.py +++ b/mitogen/unix.py @@ -44,6 +44,7 @@ import sys import tempfile import mitogen.core +import mitogen.parent import mitogen.master diff --git a/tests/context_test.py b/tests/context_test.py index ee9292c4..b9652c14 100644 --- a/tests/context_test.py +++ b/tests/context_test.py @@ -1,7 +1,6 @@ import pickle import mitogen.core -from mitogen.core import b import testlib diff --git a/tests/poller_test.py b/tests/poller_test.py index 01e4a561..ae7d2965 100644 --- a/tests/poller_test.py +++ b/tests/poller_test.py @@ -1,7 +1,6 @@ import errno import os import select -import socket import sys import unittest From 6145508312d9750265b249139a7d69798dfe76ae Mon Sep 17 00:00:00 2001 From: Alex Willmer Date: Fri, 7 Feb 2025 15:25:16 +0000 Subject: [PATCH 3/8] ansible_mitogen: De-duplicate sys.path manipulations by Ansible plugins --- ansible_mitogen/plugins/connection/__init__.py | 11 +++++++++++ ansible_mitogen/plugins/connection/mitogen_buildah.py | 10 ---------- ansible_mitogen/plugins/connection/mitogen_doas.py | 10 ---------- ansible_mitogen/plugins/connection/mitogen_docker.py | 10 ---------- ansible_mitogen/plugins/connection/mitogen_jail.py | 10 ---------- ansible_mitogen/plugins/connection/mitogen_kubectl.py | 10 ---------- ansible_mitogen/plugins/connection/mitogen_local.py | 10 +--------- ansible_mitogen/plugins/connection/mitogen_lxc.py | 10 ---------- ansible_mitogen/plugins/connection/mitogen_lxd.py | 10 ---------- .../plugins/connection/mitogen_machinectl.py | 10 ---------- ansible_mitogen/plugins/connection/mitogen_podman.py | 10 ---------- ansible_mitogen/plugins/connection/mitogen_setns.py | 10 ---------- ansible_mitogen/plugins/connection/mitogen_ssh.py | 9 --------- ansible_mitogen/plugins/connection/mitogen_su.py | 10 ---------- ansible_mitogen/plugins/connection/mitogen_sudo.py | 10 ---------- ansible_mitogen/plugins/strategy/__init__.py | 11 +++++++++++ ansible_mitogen/plugins/strategy/mitogen.py | 9 --------- ansible_mitogen/plugins/strategy/mitogen_free.py | 9 --------- .../plugins/strategy/mitogen_host_pinned.py | 9 --------- ansible_mitogen/plugins/strategy/mitogen_linear.py | 9 --------- docs/changelog.rst | 1 + 21 files changed, 24 insertions(+), 174 deletions(-) diff --git a/ansible_mitogen/plugins/connection/__init__.py b/ansible_mitogen/plugins/connection/__init__.py index e69de29b..3afb9a91 100644 --- a/ansible_mitogen/plugins/connection/__init__.py +++ b/ansible_mitogen/plugins/connection/__init__.py @@ -0,0 +1,11 @@ +# SPDX-FileCopyrightText: 2025 Mitogen authors +# SPDX-License-Identifier: BSD-3-Clause +# !mitogen: minify_safe + +import os +import sys + +try: + import ansible_mitogen +except ImportError: + sys.path.insert(0, os.path.abspath(os.path.join(__file__, '../../../..'))) diff --git a/ansible_mitogen/plugins/connection/mitogen_buildah.py b/ansible_mitogen/plugins/connection/mitogen_buildah.py index 10ab6b41..d6fbd6f8 100644 --- a/ansible_mitogen/plugins/connection/mitogen_buildah.py +++ b/ansible_mitogen/plugins/connection/mitogen_buildah.py @@ -29,16 +29,6 @@ from __future__ import absolute_import, division, print_function __metaclass__ = type -import os.path -import sys - -try: - import ansible_mitogen -except ImportError: - base_dir = os.path.dirname(__file__) - sys.path.insert(0, os.path.abspath(os.path.join(base_dir, '../../..'))) - del base_dir - import ansible_mitogen.connection diff --git a/ansible_mitogen/plugins/connection/mitogen_doas.py b/ansible_mitogen/plugins/connection/mitogen_doas.py index 963ec597..ef52ea78 100644 --- a/ansible_mitogen/plugins/connection/mitogen_doas.py +++ b/ansible_mitogen/plugins/connection/mitogen_doas.py @@ -29,16 +29,6 @@ from __future__ import absolute_import, division, print_function __metaclass__ = type -import os.path -import sys - -try: - import ansible_mitogen.connection -except ImportError: - base_dir = os.path.dirname(__file__) - sys.path.insert(0, os.path.abspath(os.path.join(base_dir, '../../..'))) - del base_dir - import ansible_mitogen.connection diff --git a/ansible_mitogen/plugins/connection/mitogen_docker.py b/ansible_mitogen/plugins/connection/mitogen_docker.py index e0dd2120..79555dc3 100644 --- a/ansible_mitogen/plugins/connection/mitogen_docker.py +++ b/ansible_mitogen/plugins/connection/mitogen_docker.py @@ -29,16 +29,6 @@ from __future__ import absolute_import, division, print_function __metaclass__ = type -import os.path -import sys - -try: - import ansible_mitogen -except ImportError: - base_dir = os.path.dirname(__file__) - sys.path.insert(0, os.path.abspath(os.path.join(base_dir, '../../..'))) - del base_dir - import ansible_mitogen.connection diff --git a/ansible_mitogen/plugins/connection/mitogen_jail.py b/ansible_mitogen/plugins/connection/mitogen_jail.py index a432e17d..3877aad1 100644 --- a/ansible_mitogen/plugins/connection/mitogen_jail.py +++ b/ansible_mitogen/plugins/connection/mitogen_jail.py @@ -29,16 +29,6 @@ from __future__ import absolute_import, division, print_function __metaclass__ = type -import os.path -import sys - -try: - import ansible_mitogen -except ImportError: - base_dir = os.path.dirname(__file__) - sys.path.insert(0, os.path.abspath(os.path.join(base_dir, '../../..'))) - del base_dir - import ansible_mitogen.connection diff --git a/ansible_mitogen/plugins/connection/mitogen_kubectl.py b/ansible_mitogen/plugins/connection/mitogen_kubectl.py index 33ae49e6..0a60b403 100644 --- a/ansible_mitogen/plugins/connection/mitogen_kubectl.py +++ b/ansible_mitogen/plugins/connection/mitogen_kubectl.py @@ -30,18 +30,8 @@ from __future__ import absolute_import, division, print_function __metaclass__ = type -import os.path -import sys - import ansible.errors -try: - import ansible_mitogen -except ImportError: - base_dir = os.path.dirname(__file__) - sys.path.insert(0, os.path.abspath(os.path.join(base_dir, '../../..'))) - del base_dir - import ansible_mitogen.connection import ansible_mitogen.loaders diff --git a/ansible_mitogen/plugins/connection/mitogen_local.py b/ansible_mitogen/plugins/connection/mitogen_local.py index 2d1e7052..61c6b809 100644 --- a/ansible_mitogen/plugins/connection/mitogen_local.py +++ b/ansible_mitogen/plugins/connection/mitogen_local.py @@ -29,15 +29,7 @@ from __future__ import absolute_import, division, print_function __metaclass__ = type -import os.path -import sys - -try: - import ansible_mitogen.connection -except ImportError: - base_dir = os.path.dirname(__file__) - sys.path.insert(0, os.path.abspath(os.path.join(base_dir, '../../..'))) - del base_dir +import os import ansible_mitogen.connection import ansible_mitogen.process diff --git a/ansible_mitogen/plugins/connection/mitogen_lxc.py b/ansible_mitogen/plugins/connection/mitogen_lxc.py index 8850b3d7..23f3c1f4 100644 --- a/ansible_mitogen/plugins/connection/mitogen_lxc.py +++ b/ansible_mitogen/plugins/connection/mitogen_lxc.py @@ -29,16 +29,6 @@ from __future__ import absolute_import, division, print_function __metaclass__ = type -import os.path -import sys - -try: - import ansible_mitogen -except ImportError: - base_dir = os.path.dirname(__file__) - sys.path.insert(0, os.path.abspath(os.path.join(base_dir, '../../..'))) - del base_dir - import ansible_mitogen.connection diff --git a/ansible_mitogen/plugins/connection/mitogen_lxd.py b/ansible_mitogen/plugins/connection/mitogen_lxd.py index 25370ef5..9842b763 100644 --- a/ansible_mitogen/plugins/connection/mitogen_lxd.py +++ b/ansible_mitogen/plugins/connection/mitogen_lxd.py @@ -29,16 +29,6 @@ from __future__ import absolute_import, division, print_function __metaclass__ = type -import os.path -import sys - -try: - import ansible_mitogen -except ImportError: - base_dir = os.path.dirname(__file__) - sys.path.insert(0, os.path.abspath(os.path.join(base_dir, '../../..'))) - del base_dir - import ansible_mitogen.connection diff --git a/ansible_mitogen/plugins/connection/mitogen_machinectl.py b/ansible_mitogen/plugins/connection/mitogen_machinectl.py index 1f538797..c531a772 100644 --- a/ansible_mitogen/plugins/connection/mitogen_machinectl.py +++ b/ansible_mitogen/plugins/connection/mitogen_machinectl.py @@ -29,16 +29,6 @@ from __future__ import absolute_import, division, print_function __metaclass__ = type -import os.path -import sys - -try: - import ansible_mitogen.connection -except ImportError: - base_dir = os.path.dirname(__file__) - sys.path.insert(0, os.path.abspath(os.path.join(base_dir, '../../..'))) - del base_dir - import ansible_mitogen.connection diff --git a/ansible_mitogen/plugins/connection/mitogen_podman.py b/ansible_mitogen/plugins/connection/mitogen_podman.py index e423aac8..19008857 100644 --- a/ansible_mitogen/plugins/connection/mitogen_podman.py +++ b/ansible_mitogen/plugins/connection/mitogen_podman.py @@ -29,16 +29,6 @@ from __future__ import absolute_import, division, print_function __metaclass__ = type -import os.path -import sys - -try: - import ansible_mitogen -except ImportError: - base_dir = os.path.dirname(__file__) - sys.path.insert(0, os.path.abspath(os.path.join(base_dir, '../../..'))) - del base_dir - import ansible_mitogen.connection diff --git a/ansible_mitogen/plugins/connection/mitogen_setns.py b/ansible_mitogen/plugins/connection/mitogen_setns.py index 4d70892f..fbb8cc70 100644 --- a/ansible_mitogen/plugins/connection/mitogen_setns.py +++ b/ansible_mitogen/plugins/connection/mitogen_setns.py @@ -29,16 +29,6 @@ from __future__ import absolute_import, division, print_function __metaclass__ = type -import os.path -import sys - -try: - import ansible_mitogen.connection -except ImportError: - base_dir = os.path.dirname(__file__) - sys.path.insert(0, os.path.abspath(os.path.join(base_dir, '../../..'))) - del base_dir - import ansible_mitogen.connection diff --git a/ansible_mitogen/plugins/connection/mitogen_ssh.py b/ansible_mitogen/plugins/connection/mitogen_ssh.py index b953edba..3b1662da 100644 --- a/ansible_mitogen/plugins/connection/mitogen_ssh.py +++ b/ansible_mitogen/plugins/connection/mitogen_ssh.py @@ -29,9 +29,6 @@ from __future__ import absolute_import, division, print_function __metaclass__ = type -import os.path -import sys - from ansible.plugins.connection.ssh import ( DOCUMENTATION as _ansible_ssh_DOCUMENTATION, ) @@ -47,12 +44,6 @@ DOCUMENTATION = """ options: """ + _ansible_ssh_DOCUMENTATION.partition('options:\n')[2] -try: - import ansible_mitogen -except ImportError: - base_dir = os.path.dirname(__file__) - sys.path.insert(0, os.path.abspath(os.path.join(base_dir, '../../..'))) - del base_dir import ansible_mitogen.connection import ansible_mitogen.loaders diff --git a/ansible_mitogen/plugins/connection/mitogen_su.py b/ansible_mitogen/plugins/connection/mitogen_su.py index 9395cc5f..c9dea2e9 100644 --- a/ansible_mitogen/plugins/connection/mitogen_su.py +++ b/ansible_mitogen/plugins/connection/mitogen_su.py @@ -29,16 +29,6 @@ from __future__ import absolute_import, division, print_function __metaclass__ = type -import os.path -import sys - -try: - import ansible_mitogen.connection -except ImportError: - base_dir = os.path.dirname(__file__) - sys.path.insert(0, os.path.abspath(os.path.join(base_dir, '../../..'))) - del base_dir - import ansible_mitogen.connection diff --git a/ansible_mitogen/plugins/connection/mitogen_sudo.py b/ansible_mitogen/plugins/connection/mitogen_sudo.py index ef549428..fe560a68 100644 --- a/ansible_mitogen/plugins/connection/mitogen_sudo.py +++ b/ansible_mitogen/plugins/connection/mitogen_sudo.py @@ -29,16 +29,6 @@ from __future__ import absolute_import, division, print_function __metaclass__ = type -import os.path -import sys - -try: - import ansible_mitogen.connection -except ImportError: - base_dir = os.path.dirname(__file__) - sys.path.insert(0, os.path.abspath(os.path.join(base_dir, '../../..'))) - del base_dir - import ansible_mitogen.connection diff --git a/ansible_mitogen/plugins/strategy/__init__.py b/ansible_mitogen/plugins/strategy/__init__.py index e69de29b..3afb9a91 100644 --- a/ansible_mitogen/plugins/strategy/__init__.py +++ b/ansible_mitogen/plugins/strategy/__init__.py @@ -0,0 +1,11 @@ +# SPDX-FileCopyrightText: 2025 Mitogen authors +# SPDX-License-Identifier: BSD-3-Clause +# !mitogen: minify_safe + +import os +import sys + +try: + import ansible_mitogen +except ImportError: + sys.path.insert(0, os.path.abspath(os.path.join(__file__, '../../../..'))) diff --git a/ansible_mitogen/plugins/strategy/mitogen.py b/ansible_mitogen/plugins/strategy/mitogen.py index abbe7672..95508f2d 100644 --- a/ansible_mitogen/plugins/strategy/mitogen.py +++ b/ansible_mitogen/plugins/strategy/mitogen.py @@ -29,8 +29,6 @@ from __future__ import absolute_import, division, print_function __metaclass__ = type -import os.path -import sys # # This is not the real Strategy implementation module, it simply exists as a @@ -47,13 +45,6 @@ import sys # debuggers and isinstance() work predictably. # -BASE_DIR = os.path.abspath( - os.path.join(os.path.dirname(__file__), '../../..') -) - -if BASE_DIR not in sys.path: - sys.path.insert(0, BASE_DIR) - import ansible_mitogen.strategy import ansible.plugins.strategy.linear diff --git a/ansible_mitogen/plugins/strategy/mitogen_free.py b/ansible_mitogen/plugins/strategy/mitogen_free.py index 4f4e1f81..89fba1c9 100644 --- a/ansible_mitogen/plugins/strategy/mitogen_free.py +++ b/ansible_mitogen/plugins/strategy/mitogen_free.py @@ -29,8 +29,6 @@ from __future__ import absolute_import, division, print_function __metaclass__ = type -import os.path -import sys # # This is not the real Strategy implementation module, it simply exists as a @@ -47,13 +45,6 @@ import sys # debuggers and isinstance() work predictably. # -BASE_DIR = os.path.abspath( - os.path.join(os.path.dirname(__file__), '../../..') -) - -if BASE_DIR not in sys.path: - sys.path.insert(0, BASE_DIR) - import ansible_mitogen.loaders import ansible_mitogen.strategy diff --git a/ansible_mitogen/plugins/strategy/mitogen_host_pinned.py b/ansible_mitogen/plugins/strategy/mitogen_host_pinned.py index c3396c5f..c130b720 100644 --- a/ansible_mitogen/plugins/strategy/mitogen_host_pinned.py +++ b/ansible_mitogen/plugins/strategy/mitogen_host_pinned.py @@ -29,8 +29,6 @@ from __future__ import absolute_import, division, print_function __metaclass__ = type -import os.path -import sys # # This is not the real Strategy implementation module, it simply exists as a @@ -47,13 +45,6 @@ import sys # debuggers and isinstance() work predictably. # -BASE_DIR = os.path.abspath( - os.path.join(os.path.dirname(__file__), '../../..') -) - -if BASE_DIR not in sys.path: - sys.path.insert(0, BASE_DIR) - import ansible_mitogen.loaders import ansible_mitogen.strategy diff --git a/ansible_mitogen/plugins/strategy/mitogen_linear.py b/ansible_mitogen/plugins/strategy/mitogen_linear.py index b1b03aef..e103fa9c 100644 --- a/ansible_mitogen/plugins/strategy/mitogen_linear.py +++ b/ansible_mitogen/plugins/strategy/mitogen_linear.py @@ -29,8 +29,6 @@ from __future__ import absolute_import, division, print_function __metaclass__ = type -import os.path -import sys # # This is not the real Strategy implementation module, it simply exists as a @@ -47,13 +45,6 @@ import sys # debuggers and isinstance() work predictably. # -BASE_DIR = os.path.abspath( - os.path.join(os.path.dirname(__file__), '../../..') -) - -if BASE_DIR not in sys.path: - sys.path.insert(0, BASE_DIR) - import ansible_mitogen.loaders import ansible_mitogen.strategy diff --git a/docs/changelog.rst b/docs/changelog.rst index 15fb4272..6b0fb172 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -22,6 +22,7 @@ In progress (unreleased) ------------------------ * :gh:issue:`1266` Import cleanups +* :gh:issue:`1266` :mod:`ansible_mitogen`: De-duplicate sys.path manipulations v0.3.29 (2025-09-18) From 85f0c33dc5023e2d30853bee6383a5aa28df684d Mon Sep 17 00:00:00 2001 From: Alex Willmer Date: Wed, 29 Oct 2025 15:14:17 +0000 Subject: [PATCH 4/8] Correct mitogen.imports.* licenses --- docs/changelog.rst | 1 + mitogen/imports/__init__.py | 2 +- mitogen/imports/_py2.py | 2 +- mitogen/imports/_py314.py | 2 +- mitogen/imports/_py36.py | 2 +- 5 files changed, 5 insertions(+), 4 deletions(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index 6b0fb172..789e381a 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -23,6 +23,7 @@ In progress (unreleased) * :gh:issue:`1266` Import cleanups * :gh:issue:`1266` :mod:`ansible_mitogen`: De-duplicate sys.path manipulations +* :gh:issue:`1344` Correct SPDX license declarations v0.3.29 (2025-09-18) diff --git a/mitogen/imports/__init__.py b/mitogen/imports/__init__.py index a54e9b01..bf246e26 100644 --- a/mitogen/imports/__init__.py +++ b/mitogen/imports/__init__.py @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: 2025 Mitogen authors -# SPDX-License-Identifier: MIT +# SPDX-License-Identifier: BSD-3-Clause # !mitogen: minify_safe import sys diff --git a/mitogen/imports/_py2.py b/mitogen/imports/_py2.py index 46f559e3..c640e278 100644 --- a/mitogen/imports/_py2.py +++ b/mitogen/imports/_py2.py @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: 2025 Mitogen authors -# SPDX-License-Identifier: MIT +# SPDX-License-Identifier: BSD-3-Clause # !mitogen: minify_safe import array diff --git a/mitogen/imports/_py314.py b/mitogen/imports/_py314.py index 7fa69cff..acf369cd 100644 --- a/mitogen/imports/_py314.py +++ b/mitogen/imports/_py314.py @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: 2025 Mitogen authors -# SPDX-License-Identifier: MIT +# SPDX-License-Identifier: BSD-3-Clause # !mitogen: minify_safe import opcode diff --git a/mitogen/imports/_py36.py b/mitogen/imports/_py36.py index 19e51a6e..a6d6f1ae 100644 --- a/mitogen/imports/_py36.py +++ b/mitogen/imports/_py36.py @@ -1,5 +1,5 @@ # SPDX-FileCopyrightText: 2025 Mitogen authors -# SPDX-License-Identifier: MIT +# SPDX-License-Identifier: BSD-3-Clause # !mitogen: minify_safe import opcode From 01baec8347df3b2db997f79dc712bf0ea1a8e271 Mon Sep 17 00:00:00 2001 From: Alex Willmer Date: Wed, 29 Oct 2025 15:17:00 +0000 Subject: [PATCH 5/8] Declare license as SPDX identifier in metadata MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes warning seen during packaging operations ``` ➜ mitogen git:(master) ✗ uv build --sdist Building source distribution... ... !! ******************************************************************************** Please consider removing the following classifiers in favor of a SPDX license expression: License :: OSI Approved :: BSD License See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details. ******************************************************************************** !! self._finalize_license_expression() running egg_info ... ``` --- docs/changelog.rst | 1 + setup.py | 3 +-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index 789e381a..941030b1 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -24,6 +24,7 @@ In progress (unreleased) * :gh:issue:`1266` Import cleanups * :gh:issue:`1266` :mod:`ansible_mitogen`: De-duplicate sys.path manipulations * :gh:issue:`1344` Correct SPDX license declarations +* :gh:issue:`1344` Declare BSD-3-Clause SPDX license in package metadata v0.3.29 (2025-09-18) diff --git a/setup.py b/setup.py index fe561fd4..ad60847e 100644 --- a/setup.py +++ b/setup.py @@ -79,7 +79,7 @@ setup( long_description = long_description(), long_description_content_type='text/markdown', author = 'David Wilson', - license = 'New BSD', + license = 'BSD-3-Clause', url = 'https://github.com/mitogen-hq/mitogen/', packages = find_packages(exclude=['tests', 'examples']), python_requires='>=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*', @@ -88,7 +88,6 @@ setup( 'Environment :: Console', 'Framework :: Ansible', 'Intended Audience :: System Administrators', - 'License :: OSI Approved :: BSD License', 'Operating System :: MacOS :: MacOS X', 'Operating System :: POSIX', 'Programming Language :: Python', From dad28e8b4a1436b09a2ae7e0a8cc12a4490f495c Mon Sep 17 00:00:00 2001 From: Marc Hartmayer Date: Thu, 23 Oct 2025 13:18:25 +0000 Subject: [PATCH 6/8] tests: Add a test case that verifies behavior when the log record factory is modified The test currently fails with the following error: $ PYTHONPATH=$(pwd)/tests:$PYTHONPATH python3 -m unittest -v log_handler_test ... test_logrecordfactory (log_handler_test.LogRecordFactoryTest.test_logrecordfactory) ... --- Logging error --- Traceback (most recent call last): File "/usr/lib/python3.12/logging/__init__.py", line 464, in format return self._format(record) ^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3.12/logging/__init__.py", line 460, in _format return self._fmt % values ~~~~~~~~~~^~~~~~~~ KeyError: 'custom_attribute' During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/usr/lib/python3.12/logging/__init__.py", line 1160, in emit msg = self.format(record) ^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3.12/logging/__init__.py", line 999, in format return fmt.format(record) ^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3.12/logging/__init__.py", line 999, in format return fmt.format(record) ^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3.12/logging/__init__.py", line 706, in format s = self.formatMessage(record) ^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3.12/logging/__init__.py", line 675, in formatMessage return self._style.format(record) ^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3.12/logging/__init__.py", line 466, in format raise ValueError('Formatting field not found in record: %s' % e) ValueError: Formatting field not found in record: 'custom_attribute' Signed-off-by: Marc Hartmayer --- tests/log_handler_test.py | 47 +++++++++++++++++++++++++++++++++++++++ tests/testlib.py | 7 ++++-- 2 files changed, 52 insertions(+), 2 deletions(-) diff --git a/tests/log_handler_test.py b/tests/log_handler_test.py index da929426..3629c728 100644 --- a/tests/log_handler_test.py +++ b/tests/log_handler_test.py @@ -14,11 +14,28 @@ import mitogen.parent import mitogen.utils from mitogen.core import b +PY2 = sys.version_info[0] == 2 +if PY2: + + def logging_getLogRecordFactory(): + return logging.LogRecord + + def logging_setLogRecordFactory(factory): + logging.LogRecord = factory + +else: + logging_getLogRecordFactory = logging.getLogRecordFactory + logging_setLogRecordFactory = logging.setLogRecordFactory + def ping(): pass +def log_test(): + logging.getLogger(__name__).info("This is a test") + + class BufferingTest(testlib.TestCase): klass = mitogen.core.LogHandler @@ -89,6 +106,36 @@ class StartupTest(testlib.RouterMixin, testlib.TestCase): expect = 'Parent is context %s (%s)' % (c1.context_id, 'parent') self.assertIn(expect, logs) + +class LogRecordFactoryTest(testlib.RouterMixin, testlib.TestCase): + def setUp(self): + super(LogRecordFactoryTest, self).setUp() + self.original_factory = logging_getLogRecordFactory() + + def tearDown(self): + logging_setLogRecordFactory(self.original_factory) + super(LogRecordFactoryTest, self).tearDown() + + def test_logrecordfactory(self): + # Change logging factory and add a custom attribute + old_factory = logging_getLogRecordFactory() + + def record_factory(*args, **kwargs): + record = old_factory(*args, **kwargs) + record.custom_attribute = 0xDEADBEEF + return record + + logging_setLogRecordFactory(record_factory) + c1 = self.router.local(name="c1") + log = testlib.LogCapturer( + __name__, formatter=logging.Formatter("%(custom_attribute)x - %(message)s") + ) + log.start() + c1.call(log_test) + logs = log.stop() + self.assertIn("deadbeef - This is a test", logs) + + StartupTest = unittest.skipIf( condition=sys.version_info < (2, 7) or sys.version_info >= (3, 6), reason="Message log flaky on Python < 2.7 or >= 3.6" diff --git a/tests/testlib.py b/tests/testlib.py index 20b6e7c7..3b5dc8b6 100644 --- a/tests/testlib.py +++ b/tests/testlib.py @@ -393,10 +393,13 @@ class CaptureStreamHandler(logging.StreamHandler): class LogCapturer(object): - def __init__(self, name=None): + def __init__(self, name=None, formatter=None): self.sio = StringIO() self.logger = logging.getLogger(name) - self.handler = CaptureStreamHandler(self.sio) + handler = CaptureStreamHandler(self.sio) + if formatter is not None: + handler.setFormatter(formatter) + self.handler = handler self.old_propagate = self.logger.propagate self.old_handlers = self.logger.handlers self.old_level = self.logger.level From 24745183edd356279c51f0abf7f775d4c4145941 Mon Sep 17 00:00:00 2001 From: Marc Hartmayer Date: Thu, 23 Oct 2025 13:19:57 +0000 Subject: [PATCH 7/8] master: Fix LogForwarder in case an own LogRecordFactory is used Since Python 3.2 the log record factory can be changed by using `logging.setLogRecordFactory` [1]. Therefore use `logging.makeLogRecord` as recommended in the documentation: "LogRecord instances are created automatically by the Logger every time something is logged, and can be created manually via makeLogRecord() (for example, from a pickled event received over the wire)." [2] This fixes the test case `log_handler_test.LogRecordFactoryTest.test_logrecordfactory`. [1] https://docs.python.org/3/library/logging.html#logging.setLogRecordFactory [2] https://docs.python.org/3/library/logging.html#logrecord-objects Signed-off-by: Marc Hartmayer --- mitogen/master.py | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/mitogen/master.py b/mitogen/master.py index f5d40025..3b896504 100644 --- a/mitogen/master.py +++ b/mitogen/master.py @@ -370,15 +370,19 @@ class LogForwarder(object): if logger is None: self._cache[logger_name] = logger = logging.getLogger(logger_name) + levelno = int(level_s) # See logging.Handler.makeRecord() - record = logging.LogRecord( - name=logger.name, - level=int(level_s), - pathname='(unknown file)', - lineno=0, - msg=s, - args=(), - exc_info=None, + record = logging.makeLogRecord( + { + "name": logger.name, + "levelname": logging.getLevelName(levelno), + "levelno": levelno, + "pathname": "(unknown file)", + "lineno": 0, + "msg": s, + "args": (), + "exc_info": None, + } ) record.mitogen_message = s record.mitogen_context = self._router.context_by_id(msg.src_id) From 1e90ff25ee9a9b14b9e4440b63050528775b1b1d Mon Sep 17 00:00:00 2001 From: Alex Willmer Date: Thu, 30 Oct 2025 08:55:43 +0000 Subject: [PATCH 8/8] Prepare v0.3.30 --- docs/changelog.rst | 5 +++++ mitogen/__init__.py | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index 941030b1..aabb41ae 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -21,10 +21,15 @@ To avail of fixes in an unreleased version, please download a ZIP file In progress (unreleased) ------------------------ + +v0.3.30 (2025-10-30) +-------------------- + * :gh:issue:`1266` Import cleanups * :gh:issue:`1266` :mod:`ansible_mitogen`: De-duplicate sys.path manipulations * :gh:issue:`1344` Correct SPDX license declarations * :gh:issue:`1344` Declare BSD-3-Clause SPDX license in package metadata +* :gh:issue:`1344` :mod:`mitogen`: Use :py:func:`logging.makeLogRecord` v0.3.29 (2025-09-18) diff --git a/mitogen/__init__.py b/mitogen/__init__.py index 22f0e9cf..719108f7 100644 --- a/mitogen/__init__.py +++ b/mitogen/__init__.py @@ -35,7 +35,7 @@ be expected. On the slave, it is built dynamically during startup. #: Library version as a tuple. -__version__ = (0, 3, 30, 'dev') +__version__ = (0, 3, 30) #: This is :data:`False` in slave contexts. Previously it was used to prevent