0.96.0
Core
- Added support for Box data to CompoundDataPlug. 
- Optimised the Context class considerably, particularly for temporary Contexts created during computation. A synthetic test which does nothing but create temporary Contexts shows a reduction in runtime of 97%, resulting in a 30% reduction in total runtime for a more real-world test using the Instancer node (#427). 
- Fixed Context copy construction doubling in Python bindings. 
- Fixed circular references within the undo system, which caused memory leaks where scripts were not destroyed at the appropriate time (#397). 
- Optimised ComputeNode::hash(). This yields ~14% reduction in runtime for a simple Reformat benchmark. 
UI
- Fixed PyQt circular references within GafferUI.Menu (#397). 
- Fixed crash caused by File->Quit menu item. 
- Improved UI for BoxPlugs. 
Scene
- Added crop window to StandardOptions node (#688). 
- Renamed gaffer:visibility attribute to scene:visible, to support the standard attribute with that name in Cortex scene caches. 
- Added a SetFilter node (#92). 
- Fixed deadlock removing input from running InteractiveRender node, or undoing or redoing such an operation. 
- Added pausing for interactive renders (#646). 
API
- Renamed BoxPlug min() and max() methods to minPlug() and maxPlug(). 
- Made Context::Scope noncopyable. 
- Added GAFFERTEST_ASSERT macro. This should be used by test cases implemented in C++, and throws an exception which can be caught and reported by the Python unit test runner. 
- Added _copy argument to Context::get() bindings. 
- Added optimised Context copy constructor, primarily for use in constructing temporary Contexts. See class documentation for details. 
- Added checks for zombie ScriptNodes and Widgets at app shutdown. This can catch many common programming errors. 
- Added BoxPlugValueWidget class.