Skip to content

Python 3.13: Many failing tests: `urllib.error.HTTPError: HTTP Error 400: 'pathlib._local.PosixPath' object does not support the context manager protocol`

Hi 👋 When trying to build against a Python 3.13 based stack on Arch Linux, I'm seeing a lot of issues currently. This unfortunately blocks our upgrade and it would be great to get some feedback on if this is test or actual package related, whether this can be fixed or if we can safely ignore the failing tests for now.

Several tests are affected, see full logs:

python-mailmanclient-3.3.5-5-x86_64-build.log python-mailmanclient-3.3.5-5-x86_64-check.log

As example, the test output for a single failing test:

=================================== FAILURES ===================================
_____________ TestUrlencodedPaths.test_member_paths_are_urlencoded _____________
src/mailmanclient/tests/test_client.py:48: in test_member_paths_are_urlencoded
    mlist.subscribe('apers?on@example.com',
src/mailmanclient/restobjects/mailinglist.py:492: in subscribe
    response, content = self._connection.call('members', data)
src/mailmanclient/restbase/connection.py:160: in call
    raise HTTPError(params.get('url'), response.status_code,
E   urllib.error.HTTPError: HTTP Error 400: 'pathlib._local.PosixPath' object does not support the context manager protocol
----------------------------- Captured stdout call -----------------------------
Dec 08 13:12:06 2024 (1445) 'pathlib._local.PosixPath' object does not support the context manager protocol
Traceback (most recent call last):
  File "/usr/lib/python3.13/site-packages/mailman/rest/members.py", line 385, in on_post
    token, token_owner, member = registrar.register(
                                 ~~~~~~~~~~~~~~~~~~^
        subscriber,
        ^^^^^^^^^^^
    ...<5 lines>...
        delivery_mode=delivery_mode,
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        delivery_status=delivery_status)
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.13/site-packages/mailman/app/subscriptions.py", line 584, in register
    list(workflow)
    ~~~~^^^^^^^^^^
  File "/usr/lib/python3.13/site-packages/mailman/app/workflow.py", line 69, in __next__
    return step()
  File "/usr/lib/python3.13/site-packages/mailman/app/subscriptions.py", line 362, in _step_do_subscription
    self.member = self.mlist.subscribe(
                  ~~~~~~~~~~~~~~~~~~~~^
        self.subscriber, send_welcome_message=self.send_welcome_message)
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.13/site-packages/mailman/database/transaction.py", line 106, in wrapper
    return function(args[0], config.db.store, *args[1:], **kws)
  File "/usr/lib/python3.13/site-packages/mailman/model/mailinglist.py", line 540, in subscribe
    notify(SubscriptionEvent(
    ~~~~~~^^^^^^^^^^^^^^^^^^^
        self, member, send_welcome_message=send_welcome_message))
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.13/site-packages/zope/event/__init__.py", line 33, in notify
    subscriber(event)
    ~~~~~~~~~~^^^^^^^
  File "/usr/lib/python3.13/site-packages/mailman/app/membership.py", line 183, in handle_SubscriptionEvent
    send_welcome_message(mlist, member, member.preferred_language)
    ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.13/site-packages/mailman/app/notifications.py", line 77, in send_welcome_message
    welcome_message = wrap(getUtility(ITemplateLoader).get(
                           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
        'list:user:notice:welcome', mlist, language=language.code))
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.13/site-packages/mailman/model/template.py", line 211, in get
    path, fp = find(default_uri, mlist, code)
               ~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.13/site-packages/mailman/utilities/i18n.py", line 157, in find
    for search_path in raw_search_order:
                       ^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.13/site-packages/mailman/utilities/i18n.py", line 117, in search
    templates_dir = str(resources.enter_context(
                        ~~~~~~~~~~~~~~~~~~~~~~~^
        files('mailman').joinpath('templates')))
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.13/contextlib.py", line 528, in enter_context
    raise TypeError(f"'{cls.__module__}.{cls.__qualname__}' object does "
                    f"not support the context manager protocol") from None
TypeError: 'pathlib._local.PosixPath' object does not support the context manager protocol
______________ TestMailingListMembershipTests.test_list_is_member ______________
src/mailmanclient/tests/test_list.py:84: in test_list_is_member
    self.mlist.subscribe(subscriber_addr, pre_verified=True,
src/mailmanclient/restobjects/mailinglist.py:492: in subscribe
    response, content = self._connection.call('members', data)
src/mailmanclient/restbase/connection.py:160: in call
    raise HTTPError(params.get('url'), response.status_code,
E   urllib.error.HTTPError: HTTP Error 400: 'pathlib._local.PosixPath' object does not support the context manager protocol
---------------------------- Captured stdout setup -----------------------------
Starting Mailman Server
---------------------------- Captured stderr setup -----------------------------
--- Logging error ---
Traceback (most recent call last):
  File "/usr/lib/python3.13/logging/handlers.py", line 1013, in emit
    self.socket.send(msg)
    ~~~~~~~~~~~~~~~~^^^^^
OSError: [Errno 9] Bad file descriptor

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3.13/logging/handlers.py", line 1016, in emit
    self._connect_unixsocket(self.address)
    ~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^
  File "/usr/lib/python3.13/logging/handlers.py", line 884, in _connect_unixsocket
    self.socket.connect(address)
    ~~~~~~~~~~~~~~~~~~~^^^^^^^^^
FileNotFoundError: [Errno 2] No such file or directory
Call stack:
  File "/usr/bin/pytest", line 8, in <module>
    sys.exit(console_main())
  File "/usr/lib/python3.13/site-packages/_pytest/config/__init__.py", line 201, in console_main
    code = main()
  File "/usr/lib/python3.13/site-packages/_pytest/config/__init__.py", line 175, in main
    ret: ExitCode | int = config.hook.pytest_cmdline_main(config=config)
  File "/usr/lib/python3.13/site-packages/pluggy/_hooks.py", line 513, in __call__
    return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult)
  File "/usr/lib/python3.13/site-packages/pluggy/_manager.py", line 120, in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
  File "/usr/lib/python3.13/site-packages/pluggy/_callers.py", line 103, in _multicall
    res = hook_impl.function(*args)
  File "/usr/lib/python3.13/site-packages/_pytest/main.py", line 330, in pytest_cmdline_main
    return wrap_session(config, _main)
  File "/usr/lib/python3.13/site-packages/_pytest/main.py", line 283, in wrap_session
    session.exitstatus = doit(config, session) or 0
  File "/usr/lib/python3.13/site-packages/_pytest/main.py", line 337, in _main
    config.hook.pytest_runtestloop(session=session)
  File "/usr/lib/python3.13/site-packages/pluggy/_hooks.py", line 513, in __call__
    return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult)
  File "/usr/lib/python3.13/site-packages/pluggy/_manager.py", line 120, in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
  File "/usr/lib/python3.13/site-packages/pluggy/_callers.py", line 103, in _multicall
    res = hook_impl.function(*args)
  File "/usr/lib/python3.13/site-packages/_pytest/main.py", line 362, in pytest_runtestloop
    item.config.hook.pytest_runtest_protocol(item=item, nextitem=nextitem)
  File "/usr/lib/python3.13/site-packages/pluggy/_hooks.py", line 513, in __call__
    return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult)
  File "/usr/lib/python3.13/site-packages/pluggy/_manager.py", line 120, in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
  File "/usr/lib/python3.13/site-packages/pluggy/_callers.py", line 103, in _multicall
    res = hook_impl.function(*args)
  File "/usr/lib/python3.13/site-packages/_pytest/runner.py", line 113, in pytest_runtest_protocol
    runtestprotocol(item, nextitem=nextitem)
  File "/usr/lib/python3.13/site-packages/_pytest/runner.py", line 126, in runtestprotocol
    rep = call_and_report(item, "setup", log)
  File "/usr/lib/python3.13/site-packages/_pytest/runner.py", line 241, in call_and_report
    call = CallInfo.from_call(
  File "/usr/lib/python3.13/site-packages/_pytest/runner.py", line 341, in from_call
    result: TResult | None = func()
  File "/usr/lib/python3.13/site-packages/_pytest/runner.py", line 242, in <lambda>
    lambda: runtest_hook(item=item, **kwds), when=when, reraise=reraise
  File "/usr/lib/python3.13/site-packages/pluggy/_hooks.py", line 513, in __call__
    return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult)
  File "/usr/lib/python3.13/site-packages/pluggy/_manager.py", line 120, in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
  File "/usr/lib/python3.13/site-packages/pluggy/_callers.py", line 103, in _multicall
    res = hook_impl.function(*args)
  File "/usr/lib/python3.13/site-packages/_pytest/runner.py", line 160, in pytest_runtest_setup
    item.session._setupstate.setup(item)
  File "/usr/lib/python3.13/site-packages/_pytest/runner.py", line 514, in setup
    col.setup()
  File "/usr/lib/python3.13/site-packages/_pytest/unittest.py", line 219, in setup
    super().setup()
  File "/usr/lib/python3.13/site-packages/_pytest/python.py", line 1630, in setup
    self._request._fillfixtures()
  File "/usr/lib/python3.13/site-packages/_pytest/fixtures.py", line 697, in _fillfixtures
    item.funcargs[argname] = self.getfixturevalue(argname)
  File "/usr/lib/python3.13/site-packages/_pytest/fixtures.py", line 532, in getfixturevalue
    fixturedef = self._get_active_fixturedef(argname)
  File "/usr/lib/python3.13/site-packages/_pytest/fixtures.py", line 617, in _get_active_fixturedef
    fixturedef.execute(request=subrequest)
  File "/usr/lib/python3.13/site-packages/_pytest/fixtures.py", line 1091, in execute
    result = ihook.pytest_fixture_setup(fixturedef=self, request=request)
  File "/usr/lib/python3.13/site-packages/pluggy/_hooks.py", line 513, in __call__
    return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult)
  File "/usr/lib/python3.13/site-packages/pluggy/_manager.py", line 120, in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
  File "/usr/lib/python3.13/site-packages/pluggy/_callers.py", line 103, in _multicall
    res = hook_impl.function(*args)
  File "/usr/lib/python3.13/site-packages/_pytest/fixtures.py", line 1140, in pytest_fixture_setup
    result = call_fixture_func(fixturefunc, request, kwargs)
  File "/usr/lib/python3.13/site-packages/_pytest/fixtures.py", line 898, in call_fixture_func
    fixture_result = fixturefunc(**kwargs)
  File "/build/python-mailmanclient/src/mailmanclient/src/mailmanclient/conftest.py", line 44, in mailman_core
    return watcher_getter(
  File "/usr/lib/python3.13/site-packages/pytest_services/service.py", line 78, in watcher_getter_function
    services_log.debug('Starting {0}: {1}'.format(name, arguments))
Message: "Starting master: ['-C', 'mailman_test.cfg']"
Arguments: ()
----------------------------- Captured stdout call -----------------------------
Dec 08 13:12:17 2024 (1482) 'pathlib._local.PosixPath' object does not support the context manager protocol
Traceback (most recent call last):
  File "/usr/lib/python3.13/site-packages/mailman/rest/members.py", line 385, in on_post
    token, token_owner, member = registrar.register(
                                 ~~~~~~~~~~~~~~~~~~^
        subscriber,
        ^^^^^^^^^^^
    ...<5 lines>...
        delivery_mode=delivery_mode,
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        delivery_status=delivery_status)
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.13/site-packages/mailman/app/subscriptions.py", line 584, in register
    list(workflow)
    ~~~~^^^^^^^^^^
  File "/usr/lib/python3.13/site-packages/mailman/app/workflow.py", line 69, in __next__
    return step()
  File "/usr/lib/python3.13/site-packages/mailman/app/subscriptions.py", line 362, in _step_do_subscription
    self.member = self.mlist.subscribe(
                  ~~~~~~~~~~~~~~~~~~~~^
        self.subscriber, send_welcome_message=self.send_welcome_message)
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.13/site-packages/mailman/database/transaction.py", line 106, in wrapper
    return function(args[0], config.db.store, *args[1:], **kws)
  File "/usr/lib/python3.13/site-packages/mailman/model/mailinglist.py", line 540, in subscribe
    notify(SubscriptionEvent(
    ~~~~~~^^^^^^^^^^^^^^^^^^^
        self, member, send_welcome_message=send_welcome_message))
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.13/site-packages/zope/event/__init__.py", line 33, in notify
    subscriber(event)
    ~~~~~~~~~~^^^^^^^
  File "/usr/lib/python3.13/site-packages/mailman/app/membership.py", line 183, in handle_SubscriptionEvent
    send_welcome_message(mlist, member, member.preferred_language)
    ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.13/site-packages/mailman/app/notifications.py", line 77, in send_welcome_message
    welcome_message = wrap(getUtility(ITemplateLoader).get(
                           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
        'list:user:notice:welcome', mlist, language=language.code))
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.13/site-packages/mailman/model/template.py", line 211, in get
    path, fp = find(default_uri, mlist, code)
               ~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.13/site-packages/mailman/utilities/i18n.py", line 157, in find
    for search_path in raw_search_order:
                       ^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.13/site-packages/mailman/utilities/i18n.py", line 117, in search
    templates_dir = str(resources.enter_context(
                        ~~~~~~~~~~~~~~~~~~~~~~~^
        files('mailman').joinpath('templates')))
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.13/contextlib.py", line 528, in enter_context
    raise TypeError(f"'{cls.__module__}.{cls.__qualname__}' object does "
                    f"not support the context manager protocol") from None
TypeError: 'pathlib._local.PosixPath' object does not support the context manager protocol