[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#975829: ufo2ft: FTBFS: dh_auto_test: error: pybuild --test --test-pytest -i python{version} -p "3.8 3.9" returned exit code 13



Source: ufo2ft
Version: 2.16.0-1
Severity: serious
Justification: FTBFS on amd64
Tags: bullseye sid ftbfs
Usertags: ftbfs-20201125 ftbfs-bullseye

Hi,

During a rebuild of all packages in sid, your package failed to build
on amd64.

Relevant part (hopefully):
> make[1]: Entering directory '/<<PKGBUILDDIR>>'
> dh_auto_test
> I: pybuild base:232: cd /<<PKGBUILDDIR>>/.pybuild/cpython3_3.8_ufo2ft/build; python3.8 -m pytest tests
> ============================= test session starts ==============================
> platform linux -- Python 3.8.6, pytest-4.6.11, py-1.9.0, pluggy-0.13.0
> rootdir: /<<PKGBUILDDIR>>, inifile: setup.cfg, testpaths: tests
> collected 519 items
> 
> tests/featureCompiler_test.py ...........                                [  2%]
> tests/fontInfoData_test.py ...............                               [  5%]
> tests/integration_test.py .....s.s....................                   [ 10%]
> tests/outlineCompiler_test.py ........................................F. [ 18%]
> ........................................                                 [ 26%]
> tests/preProcessor_test.py .................                             [ 29%]
> tests/featureWriters/featureWriters_test.py ........                     [ 31%]
> tests/featureWriters/kernFeatureWriter_test.py ...................       [ 34%]
> tests/featureWriters/markFeatureWriter_test.py ...............           [ 37%]
> tests/filters/decomposeComponents_test.py ..                             [ 37%]
> tests/filters/decomposeTransformedComponents_test.py .                   [ 38%]
> tests/filters/flattenComponents_test.py ......                           [ 39%]
> tests/filters/propagateAnchors_test.py .............                     [ 41%]
> tests/filters/sortContours_test.py ....                                  [ 42%]
> tests/filters/transformations_test.py ..........................         [ 47%]
> tests/featureCompiler_test.py ...........                                [ 49%]
> tests/fontInfoData_test.py ...............                               [ 52%]
> tests/integration_test.py .....s.s....................                   [ 57%]
> tests/outlineCompiler_test.py ........................................F. [ 66%]
> ........................................                                 [ 73%]
> tests/preProcessor_test.py .................                             [ 77%]
> tests/featureWriters/featureWriters_test.py ........                     [ 78%]
> tests/featureWriters/kernFeatureWriter_test.py ...................       [ 82%]
> tests/featureWriters/markFeatureWriter_test.py ...............           [ 85%]
> tests/filters/decomposeComponents_test.py ..                             [ 85%]
> tests/filters/decomposeTransformedComponents_test.py .                   [ 85%]
> tests/filters/flattenComponents_test.py ......                           [ 86%]
> tests/filters/propagateAnchors_test.py .............                     [ 89%]
> tests/filters/sortContours_test.py ....                                  [ 90%]
> tests/filters/transformations_test.py ..........................         [ 95%]
> tests/fontInfoData_test.py ..                                            [ 95%]
> tests/featureWriters/markFeatureWriter_test.py .........                 [ 97%]
> tests/filters/filters_test.py .............                              [ 99%]
> tests/filters/transformations_test.py .                                  [100%]
> 
> =================================== FAILURES ===================================
> ___________________ ColrCpalTest.test_colr_cpal_raw[defcon] ____________________
> 
> colorGlyphs = {'a': [['a.color1', 0], ['a.color2', 1]]}, glyphMap = None
> 
>     def buildColrV1(
>         colorGlyphs: _ColorGlyphsDict,
>         glyphMap: Optional[Mapping[str, int]] = None,
>     ) -> Tuple[ot.LayerV1List, ot.BaseGlyphV1List]:
>         if glyphMap is not None:
>             colorGlyphItems = sorted(
>                 colorGlyphs.items(), key=lambda item: glyphMap[item[0]]
>             )
>         else:
>             colorGlyphItems = colorGlyphs.items()
>     
>         errors = {}
>         baseGlyphs = []
>         layerBuilder = LayerV1ListBuilder()
>         for baseGlyph, paint in colorGlyphItems:
>             try:
> >               baseGlyphs.append(buildBaseGlyphV1Record(baseGlyph, layerBuilder, paint))
> 
> /usr/lib/python3/dist-packages/fontTools/colorLib/builder.py:676: 
> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
> 
> baseGlyph = 'a'
> layerBuilder = <fontTools.colorLib.builder.LayerV1ListBuilder object at 0x7f1b82fd4d90>
> paint = [['a.color1', 0], ['a.color2', 1]]
> 
>     def buildBaseGlyphV1Record(
>         baseGlyph: str, layerBuilder: LayerV1ListBuilder, paint: _PaintInput
>     ) -> ot.BaseGlyphV1List:
>         self = ot.BaseGlyphV1Record()
>         self.BaseGlyph = baseGlyph
> >       self.Paint = layerBuilder.buildPaint(paint)
> 
> /usr/lib/python3/dist-packages/fontTools/colorLib/builder.py:649: 
> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
> 
> self = <fontTools.colorLib.builder.LayerV1ListBuilder object at 0x7f1b82fd4d90>
> paint = [['a.color1', 0], ['a.color2', 1]]
> 
>     def buildPaint(self, paint: _PaintInput) -> ot.Paint:
>         if isinstance(paint, ot.Paint):
>             return paint
>         elif isinstance(paint, int):
>             paletteIndex = paint
>             return self.buildPaintSolid(paletteIndex)
>         elif isinstance(paint, tuple):
>             layerGlyph, paint = paint
>             return self.buildPaintGlyph(layerGlyph, paint)
>         elif isinstance(paint, list):
>             # implicit PaintColrLayers for a list of > 1
>             if len(paint) == 0:
>                 raise ValueError("An empty list is hard to paint")
>             elif len(paint) == 1:
>                 return self.buildPaint(paint[0])
>             else:
> >               return self.buildColrLayers(paint)
> 
> /usr/lib/python3/dist-packages/fontTools/colorLib/builder.py:602: 
> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
> 
> self = <fontTools.colorLib.builder.LayerV1ListBuilder object at 0x7f1b82fd4d90>
> paints = [['a.color1', 0], ['a.color2', 1]]
> 
>     def buildColrLayers(self, paints: List[_PaintInput]) -> ot.Paint:
>         ot_paint = ot.Paint()
>         ot_paint.Format = int(ot.Paint.Format.PaintColrLayers)
>         self.slices.append(ot_paint)
>     
> >       paints = [self.buildPaint(p) for p in paints]
> 
> /usr/lib/python3/dist-packages/fontTools/colorLib/builder.py:550: 
> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
> 
> .0 = <list_iterator object at 0x7f1b82fd48b0>
> 
> >   paints = [self.buildPaint(p) for p in paints]
> 
> /usr/lib/python3/dist-packages/fontTools/colorLib/builder.py:550: 
> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
> 
> self = <fontTools.colorLib.builder.LayerV1ListBuilder object at 0x7f1b82fd4d90>
> paint = ['a.color1', 0]
> 
>     def buildPaint(self, paint: _PaintInput) -> ot.Paint:
>         if isinstance(paint, ot.Paint):
>             return paint
>         elif isinstance(paint, int):
>             paletteIndex = paint
>             return self.buildPaintSolid(paletteIndex)
>         elif isinstance(paint, tuple):
>             layerGlyph, paint = paint
>             return self.buildPaintGlyph(layerGlyph, paint)
>         elif isinstance(paint, list):
>             # implicit PaintColrLayers for a list of > 1
>             if len(paint) == 0:
>                 raise ValueError("An empty list is hard to paint")
>             elif len(paint) == 1:
>                 return self.buildPaint(paint[0])
>             else:
> >               return self.buildColrLayers(paint)
> 
> /usr/lib/python3/dist-packages/fontTools/colorLib/builder.py:602: 
> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
> 
> self = <fontTools.colorLib.builder.LayerV1ListBuilder object at 0x7f1b82fd4d90>
> paints = ['a.color1', 0]
> 
>     def buildColrLayers(self, paints: List[_PaintInput]) -> ot.Paint:
>         ot_paint = ot.Paint()
>         ot_paint.Format = int(ot.Paint.Format.PaintColrLayers)
>         self.slices.append(ot_paint)
>     
> >       paints = [self.buildPaint(p) for p in paints]
> 
> /usr/lib/python3/dist-packages/fontTools/colorLib/builder.py:550: 
> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
> 
> .0 = <list_iterator object at 0x7f1b82fd4a00>
> 
> >   paints = [self.buildPaint(p) for p in paints]
> 
> /usr/lib/python3/dist-packages/fontTools/colorLib/builder.py:550: 
> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
> 
> self = <fontTools.colorLib.builder.LayerV1ListBuilder object at 0x7f1b82fd4d90>
> paint = 'a.color1'
> 
>     def buildPaint(self, paint: _PaintInput) -> ot.Paint:
>         if isinstance(paint, ot.Paint):
>             return paint
>         elif isinstance(paint, int):
>             paletteIndex = paint
>             return self.buildPaintSolid(paletteIndex)
>         elif isinstance(paint, tuple):
>             layerGlyph, paint = paint
>             return self.buildPaintGlyph(layerGlyph, paint)
>         elif isinstance(paint, list):
>             # implicit PaintColrLayers for a list of > 1
>             if len(paint) == 0:
>                 raise ValueError("An empty list is hard to paint")
>             elif len(paint) == 1:
>                 return self.buildPaint(paint[0])
>             else:
>                 return self.buildColrLayers(paint)
>         elif isinstance(paint, collections.abc.Mapping):
>             kwargs = dict(paint)
>             fmt = kwargs.pop("format")
>             try:
>                 return LayerV1ListBuilder._buildFunctions[fmt](self, **kwargs)
>             except KeyError:
>                 raise NotImplementedError(fmt)
> >       raise TypeError(f"Not sure what to do with {type(paint).__name__}: {paint!r}")
> E       TypeError: Not sure what to do with str: 'a.color1'
> 
> /usr/lib/python3/dist-packages/fontTools/colorLib/builder.py:610: TypeError
> 
> The above exception was the direct cause of the following exception:
> 
> self = <tests.outlineCompiler_test.ColrCpalTest object at 0x7f1b88076550>
> FontClass = <class 'defcon.objects.font.Font'>
> 
>     def test_colr_cpal_raw(self, FontClass):
>         testufo = FontClass(getpath("ColorTestRaw.ufo"))
>         assert "com.github.googlei18n.ufo2ft.colorLayers" in testufo.lib
>         assert "com.github.googlei18n.ufo2ft.colorPalettes" in testufo.lib
> >       result = compileTTF(testufo)
> 
> tests/outlineCompiler_test.py:792: 
> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
> ufo2ft/__init__.py:221: in compileTTF
>     otf = outlineCompiler.compile()
> ufo2ft/outlineCompiler.py:142: in compile
>     self.setupTable_COLR()
> ufo2ft/outlineCompiler.py:917: in setupTable_COLR
>     self.otf["COLR"] = buildCOLR(layerInfo)
> /usr/lib/python3/dist-packages/fontTools/colorLib/builder.py:153: in buildCOLR
>     colr.LayerV1List, colr.BaseGlyphV1List = buildColrV1(colorGlyphsV1, glyphMap)
> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
> 
> colorGlyphs = {'a': [['a.color1', 0], ['a.color2', 1]]}, glyphMap = None
> 
>     def buildColrV1(
>         colorGlyphs: _ColorGlyphsDict,
>         glyphMap: Optional[Mapping[str, int]] = None,
>     ) -> Tuple[ot.LayerV1List, ot.BaseGlyphV1List]:
>         if glyphMap is not None:
>             colorGlyphItems = sorted(
>                 colorGlyphs.items(), key=lambda item: glyphMap[item[0]]
>             )
>         else:
>             colorGlyphItems = colorGlyphs.items()
>     
>         errors = {}
>         baseGlyphs = []
>         layerBuilder = LayerV1ListBuilder()
>         for baseGlyph, paint in colorGlyphItems:
>             try:
>                 baseGlyphs.append(buildBaseGlyphV1Record(baseGlyph, layerBuilder, paint))
>     
>             except (ColorLibError, OverflowError, ValueError, TypeError) as e:
>                 errors[baseGlyph] = e
>     
>         if errors:
>             failed_glyphs = _format_glyph_errors(errors)
>             exc = ColorLibError(f"Failed to build BaseGlyphV1List:\n{failed_glyphs}")
>             exc.errors = errors
> >           raise exc from next(iter(errors.values()))
> E           fontTools.colorLib.errors.ColorLibError: Failed to build BaseGlyphV1List:
> E               a => TypeError: Not sure what to do with str: 'a.color1'
> 
> /usr/lib/python3/dist-packages/fontTools/colorLib/builder.py:685: ColorLibError
> ___________________ ColrCpalTest.test_colr_cpal_raw[ufoLib2] ___________________
> 
> colorGlyphs = {'a': [['a.color1', 0], ['a.color2', 1]]}, glyphMap = None
> 
>     def buildColrV1(
>         colorGlyphs: _ColorGlyphsDict,
>         glyphMap: Optional[Mapping[str, int]] = None,
>     ) -> Tuple[ot.LayerV1List, ot.BaseGlyphV1List]:
>         if glyphMap is not None:
>             colorGlyphItems = sorted(
>                 colorGlyphs.items(), key=lambda item: glyphMap[item[0]]
>             )
>         else:
>             colorGlyphItems = colorGlyphs.items()
>     
>         errors = {}
>         baseGlyphs = []
>         layerBuilder = LayerV1ListBuilder()
>         for baseGlyph, paint in colorGlyphItems:
>             try:
> >               baseGlyphs.append(buildBaseGlyphV1Record(baseGlyph, layerBuilder, paint))
> 
> /usr/lib/python3/dist-packages/fontTools/colorLib/builder.py:676: 
> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
> 
> baseGlyph = 'a'
> layerBuilder = <fontTools.colorLib.builder.LayerV1ListBuilder object at 0x7f1b82c69310>
> paint = [['a.color1', 0], ['a.color2', 1]]
> 
>     def buildBaseGlyphV1Record(
>         baseGlyph: str, layerBuilder: LayerV1ListBuilder, paint: _PaintInput
>     ) -> ot.BaseGlyphV1List:
>         self = ot.BaseGlyphV1Record()
>         self.BaseGlyph = baseGlyph
> >       self.Paint = layerBuilder.buildPaint(paint)
> 
> /usr/lib/python3/dist-packages/fontTools/colorLib/builder.py:649: 
> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
> 
> self = <fontTools.colorLib.builder.LayerV1ListBuilder object at 0x7f1b82c69310>
> paint = [['a.color1', 0], ['a.color2', 1]]
> 
>     def buildPaint(self, paint: _PaintInput) -> ot.Paint:
>         if isinstance(paint, ot.Paint):
>             return paint
>         elif isinstance(paint, int):
>             paletteIndex = paint
>             return self.buildPaintSolid(paletteIndex)
>         elif isinstance(paint, tuple):
>             layerGlyph, paint = paint
>             return self.buildPaintGlyph(layerGlyph, paint)
>         elif isinstance(paint, list):
>             # implicit PaintColrLayers for a list of > 1
>             if len(paint) == 0:
>                 raise ValueError("An empty list is hard to paint")
>             elif len(paint) == 1:
>                 return self.buildPaint(paint[0])
>             else:
> >               return self.buildColrLayers(paint)
> 
> /usr/lib/python3/dist-packages/fontTools/colorLib/builder.py:602: 
> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
> 
> self = <fontTools.colorLib.builder.LayerV1ListBuilder object at 0x7f1b82c69310>
> paints = [['a.color1', 0], ['a.color2', 1]]
> 
>     def buildColrLayers(self, paints: List[_PaintInput]) -> ot.Paint:
>         ot_paint = ot.Paint()
>         ot_paint.Format = int(ot.Paint.Format.PaintColrLayers)
>         self.slices.append(ot_paint)
>     
> >       paints = [self.buildPaint(p) for p in paints]
> 
> /usr/lib/python3/dist-packages/fontTools/colorLib/builder.py:550: 
> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
> 
> .0 = <list_iterator object at 0x7f1b82c55fd0>
> 
> >   paints = [self.buildPaint(p) for p in paints]
> 
> /usr/lib/python3/dist-packages/fontTools/colorLib/builder.py:550: 
> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
> 
> self = <fontTools.colorLib.builder.LayerV1ListBuilder object at 0x7f1b82c69310>
> paint = ['a.color1', 0]
> 
>     def buildPaint(self, paint: _PaintInput) -> ot.Paint:
>         if isinstance(paint, ot.Paint):
>             return paint
>         elif isinstance(paint, int):
>             paletteIndex = paint
>             return self.buildPaintSolid(paletteIndex)
>         elif isinstance(paint, tuple):
>             layerGlyph, paint = paint
>             return self.buildPaintGlyph(layerGlyph, paint)
>         elif isinstance(paint, list):
>             # implicit PaintColrLayers for a list of > 1
>             if len(paint) == 0:
>                 raise ValueError("An empty list is hard to paint")
>             elif len(paint) == 1:
>                 return self.buildPaint(paint[0])
>             else:
> >               return self.buildColrLayers(paint)
> 
> /usr/lib/python3/dist-packages/fontTools/colorLib/builder.py:602: 
> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
> 
> self = <fontTools.colorLib.builder.LayerV1ListBuilder object at 0x7f1b82c69310>
> paints = ['a.color1', 0]
> 
>     def buildColrLayers(self, paints: List[_PaintInput]) -> ot.Paint:
>         ot_paint = ot.Paint()
>         ot_paint.Format = int(ot.Paint.Format.PaintColrLayers)
>         self.slices.append(ot_paint)
>     
> >       paints = [self.buildPaint(p) for p in paints]
> 
> /usr/lib/python3/dist-packages/fontTools/colorLib/builder.py:550: 
> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
> 
> .0 = <list_iterator object at 0x7f1b82c559a0>
> 
> >   paints = [self.buildPaint(p) for p in paints]
> 
> /usr/lib/python3/dist-packages/fontTools/colorLib/builder.py:550: 
> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
> 
> self = <fontTools.colorLib.builder.LayerV1ListBuilder object at 0x7f1b82c69310>
> paint = 'a.color1'
> 
>     def buildPaint(self, paint: _PaintInput) -> ot.Paint:
>         if isinstance(paint, ot.Paint):
>             return paint
>         elif isinstance(paint, int):
>             paletteIndex = paint
>             return self.buildPaintSolid(paletteIndex)
>         elif isinstance(paint, tuple):
>             layerGlyph, paint = paint
>             return self.buildPaintGlyph(layerGlyph, paint)
>         elif isinstance(paint, list):
>             # implicit PaintColrLayers for a list of > 1
>             if len(paint) == 0:
>                 raise ValueError("An empty list is hard to paint")
>             elif len(paint) == 1:
>                 return self.buildPaint(paint[0])
>             else:
>                 return self.buildColrLayers(paint)
>         elif isinstance(paint, collections.abc.Mapping):
>             kwargs = dict(paint)
>             fmt = kwargs.pop("format")
>             try:
>                 return LayerV1ListBuilder._buildFunctions[fmt](self, **kwargs)
>             except KeyError:
>                 raise NotImplementedError(fmt)
> >       raise TypeError(f"Not sure what to do with {type(paint).__name__}: {paint!r}")
> E       TypeError: Not sure what to do with str: 'a.color1'
> 
> /usr/lib/python3/dist-packages/fontTools/colorLib/builder.py:610: TypeError
> 
> The above exception was the direct cause of the following exception:
> 
> self = <tests.outlineCompiler_test.ColrCpalTest object at 0x7f1b82c76310>
> FontClass = <function FontClass.<locals>.ctor at 0x7f1b82e92280>
> 
>     def test_colr_cpal_raw(self, FontClass):
>         testufo = FontClass(getpath("ColorTestRaw.ufo"))
>         assert "com.github.googlei18n.ufo2ft.colorLayers" in testufo.lib
>         assert "com.github.googlei18n.ufo2ft.colorPalettes" in testufo.lib
> >       result = compileTTF(testufo)
> 
> tests/outlineCompiler_test.py:792: 
> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
> ufo2ft/__init__.py:221: in compileTTF
>     otf = outlineCompiler.compile()
> ufo2ft/outlineCompiler.py:142: in compile
>     self.setupTable_COLR()
> ufo2ft/outlineCompiler.py:917: in setupTable_COLR
>     self.otf["COLR"] = buildCOLR(layerInfo)
> /usr/lib/python3/dist-packages/fontTools/colorLib/builder.py:153: in buildCOLR
>     colr.LayerV1List, colr.BaseGlyphV1List = buildColrV1(colorGlyphsV1, glyphMap)
> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
> 
> colorGlyphs = {'a': [['a.color1', 0], ['a.color2', 1]]}, glyphMap = None
> 
>     def buildColrV1(
>         colorGlyphs: _ColorGlyphsDict,
>         glyphMap: Optional[Mapping[str, int]] = None,
>     ) -> Tuple[ot.LayerV1List, ot.BaseGlyphV1List]:
>         if glyphMap is not None:
>             colorGlyphItems = sorted(
>                 colorGlyphs.items(), key=lambda item: glyphMap[item[0]]
>             )
>         else:
>             colorGlyphItems = colorGlyphs.items()
>     
>         errors = {}
>         baseGlyphs = []
>         layerBuilder = LayerV1ListBuilder()
>         for baseGlyph, paint in colorGlyphItems:
>             try:
>                 baseGlyphs.append(buildBaseGlyphV1Record(baseGlyph, layerBuilder, paint))
>     
>             except (ColorLibError, OverflowError, ValueError, TypeError) as e:
>                 errors[baseGlyph] = e
>     
>         if errors:
>             failed_glyphs = _format_glyph_errors(errors)
>             exc = ColorLibError(f"Failed to build BaseGlyphV1List:\n{failed_glyphs}")
>             exc.errors = errors
> >           raise exc from next(iter(errors.values()))
> E           fontTools.colorLib.errors.ColorLibError: Failed to build BaseGlyphV1List:
> E               a => TypeError: Not sure what to do with str: 'a.color1'
> 
> /usr/lib/python3/dist-packages/fontTools/colorLib/builder.py:685: ColorLibError
> =============================== warnings summary ===============================
> ufo2ft/outlineCompiler.py:964
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.8_ufo2ft/build/ufo2ft/outlineCompiler.py:964: DeprecationWarning: invalid escape sequence \s
>     '(^<ttFont\s+)(sfntVersion=".*"\s+)(.*>$)', flags=re.MULTILINE
> 
> tests/filters/transformations_test.py:79
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.8_ufo2ft/build/tests/filters/transformations_test.py:79: DeprecationWarning: invalid escape sequence \.
>     excinfo.match("is not a valid (TransformationsFilter\.)?Origin")
> 
> -- Docs: https://docs.pytest.org/en/latest/warnings.html
> =========================== short test summary info ============================
> SKIPPED [2] .pybuild/cpython3_3.8_ufo2ft/build/tests/integration_test.py:110: skia-pathops is unavailable in debian yet
> SKIPPED [2] .pybuild/cpython3_3.8_ufo2ft/build/tests/integration_test.py:119: skia-pathops is unavailable in debian yet
> FAILED tests/outlineCompiler_test.py::ColrCpalTest::test_colr_cpal_raw[defcon]
> FAILED tests/outlineCompiler_test.py::ColrCpalTest::test_colr_cpal_raw[ufoLib2]
> ========= 2 failed, 513 passed, 4 skipped, 2 warnings in 6.10 seconds ==========
> E: pybuild pybuild:353: test: plugin distutils failed with: exit code=1: cd /<<PKGBUILDDIR>>/.pybuild/cpython3_3.8_ufo2ft/build; python3.8 -m pytest tests
> I: pybuild base:232: cd /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9_ufo2ft/build; python3.9 -m pytest tests
> ============================= test session starts ==============================
> platform linux -- Python 3.9.0+, pytest-4.6.11, py-1.9.0, pluggy-0.13.0
> rootdir: /<<PKGBUILDDIR>>, inifile: setup.cfg, testpaths: tests
> collected 519 items
> 
> tests/featureCompiler_test.py ...........                                [  2%]
> tests/fontInfoData_test.py ...............                               [  5%]
> tests/integration_test.py .....s.s....................                   [ 10%]
> tests/outlineCompiler_test.py ........................................F. [ 18%]
> ........................................                                 [ 26%]
> tests/preProcessor_test.py .................                             [ 29%]
> tests/featureWriters/featureWriters_test.py ........                     [ 31%]
> tests/featureWriters/kernFeatureWriter_test.py ...................       [ 34%]
> tests/featureWriters/markFeatureWriter_test.py ...............           [ 37%]
> tests/filters/decomposeComponents_test.py ..                             [ 37%]
> tests/filters/decomposeTransformedComponents_test.py .                   [ 38%]
> tests/filters/flattenComponents_test.py ......                           [ 39%]
> tests/filters/propagateAnchors_test.py .............                     [ 41%]
> tests/filters/sortContours_test.py ....                                  [ 42%]
> tests/filters/transformations_test.py ..........................         [ 47%]
> tests/featureCompiler_test.py ...........                                [ 49%]
> tests/fontInfoData_test.py ...............                               [ 52%]
> tests/integration_test.py .....s.s....................                   [ 57%]
> tests/outlineCompiler_test.py ........................................F. [ 66%]
> ........................................                                 [ 73%]
> tests/preProcessor_test.py .................                             [ 77%]
> tests/featureWriters/featureWriters_test.py ........                     [ 78%]
> tests/featureWriters/kernFeatureWriter_test.py ...................       [ 82%]
> tests/featureWriters/markFeatureWriter_test.py ...............           [ 85%]
> tests/filters/decomposeComponents_test.py ..                             [ 85%]
> tests/filters/decomposeTransformedComponents_test.py .                   [ 85%]
> tests/filters/flattenComponents_test.py ......                           [ 86%]
> tests/filters/propagateAnchors_test.py .............                     [ 89%]
> tests/filters/sortContours_test.py ....                                  [ 90%]
> tests/filters/transformations_test.py ..........................         [ 95%]
> tests/fontInfoData_test.py ..                                            [ 95%]
> tests/featureWriters/markFeatureWriter_test.py .........                 [ 97%]
> tests/filters/filters_test.py .............                              [ 99%]
> tests/filters/transformations_test.py .                                  [100%]
> 
> =================================== FAILURES ===================================
> ___________________ ColrCpalTest.test_colr_cpal_raw[defcon] ____________________
> 
> colorGlyphs = {'a': [['a.color1', 0], ['a.color2', 1]]}, glyphMap = None
> 
>     def buildColrV1(
>         colorGlyphs: _ColorGlyphsDict,
>         glyphMap: Optional[Mapping[str, int]] = None,
>     ) -> Tuple[ot.LayerV1List, ot.BaseGlyphV1List]:
>         if glyphMap is not None:
>             colorGlyphItems = sorted(
>                 colorGlyphs.items(), key=lambda item: glyphMap[item[0]]
>             )
>         else:
>             colorGlyphItems = colorGlyphs.items()
>     
>         errors = {}
>         baseGlyphs = []
>         layerBuilder = LayerV1ListBuilder()
>         for baseGlyph, paint in colorGlyphItems:
>             try:
> >               baseGlyphs.append(buildBaseGlyphV1Record(baseGlyph, layerBuilder, paint))
> 
> /usr/lib/python3/dist-packages/fontTools/colorLib/builder.py:676: 
> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
> 
> baseGlyph = 'a'
> layerBuilder = <fontTools.colorLib.builder.LayerV1ListBuilder object at 0x7fa1e04a1f10>
> paint = [['a.color1', 0], ['a.color2', 1]]
> 
>     def buildBaseGlyphV1Record(
>         baseGlyph: str, layerBuilder: LayerV1ListBuilder, paint: _PaintInput
>     ) -> ot.BaseGlyphV1List:
>         self = ot.BaseGlyphV1Record()
>         self.BaseGlyph = baseGlyph
> >       self.Paint = layerBuilder.buildPaint(paint)
> 
> /usr/lib/python3/dist-packages/fontTools/colorLib/builder.py:649: 
> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
> 
> self = <fontTools.colorLib.builder.LayerV1ListBuilder object at 0x7fa1e04a1f10>
> paint = [['a.color1', 0], ['a.color2', 1]]
> 
>     def buildPaint(self, paint: _PaintInput) -> ot.Paint:
>         if isinstance(paint, ot.Paint):
>             return paint
>         elif isinstance(paint, int):
>             paletteIndex = paint
>             return self.buildPaintSolid(paletteIndex)
>         elif isinstance(paint, tuple):
>             layerGlyph, paint = paint
>             return self.buildPaintGlyph(layerGlyph, paint)
>         elif isinstance(paint, list):
>             # implicit PaintColrLayers for a list of > 1
>             if len(paint) == 0:
>                 raise ValueError("An empty list is hard to paint")
>             elif len(paint) == 1:
>                 return self.buildPaint(paint[0])
>             else:
> >               return self.buildColrLayers(paint)
> 
> /usr/lib/python3/dist-packages/fontTools/colorLib/builder.py:602: 
> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
> 
> self = <fontTools.colorLib.builder.LayerV1ListBuilder object at 0x7fa1e04a1f10>
> paints = [['a.color1', 0], ['a.color2', 1]]
> 
>     def buildColrLayers(self, paints: List[_PaintInput]) -> ot.Paint:
>         ot_paint = ot.Paint()
>         ot_paint.Format = int(ot.Paint.Format.PaintColrLayers)
>         self.slices.append(ot_paint)
>     
> >       paints = [self.buildPaint(p) for p in paints]
> 
> /usr/lib/python3/dist-packages/fontTools/colorLib/builder.py:550: 
> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
> 
> .0 = <list_iterator object at 0x7fa1e04a1340>
> 
> >   paints = [self.buildPaint(p) for p in paints]
> 
> /usr/lib/python3/dist-packages/fontTools/colorLib/builder.py:550: 
> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
> 
> self = <fontTools.colorLib.builder.LayerV1ListBuilder object at 0x7fa1e04a1f10>
> paint = ['a.color1', 0]
> 
>     def buildPaint(self, paint: _PaintInput) -> ot.Paint:
>         if isinstance(paint, ot.Paint):
>             return paint
>         elif isinstance(paint, int):
>             paletteIndex = paint
>             return self.buildPaintSolid(paletteIndex)
>         elif isinstance(paint, tuple):
>             layerGlyph, paint = paint
>             return self.buildPaintGlyph(layerGlyph, paint)
>         elif isinstance(paint, list):
>             # implicit PaintColrLayers for a list of > 1
>             if len(paint) == 0:
>                 raise ValueError("An empty list is hard to paint")
>             elif len(paint) == 1:
>                 return self.buildPaint(paint[0])
>             else:
> >               return self.buildColrLayers(paint)
> 
> /usr/lib/python3/dist-packages/fontTools/colorLib/builder.py:602: 
> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
> 
> self = <fontTools.colorLib.builder.LayerV1ListBuilder object at 0x7fa1e04a1f10>
> paints = ['a.color1', 0]
> 
>     def buildColrLayers(self, paints: List[_PaintInput]) -> ot.Paint:
>         ot_paint = ot.Paint()
>         ot_paint.Format = int(ot.Paint.Format.PaintColrLayers)
>         self.slices.append(ot_paint)
>     
> >       paints = [self.buildPaint(p) for p in paints]
> 
> /usr/lib/python3/dist-packages/fontTools/colorLib/builder.py:550: 
> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
> 
> .0 = <list_iterator object at 0x7fa1e04a1190>
> 
> >   paints = [self.buildPaint(p) for p in paints]
> 
> /usr/lib/python3/dist-packages/fontTools/colorLib/builder.py:550: 
> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
> 
> self = <fontTools.colorLib.builder.LayerV1ListBuilder object at 0x7fa1e04a1f10>
> paint = 'a.color1'
> 
>     def buildPaint(self, paint: _PaintInput) -> ot.Paint:
>         if isinstance(paint, ot.Paint):
>             return paint
>         elif isinstance(paint, int):
>             paletteIndex = paint
>             return self.buildPaintSolid(paletteIndex)
>         elif isinstance(paint, tuple):
>             layerGlyph, paint = paint
>             return self.buildPaintGlyph(layerGlyph, paint)
>         elif isinstance(paint, list):
>             # implicit PaintColrLayers for a list of > 1
>             if len(paint) == 0:
>                 raise ValueError("An empty list is hard to paint")
>             elif len(paint) == 1:
>                 return self.buildPaint(paint[0])
>             else:
>                 return self.buildColrLayers(paint)
>         elif isinstance(paint, collections.abc.Mapping):
>             kwargs = dict(paint)
>             fmt = kwargs.pop("format")
>             try:
>                 return LayerV1ListBuilder._buildFunctions[fmt](self, **kwargs)
>             except KeyError:
>                 raise NotImplementedError(fmt)
> >       raise TypeError(f"Not sure what to do with {type(paint).__name__}: {paint!r}")
> E       TypeError: Not sure what to do with str: 'a.color1'
> 
> /usr/lib/python3/dist-packages/fontTools/colorLib/builder.py:610: TypeError
> 
> The above exception was the direct cause of the following exception:
> 
> self = <tests.outlineCompiler_test.ColrCpalTest object at 0x7fa1e04b62e0>
> FontClass = <class 'defcon.objects.font.Font'>
> 
>     def test_colr_cpal_raw(self, FontClass):
>         testufo = FontClass(getpath("ColorTestRaw.ufo"))
>         assert "com.github.googlei18n.ufo2ft.colorLayers" in testufo.lib
>         assert "com.github.googlei18n.ufo2ft.colorPalettes" in testufo.lib
> >       result = compileTTF(testufo)
> 
> tests/outlineCompiler_test.py:792: 
> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
> ufo2ft/__init__.py:221: in compileTTF
>     otf = outlineCompiler.compile()
> ufo2ft/outlineCompiler.py:142: in compile
>     self.setupTable_COLR()
> ufo2ft/outlineCompiler.py:917: in setupTable_COLR
>     self.otf["COLR"] = buildCOLR(layerInfo)
> /usr/lib/python3/dist-packages/fontTools/colorLib/builder.py:153: in buildCOLR
>     colr.LayerV1List, colr.BaseGlyphV1List = buildColrV1(colorGlyphsV1, glyphMap)
> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
> 
> colorGlyphs = {'a': [['a.color1', 0], ['a.color2', 1]]}, glyphMap = None
> 
>     def buildColrV1(
>         colorGlyphs: _ColorGlyphsDict,
>         glyphMap: Optional[Mapping[str, int]] = None,
>     ) -> Tuple[ot.LayerV1List, ot.BaseGlyphV1List]:
>         if glyphMap is not None:
>             colorGlyphItems = sorted(
>                 colorGlyphs.items(), key=lambda item: glyphMap[item[0]]
>             )
>         else:
>             colorGlyphItems = colorGlyphs.items()
>     
>         errors = {}
>         baseGlyphs = []
>         layerBuilder = LayerV1ListBuilder()
>         for baseGlyph, paint in colorGlyphItems:
>             try:
>                 baseGlyphs.append(buildBaseGlyphV1Record(baseGlyph, layerBuilder, paint))
>     
>             except (ColorLibError, OverflowError, ValueError, TypeError) as e:
>                 errors[baseGlyph] = e
>     
>         if errors:
>             failed_glyphs = _format_glyph_errors(errors)
>             exc = ColorLibError(f"Failed to build BaseGlyphV1List:\n{failed_glyphs}")
>             exc.errors = errors
> >           raise exc from next(iter(errors.values()))
> E           fontTools.colorLib.errors.ColorLibError: Failed to build BaseGlyphV1List:
> E               a => TypeError: Not sure what to do with str: 'a.color1'
> 
> /usr/lib/python3/dist-packages/fontTools/colorLib/builder.py:685: ColorLibError
> ___________________ ColrCpalTest.test_colr_cpal_raw[ufoLib2] ___________________
> 
> colorGlyphs = {'a': [['a.color1', 0], ['a.color2', 1]]}, glyphMap = None
> 
>     def buildColrV1(
>         colorGlyphs: _ColorGlyphsDict,
>         glyphMap: Optional[Mapping[str, int]] = None,
>     ) -> Tuple[ot.LayerV1List, ot.BaseGlyphV1List]:
>         if glyphMap is not None:
>             colorGlyphItems = sorted(
>                 colorGlyphs.items(), key=lambda item: glyphMap[item[0]]
>             )
>         else:
>             colorGlyphItems = colorGlyphs.items()
>     
>         errors = {}
>         baseGlyphs = []
>         layerBuilder = LayerV1ListBuilder()
>         for baseGlyph, paint in colorGlyphItems:
>             try:
> >               baseGlyphs.append(buildBaseGlyphV1Record(baseGlyph, layerBuilder, paint))
> 
> /usr/lib/python3/dist-packages/fontTools/colorLib/builder.py:676: 
> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
> 
> baseGlyph = 'a'
> layerBuilder = <fontTools.colorLib.builder.LayerV1ListBuilder object at 0x7fa1e0284e50>
> paint = [['a.color1', 0], ['a.color2', 1]]
> 
>     def buildBaseGlyphV1Record(
>         baseGlyph: str, layerBuilder: LayerV1ListBuilder, paint: _PaintInput
>     ) -> ot.BaseGlyphV1List:
>         self = ot.BaseGlyphV1Record()
>         self.BaseGlyph = baseGlyph
> >       self.Paint = layerBuilder.buildPaint(paint)
> 
> /usr/lib/python3/dist-packages/fontTools/colorLib/builder.py:649: 
> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
> 
> self = <fontTools.colorLib.builder.LayerV1ListBuilder object at 0x7fa1e0284e50>
> paint = [['a.color1', 0], ['a.color2', 1]]
> 
>     def buildPaint(self, paint: _PaintInput) -> ot.Paint:
>         if isinstance(paint, ot.Paint):
>             return paint
>         elif isinstance(paint, int):
>             paletteIndex = paint
>             return self.buildPaintSolid(paletteIndex)
>         elif isinstance(paint, tuple):
>             layerGlyph, paint = paint
>             return self.buildPaintGlyph(layerGlyph, paint)
>         elif isinstance(paint, list):
>             # implicit PaintColrLayers for a list of > 1
>             if len(paint) == 0:
>                 raise ValueError("An empty list is hard to paint")
>             elif len(paint) == 1:
>                 return self.buildPaint(paint[0])
>             else:
> >               return self.buildColrLayers(paint)
> 
> /usr/lib/python3/dist-packages/fontTools/colorLib/builder.py:602: 
> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
> 
> self = <fontTools.colorLib.builder.LayerV1ListBuilder object at 0x7fa1e0284e50>
> paints = [['a.color1', 0], ['a.color2', 1]]
> 
>     def buildColrLayers(self, paints: List[_PaintInput]) -> ot.Paint:
>         ot_paint = ot.Paint()
>         ot_paint.Format = int(ot.Paint.Format.PaintColrLayers)
>         self.slices.append(ot_paint)
>     
> >       paints = [self.buildPaint(p) for p in paints]
> 
> /usr/lib/python3/dist-packages/fontTools/colorLib/builder.py:550: 
> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
> 
> .0 = <list_iterator object at 0x7fa1e0284310>
> 
> >   paints = [self.buildPaint(p) for p in paints]
> 
> /usr/lib/python3/dist-packages/fontTools/colorLib/builder.py:550: 
> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
> 
> self = <fontTools.colorLib.builder.LayerV1ListBuilder object at 0x7fa1e0284e50>
> paint = ['a.color1', 0]
> 
>     def buildPaint(self, paint: _PaintInput) -> ot.Paint:
>         if isinstance(paint, ot.Paint):
>             return paint
>         elif isinstance(paint, int):
>             paletteIndex = paint
>             return self.buildPaintSolid(paletteIndex)
>         elif isinstance(paint, tuple):
>             layerGlyph, paint = paint
>             return self.buildPaintGlyph(layerGlyph, paint)
>         elif isinstance(paint, list):
>             # implicit PaintColrLayers for a list of > 1
>             if len(paint) == 0:
>                 raise ValueError("An empty list is hard to paint")
>             elif len(paint) == 1:
>                 return self.buildPaint(paint[0])
>             else:
> >               return self.buildColrLayers(paint)
> 
> /usr/lib/python3/dist-packages/fontTools/colorLib/builder.py:602: 
> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
> 
> self = <fontTools.colorLib.builder.LayerV1ListBuilder object at 0x7fa1e0284e50>
> paints = ['a.color1', 0]
> 
>     def buildColrLayers(self, paints: List[_PaintInput]) -> ot.Paint:
>         ot_paint = ot.Paint()
>         ot_paint.Format = int(ot.Paint.Format.PaintColrLayers)
>         self.slices.append(ot_paint)
>     
> >       paints = [self.buildPaint(p) for p in paints]
> 
> /usr/lib/python3/dist-packages/fontTools/colorLib/builder.py:550: 
> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
> 
> .0 = <list_iterator object at 0x7fa1e0284550>
> 
> >   paints = [self.buildPaint(p) for p in paints]
> 
> /usr/lib/python3/dist-packages/fontTools/colorLib/builder.py:550: 
> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
> 
> self = <fontTools.colorLib.builder.LayerV1ListBuilder object at 0x7fa1e0284e50>
> paint = 'a.color1'
> 
>     def buildPaint(self, paint: _PaintInput) -> ot.Paint:
>         if isinstance(paint, ot.Paint):
>             return paint
>         elif isinstance(paint, int):
>             paletteIndex = paint
>             return self.buildPaintSolid(paletteIndex)
>         elif isinstance(paint, tuple):
>             layerGlyph, paint = paint
>             return self.buildPaintGlyph(layerGlyph, paint)
>         elif isinstance(paint, list):
>             # implicit PaintColrLayers for a list of > 1
>             if len(paint) == 0:
>                 raise ValueError("An empty list is hard to paint")
>             elif len(paint) == 1:
>                 return self.buildPaint(paint[0])
>             else:
>                 return self.buildColrLayers(paint)
>         elif isinstance(paint, collections.abc.Mapping):
>             kwargs = dict(paint)
>             fmt = kwargs.pop("format")
>             try:
>                 return LayerV1ListBuilder._buildFunctions[fmt](self, **kwargs)
>             except KeyError:
>                 raise NotImplementedError(fmt)
> >       raise TypeError(f"Not sure what to do with {type(paint).__name__}: {paint!r}")
> E       TypeError: Not sure what to do with str: 'a.color1'
> 
> /usr/lib/python3/dist-packages/fontTools/colorLib/builder.py:610: TypeError
> 
> The above exception was the direct cause of the following exception:
> 
> self = <tests.outlineCompiler_test.ColrCpalTest object at 0x7fa1e02610d0>
> FontClass = <function FontClass.<locals>.ctor at 0x7fa1e04ddd30>
> 
>     def test_colr_cpal_raw(self, FontClass):
>         testufo = FontClass(getpath("ColorTestRaw.ufo"))
>         assert "com.github.googlei18n.ufo2ft.colorLayers" in testufo.lib
>         assert "com.github.googlei18n.ufo2ft.colorPalettes" in testufo.lib
> >       result = compileTTF(testufo)
> 
> tests/outlineCompiler_test.py:792: 
> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
> ufo2ft/__init__.py:221: in compileTTF
>     otf = outlineCompiler.compile()
> ufo2ft/outlineCompiler.py:142: in compile
>     self.setupTable_COLR()
> ufo2ft/outlineCompiler.py:917: in setupTable_COLR
>     self.otf["COLR"] = buildCOLR(layerInfo)
> /usr/lib/python3/dist-packages/fontTools/colorLib/builder.py:153: in buildCOLR
>     colr.LayerV1List, colr.BaseGlyphV1List = buildColrV1(colorGlyphsV1, glyphMap)
> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
> 
> colorGlyphs = {'a': [['a.color1', 0], ['a.color2', 1]]}, glyphMap = None
> 
>     def buildColrV1(
>         colorGlyphs: _ColorGlyphsDict,
>         glyphMap: Optional[Mapping[str, int]] = None,
>     ) -> Tuple[ot.LayerV1List, ot.BaseGlyphV1List]:
>         if glyphMap is not None:
>             colorGlyphItems = sorted(
>                 colorGlyphs.items(), key=lambda item: glyphMap[item[0]]
>             )
>         else:
>             colorGlyphItems = colorGlyphs.items()
>     
>         errors = {}
>         baseGlyphs = []
>         layerBuilder = LayerV1ListBuilder()
>         for baseGlyph, paint in colorGlyphItems:
>             try:
>                 baseGlyphs.append(buildBaseGlyphV1Record(baseGlyph, layerBuilder, paint))
>     
>             except (ColorLibError, OverflowError, ValueError, TypeError) as e:
>                 errors[baseGlyph] = e
>     
>         if errors:
>             failed_glyphs = _format_glyph_errors(errors)
>             exc = ColorLibError(f"Failed to build BaseGlyphV1List:\n{failed_glyphs}")
>             exc.errors = errors
> >           raise exc from next(iter(errors.values()))
> E           fontTools.colorLib.errors.ColorLibError: Failed to build BaseGlyphV1List:
> E               a => TypeError: Not sure what to do with str: 'a.color1'
> 
> /usr/lib/python3/dist-packages/fontTools/colorLib/builder.py:685: ColorLibError
> =============================== warnings summary ===============================
> ufo2ft/outlineCompiler.py:964
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9_ufo2ft/build/ufo2ft/outlineCompiler.py:964: DeprecationWarning: invalid escape sequence \s
>     '(^<ttFont\s+)(sfntVersion=".*"\s+)(.*>$)', flags=re.MULTILINE
> 
> tests/filters/transformations_test.py:79
>   /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9_ufo2ft/build/tests/filters/transformations_test.py:79: DeprecationWarning: invalid escape sequence \.
>     excinfo.match("is not a valid (TransformationsFilter\.)?Origin")
> 
> <unknown>:79
>   <unknown>:79: DeprecationWarning: invalid escape sequence \.
> 
> -- Docs: https://docs.pytest.org/en/latest/warnings.html
> =========================== short test summary info ============================
> SKIPPED [2] .pybuild/cpython3_3.9_ufo2ft/build/tests/integration_test.py:110: skia-pathops is unavailable in debian yet
> SKIPPED [2] .pybuild/cpython3_3.9_ufo2ft/build/tests/integration_test.py:119: skia-pathops is unavailable in debian yet
> FAILED tests/outlineCompiler_test.py::ColrCpalTest::test_colr_cpal_raw[defcon]
> FAILED tests/outlineCompiler_test.py::ColrCpalTest::test_colr_cpal_raw[ufoLib2]
> ========= 2 failed, 513 passed, 4 skipped, 3 warnings in 6.14 seconds ==========
> E: pybuild pybuild:353: test: plugin distutils failed with: exit code=1: cd /<<PKGBUILDDIR>>/.pybuild/cpython3_3.9_ufo2ft/build; python3.9 -m pytest tests
> dh_auto_test: error: pybuild --test --test-pytest -i python{version} -p "3.8 3.9" returned exit code 13

The full build log is available from:
   http://qa-logs.debian.net/2020/11/25/ufo2ft_2.16.0-1_unstable.log

A list of current common problems and possible solutions is available at
http://wiki.debian.org/qa.debian.org/FTBFS . You're welcome to contribute!

About the archive rebuild: The rebuild was done on EC2 VM instances from
Amazon Web Services, using a clean, minimal and up-to-date chroot. Every
failed build was retried once to eliminate random failures.


Reply to: