Bug 2372184 - F43FailsToInstall: python3-ufo2ft+cffsubr, python3-ufo2ft+compreffor, python3-ufo2ft. Test failures with Python 3.14
Summary: F43FailsToInstall: python3-ufo2ft+cffsubr, python3-ufo2ft+compreffor, python3...
Keywords:
Status: CLOSED ERRATA
Alias: None
Product: Fedora
Classification: Fedora
Component: python-ufo2ft
Version: rawhide
Hardware: Unspecified
OS: Unspecified
unspecified
unspecified
Target Milestone: ---
Assignee: Benson Muite
QA Contact: Fedora Extras Quality Assurance
URL:
Whiteboard:
Depends On: 2336951 2371858 2372185
Blocks: PYTHON3.14 F43FTBFS, RAWHIDEFTBFS F43FailsToInstall, RAWHIDEFailsToInstall 2371716 2371924
TreeView+ depends on / blocked
 
Reported: 2025-06-11 08:20 UTC by Fedora Fails To Install
Modified: 2025-06-16 11:29 UTC (History)
2 users (show)

Fixed In Version: python-ufo2ft-3.5.0-4.fc43
Clone Of:
Environment:
Last Closed: 2025-06-16 11:29:03 UTC
Type: ---
Embargoed:


Attachments (Terms of Use)

Description Fedora Fails To Install 2025-06-11 08:20:23 UTC
Hello,

Please note that this comment was generated automatically by https://pagure.io/releng/blob/main/f/scripts/ftbfs-fti/follow-policy.py
If you feel that this output has mistakes, please open an issue at https://pagure.io/releng/

Your package (python-ufo2ft) Fails To Install in Fedora 43:

can't install python3-ufo2ft+cffsubr:
  - nothing provides python(abi) = 3.13 needed by python3-ufo2ft+cffsubr-3.4.2-2.fc43.noarch
  
can't install python3-ufo2ft+compreffor:
  - nothing provides python(abi) = 3.13 needed by python3-ufo2ft+compreffor-3.4.2-2.fc43.noarch
  - nothing provides python3.13dist(compreffor) >= 0.5.5 needed by python3-ufo2ft+compreffor-3.4.2-2.fc43.noarch
  
can't install python3-ufo2ft:
  - nothing provides python(abi) = 3.13 needed by python3-ufo2ft-3.4.2-2.fc43.noarch
  - nothing provides python3.13dist(booleanoperations) >= 0.9 needed by python3-ufo2ft-3.4.2-2.fc43.noarch
  - nothing provides python3.13dist(cffsubr) >= 0.3 needed by python3-ufo2ft-3.4.2-2.fc43.noarch
  - nothing provides python3.13dist(fontmath) >= 0.9.3 needed by python3-ufo2ft-3.4.2-2.fc43.noarch
  - nothing provides python3.13dist(fonttools) >= 4.52 needed by python3-ufo2ft-3.4.2-2.fc43.noarch
  - nothing provides python3.13dist(fonttools[ufo]) >= 4.52 needed by python3-ufo2ft-3.4.2-2.fc43.noarch
  
If you know about this problem and are planning on fixing it, please acknowledge so by setting the bug status to ASSIGNED. If you don't have time to maintain this package, consider orphaning it, so maintainers of dependent packages realize the problem.


If you don't react accordingly to the policy for FTBFS/FTI bugs (https://docs.fedoraproject.org/en-US/fesco/Fails_to_build_from_source_Fails_to_install/), your package may be orphaned in 8+ weeks.


P.S. The data was generated solely from koji buildroot, so it might be newer than the latest compose or the content on mirrors. To reproduce, use the koji/local repo only, e.g. in mock:

    $ mock -r fedora-43-x86_64 --config-opts mirrored=False install python3-ufo2ft+cffsubr python3-ufo2ft+compreffor python3-ufo2ft


P.P.S. If this bug has been reported in the middle of upgrading multiple dependent packages, please consider using side tags: https://docs.fedoraproject.org/en-US/fesco/Updates_Policy/#updating-inter-dependent-packages

Thanks!

Comment 1 Miro Hrončok 2025-06-15 22:26:08 UTC
=================================== FAILURES ===================================
_________ FeatureCompilerTest.test_buildTables_FeatureLibError[defcon] _________
self = <tests.featureCompiler_test.FeatureCompilerTest object at 0x7fff98e3cc30>
FontClass = <class 'defcon.objects.font.Font'>
caplog = <_pytest.logging.LogCaptureFixture object at 0x7fff9a46b9d0>
    def test_buildTables_FeatureLibError(self, FontClass, caplog):
        caplog.set_level(logging.CRITICAL)
    
        ufo = FontClass()
        ufo.newGlyph("f")
        ufo.newGlyph("f.alt01")
        ufo.newGlyph("f_f")
        features = dedent(
            """\
            feature BUGS {
                # invalid
                lookup MIXED_TYPE {
                    sub f by f.alt01;
                    sub f f by f_f;
                } MIXED_TYPE;
    
            } BUGS;
            """
        )
        ufo.features.text = features
    
        compiler = FeatureCompiler(ufo)
    
        tmpfile = None
        try:
            with caplog.at_level(logging.ERROR, logger=logger.name):
>               with pytest.raises(FeatureLibError):
E               Failed: DID NOT RAISE <class 'fontTools.feaLib.error.FeatureLibError'>
tests/featureCompiler_test.py:301: Failed
_______________ IntegrationTest.test_compileVariableTTFs[defcon] _______________
self = <tests.integration_test.IntegrationTest object at 0x7fff987de3f0>
designspace_v5 = <fontTools.designspaceLib.DesignSpaceDocument object at 0x7fff98cedc50>
    def test_compileVariableTTFs(self, designspace_v5):
        fonts = compileVariableTTFs(designspace_v5)
    
        # NOTE: Test dumps were generated like this:
        # for k, font in fonts.items():
        #     font.recalcTimestamp = False
        #     font["head"].created, font["head"].modified = 3570196637, 3601822698
        #     font["head"].checkSumAdjustment = 0x12345678
        #     font.saveXML(f"tests/data/DSv5/{k}-TTF.ttx")
    
        assert set(fonts.keys()) == {
            "MutatorSansVariable_Weight_Width",
            "MutatorSansVariable_Weight",
            "MutatorSansVariable_Width",
            "MutatorSerifVariable_Width",
        }
        # The STAT table is set to [SRIF=0, wght=[300, 700], wdth=[50, 200]] + S1 + S2
        expectTTX(
            fonts["MutatorSansVariable_Weight_Width"],
            "DSv5/MutatorSansVariable_Weight_Width-TTF.ttx",
        )
        # The STAT table is set to [SRIF=0, wght=[300, 700], wdth=50]
>       expectTTX(
            fonts["MutatorSansVariable_Weight"],
            "DSv5/MutatorSansVariable_Weight-TTF.ttx",
        )
tests/integration_test.py:400: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
font = <fontTools.ttLib.ttFont.TTFont object at 0x7fff98238210>
expectedTTX = 'DSv5/MutatorSansVariable_Weight-TTF.ttx', tables = None
    def expectTTX(font, expectedTTX, tables=None):
        with open(getpath(expectedTTX), encoding="utf-8") as f:
            expected = readLines(f)
        font.recalcTimestamp = False
        font["head"].created, font["head"].modified = 3570196637, 3601822698
        font["head"].checkSumAdjustment = 0x12345678
        f = io.StringIO()
        font.saveXML(f, tables=tables)
    
        actual = readLines(f)
        if actual != expected:
            for line in difflib.unified_diff(
                expected, actual, fromfile=expectedTTX, tofile="<generated>"
            ):
                sys.stderr.write(line)
>           pytest.fail("TTX output is different from expected")
E           Failed: TTX output is different from expected
tests/integration_test.py:73: Failed
----------------------------- Captured stderr call -----------------------------
--- DSv5/MutatorSansVariable_Weight-TTF.ttx
+++ <generated>
@@ -409,9 +409,6 @@
         </FeatureTableSubstitution>
       </FeatureVariationRecord>
       <FeatureVariationRecord index="1">
-        <ConditionSet>
-          <!-- ConditionCount=0 -->
-        </ConditionSet>
         <FeatureTableSubstitution>
           <Version value="0x00010000"/>
           <!-- SubstitutionCount=1 -->
______________ IntegrationTest.test_compileVariableCFF2s[defcon] _______________
self = <tests.integration_test.IntegrationTest object at 0x7fff987de530>
designspace_v5 = <fontTools.designspaceLib.DesignSpaceDocument object at 0x7fff980d5e10>
    def test_compileVariableCFF2s(self, designspace_v5):
        fonts = compileVariableCFF2s(designspace_v5)
    
        # NOTE: Test dumps were generated like this:
        # for k, font in fonts.items():
        #     font.recalcTimestamp = False
        #     font["head"].created, font["head"].modified = 3570196637, 3601822698
        #     font["head"].checkSumAdjustment = 0x12345678
        #     font.saveXML(f"tests/data/DSv5/{k}-CFF2.ttx")
    
        assert set(fonts.keys()) == {
            "MutatorSansVariable_Weight_Width",
            "MutatorSansVariable_Weight",
            "MutatorSansVariable_Width",
            "MutatorSerifVariable_Width",
        }
        # The STAT table is set to [SRIF=0, wght=[300, 700], wdth=[50, 200]] + S1 + S2
        expectTTX(
            fonts["MutatorSansVariable_Weight_Width"],
            "DSv5/MutatorSansVariable_Weight_Width-CFF2.ttx",
        )
        # The STAT table is set to [SRIF=0, wght=[300, 700], wdth=50]
>       expectTTX(
            fonts["MutatorSansVariable_Weight"],
            "DSv5/MutatorSansVariable_Weight-CFF2.ttx",
        )
tests/integration_test.py:437: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
font = <fontTools.ttLib.ttFont.TTFont object at 0x7fff97fe9c50>
expectedTTX = 'DSv5/MutatorSansVariable_Weight-CFF2.ttx', tables = None
    def expectTTX(font, expectedTTX, tables=None):
        with open(getpath(expectedTTX), encoding="utf-8") as f:
            expected = readLines(f)
        font.recalcTimestamp = False
        font["head"].created, font["head"].modified = 3570196637, 3601822698
        font["head"].checkSumAdjustment = 0x12345678
        f = io.StringIO()
        font.saveXML(f, tables=tables)
    
        actual = readLines(f)
        if actual != expected:
            for line in difflib.unified_diff(
                expected, actual, fromfile=expectedTTX, tofile="<generated>"
            ):
                sys.stderr.write(line)
>           pytest.fail("TTX output is different from expected")
E           Failed: TTX output is different from expected
tests/integration_test.py:73: Failed
----------------------------- Captured stderr call -----------------------------
--- DSv5/MutatorSansVariable_Weight-CFF2.ttx
+++ <generated>
@@ -385,9 +385,6 @@
         </FeatureTableSubstitution>
       </FeatureVariationRecord>
       <FeatureVariationRecord index="1">
-        <ConditionSet>
-          <!-- ConditionCount=0 -->
-        </ConditionSet>
         <FeatureTableSubstitution>
           <Version value="0x00010000"/>
           <!-- SubstitutionCount=1 -->
________ FeatureCompilerTest.test_buildTables_FeatureLibError[ufoLib2] _________
self = <tests.featureCompiler_test.FeatureCompilerTest object at 0x7fff98e3ccd0>
FontClass = <function FontClass.<locals>.ctor at 0x7fff9874fd70>
caplog = <_pytest.logging.LogCaptureFixture object at 0x7fff98dffe70>
    def test_buildTables_FeatureLibError(self, FontClass, caplog):
        caplog.set_level(logging.CRITICAL)
    
        ufo = FontClass()
        ufo.newGlyph("f")
        ufo.newGlyph("f.alt01")
        ufo.newGlyph("f_f")
        features = dedent(
            """\
            feature BUGS {
                # invalid
                lookup MIXED_TYPE {
                    sub f by f.alt01;
                    sub f f by f_f;
                } MIXED_TYPE;
    
            } BUGS;
            """
        )
        ufo.features.text = features
    
        compiler = FeatureCompiler(ufo)
    
        tmpfile = None
        try:
            with caplog.at_level(logging.ERROR, logger=logger.name):
>               with pytest.raises(FeatureLibError):
E               Failed: DID NOT RAISE <class 'fontTools.feaLib.error.FeatureLibError'>
tests/featureCompiler_test.py:301: Failed
______________ IntegrationTest.test_compileVariableTTFs[ufoLib2] _______________
self = <tests.integration_test.IntegrationTest object at 0x7fff987de490>
designspace_v5 = <fontTools.designspaceLib.DesignSpaceDocument object at 0x7fff98032890>
    def test_compileVariableTTFs(self, designspace_v5):
        fonts = compileVariableTTFs(designspace_v5)
    
        # NOTE: Test dumps were generated like this:
        # for k, font in fonts.items():
        #     font.recalcTimestamp = False
        #     font["head"].created, font["head"].modified = 3570196637, 3601822698
        #     font["head"].checkSumAdjustment = 0x12345678
        #     font.saveXML(f"tests/data/DSv5/{k}-TTF.ttx")
    
        assert set(fonts.keys()) == {
            "MutatorSansVariable_Weight_Width",
            "MutatorSansVariable_Weight",
            "MutatorSansVariable_Width",
            "MutatorSerifVariable_Width",
        }
        # The STAT table is set to [SRIF=0, wght=[300, 700], wdth=[50, 200]] + S1 + S2
        expectTTX(
            fonts["MutatorSansVariable_Weight_Width"],
            "DSv5/MutatorSansVariable_Weight_Width-TTF.ttx",
        )
        # The STAT table is set to [SRIF=0, wght=[300, 700], wdth=50]
>       expectTTX(
            fonts["MutatorSansVariable_Weight"],
            "DSv5/MutatorSansVariable_Weight-TTF.ttx",
        )
tests/integration_test.py:400: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
font = <fontTools.ttLib.ttFont.TTFont object at 0x7fff98cedc50>
expectedTTX = 'DSv5/MutatorSansVariable_Weight-TTF.ttx', tables = None
    def expectTTX(font, expectedTTX, tables=None):
        with open(getpath(expectedTTX), encoding="utf-8") as f:
            expected = readLines(f)
        font.recalcTimestamp = False
        font["head"].created, font["head"].modified = 3570196637, 3601822698
        font["head"].checkSumAdjustment = 0x12345678
        f = io.StringIO()
        font.saveXML(f, tables=tables)
    
        actual = readLines(f)
        if actual != expected:
            for line in difflib.unified_diff(
                expected, actual, fromfile=expectedTTX, tofile="<generated>"
            ):
                sys.stderr.write(line)
>           pytest.fail("TTX output is different from expected")
E           Failed: TTX output is different from expected
tests/integration_test.py:73: Failed
----------------------------- Captured stderr call -----------------------------
--- DSv5/MutatorSansVariable_Weight-TTF.ttx
+++ <generated>
@@ -409,9 +409,6 @@
         </FeatureTableSubstitution>
       </FeatureVariationRecord>
       <FeatureVariationRecord index="1">
-        <ConditionSet>
-          <!-- ConditionCount=0 -->
-        </ConditionSet>
         <FeatureTableSubstitution>
           <Version value="0x00010000"/>
           <!-- SubstitutionCount=1 -->
______________ IntegrationTest.test_compileVariableCFF2s[ufoLib2] ______________
self = <tests.integration_test.IntegrationTest object at 0x7fff987de5d0>
designspace_v5 = <fontTools.designspaceLib.DesignSpaceDocument object at 0x7fff980a7930>
    def test_compileVariableCFF2s(self, designspace_v5):
        fonts = compileVariableCFF2s(designspace_v5)
    
        # NOTE: Test dumps were generated like this:
        # for k, font in fonts.items():
        #     font.recalcTimestamp = False
        #     font["head"].created, font["head"].modified = 3570196637, 3601822698
        #     font["head"].checkSumAdjustment = 0x12345678
        #     font.saveXML(f"tests/data/DSv5/{k}-CFF2.ttx")
    
        assert set(fonts.keys()) == {
            "MutatorSansVariable_Weight_Width",
            "MutatorSansVariable_Weight",
            "MutatorSansVariable_Width",
            "MutatorSerifVariable_Width",
        }
        # The STAT table is set to [SRIF=0, wght=[300, 700], wdth=[50, 200]] + S1 + S2
        expectTTX(
            fonts["MutatorSansVariable_Weight_Width"],
            "DSv5/MutatorSansVariable_Weight_Width-CFF2.ttx",
        )
        # The STAT table is set to [SRIF=0, wght=[300, 700], wdth=50]
>       expectTTX(
            fonts["MutatorSansVariable_Weight"],
            "DSv5/MutatorSansVariable_Weight-CFF2.ttx",
        )
tests/integration_test.py:437: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
font = <fontTools.ttLib.ttFont.TTFont object at 0x7fff97fea5f0>
expectedTTX = 'DSv5/MutatorSansVariable_Weight-CFF2.ttx', tables = None
    def expectTTX(font, expectedTTX, tables=None):
        with open(getpath(expectedTTX), encoding="utf-8") as f:
            expected = readLines(f)
        font.recalcTimestamp = False
        font["head"].created, font["head"].modified = 3570196637, 3601822698
        font["head"].checkSumAdjustment = 0x12345678
        f = io.StringIO()
        font.saveXML(f, tables=tables)
    
        actual = readLines(f)
        if actual != expected:
            for line in difflib.unified_diff(
                expected, actual, fromfile=expectedTTX, tofile="<generated>"
            ):
                sys.stderr.write(line)
>           pytest.fail("TTX output is different from expected")
E           Failed: TTX output is different from expected
tests/integration_test.py:73: Failed
----------------------------- Captured stderr call -----------------------------
--- DSv5/MutatorSansVariable_Weight-CFF2.ttx
+++ <generated>
@@ -385,9 +385,6 @@
         </FeatureTableSubstitution>
       </FeatureVariationRecord>
       <FeatureVariationRecord index="1">
-        <ConditionSet>
-          <!-- ConditionCount=0 -->
-        </ConditionSet>
         <FeatureTableSubstitution>
           <Version value="0x00010000"/>
           <!-- SubstitutionCount=1 -->
=============================== warnings summary ===============================
tests/filters/dottedCircle_test.py::test_empty_font_deprecated[defcon]
  /builddir/build/BUILD/python-ufo2ft-3.4.2-build/BUILDROOT/usr/lib/python3.14/site-packages/ufo2ft/filters/dottedCircleFilter.py:8: UserWarning: The dottedCircleFilter module is deprecated, please import dottedCircle instead.
    warnings.warn(
-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
--------------------------- snapshot report summary ----------------------------
40 snapshots passed.
=========================== short test summary info ============================
FAILED tests/featureCompiler_test.py::FeatureCompilerTest::test_buildTables_FeatureLibError[defcon]
FAILED tests/integration_test.py::IntegrationTest::test_compileVariableTTFs[defcon]
FAILED tests/integration_test.py::IntegrationTest::test_compileVariableCFF2s[defcon]
FAILED tests/featureCompiler_test.py::FeatureCompilerTest::test_buildTables_FeatureLibError[ufoLib2]
FAILED tests/integration_test.py::IntegrationTest::test_compileVariableTTFs[ufoLib2]
FAILED tests/integration_test.py::IntegrationTest::test_compileVariableCFF2s[ufoLib2]
========== 6 failed, 1130 passed, 12 deselected, 1 warning in 43.78s ===========

Comment 2 Fedora Update System 2025-06-16 11:27:02 UTC
FEDORA-2025-c37a421fd1 (python-ufo2ft-3.5.0-4.fc43) has been submitted as an update to Fedora 43.
https://bodhi.fedoraproject.org/updates/FEDORA-2025-c37a421fd1

Comment 3 Fedora Update System 2025-06-16 11:29:03 UTC
FEDORA-2025-c37a421fd1 (python-ufo2ft-3.5.0-4.fc43) has been pushed to the Fedora 43 stable repository.
If problem still persists, please make note of it in this bug report.


Note You need to log in before you can comment on or make changes to this bug.