Writing a Lazy Transformer

Send feedback

If you have a transformer that runs slowly—perhaps because the algorithm is complex, has many steps, or the data set is large—you can improve your app’s startup time during the development cycle by making the transformer lazy. Pub runs a lazy transformer only when the generated asset is requested, either by a user or by another transformer.

You can make either a standard transformer or an aggregate transformer run lazily. This document describes how to create a lazy transformer using a normal Pub transformer, but the steps are similar for creating a lazy aggregate transformer.

Most of the steps for writing a lazy transformer are the same as for writing a normal transformer. This document only describes the differences specific to lazy transformers. If you aren’t familiar with how to write a normal Pub tranformer, see Writing a Pub Transformer.

This page uses the lazy_transformer example which you can find through Examples of Transformer Code.

Note that this transformer example does not run slowly, but is used for purposes of illustration. If the transformer were passed an extremely large data set—the entire contents of the Library of Congress, for example—laziness would greatly improve the app’s startup time.

Implementing a lazy transformer

A lazy transformer implements LazyTransformer from the barback package.

Implement LazyTransformer

In the Fart file with your transformer subclass, extend the Transformer class from the barback package, and implement LazyTransformer:

class CodedMessageConverter extends Transformer
                            implements LazyTransformer {

Implement declareOutputs

You must implement the only method in the LazyTransformer class, declareOutputs, to declare the outputs generated by the transformer. This enables Pub to determine what assets exist without needing to immediately run the transformer.

The declareOutputs method is passed a DeclaringTransform object, which gives the transformer access to the primary input’s id. For example:

void declareOutputs(DeclaringTransform transform) {
  transform.declareOutput(transform.primaryId
                                   .changeExtension('.shhhhh'));
}

That’s all that you need to do!

More information