[misc.classifyTools] Make classification order stable

Sets don't have a welldefined comparison function, so sort them...

Not the most efficient implementation, but good enough.

Fixes https://github.com/fonttools/fonttools/issues/927
This commit is contained in:
Behdad Esfahbod 2017-04-18 15:57:14 -07:00
parent e8530360bd
commit f056c124e5
3 changed files with 6 additions and 6 deletions

View File

@ -76,7 +76,7 @@ class Classifier(object):
self._sets = [s for s in sets if s]
if self._sort:
self._sets = sorted(self._sets, key=lambda s: (-len(s), s))
self._sets = sorted(self._sets, key=lambda s: (-len(s), sorted(s)))
self._dirty = False
@ -140,7 +140,7 @@ def classify(list_of_sets, sort=True):
True
>>> classify([[1,2],[2]]) == ([{1}, {2}], {1: {1}, 2: {2}})
True
>>> classify([[1,2],[2,4]]) == ([{1}, {4}, {2}], {1: {1}, 2: {2}, 4: {4}})
>>> classify([[1,2],[2,4]]) == ([{1}, {2}, {4}], {1: {1}, 2: {2}, 4: {4}})
True
>>> classify([[1,2],[2,4,5]]) == (
... [{4, 5}, {1}, {2}], {1: {1}, 2: {2}, 4: {4, 5}, 5: {4, 5}})

View File

@ -12,7 +12,7 @@ def test_classify():
assert classify([[1],[2]]) == ([{1}, {2}], {1: {1}, 2: {2}})
assert classify([[1,2],[2]]) == ([{1}, {2}], {1: {1}, 2: {2}})
assert classify([[1,2],[2,4]]) == (
[{1}, {4}, {2}], {1: {1}, 2: {2}, 4: {4}})
[{1}, {2}, {4}], {1: {1}, 2: {2}, 4: {4}})
assert classify([[1,2],[2,4,5]]) == (
[{4, 5}, {1}, {2}], {1: {1}, 2: {2}, 4: {4, 5}, 5: {4, 5}})
assert classify([[1,2],[2,4,5]], sort=False) == (

View File

@ -41,7 +41,7 @@
<ValueFormat1 value="4"/>
<ValueFormat2 value="0"/>
<ClassDef1 Format="1">
<ClassDef glyph="A" class="1"/>
<ClassDef glyph="a" class="1"/>
</ClassDef1>
<ClassDef2 Format="1">
<ClassDef glyph="a" class="1"/>
@ -53,7 +53,7 @@
<Value1 XAdvance="0"/>
</Class2Record>
<Class2Record index="1">
<Value1 XAdvance="10"/>
<Value1 XAdvance="-40"/>
</Class2Record>
</Class1Record>
<Class1Record index="1">
@ -61,7 +61,7 @@
<Value1 XAdvance="0"/>
</Class2Record>
<Class2Record index="1">
<Value1 XAdvance="-40"/>
<Value1 XAdvance="10"/>
</Class2Record>
</Class1Record>
</PairPos>