def test_run_task(self): f = Mock() task = Task("foobaz") task << Chute.create(f)() Hellbox.add_task(task) Hellbox.run_task("foobaz") assert f.called
def _generate(self, file): Hellbox.info(f"Generating OTF: {file.basename}") return file.transform( "fontmake -o otf -u \"{input}\" --output-path \"{output}\"", extension="otf" )
def test_run_task(self): f = Mock() task = Task('foobaz') task.start_chain(Chute.create(f)()) Hellbox.add_task(task) Hellbox.run_task('foobaz') assert f.called
def _insert_dummy(self, file): Hellbox.info(f"Updating DSIG: {file.basename}") copy = file.copy() font = ttLib.TTFont(copy.content_path) font.tables["DSIG"] = self._create_signature() font.save(copy.content_path) return copy
def _hint(self, file): Hellbox.info(f"Hinting: {file.basename}") if file.extension == "ttf": return file.transform("ttfautohint \"{input}\" \"{output}\"") elif file.extension == "otf": return file.transform( "autohint -o \"{output}\" -nb -q \"{input}\"") else: Hellbox.warn(f"Skipping {file.basename} (not a hintable format)") return file
def test_usage(self): task = Task("build") task.describe("Does the building") task << Bar(2, grade=3) >> Foo() task << Foo() >> Bar(level=2) Hellbox.add_task(task) task = Task("package") task.describe("Does the packaging\nZips and tars") task << Foo() Hellbox.add_task(task) assert Hellbox.usage() == USAGE
def test_compose_many(self): foo = Noop() bar = Noop() baz = Noop() composed = Hellbox.compose(foo, bar, baz)() assert composed.head == foo assert composed.tail == baz
def test_find_missing_task(self): task = Hellbox.find_task_by_name("bazzio") Hellbox._warn = Hellbox.warn Hellbox.warn = Mock() task.run() assert Hellbox.warn.called Hellbox.warn = Hellbox._warn
def test_find_missing_task(self): task = Hellbox.find_task_by_name('bazzio') assert type(task) is NullTask Hellbox._warn = Hellbox.warn Hellbox.warn = Mock() task.run() assert Hellbox.warn.called Hellbox.warn = Hellbox._warn
def test_compose(self): noop = lambda x: x foo = Chute.create(noop)() bar = Chute.create(noop)() Composite = Hellbox.compose(foo, bar) composed = Composite() assert composed.head is foo assert composed.tail is bar assert bar in foo.callbacks
def test_compose(self): foo = Noop() bar = Noop() composed = Hellbox.compose(foo, bar)() assert composed.head == foo assert composed.head is not foo assert composed.tail == bar assert composed.tail is not bar assert bar in composed.head.callbacks
def test_multiple_compose(self): foo = Noop() bar = Noop() Composite = Hellbox.compose(foo, bar) composed = Composite() assert composed.head == foo assert composed.tail == bar composed2 = Composite() assert composed is not composed2 assert composed.head is not composed2.head
def test_run_task_with_requirements(self): f = Mock() f2 = Mock() task = Task('fooqaaz') task.requires('foobar') task.start_chain(Chute.create(f)()) task2 = Task('foobar') task2.start_chain(Chute.create(f2)()) Hellbox.add_task(task) Hellbox.add_task(task2) Hellbox.run_task('fooqaaz') assert f2.called
def test_run_task_with_requirements(self): f = Mock() f2 = Mock() task = Task("fooqaaz") task.requires("foobar") task << Chute.create(f)() task2 = Task("foobar") task2 << Chute.create(f2)() Hellbox.add_task(task) Hellbox.add_task(task2) Hellbox.run_task("fooqaaz") assert f2.called
def test_get_default_task_name(self): Hellbox.default = 'bar' assert Hellbox.get_task_name_or_default('default') is 'bar'
def test_find_task_by_name(self): Hellbox.add_task(Task("foo")) assert Hellbox.find_task_by_name("foo")
def teardown(self): Hellbox.reset_tasks()
def test_usage_without_tasks(self): assert Hellbox.usage() == "No tasks have been defined in Hellfile.py"
def test_with(self): with Hellbox("foo") as task: assert task assert type(task) is Task assert Hellbox.find_task_by_name("foo")
def _generate(self, file): Hellbox.info(f"Generating WOFF2: {file.basename}") return file.transform("woff2_compress \"{input}\"", extension="woff2")
def test_get_task_name(self): assert Hellbox.get_task_name_or_default("bar") == "bar"
""" Example hellfile.py To run with development version of Hellbox, from this directory run: > hell init (This will fail because pip doesn't know about hellbox yet) > cd .. && ./example/.hellbox/bin/python setup.py install > cd example && hell freeze && hell inspect """ from hellbox import Hellbox from packages.test import TestUFO from packages.generate_otf import GenerateOTF from packages.extension import BuildRoboFontExtension MakeOTF = Hellbox.compose(TestUFO(), GenerateOTF()) MakeExt = Hellbox.compose(BuildRoboFontExtension(info_format="yaml")) with Hellbox("font") as task: task.describe("Does a little generation dance.") task.read("*.ufo", "src/*") >> MakeOTF() >> task.write("otf") with Hellbox("extension") as task: task.describe("Builds a robofont extension in place.") task.requires("font") task.read("src") >> MakeExt() >> task.write(".") Hellbox.default = "font"
def test_init(self): h = Hellbox("foo") assert hasattr(h, "task") assert type(h.task) is Task
def test_get_default_task_name(self): Hellbox.default = "bar" assert Hellbox.get_task_name_or_default("default") == "bar"
def _process(self, file): Hellbox.info(f"Doing something: {file.basename}") return file
from hellbox import Hellbox from hellbox.jobs.fontmake import GenerateOtf, GenerateTtf with Hellbox("build") as task: ufo = task.read("ufo/*") otf = ufo >> GenerateOtf() ttf = ufo >> GenerateTtf() otf >> task.write("build/otf") ttf >> task.write("build/ttf")
def test_get_task_name(self): assert Hellbox.get_task_name_or_default('bar') is 'bar'
from hellbox import Hellbox from hellbox.jobs.dsig import InsertDummyDsig from hellbox.jobs.fontmake import GenerateOtf, GenerateTtf from lib.autohint import Autohint from lib.woff import GenerateWoff from lib.woff2 import GenerateWoff2 PostProduction = Hellbox.compose(InsertDummyDsig(), Autohint()) Hellbox.default = "build" with Hellbox("build") as task: task.describe("Builds font files from source") source = task.read("source/*.ufo") otf = source >> GenerateOtf() >> PostProduction() ttf = source >> GenerateTtf() >> PostProduction() woff = ttf >> GenerateWoff() woff2 = ttf >> GenerateWoff2() otf >> task.write("build/otf") ttf >> task.write("build/ttf") woff >> task.write("build/woff") woff2 >> task.write("build/woff2")
def _generate(self, file): Hellbox.info(f"Generating WOFF: {file.basename}") return file.transform("sfnt2woff-zopfli \"{input}\"", extension="woff")