Développement basé sur le test pour Fontlab Studio 5 Python Macros and Modules.
FakeLab est un remplacement Fontlab Studio 5 pour tester le code Python.
Tout n'est mis en œuvre que pour rendre les objets FontLab imporables en dehors de Fontlab Studio 5 et exécuter des tests.
Il est suggéré d'installer FakeLab dans un environnement virtuel afin que Fontlab n'importe pas accidentellement le faux module lors de l'exécution des scripts dans Fontlab Studio 5. Si vous pouvez vivre avec les incompatibilites entre Python 2.7 et 3, vous pouvez également exécuter FAKELAB dans Python 3.
La sauvegarde de VFBS n'est pas prise en charge, car le format VFB n'est pas public, mais vous pouvez enregistrer des objets Font sous forme de JSON.
La mise en œuvre de FakeLab est basée sur la référence INFAUX OFFICIAL FONTLAB / PYTHON, et de l'exécution de scripts dans Fontlab Studio et de vérifier ce qu'ils font, en plus de écraser l'application.
Lorsque vous avez activé votre environnement virtuel:
$ pip install -e .FL est ensuite imporable en dehors de Fontlab Studio:
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 () Si vous fonctionnez dans un environnement virtuel et que vous devez rendre vos modules Fontlab Importables, ajoutez un fichier .pth dans le répertoire des packages de site de votre environnement virtuel:
# fl5modules.pth
/Users/<yourname>/Code/FLMacros/System/Modules
FakeLab est un travail en cours et mis en œuvre uniquement dans la mesure où j'en avais besoin dans mes propres scripts. Je dois admettre que la majeure partie d'eux n'a toujours pas de tests.
Si vous rencontrez un NotImplementedError lors de la rédaction de tests, c'est là que vous pouvez exceller pour aider à améliorer ce projet;) Je serai heureux d'accepter vos demandes de traction. Alternativement, ouvrez un problème, achetez-moi un café et j'espère que mes enfants me laisseront tranquille pour que je puisse trouver du temps pour travailler sur votre problème.
Le développement de scripts sans test automatisé est vraiment uniquement pour de très petits projets. Pour être sûr des résultats d'un module ou d'un script, vous devez toujours écrire des tests. Cela se fait généralement à l'aide de Pytest.
Supposons que vous ayez un script FontLab pour sélectionner les glyphes contenant des composants. Si vous avez votre propre collection d'outils pour Fontlab, ce script peut être composé de deux parties: un script répertorié dans la barre d'outils macro de Fontlab et un module Python implémentant la logique, qui est appelé par le script de la barre d'outils.
Studio 5
+- Macros
+- Selection
+- Select Composites.py
+- System
+- Modules
+- fakeLabDemo
+- selection
+- __init__.py
+- composites.py
Le script Select Composites.py ressemble à ceci:
#FLM: Select composites
# Studio 5/Macros/Selection/Select Composites.py
from fakeLabDemo . selection . composites import selectComposites
selectComposites ( fl . font )Et le module:
# 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
]
)Comment pouvons-nous être sûrs que ce script fait ce qu'il est censé faire? Pour Pytest, nous ajoutons une autre structure de dossiers parallèles à la structure existante:
Studio 5
+- Macros
+- Selection
+- Select Composites.py
+- System
+- Modules
+- fakeLabDemo
+- selection
+- __init__.py
+- composites.py
+- tests
+- fakeLabDemo
+- selection
+- composites_test.py
Le fichier composites_test.py , qui est nommé analogue au fichier de module auquel il se rapporte, est l'endroit où nous implémenterons nos tests:
# 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 ()Comme vous le voyez, vous pouvez utiliser les objets comme vous le feriez à l'intérieur de Fontlab. Vous ne pouvez tout simplement pas ouvrir une police d'un VFB existant, ce qui serait beaucoup plus facile. Mais le format de fichier VFB n'est pas public.
Au lieu de cela, vous devez construire une police de test en utilisant l'API FL Python.
Invoquez le script de test dans une fenêtre de terminal pendant que votre environnement virtuel est actif:
cd " Studio 5/Macros/System/Modules "
python -m pytest tests/fakeLabDemo/selection/composites_test.pySi tout fonctionne, vous verrez une sortie comme ceci:
============================ 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 ================================