docs: def _fake_designspace(self, ufos):
          """Build a fake designspace with the given UFOs as sources, so that all
          builder functions can rely on the presence of a designspace.
          """
          designspace = designspaceLib.DesignSpaceDocument()
  
          ufo_to_location = defaultdict(dict)
  
          # Make weight and width axis if relevant
          for info_key, axis_def in zip(
              ("openTypeOS2WeightClass", "openTypeOS2WidthClass"),
              (WEIGHT_AXIS_DEF, WIDTH_AXIS_DEF),
          ):
              axis = designspace.newAxisDescriptor()
              axis.tag = axis_def.tag
              axis.name = axis_def.name
              mapping = []
              for ufo in ufos:
                  user_loc = getattr(ufo.info, info_key)
                  if user_loc is not None:
                      design_loc = class_to_value(axis_def.tag, user_loc)
                      mapping.append((user_loc, design_loc))
                      ufo_to_location[ufo][axis_def.name] = design_loc
  
              mapping = sorted(set(mapping))
              if len(mapping) > 1:
                  axis.map = mapping
                  axis.minimum = min([user_loc for user_loc, _ in mapping])
                  axis.maximum = max([user_loc for user_loc, _ in mapping])
                  axis.default = min(
                      axis.maximum, max(axis.minimum, axis_def.default_user_loc)
                  )
                  designspace.addAxis(axis)
  
          for ufo in ufos:
              source = designspace.newSourceDescriptor()
              source.font = ufo
              source.familyName = ufo.info.familyName
              source.styleName = ufo.info.styleName
              # source.name = '%s %s' % (source.familyName, source.styleName)
              source.path = ufo.path
              source.location = ufo_to_location[ufo]
              designspace.addSource(source)
  
          # UFO-level skip list lib keys are usually ignored, except when we don't have a
          # Designspace file to start from. If they exist in the UFOs, promote them to a
          # Designspace-level lib key. However, to avoid accidents, expect the list to
          # exist in none or be the same in all UFOs.
          if any("public.skipExportGlyphs" in ufo.lib for ufo in ufos):
              skip_export_glyphs = {
                  frozenset(ufo.lib.get("public.skipExportGlyphs", [])) for ufo in ufos
              }
              if len(skip_export_glyphs) == 1:
                  designspace.lib["public.skipExportGlyphs"] = sorted(
                      next(iter(skip_export_glyphs))
                  )
              else:
                  raise ValueError(
                      "The `public.skipExportGlyphs` list of all UFOs must either not "
                      "exist or be the same in every UFO."
                  )
  
          return designspace