diff --git a/pyproject.toml b/pyproject.toml index d7e33c1..18a7121 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,7 +12,7 @@ authors = [ ] keywords = ["font", "fonts"] license = {text = "GNU General Public License v3"} -dependencies = ["fontra"] +dependencies = ["fontra", "fontmake"] dynamic = ["version"] requires-python = ">=3.10" classifiers = [ @@ -37,7 +37,8 @@ fontra-compile = "fontra_compile.__main__:main" [project.entry-points."fontra.workflow.actions"] -fontra_compile = "fontra_compile.workflow_action" +compile_varc = "fontra_compile.compile_varc_action" +compile_fontmake = "fontra_compile.compile_fontmake_action" [tool.hatch.build.targets.wheel] diff --git a/requirements-dev.txt b/requirements-dev.txt index 2634433..01e605a 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -1,4 +1,4 @@ -mypy==1.8.0 -pre-commit==3.3.3 -pytest==7.3.2 -types-PyYAML==6.0.12.12 +mypy==1.9.0 +pre-commit==3.6.2 +pytest==8.1.1 +types-PyYAML==6.0.12.20240311 diff --git a/requirements.txt b/requirements.txt index 3b7bf3e..fa18f1d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,4 @@ -fonttools==4.43.0 +fonttools==4.50.0 +fontmake==3.8.1 git+https://github.com/googlefonts/fontra.git git+https://github.com/googlefonts/fontra-rcjk.git diff --git a/src/fontra_compile/compile_fontmake_action.py b/src/fontra_compile/compile_fontmake_action.py new file mode 100644 index 0000000..84f07d9 --- /dev/null +++ b/src/fontra_compile/compile_fontmake_action.py @@ -0,0 +1,63 @@ +import os +import pathlib +import subprocess +import tempfile +from contextlib import aclosing, asynccontextmanager +from dataclasses import dataclass, field +from typing import AsyncGenerator + +from fontra.backends import newFileSystemBackend +from fontra.backends.copy import copyFont +from fontra.core.protocols import ReadableFontBackend +from fontra.workflow.actions import OutputActionProtocol, registerActionClass + + +@registerActionClass("compile-fontmake") +@dataclass(kw_only=True) +class CompileFontMakeAction: + destination: str + options: dict[str, str] = field(default_factory=dict) + input: ReadableFontBackend | None = field(init=False, default=None) + + @asynccontextmanager + async def connect( + self, input: ReadableFontBackend + ) -> AsyncGenerator[ReadableFontBackend | OutputActionProtocol, None]: + self.input = input + try: + yield self + finally: + self.input = None + + async def process(self, outputDir: os.PathLike = pathlib.Path()) -> None: + assert self.input is not None + outputDir = pathlib.Path(outputDir) + outputFontPath = outputDir / self.destination + + with tempfile.TemporaryDirectory() as tmpDirName: + tmpDir = pathlib.Path(tmpDirName) + + designspacePath = tmpDir / "temp.designspace" + + dsBackend = newFileSystemBackend(designspacePath) + + async with aclosing(dsBackend): + await copyFont(self.input, dsBackend) + + # assert 0, [p.name for p in tmpDir.iterdir()] + command = [ + "fontmake", + "-m", + os.fspath(designspacePath), + "-o", + "variable", + "--output-path", + os.fspath(outputFontPath), + ] + + for option, value in self.options.items(): + command.append(f"--{option}") + if value: + command.append(value) + + subprocess.run(command, check=True) diff --git a/src/fontra_compile/workflow_action.py b/src/fontra_compile/compile_varc_action.py similarity index 96% rename from src/fontra_compile/workflow_action.py rename to src/fontra_compile/compile_varc_action.py index 249687f..8ebbb20 100644 --- a/src/fontra_compile/workflow_action.py +++ b/src/fontra_compile/compile_varc_action.py @@ -10,7 +10,7 @@ from .builder import Builder -@registerActionClass("fontra-compile") +@registerActionClass("compile-varc") @dataclass(kw_only=True) class FontraCompileAction: destination: str diff --git a/tests/data/MutatorSans-fontmake.ttx b/tests/data/MutatorSans-fontmake.ttx new file mode 100644 index 0000000..fc9d925 --- /dev/null +++ b/tests/data/MutatorSans-fontmake.ttx @@ -0,0 +1,5387 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Width + + + Weight + + + License same as MutatorMath. BSD 3-clause. [test-token: C] + + + MutatorMathTest + + + Regular + + + 1.002;NONE;MutatorMathTest-Regular + + + MutatorMathTest Regular + + + Version 1.002 + + + MutatorMathTest-Regular + + + License same as MutatorMath. BSD 3-clause. [test-token: C] + + + Width + + + Weight + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + wdth + 0x0 + 0.0 + 0.0 + 1000.0 + 256 + + + + + wght + 0x0 + 100.0 + 100.0 + 900.0 + 257 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/data/MutatorSans.fontra/font-data.json b/tests/data/MutatorSans.fontra/font-data.json index b22c6dd..34c140b 100644 --- a/tests/data/MutatorSans.fontra/font-data.json +++ b/tests/data/MutatorSans.fontra/font-data.json @@ -1,5 +1,12 @@ { "unitsPerEm": 1000, +"fontInfo": { +"familyName": "MutatorMathTest", +"versionMajor": 1, +"versionMinor": 2, +"copyright": "License same as MutatorMath. BSD 3-clause. [test-token: C]", +"licenseDescription": "License same as MutatorMath. BSD 3-clause. [test-token: C]" +}, "lib": {}, "axes": [ { diff --git a/tests/test_workflow.py b/tests/test_workflow.py index a556a3f..056c180 100644 --- a/tests/test_workflow.py +++ b/tests/test_workflow.py @@ -1,6 +1,7 @@ import pathlib import subprocess +import pytest import yaml from fontra.workflow.workflow import Workflow from test_compile import cleanupTTX @@ -9,18 +10,36 @@ dataDir = testDir / "data" -testWorkFlow = """ +testData = [ + ( + """ steps: - action: input source: "tests/data/MutatorSans.fontra" -- action: fontra-compile +- action: compile-varc destination: "output1.ttf" -""" - - -async def test_workflow(tmpdir): +""", + "MutatorSans.ttx", + ), + ( + """ +steps: +- action: input + source: "tests/data/MutatorSans.fontra" +- action: compile-fontmake + options: + flatten-components: # no value + destination: "output-fontmake.ttf" +""", + "MutatorSans-fontmake.ttx", + ), +] + + +@pytest.mark.parametrize("workflowSource, ttxFileName", testData) +async def test_workflow(tmpdir, workflowSource, ttxFileName): tmpdir = pathlib.Path(tmpdir) - config = yaml.safe_load(testWorkFlow) + config = yaml.safe_load(workflowSource) workflow = Workflow(config=config) @@ -29,11 +48,12 @@ async def test_workflow(tmpdir): for output in endPoints.outputs: await output.process(tmpdir) - ttxPath = dataDir / "MutatorSans.ttx" + ttxPath = dataDir / ttxFileName outPath = tmpdir / output.destination + assert outPath.exists(), outPath outTTXPath = tmpdir / (outPath.stem + ".ttx") - subprocess.run(["ttx", outPath], check=True) + subprocess.run(["ttx", "-o", outTTXPath, outPath], check=True) ttxLines = cleanupTTX(outTTXPath.read_text()) expectedLines = cleanupTTX(ttxPath.read_text()) - assert expectedLines == ttxLines + assert expectedLines == ttxLines, outTTXPath