[interpolatable] Return master indices in addition to master names (#3346)

[interpolatable] Add master indices to problem reports

More solid than using names to refer back to the master index,
as needed in interpolatablePlot.
This commit is contained in:
Behdad Esfahbod 2023-11-20 08:59:11 -07:00 committed by GitHub
parent 82f44a6b45
commit 51e70f9742
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 68 additions and 30 deletions

View File

@ -321,10 +321,15 @@ def test_gen(
allGlyphs = [glyphset[glyph_name] for glyphset in glyphsets]
if len([1 for glyph in allGlyphs if glyph is not None]) <= 1:
continue
for glyph, glyphset, name in zip(allGlyphs, glyphsets, names):
for master_idx, (glyph, glyphset, name) in enumerate(
zip(allGlyphs, glyphsets, names)
):
if glyph is None:
if not ignore_missing:
yield (glyph_name, {"type": "missing", "master": name})
yield (
glyph_name,
{"type": "missing", "master": name, "master_idx": master_idx},
)
allNodeTypes.append(None)
allControlVectors.append(None)
allGreenVectors.append(None)
@ -359,7 +364,12 @@ def test_gen(
except OpenContourError as e:
yield (
glyph_name,
{"master": name, "contour": ix, "type": "open_path"},
{
"master": name,
"master_idx": master_idx,
"contour": ix,
"type": "open_path",
},
)
continue
contourGreenVectors.append(_contour_vector_from_stats(greenStats))
@ -405,6 +415,8 @@ def test_gen(
"type": "path_count",
"master_1": names[m0idx],
"master_2": names[m1idx],
"master_1_idx": m0idx,
"master_2_idx": m1idx,
"value_1": len(m0),
"value_2": len(m1),
},
@ -423,6 +435,8 @@ def test_gen(
"path": pathIx,
"master_1": names[m0idx],
"master_2": names[m1idx],
"master_1_idx": m0idx,
"master_2_idx": m1idx,
"value_1": len(nodes1),
"value_2": len(nodes2),
},
@ -438,6 +452,8 @@ def test_gen(
"node": nodeIx,
"master_1": names[m0idx],
"master_2": names[m1idx],
"master_1_idx": m0idx,
"master_2_idx": m1idx,
"value_1": n1,
"value_2": n2,
},
@ -510,6 +526,8 @@ def test_gen(
"type": "contour_order",
"master_1": names[m0idx],
"master_2": names[m1idx],
"master_1_idx": m0idx,
"master_2_idx": m1idx,
"value_1": list(range(len(m0Control))),
"value_2": matching,
},
@ -543,6 +561,8 @@ def test_gen(
"contour": ix,
"master_1": names[m0idx],
"master_2": names[m1idx],
"master_1_idx": m0idx,
"master_2_idx": m1idx,
"value_1": 0,
"value_2": contour1[min_cost_idx][1],
"reversed": reverse,
@ -820,14 +840,21 @@ def main(args=None):
if glyphname != last_glyphname:
print(f"Glyph {glyphname} was not compatible:", file=f)
last_glyphname = glyphname
last_masters = None
last_master_idxs = None
masters = (
(p["master"]) if "master" in p else (p["master_1"], p["master_2"])
master_idxs = (
(p["master_idx"])
if "master_idx" in p
else (p["master_1_idx"], p["master_2_idx"])
)
if masters != last_masters:
print(f" Masters: %s:" % ", ".join(masters), file=f)
last_masters = masters
if master_idxs != last_master_idxs:
master_names = (
(p["master"])
if "master" in p
else (p["master_1"], p["master_2"])
)
print(f" Masters: %s:" % ", ".join(master_names), file=f)
last_master_idxs = master_idxs
if p["type"] == "missing":
print(" Glyph was missing in master %s" % p["master"], file=f)

View File

@ -148,7 +148,9 @@ class InterpolatablePlot:
current_glyph_problems = []
for p in glyph_problems:
masters = (
p["master"] if "master" in p else (p["master_1"], p["master_2"])
p["master_idx"]
if "master_idx" in p
else (p["master_1_idx"], p["master_2_idx"])
)
if masters == last_masters:
current_glyph_problems.append(p)
@ -176,10 +178,11 @@ class InterpolatablePlot:
log.info("Drawing %s: %s", glyphname, problem_type)
master_keys = (
("master",) if "master" in problems[0] else ("master_1", "master_2")
("master_idx",)
if "master_idx" in problems[0]
else ("master_1_idx", "master_2_idx")
)
master_names = [problems[0][k] for k in master_keys]
master_indices = [self.names.index(n) for n in master_names]
master_indices = [problems[0][k] for k in master_keys]
if problem_type == "missing":
sample_glyph = next(

View File

@ -47,7 +47,7 @@ class InterpolatableTest(unittest.TestCase):
for p in all_files:
if p.startswith(prefix) and p.endswith(suffix):
file_list.append(os.path.abspath(os.path.join(folder, p)))
return file_list
return sorted(file_list)
def temp_path(self, suffix):
self.temp_dir()
@ -136,18 +136,20 @@ class InterpolatableTest(unittest.TestCase):
# without --ignore-missing
problems = interpolatable_main(["--quiet"] + ttf_paths)
self.assertEqual(
problems["a"], [{"type": "missing", "master": "SparseMasters-Medium"}]
problems["a"],
[{"type": "missing", "master": "SparseMasters-Medium", "master_idx": 1}],
)
self.assertEqual(
problems["s"], [{"type": "missing", "master": "SparseMasters-Medium"}]
problems["s"],
[{"type": "missing", "master": "SparseMasters-Medium", "master_idx": 1}],
)
self.assertEqual(
problems["edotabove"],
[{"type": "missing", "master": "SparseMasters-Medium"}],
[{"type": "missing", "master": "SparseMasters-Medium", "master_idx": 1}],
)
self.assertEqual(
problems["dotabovecomb"],
[{"type": "missing", "master": "SparseMasters-Medium"}],
[{"type": "missing", "master": "SparseMasters-Medium", "master_idx": 1}],
)
# normal order, with --ignore-missing
@ -172,18 +174,20 @@ class InterpolatableTest(unittest.TestCase):
# without --ignore-missing
problems = interpolatable_main(["--quiet"] + ufo_paths)
self.assertEqual(
problems["a"], [{"type": "missing", "master": "SparseMasters-Medium"}]
problems["a"],
[{"type": "missing", "master": "SparseMasters-Medium", "master_idx": 1}],
)
self.assertEqual(
problems["s"], [{"type": "missing", "master": "SparseMasters-Medium"}]
problems["s"],
[{"type": "missing", "master": "SparseMasters-Medium", "master_idx": 1}],
)
self.assertEqual(
problems["edotabove"],
[{"type": "missing", "master": "SparseMasters-Medium"}],
[{"type": "missing", "master": "SparseMasters-Medium", "master_idx": 1}],
)
self.assertEqual(
problems["dotabovecomb"],
[{"type": "missing", "master": "SparseMasters-Medium"}],
[{"type": "missing", "master": "SparseMasters-Medium", "master_idx": 1}],
)
# normal order, with --ignore-missing
@ -206,18 +210,20 @@ class InterpolatableTest(unittest.TestCase):
problems = interpolatable_main(["--quiet", designspace_path])
self.assertEqual(
problems["a"], [{"type": "missing", "master": "SparseMasters-Medium"}]
problems["a"],
[{"type": "missing", "master": "SparseMasters-Medium", "master_idx": 1}],
)
self.assertEqual(
problems["s"], [{"type": "missing", "master": "SparseMasters-Medium"}]
problems["s"],
[{"type": "missing", "master": "SparseMasters-Medium", "master_idx": 1}],
)
self.assertEqual(
problems["edotabove"],
[{"type": "missing", "master": "SparseMasters-Medium"}],
[{"type": "missing", "master": "SparseMasters-Medium", "master_idx": 1}],
)
self.assertEqual(
problems["dotabovecomb"],
[{"type": "missing", "master": "SparseMasters-Medium"}],
[{"type": "missing", "master": "SparseMasters-Medium", "master_idx": 1}],
)
# normal order, with --ignore-missing
@ -229,18 +235,20 @@ class InterpolatableTest(unittest.TestCase):
problems = interpolatable_main(["--quiet", glyphsapp_path])
self.assertEqual(
problems["a"], [{"type": "missing", "master": "Sparse Masters-Medium"}]
problems["a"],
[{"type": "missing", "master": "Sparse Masters-Medium", "master_idx": 1}],
)
self.assertEqual(
problems["s"], [{"type": "missing", "master": "Sparse Masters-Medium"}]
problems["s"],
[{"type": "missing", "master": "Sparse Masters-Medium", "master_idx": 1}],
)
self.assertEqual(
problems["edotabove"],
[{"type": "missing", "master": "Sparse Masters-Medium"}],
[{"type": "missing", "master": "Sparse Masters-Medium", "master_idx": 1}],
)
self.assertEqual(
problems["dotabovecomb"],
[{"type": "missing", "master": "Sparse Masters-Medium"}],
[{"type": "missing", "master": "Sparse Masters-Medium", "master_idx": 1}],
)
# normal order, with --ignore-missing