gftools icon indicating copy to clipboard operation
gftools copied to clipboard

[builder] "assert instance is not None" build problem

Open arrowtype opened this issue 1 year ago • 1 comments

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:

arrowtype avatar Oct 18 '24 18:10 arrowtype

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!

simoncozens avatar Oct 21 '24 16:10 simoncozens

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!

arrowtype avatar Oct 24 '24 15:10 arrowtype