unified-font-object / ufoNormalizer

A tool that will normalize the XML and other data inside of a UFO.
Other
51 stars 19 forks source link

Coverage Status Python Versions PyPI Version

ufoNormalizer

Provides a standard formatting so that there are meaningful diffs in version control rather than formatting noise.

Examples of formatting applied by ufoNormalizer include:

Usage in RoboFont

RoboFont comes with ufoNormalizer pre-installed, and you can set a preference to normalize UFOs on save.

Simply open the Scripting Window and run the following code:

from mojo.UI import setDefault, getDefault

setDefault("shouldNormalizeOnSave", True)

print("shouldNormalizeOnSave is set to " + str(getDefault("shouldNormalizeOnSave")))

Advanced usage

Installation

Install these tools using the pip package hosted on PyPI:

pip install --upgrade ufonormalizer

Command line

Use on the command line:

ufonormalizer <path>/font.ufo

To view all arguments, run:

ufonormalizer --help

Note: if you are working on a UFO within RoboFont and run ufoNormalizer on that UFO, RoboFont will notify you that the UFO has been updated externally. Simply accept this by selecting "Update."

Automating via Git hooks

Beyond basic command-line usage, ufoNormalizer can be used in an automated manner.

Of course, you can automate it to run from a shell script or a Python script. One useful possibility is using it within a Git hook.

Git hooks are scripts that Git executes before or after events such as: commit, push, and receive. Git hooks are a built-in feature - no need to download anything. Git hooks are run locally. – from Git Hooks

It's easy to set up a git hook that will normalize ufos in a project immediately before each commit, ensuring that you only ever commit clean UFO data.

In a Git project, navigate to /.git/hooks and replace pre-commit.sample with the following code, then remove the file extension:

#!/bin/sh

# A hook script to verify what is about to be committed.
# Called by "git commit" with no arguments.
#
# Uses bash syntax to call arguments as needed.
#
# To enable this hook, save this to <your_project>/.git/hooks/pre-commit (with no file extension)

set -e

for ufo in ./*.ufo; do
    ufonormalizer "$ufo"
done

Now, each time you commit, all .ufos in your Git project will be normalized before being recorded by Git.

Because this hook is setup within the immediate project, this configuration will only apply to the immediate project. You will need to update each project to use this Git hook if you wish to normalize UFOs elsewhere. If you want this hook to be added to all future git projects, you can configure a global git template. However, this approach probably doesn't make sense if you also work on projects that don't involve UFO files.