[builder] "assert instance is not None" build problem
I’m working to set up a builder config for a relatively simple UFO project. I’ve done this before, quite a few times, with different variations, so I’m confused why this particular approach is failing. Some basic debugging hasn’t turned up anything yet, and the designspace builds via FontMake directly without issue, whether to VF or interpolated UFO/OTF/TTF.
My config is like this:
familyName: Familyname
outputDir: "fonts"
buildVariable: False
autohintTTF: True
sources:
- Familyname.designspace
I’ve experimented with different paths for the outputDir and sources. The config is at the same level as the designspace, and the source paths are relative, as in other configs I’ve made. However, the GF Builder is failing for a reason that is hard for me to understand, so far. Running the above config gives me this error:
▶ gftools builder source/config.yaml
Traceback (most recent call last):
File "/Users/stephennixon/type-repos/familyname/venv/bin/gftools", line 8, in <module>
sys.exit(main())
^^^^^^
File "/Users/stephennixon/type-repos/familyname/venv/lib/python3.11/site-packages/gftools/scripts/__init__.py", line 98, in main
mod.main(args[2:])
File "/Users/stephennixon/type-repos/familyname/venv/lib/python3.11/site-packages/gftools/builder/__init__.py", line 414, in main
pd.build_graph()
File "/Users/stephennixon/type-repos/familyname/venv/lib/python3.11/site-packages/gftools/builder/__init__.py", line 187, in build_graph
self._build_graph(target, steps)
File "/Users/stephennixon/type-repos/familyname/venv/lib/python3.11/site-packages/gftools/builder/__init__.py", line 277, in _build_graph
elif step.targets: # Step already knows its own target
^^^^^^^^^^^^
File "/Users/stephennixon/type-repos/familyname/venv/lib/python3.11/site-packages/gftools/builder/operations/instantiateUfo.py", line 48, in targets
assert instance is not None
^^^^^^^^^^^^^^^^^^^^
AssertionError
To be honest, I’m having a bit of trouble understanding what is happening here.
Can anyone potentially point me in the right direction? Thanks so much for any insights!
For what it’s worth, here’s what I get if I run the builder with the --generate flag, which seems fine, though I’m probably missing something:
GF Builder --generate output (Click to expand)
autohintTTF: true
buildVariable: false
familyName: Familyname
outputDir: fonts
recipe:
fonts/otf/Familyname-Bold.otf:
- source: Familyname.designspace
- glyphData: null
instance_name: Familyname Bold
operation: instantiateUfo
- args: --filter ... --filter FlattenComponentsFilter --filter DecomposeTransformedComponentsFilter
operation: buildOTF
- args: ''
operation: fix
fonts/otf/Familyname-Light.otf:
- source: Familyname.designspace
- glyphData: null
instance_name: Familyname Light
operation: instantiateUfo
- args: --filter ... --filter FlattenComponentsFilter --filter DecomposeTransformedComponentsFilter
operation: buildOTF
- args: ''
operation: fix
fonts/otf/Familyname-Medium.otf:
- source: Familyname.designspace
- glyphData: null
instance_name: Familyname Medium
operation: instantiateUfo
- args: --filter ... --filter FlattenComponentsFilter --filter DecomposeTransformedComponentsFilter
operation: buildOTF
- args: ''
operation: fix
fonts/otf/Familyname-Regular.otf:
- source: Familyname.designspace
- glyphData: null
instance_name: Familyname Regular
operation: instantiateUfo
- args: --filter ... --filter FlattenComponentsFilter --filter DecomposeTransformedComponentsFilter
operation: buildOTF
- args: ''
operation: fix
fonts/otf/Familyname-SemiBold.otf:
- source: Familyname.designspace
- glyphData: null
instance_name: Familyname SemiBold
operation: instantiateUfo
- args: --filter ... --filter FlattenComponentsFilter --filter DecomposeTransformedComponentsFilter
operation: buildOTF
- args: ''
operation: fix
fonts/ttf/Familyname-Bold.ttf:
- source: Familyname.designspace
- glyphData: null
instance_name: Familyname Bold
operation: instantiateUfo
- args: --filter ... --filter FlattenComponentsFilter --filter DecomposeTransformedComponentsFilter
operation: buildTTF
- args: '--fail-ok '
operation: autohint
- args: ''
operation: fix
fonts/ttf/Familyname-Light.ttf:
- source: Familyname.designspace
- glyphData: null
instance_name: Familyname Light
operation: instantiateUfo
- args: --filter ... --filter FlattenComponentsFilter --filter DecomposeTransformedComponentsFilter
operation: buildTTF
- args: '--fail-ok '
operation: autohint
- args: ''
operation: fix
fonts/ttf/Familyname-Medium.ttf:
- source: Familyname.designspace
- glyphData: null
instance_name: Familyname Medium
operation: instantiateUfo
- args: --filter ... --filter FlattenComponentsFilter --filter DecomposeTransformedComponentsFilter
operation: buildTTF
- args: '--fail-ok '
operation: autohint
- args: ''
operation: fix
fonts/ttf/Familyname-Regular.ttf:
- source: Familyname.designspace
- glyphData: null
instance_name: Familyname Regular
operation: instantiateUfo
- args: --filter ... --filter FlattenComponentsFilter --filter DecomposeTransformedComponentsFilter
operation: buildTTF
- args: '--fail-ok '
operation: autohint
- args: ''
operation: fix
fonts/ttf/Familyname-SemiBold.ttf:
- source: Familyname.designspace
- glyphData: null
instance_name: Familyname SemiBold
operation: instantiateUfo
- args: --filter ... --filter FlattenComponentsFilter --filter DecomposeTransformedComponentsFilter
operation: buildTTF
- args: '--fail-ok '
operation: autohint
- args: ''
operation: fix
fonts/webfonts/Familyname-Bold.woff2:
- source: Familyname.designspace
- glyphData: null
instance_name: Familyname Bold
operation: instantiateUfo
- args: --filter ... --filter FlattenComponentsFilter --filter DecomposeTransformedComponentsFilter
operation: buildTTF
- args: '--fail-ok '
operation: autohint
- args: ''
operation: fix
- operation: compress
fonts/webfonts/Familyname-Light.woff2:
- source: Familyname.designspace
- glyphData: null
instance_name: Familyname Light
operation: instantiateUfo
- args: --filter ... --filter FlattenComponentsFilter --filter DecomposeTransformedComponentsFilter
operation: buildTTF
- args: '--fail-ok '
operation: autohint
- args: ''
operation: fix
- operation: compress
fonts/webfonts/Familyname-Medium.woff2:
- source: Familyname.designspace
- glyphData: null
instance_name: Familyname Medium
operation: instantiateUfo
- args: --filter ... --filter FlattenComponentsFilter --filter DecomposeTransformedComponentsFilter
operation: buildTTF
- args: '--fail-ok '
operation: autohint
- args: ''
operation: fix
- operation: compress
fonts/webfonts/Familyname-Regular.woff2:
- source: Familyname.designspace
- glyphData: null
instance_name: Familyname Regular
operation: instantiateUfo
- args: --filter ... --filter FlattenComponentsFilter --filter DecomposeTransformedComponentsFilter
operation: buildTTF
- args: '--fail-ok '
operation: autohint
- args: ''
operation: fix
- operation: compress
fonts/webfonts/Familyname-SemiBold.woff2:
- source: Familyname.designspace
- glyphData: null
instance_name: Familyname SemiBold
operation: instantiateUfo
- args: --filter ... --filter FlattenComponentsFilter --filter DecomposeTransformedComponentsFilter
operation: buildTTF
- args: '--fail-ok '
operation: autohint
- args: ''
operation: fix
- operation: compress
recipeProvider: googlefonts
sources:
- Familyname.designspace
Other details:
- gftools 0.9.71
- The font source UFOs are here, if it’s helpful
OK, replicated, thank you. The problem is that we are looking for an instance name attribute to generate the instance (ie. we want to find the instance descriptor for "RedHat Display Light"). In the recipe provider which schedules the instance build, we check the name attribute and if it's empty, we construct a name from instance.familyName + " " + instance.styleName. In the operation which actually performs the instance build, we check then name attribute, and if it's empty... we crash.
Will fix!
Ohhh thank you! I had found that before, I think, but somehow it was unclear to me, on this pass. This fix will be very handy in the builder, though. Thanks for the quick update!