Тестовая разработка для Fontlab Studio 5 Python Macros and Modules.
Fakelab - это замена Fontlab Studio 5 для тестирования кода Python.
Все реализовано только для того, чтобы сделать объекты Fontlab, импортируемые за пределами Fontlab Studio 5, и запустить тесты.
Предполагается установить Fakelab в виртуальную среду, чтобы Fontlab не случайно импортировал фальшивый модуль при запуске сценариев в фактической студии Fontlab 5. Если вы можете жить с несовместимыми между Python 2.7 и 3, вы также можете запустить Fakelab в Python 3.
Сохранение VFBS не поддерживается, так как формат VFB не является публичным, но вы можете сохранить объекты Font как JSON.
Реализация Fakelab основана на бесценной неофициальной ссылке на API Fontlab/Python, а также на запуске сценариев в студии Fontlab и проверке того, что они делают, кроме сбоя приложения.
Когда вы активировали свою виртуальную среду:
$ pip install -e .FL затем импортируется за пределами студии Fontlab:
from FL import fl , Font
# Make an empty font
f = Font ()
# Add the font to the mock app
fl . Add ( f )
# Close the font
fl . Close () Если вы работаете в виртуальной среде, и вам необходимо сделать ваши модули .pth , добавившись в каталог пакетов на сайте виртуальной среды:
# fl5modules.pth
/Users/<yourname>/Code/FLMacros/System/Modules
Fakelab находится в стадии разработки и реализована только в том, насколько мне нужно в моих собственных сценариях. Я должен признать, что у них у основной массы все еще нет тестов.
Если вы столкнетесь NotImplementedError во время написания тестов, именно здесь вы можете преуспеть в том, чтобы помочь улучшить этот проект;) Я буду рад принять ваши запросы на притяжение. В качестве альтернативы, откройте проблему, купите мне кофе и надеюсь, что мои дети оставят меня в покое, чтобы я мог найти время, чтобы поработать над вашей проблемой.
Разработка сценариев без автоматического тестирования на самом деле предназначена только для очень небольших проектов. Чтобы быть уверенным в результатах модуля или сценария, вы всегда должны писать тесты. Обычно это делается с помощью pytest.
Давайте предположим, что у вас есть скрипт Fontlab для выбора глифов, содержащих компоненты. Если у вас есть собственная коллекция инструментов для Fontlab, этот сценарий может состоять из двух частей: один сценарий, который указан на панели инструментов Macro Fontlab, и один модуль Python, реализующий логику, который вызывается сценарием панели инструментов.
Studio 5
+- Macros
+- Selection
+- Select Composites.py
+- System
+- Modules
+- fakeLabDemo
+- selection
+- __init__.py
+- composites.py
Сценарий Select Composites.py выглядит так:
#FLM: Select composites
# Studio 5/Macros/Selection/Select Composites.py
from fakeLabDemo . selection . composites import selectComposites
selectComposites ( fl . font )И модуль:
# Studio 5/Macros/System/Modules/fakeLabDemo/selection/composites.py
from __future__ import absolute_import , division , print_function
from FL import fl
def getFontIndex ( font ):
"""
Get the index of the supplied font.
We must iterate through the open fonts and compare file names,
because the == operator can not compare the font objects directly.
(FL font objects get a different id() each time they are called)
:param font: A title for the dialog.
:type font: :py:class:`FL.Font`
"""
for i in range ( len ( fl )):
cf = fl [ i ]
if cf . file_name == font . file_name :
if font . file_name is None :
if (
cf . family_name == font . family_name
and cf . style_name == font . style_name
):
return ( cf , i )
else :
return ( cf , i )
# Font was not found, probably there are no open fonts
return ( None , - 1 )
def setSelection ( font , glyph_names ):
"""
Set glyphs from the glyph_names list as selected in the font window.
"""
f , i = getFontIndex ( font )
if i > - 1 :
fl . ifont = i
fl . Unselect ()
for n in glyph_names :
fl . Select ( n )
def selectComposites ( font ):
"""
Select composites in font.
"""
setSelection (
font ,
[
glyph . name
for glyph in font . glyphs
if glyph . components
]
)Как мы можем быть уверены, что этот сценарий делает то, что он должен делать? Для Pytest мы добавляем еще одну параллельную структуру папок в существующую структуру:
Studio 5
+- Macros
+- Selection
+- Select Composites.py
+- System
+- Modules
+- fakeLabDemo
+- selection
+- __init__.py
+- composites.py
+- tests
+- fakeLabDemo
+- selection
+- composites_test.py
File composites_test.py , который называется аналогичным файлу модуля, который он относится к тому, где мы будем реализовать наши тесты:
# Studio 5/Macros/System/Modules/tests/fakeLabDemo/selection/composites_test.py
import pytest
from FL import fl , Component , Font , Glyph , Point
from fakeLabDemo . selection . composites import selectComposites
def test_selectComposites ():
# Construct a fake FontLab font object
font = Font ()
g = Glyph ( 1 )
g . name = "A"
g . width = 500
g . unicode = 0x41
font . glyphs . append ( g )
g = Glyph ( 1 )
g . name = "dieresis"
g . width = 500
g . unicode = 0xA8
font . glyphs . append ( g )
g = Glyph ( 1 )
g . name = "Adieresis"
g . width = 500
g . unicode = 0xC4
g . components . append ( Component ( 0 ))
g . components . append ( Component ( 1 , Point ( 0 , 300 )))
font . glyphs . append ( g )
# Add the font to the FL object
fl . Add ( font )
fl . UpdateFont ()
# Run our script to be tested on the font
selectComposites ( fl . font )
# You could save the fake font to JSON instead of VFB.
# fl.font.Save("test_composites.vfb.json")
# Test if the correct glyphs have been selected
assert fl . Selected ( 0 ) == 0
assert fl . Selected ( 1 ) == 0
assert fl . Selected ( 2 ) == 1
# Close the fake font
fl . Close ()Как вы видите, вы можете использовать объекты так же, как и в Fontlab. Вы просто не можете открыть шрифт из существующего VFB, что было бы намного проще. Но формат файла VFB не является общедоступным.
Вместо этого вы должны построить тестовый шрифт, используя FL Python API.
Вызовать тестовый скрипт в окне терминала, пока ваша виртуальная среда активна:
cd " Studio 5/Macros/System/Modules "
python -m pytest tests/fakeLabDemo/selection/composites_test.pyЕсли все сработает, вы увидите некоторые результаты, как это:
============================ test session starts ===============================
platform darwin -- Python 3.8.7, pytest-6.0.1, py-1.9.0, pluggy-0.13.1
rootdir: /Users/jens/Code/fakelab
collected 1 item
tests/fakeLabDemo/selection/composites_test.py . [100%]
============================= 1 passed in 0.02s ================================