A Tale of Three APIs
In Pyblish, there are three conceptual APIs of interest while developing plug-ins.
Library to Plug-in
The Pyblish library itself carries an interface that is exposed to plug-ins.
This is the interface you gain access to from within your plug-in during development and includes helper functions exposed globally, such as format_filename.
# Library API import pyblish.api pyblish.api.format_filename(r"str%*ange_fil£&en*ame.mb") 'strange_filename' pyblish.api.discover() [..all discovered plug-ins..]
Plug-in to Library
Each plug-in also exposes attributes to the library. Primarily, attributes used to identifying the plug-in such its family support and processing methods.
import pyblish.api as pyblish class ValidateInstance(pyblish.InstancePlugin): order = pyblish.ValidatorOrder # Run during validation families = ["myFamily"] # Signals to the library that instances # of family "myFamily" should be processed. hosts = ["maya"] # This plug-in should run within Autodesk Maya def process(self, instance): # The library will call upon this method at the opportune time. instance.set_data("send_to_extraction", ["Some Data"])
This pattern is known as Inversion-of-Control.
Plug-in to Plug-in
Plug-ins may coordinate with each other by passing data.
import pyblish.api as pyblish class ValidateInstance(pyblish.InstancePlugin): order = pyblish.ValidatorOrder def process(self, instance): instance.set_data("message", "Hello") class ExtractInstance(pyblish.InstancePlugin): order = pyblish.ExtractorOrder def process(self, instance): if "message" in instance.data: # ...
It does this via the data member. Each stage, selection, validation, extraction and conform, may pass data from one to the next.
Other data includes switches within the instance itself. For example, a
review family may include options for output resolution in pixels, or format such as whether to write a Quicktime file or a plain
instance.data["output"] = "png"