Bug 2389731

Summary: python-ufo2ft: FTBFS in Fedora Rawhide and 43
Product: [Fedora] Fedora Reporter: Miro Hrončok <mhroncok>
Component: python-ufo2ftAssignee: Benson Muite <benson_muite>
Status: CLOSED NEXTRELEASE QA Contact: Fedora Extras Quality Assurance <extras-qa>
Severity: unspecified Docs Contact:
Priority: unspecified    
Version: 43CC: benson_muite, code
Target Milestone: ---   
Target Release: ---   
Hardware: Unspecified   
OS: Unspecified   
URL: https://koschei.fedoraproject.org/package/python-ufo2ft
Whiteboard:
Fixed In Version: python-ufo2ft-3.6.0-3.fc43 Doc Type: ---
Doc Text:
Story Points: ---
Clone Of: Environment:
Last Closed: 2025-08-26 10:42:50 UTC Type: Bug
Regression: --- Mount Type: ---
Documentation: --- CRM:
Verified Versions: Category: ---
oVirt Team: --- RHEL 7.3 requirements from Atomic Host:
Cloudforms Team: --- Target Upstream Version:
Embargoed:
Bug Depends On:    
Bug Blocks: 2339432, 2384424, 2373702    

Description Miro Hrončok 2025-08-20 12:54:31 UTC
Description of problem:
Package python-ufo2ft fails to build from source in Fedora Rawhide.

Due to reasons described in https://lists.fedoraproject.org/archives/list/devel@lists.fedoraproject.org/thread/XO5QGOXBWHFG7AOGDQBG23AQDS2MDTWI/ a rebuild of python-ufo2ft is needed in Fedora Rawhide (44) and Fedora 43.

Version-Release number of selected component (if applicable):
3.6.0-1.fc43

Steps to Reproduce:
fedpkg build

Additional info:
This package is tracked by Koschei. See:
https://koschei.fedoraproject.org/package/python-ufo2ft

=================================== FAILURES ===================================
_______________ IntegrationTest.test_compileVariableTTFs[defcon] _______________
self = <tests.integration_test.IntegrationTest object at 0x3ffba03fb60>
designspace_v5 = <fontTools.designspaceLib.DesignSpaceDocument object at 0x3ffbb3c7cb0>
    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",
        )
tests/integration_test.py:395: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
font = <fontTools.ttLib.ttFont.TTFont object at 0x3ffb99b4590>
expectedTTX = 'DSv5/MutatorSansVariable_Weight_Width-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_Width-TTF.ttx
+++ <generated>
@@ -121,7 +121,7 @@
     <sCapHeight value="700"/>
     <usDefaultChar value="0"/>
     <usBreakChar value="32"/>
-    <usMaxContext value="0"/>
+    <usMaxContext value="1"/>
   </OS_2>
 
   <hmtx>
______________ IntegrationTest.test_compileVariableCFF2s[defcon] _______________
self = <tests.integration_test.IntegrationTest object at 0x3ffba03fca0>
designspace_v5 = <fontTools.designspaceLib.DesignSpaceDocument object at 0x3ffb999d630>
    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",
        )
tests/integration_test.py:432: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
font = <fontTools.ttLib.ttFont.TTFont object at 0x3ffb93c5b70>
expectedTTX = 'DSv5/MutatorSansVariable_Weight_Width-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_Width-CFF2.ttx
+++ <generated>
@@ -107,7 +107,7 @@
     <sCapHeight value="700"/>
     <usDefaultChar value="0"/>
     <usBreakChar value="32"/>
-    <usMaxContext value="0"/>
+    <usMaxContext value="1"/>
   </OS_2>
 
   <hmtx>
______________ IntegrationTest.test_compileVariableTTFs[ufoLib2] _______________
self = <tests.integration_test.IntegrationTest object at 0x3ffba03fc00>
designspace_v5 = <fontTools.designspaceLib.DesignSpaceDocument object at 0x3ffb9cf6350>
    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",
        )
tests/integration_test.py:395: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
font = <fontTools.ttLib.ttFont.TTFont object at 0x3ffb9a4a350>
expectedTTX = 'DSv5/MutatorSansVariable_Weight_Width-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_Width-TTF.ttx
+++ <generated>
@@ -121,7 +121,7 @@
     <sCapHeight value="700"/>
     <usDefaultChar value="0"/>
     <usBreakChar value="32"/>
-    <usMaxContext value="0"/>
+    <usMaxContext value="1"/>
   </OS_2>
 
   <hmtx>
______________ IntegrationTest.test_compileVariableCFF2s[ufoLib2] ______________
self = <tests.integration_test.IntegrationTest object at 0x3ffba03fd40>
designspace_v5 = <fontTools.designspaceLib.DesignSpaceDocument object at 0x3ffba198d70>
    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",
        )
tests/integration_test.py:432: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
font = <fontTools.ttLib.ttFont.TTFont object at 0x3ffb97c5fd0>
expectedTTX = 'DSv5/MutatorSansVariable_Weight_Width-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_Width-CFF2.ttx
+++ <generated>
@@ -107,7 +107,7 @@
     <sCapHeight value="700"/>
     <usDefaultChar value="0"/>
     <usBreakChar value="32"/>
-    <usMaxContext value="0"/>
+    <usMaxContext value="1"/>
   </OS_2>
 
   <hmtx>
=============================== warnings summary ===============================
tests/filters/dottedCircle_test.py::test_empty_font_deprecated[defcon]
  /builddir/build/BUILD/python-ufo2ft-3.6.0-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/integration_test.py::IntegrationTest::test_compileVariableTTFs[defcon]
FAILED tests/integration_test.py::IntegrationTest::test_compileVariableCFF2s[defcon]
FAILED tests/integration_test.py::IntegrationTest::test_compileVariableTTFs[ufoLib2]
FAILED tests/integration_test.py::IntegrationTest::test_compileVariableCFF2s[ufoLib2]