Beispiel #1
0
def test_loadFilterFromString_args_missing(ufo):
    with pytest.raises(TypeError) as info:
        loadFilterFromString(
            "ufo2ft.filters.fooBar::FooBarFilter(a='a', c=1)", )
    assert info.match("missing 1 required positional argument: 'b'")

    with pytest.raises(TypeError) as info:
        loadFilterFromString("ufo2ft.filters.fooBar::FooBarFilter(c=1)", )
    assert info.match("missing 2 required positional arguments: 'a', 'b'")
Beispiel #2
0
    def run_fontmake(self, source, args):
        if "output_dir" in args:
            original_output_dir = args["output_dir"]
            tmpdir = tempfile.TemporaryDirectory()
            args["output_dir"] = tmpdir.name

        if (self.config["flattenComponents"]
                or self.config["decomposeTransformedComponents"]):
            filters = args.get("filters", [])
            if self.config["flattenComponents"]:
                filters.append(loadFilterFromString("FlattenComponentsFilter"))

            if self.config["decomposeTransformedComponents"]:
                filters.append(
                    loadFilterFromString(
                        "DecomposeTransformedComponentsFilter"))
            args["filters"] = filters

        if source.endswith(".glyphs"):
            FontProject().run_from_glyphs(source, **args)
        elif source.endswith(".designspace"):
            FontProject().run_from_designspace(source, **args)
        elif source.endswith(".ufo"):
            FontProject().run_from_ufos([source], **args)
        else:
            raise ValueError("Can't build from unknown source file: %s" %
                             source)
        if "output_path" in args:
            return [args["output_path"]]
        else:
            # Move it to where it should be...
            file_names = os.listdir(args["output_dir"])
            for file_name in file_names:
                shutil.move(os.path.join(args["output_dir"], file_name),
                            original_output_dir)
            tmpdir.cleanup()
            args["output_dir"] = original_output_dir
            return [os.path.join(original_output_dir, x) for x in file_names]
Beispiel #3
0
    def test_custom_filters_as_argument(self, FontClass):
        ufo1 = FontClass(getpath("TestFont.ufo"))
        ufo2 = FontClass(getpath("TestFont.ufo"))
        filter1 = loadFilterFromString("RemoveOverlapsFilter(backend='pathops')")
        filter2 = loadFilterFromString(
            "TransformationsFilter(OffsetY=-200, include=['d'], pre=True)"
        )
        filter3 = loadFilterFromString("TransformationsFilter(OffsetX=10)")
        ufos = [ufo1, ufo2]

        glyphSets = TTFInterpolatablePreProcessor(
            ufos,
            filters=[filter1, filter2, filter3],
        ).process()

        # Both UFOs have the same filters applied
        assert (glyphSets[0]["a"][0][0].x - glyphSets[1]["a"][0][0].x) == 0
        # "a" has initially its starting point at (66, 0)
        assert (glyphSets[0]["a"][0][0].x, glyphSets[0]["a"][0][0].y) == (76, 0)
        assert (glyphSets[1]["a"][0][0].x, glyphSets[1]["a"][0][0].y) == (76, 0)
        # A component was shifted to overlap with another in a pre-filter
        # filter2, before overlaps were removed in a post-filter filter1
        assert len(glyphSets[0]["d"].components) == 0
args = parser.parse_args()
if not args.output:
    args.output = makeOutputFileName(args.ufo)

ufo = loader(args.ufo)

include = None

if args.include:
    include_set = set(args.include.split(","))

    def include(g):
        return g.name in include_set


elif args.exclude:
    exclude_set = set(args.exclude.split(","))

    def include(g):
        return g.name not in exclude_set


for filtername in args.filters:
    f = loadFilterFromString(filtername)
    if include is not None:
        f.include = include
    f(ufo)

logger.info("Written on %s" % args.output)
ufo.save(args.output)
Beispiel #5
0
def test_loadFilterFromString(spec, ufo):
    philter = loadFilterFromString(spec)
    assert callable(philter)