Merge pull request #1347 from moreati/release-v0.3.30

Release v0.3.30
pull/1354/head v0.3.30
Alex Willmer 1 month ago committed by GitHub
commit 81e11d5456
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -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

@ -34,7 +34,6 @@ import os
import ansible.utils.display
import mitogen.core
import mitogen.utils

@ -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

@ -0,0 +1,11 @@
# SPDX-FileCopyrightText: 2025 Mitogen authors <https://github.com/mitogen-hq>
# 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__, '../../../..')))

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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

@ -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

@ -0,0 +1,11 @@
# SPDX-FileCopyrightText: 2025 Mitogen authors <https://github.com/mitogen-hq>
# 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__, '../../../..')))

@ -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

@ -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

@ -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

@ -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

@ -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

@ -18,6 +18,16 @@ To avail of fixes in an unreleased version, please download a ZIP file
`directly from GitHub <https://github.com/mitogen-hq/mitogen/>`_.
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)
--------------------

@ -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)
#: This is :data:`False` in slave contexts. Previously it was used to prevent
@ -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()

@ -97,7 +97,6 @@ import inspect
import os
import pty
import shutil
import socket
import subprocess
import sys
import tempfile

@ -1,5 +1,5 @@
# SPDX-FileCopyrightText: 2025 Mitogen authors <https://github.com/mitogen-hq>
# SPDX-License-Identifier: MIT
# SPDX-License-Identifier: BSD-3-Clause
# !mitogen: minify_safe
import sys

@ -1,5 +1,5 @@
# SPDX-FileCopyrightText: 2025 Mitogen authors <https://github.com/mitogen-hq>
# SPDX-License-Identifier: MIT
# SPDX-License-Identifier: BSD-3-Clause
# !mitogen: minify_safe
import array

@ -1,5 +1,5 @@
# SPDX-FileCopyrightText: 2025 Mitogen authors <https://github.com/mitogen-hq>
# SPDX-License-Identifier: MIT
# SPDX-License-Identifier: BSD-3-Clause
# !mitogen: minify_safe
import opcode

@ -1,5 +1,5 @@
# SPDX-FileCopyrightText: 2025 Mitogen authors <https://github.com/mitogen-hq>
# SPDX-License-Identifier: MIT
# SPDX-License-Identifier: BSD-3-Clause
# !mitogen: minify_safe
import opcode

@ -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)

@ -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

@ -44,6 +44,7 @@ import sys
import tempfile
import mitogen.core
import mitogen.parent
import mitogen.master

@ -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',

@ -1,7 +1,6 @@
import pickle
import mitogen.core
from mitogen.core import b
import testlib

@ -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"

@ -1,7 +1,6 @@
import errno
import os
import select
import socket
import sys
import unittest

@ -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

Loading…
Cancel
Save