• Bug#1098633: towncrier: FTBFS: E twisted.trial.unittest.FailTest: False

    From Santiago Vila@21:1/5 to All on Sat Feb 22 00:40:18 2025
    Package: src:towncrier
    Version: 24.8.0-2
    Severity: serious
    Tags: ftbfs trixie sid

    Dear maintainer:

    During a rebuild of all packages in unstable, your package failed to build:

    --------------------------------------------------------------------------------
    [...]
    debian/rules clean
    dh clean --with python3 --buildsystem=pybuild
    dh_auto_clean -O--buildsystem=pybuild
    dh_autoreconf_clean -O--buildsystem=pybuild
    dh_clean -O--buildsystem=pybuild
    debian/rules binary
    dh binary --with python3 --buildsystem=pybuild
    dh_update_autotools_config -O--buildsystem=pybuild
    dh_autoreconf -O--buildsystem=pybuild
    dh_auto_configure -O--buildsystem=pybuild
    dh_auto_build -O--buildsystem=pybuild
    I: pybuild plugin_pyproject:129: Building wheel for python3.13 with "build" module
    I: pybuild base:311: python3.13 -m build --skip-dependency-check --no-isolation --wheel --outdir /<<PKGBUILDDIR>>/.pybuild/cpython3_3.13
    * Building wheel...
    Successfully built towncrier-24.8.0-py3-none-any.whl
    I: pybuild plugin_pyproject:144: Unpacking wheel built for python3.13 with "installer" module
    dh_auto_test -O--buildsystem=pybuild
    I: pybuild base:311: cd /<<PKGBUILDDIR>>/.pybuild/cpython3_3.13/build; python3.13 -m pytest "/<<PKGBUILDDIR>>"/src/
    ============================= test session starts ==============================
    platform linux -- Python 3.13.2, pytest-8.3.4, pluggy-1.5.0
    rootdir: /<<PKGBUILDDIR>>
    configfile: pyproject.toml
    plugins: typeguard-4.4.1
    collected 148 items

    ../../../src/towncrier/test/test_build.py .................F............ [ 20%] .F.......... [ 28%] ../../../src/towncrier/test/test_builder.py ................. [ 39%] ../../../src/towncrier/test/test_check.py ..................F. [ 53%] ../../../src/towncrier/test/test_create.py ............................. [ 72%]
    [ 72%] ../../../src/towncrier/test/test_format.py ...... [ 77%] ../../../src/towncrier/test/test_git.py . [ 77%] ../../../src/towncrier/test/test_project.py ............. [ 86%] ../../../src/towncrier/test/test_settings.py ......FF....... [ 96%] ../../../src/towncrier/test/test_write.py ..... [100%]

    =================================== FAILURES ===================================
    __________________________ TestCli.test_needs_config ___________________________

    self = <towncrier.test.test_build.TestCli testMethod=test_needs_config>

    def test_needs_config(self):
    """
    Towncrier needs a configuration file.
    """
    runner = CliRunner()

    with runner.isolated_filesystem():
    result = runner.invoke(_main, ["--draft"])

    self.assertEqual(1, result.exit_code, result.output)
    self.assertTrue(result.output.startswith("No configuration file found."))

    ../../../src/towncrier/test/test_build.py:522:
    _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /usr/lib/python3/dist-packages/twisted/trial/_synctest.py:402: in assertTrue
    super().assertTrue(condition, msg)
    E twisted.trial.unittest.FailTest: False is not true
    _____________ TestCli.test_singlefile_errors_and_explains_cleanly ______________

    self = <towncrier.test.test_build.TestCli testMethod=test_singlefile_errors_and_explains_cleanly>
    runner = <click.testing.CliRunner object at 0x7fc04247dd30>

    @with_project(
    config="""
    [tool.towncrier]
    singlefile="fail!"
    """
    )
    def test_singlefile_errors_and_explains_cleanly(self, runner):
    """
    Failure to find the configuration file results in a clean explanation
    without a traceback.
    """
    result = runner.invoke(_main)

    self.assertEqual(1, result.exit_code)
    self.assertEqual(
    "`singlefile` is not a valid option. Did you mean `single_file`?\n",
    result.output,
    )

    ../../../src/towncrier/test/test_build.py:817:
    _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /usr/lib/python3/dist-packages/twisted/trial/_synctest.py:444: in assertEqual
    super().assertEqual(first, second, msg)
    _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

    self = <towncrier.test.test_build.TestCli testMethod=test_singlefile_errors_and_explains_cleanly>
    msg = "'`singlefile` is not a valid option. Did you mean `single_file`?\\n' != ''\n- `singlefile` is not a valid option. Did you mean `single_file`?\n"

    def fail(self, msg: Optional[object] = None) -> NoReturn:
    """
    Absolutely fail the test. Do not pass go, do not collect $200.

    @param msg: the message that will be displayed as the reason for the
    failure
    """
    raise self.failureException(msg)
    E twisted.trial.unittest.FailTest: '`singlefile` is not a valid option. Did you mean `single_file`?\n' != ''
    E - `singlefile` is not a valid option. Did you mean `single_file`?

    /usr/lib/python3/dist-packages/twisted/trial/_synctest.py:381: FailTest _________________ TestChecker.test_none_stdout_encoding_works __________________

    self = <towncrier.test.test_check.TestChecker testMethod=test_none_stdout_encoding_works>

    def test_none_stdout_encoding_works(self):
    """
    No failure when output is piped causing None encoding for stdout.
    """
    runner = CliRunner()

    with runner.isolated_filesystem():
    create_project("pyproject.toml", main_branch="master")

    fragment_path = "foo/newsfragments/1234.feature"
    with open(fragment_path, "w") as f:
    f.write("Adds gravity back")

    call(["git", "add", fragment_path])
    call(["git", "commit", "-m", "add a newsfragment"])

    runner = CliRunner(mix_stderr=False)
    E TypeError: CliRunner.__init__() got an unexpected keyword argument 'mix_stderr'

    ../../../src/towncrier/test/test_check.py:260: TypeError ----------------------------- Captured stdout call -----------------------------
    Initialized empty Git repository in /tmp/tmpruz0jsvg/.git/
    [master (root-commit) 1764702] Initial Commit
    3 files changed, 4 insertions(+)
    create mode 100644 foo/__init__.py
    create mode 100644 foo/newsfragments/123.feature
    create mode 100644 pyproject.toml
    [otherbranch b9fd99e] add a newsfragment
    1 file changed, 1 insertion(+)
    create mode 100644 foo/newsfragments/1234.feature ----------------------------- Captured stderr call -----------------------------
    Switched to a new branch 'otherbranch'
    _____________ TomlSettingsTests.test_load_explicit_missing_config ______________

    self = <towncrier.test.test_settings.TomlSettingsTests testMethod=test_load_explicit_missing_config>
    runner = <click.testing.CliRunner object at 0x7fc041787380>

    @with_isolated_runner
    def test_load_explicit_missing_config(self, runner: CliRunner):
    """
    Calling the CLI with an incorrect explicit configuration file will exit with
    code 1 and an informative message is sent to standard output.
    """
    config = "not-there.toml"
    result = runner.invoke(cli, ("--config", config))

    self.assertEqual(result.exit_code, 1)
    self.assertEqual(
    result.output,
    f"Configuration file '{os.path.abspath(config)}' not found.\n",
    )

    ../../../src/towncrier/test/test_settings.py:224:
    _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /usr/lib/python3/dist-packages/twisted/trial/_synctest.py:444: in assertEqual
    super().assertEqual(first, second, msg)
    _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

    self = <towncrier.test.test_settings.TomlSettingsTests testMethod=test_load_explicit_missing_config>
    msg = '\'\' != "Configuration file \'/tmp/tmpr3vzhu07/not-there.toml\' not found.\\n"\n+ Configuration file \'/tmp/tmpr3vzhu07/not-there.toml\' not found.\n'

    def fail(self, msg: Optional[object] = None) -> NoReturn:
    """
    Absolutely fail the test. Do not pass go, do not collect $200.

    @param msg: the message that will be displayed as the reason for the
    failure
    """
    raise self.failureException(msg)
    E twisted.trial.unittest.FailTest: '' != "Configuration file '/tmp/tmpr3vzhu07/not-there.toml' not found.\n"
    E + Configuration file '/tmp/tmpr3vzhu07/not-there.toml' not found.

    /usr/lib/python3/dist-packages/twisted/trial/_synctest.py:381: FailTest ____________________ TomlSettingsTests.test_load_no_config _____________________

    self = <towncrier.test.test_settings.TomlSettingsTests testMethod=test_load_no_config>
    runner = <click.testing.CliRunner object at 0x7fc041787230>

    @with_isolated_runner
    def test_load_no_config(self, runner: CliRunner):
    """
    Calling the root CLI without an existing configuration file in the base directory,
    will exit with code 1 and an informative message is sent to standard output.
    """
    temp = self.mktemp()
    os.makedirs(temp)

    result = runner.invoke(cli, ("--dir", temp))

    self.assertEqual(
    result.output,
    f"No configuration file found.\nLooked back from: {os.path.abspath(temp)}\n",
    )

    ../../../src/towncrier/test/test_settings.py:208:
    _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /usr/lib/python3/dist-packages/twisted/trial/_synctest.py:444: in assertEqual
    super().assertEqual(first, second, msg)
    _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

    self = <towncrier.test.test_settings.TomlSettingsTests testMethod=test_load_no_config>
    msg = "'' != 'No configuration file found.\\nLooked back[102 chars]mp\\n'\n+ No configuration file found.\n+ Looked back from: /tmp/tmp3wnual6i/towncrier.test.test_settings/TomlSettingsTests/test_load_no_config/yae2qc6r/temp\n"

    def fail(self, msg: Optional[object] = None) -> NoReturn:
    """
    Absolutely fail the test. Do not pass go, do not collect $200.

    @param msg: the message that will be displayed as the reason for the
    failure
    """
    raise self.failureException(msg)
    E twisted.trial.unittest.FailTest: '' != 'No configuration file found.\nLooked back[102 chars]mp\n'
    E + No configuration file found.
    E + Looked back from: /tmp/tmp3wnual6i/towncrier.test.test_settings/TomlSettingsTests/test_load_no_config/yae2qc6r/temp

    /usr/lib/python3/dist-packages/twisted/trial/_synctest.py:381: FailTest =========================== short test summary info ============================
    FAILED ../../../src/towncrier/test/test_build.py::TestCli::test_needs_config FAILED ../../../src/towncrier/test/test_build.py::TestCli::test_singlefile_errors_and_explains_cleanly
    FAILED ../../../src/towncrier/test/test_check.py::TestChecker::test_none_stdout_encoding_works
    FAILED ../../../src/towncrier/test/test_settings.py::TomlSettingsTests::test_load_explicit_missing_config
    FAILED ../../../src/towncrier/test/test_settings.py::TomlSettingsTests::test_load_no_config
    ======================== 5 failed, 143 passed in 1.41s =========================
    E: pybuild pybuild:389: test: plugin pyproject failed with: exit code=1: cd /<<PKGBUILDDIR>>/.pybuild/cpython3_3.13/build; python3.13 -m pytest "{dir}"/src/
    dh_auto_test: error: pybuild --test --test-pytest -i python{version} -p 3.13 returned exit code 13
    make: *** [debian/rules:31: binary] Error 25
    dpkg-buildpackage: error: debian/rules binary subprocess returned exit status 2 --------------------------------------------------------------------------------

    The above is just how the build ends and not necessarily the most relevant part.
    If required, the full build log is available here:

    https://people.debian.org/~sanvila/build-logs/202502/

    About the archive rebuild: The build was made on virtual machines from AWS, using sbuild and a reduced chroot with only build-essential packages.

    If you could not reproduce the bug please contact me privately, as I
    am willing to provide ssh access to a virtual machine where the bug is
    fully reproducible.

    If this is really a bug in one of the build-depends, please use
    reassign and add an affects on src:towncrier, so that this is still
    visible in the BTS web page for this package.

    Thanks.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)