Releases: OpenAssetIO/OpenAssetIO
v1.0.0
v1.0.0-rc.2.0
This release may break source compatibility for Python and C++ hosts, see breaking changes section for more details.
Breaking changes
-
Modified
PythonPluginSystem.scan()method to search Python distribution entry point hooks as well as scan given paths. Added arguments to parametrise search path and entry point usage. This class is primarily an internal implementation detail, so the change will only break advanced downstream use-cases. #1445 -
Modified signature of
CppPluginSystem.scan()to accept more arguments to further parametrise search path usage. This class is primarily an internal implementation detail, so this change will only break advanced downstream use-cases. #1445
New features
-
Added an experimental UI delegation API alongside the core manager API. This allows asset management systems to augment or replace portions of a host application's user interface. The UI delegation API has its own separate plugin system and namespace, and is entirely opt-in. #1445
-
Added
defaultEntityReferenceoverloads for convenience, providing alternatives to the core callback-based workflow. Includes querying for a single result vs. a batch of results, and exception vs. result object workflows. #1170
Improvements
-
Added a new constant
kInfoKey_IsPython("isPython"), and used in the PythonHostInterface.info()base class implementation, allowing managers to detect if the host they're interacting with is written in Python. #1445 -
Added operators and hash functions to the
EntityReferencetype, in both C++ and Python, such thatEntityReferenceobjects can be used as keys in associative containers (e.g.dict/std::unordered_map). #573 -
Added non-equality
!=operator to theTraitsDataandManagerDetailtypes in C++, providing feature parity with Python. #875 -
Added bounds checking of array access to convenience methods that wrap batch-first callback-based signatures. This avoids some potential segfaults if a manager plugin calls a callback passing an invalid index argument. #1196
-
Removed the requirement to define C++ destructors for classes inheriting from
LoggerInterfaceandManagerImplementationFactoryInterface. I.e. the destructors are no longer pure virtual. #1196 -
Explicitly disabled unsafe special member functions for
TraitsDataandFileUrlPathConverterclasses in C++. #1196
Bug fixes
- Added "raise from" behaviour in C++->Python exception translation, in case a Python exception is already active when the C++ exception occurs. #1419
v1.0.0-rc.1.0
This release breaks binary compatibility with C++ hosts and managers. It may break source compatibility for hosts and managers in both C++ and Python. See breaking changes section for more details.
Breaking changes
-
Removed official support for Python 3.7 and 3.9. The minimum supported Python version is now Python 3.10. This includes PyPI packages. #1365 #1389
-
Removed deprecated type aliases
openassetio.TraitsData,openassetio.BatchElementErrorandopenassetio.BatchElementException. Removed the deprecated explicit*BatchElementExceptionexception subtypes under the top-levelopenassetionamespace. Removed the deprecated Pythonopenassetio.exceptionsmodule. Removed the deprecatedkField_*constants. #1311 -
Marked as "final" several C++ Python bindings of classes that do not support Python inheritance, such that an error will be encountered at import time if an attempt is made to inherit from them. #1357
-
Updated the API contract to no longer require that managers throw an exception when an unrecognized setting is given during initialization. The
openassetio.test.managerAPI Compliance test suite no longer asserts that this is the case. #1202 -
Switched from
std::unordered_settostd::setfor trait sets (viaTraitSetalias) in C++. This allows C++stdalgorithm set operations to work. Python is unaffected. This is mostly a source-compatible change, provided theTraitSetalias is used in consuming code, and nounordered_set-specific API is used (e.g.reserve(...)). #1339 -
Source values for
BatchElementErrorerror codes changed to an internally-namespacedenumrather than global macros. #1060 -
Removed
OPENASSETIO_GLIBCXX_USE_CXX11_ABICMake build option. Builds will use the system default libstdc++ ABI, rather than defaulting to the old ABI. #1353 -
Removed support for querying the "beta" version number of the library. #1401
New Features
-
Added the Hybrid Plugin System via a
HybridPluginSystemManagerImplementationFactory, allowing multiple plugin systems to be composed (i.e. Python and C++). As well as reducing host boilerplate, this also supports merging two (or more) plugins. API requests are routed to the plugin that advertises the associated capability for that API request. Performance-critical API methods can then be coded in C++, whilst other methods are coded in more developer-friendly Python. #1202 -
Added SimpleCppManager - a minimal C++ manager and plugin example implementation, useful for testing C++ plugin support in hosts. This has minimal API support, so Basic Asset Library (BAL) should still be preferred as a test manager when Python is available. #1324
-
For Windows users, added
OPENASSETIO_DLL_PATHenvironment variable to allow non-standard Python installations to locateopenassetio.dll, if required. #1340 -
Added
kAuthErrorto the set of possibleBatchElementErrorerror codes. #1009
Improvements
-
Added singular overload of
managementPolicyfor convenience. #856 -
Updated the
simpleResolverexample host to support C++ plugins. #1324 -
Added a type hint for the
Managerinstance injected into theopenassetio.test.managerAPI Compliance test harness, to aid in IDE code completion when writing test cases for manager plugins. -
importlib_metadatais no longer a dependency for Python manager plugins to make use of Python entry point hooks. #1389
Bug fixes
-
Modified OpenAssetIO Python distributions (e.g. installed with
pip install) to allow C++ plugins to load. OpenAssetIO is now bundled as multiple shared libraries, allowing external libraries to link. #1340 -
Fixed Python wheel builds to use the new libstdc++ ABI, reflecting their associated VFX Reference Platform version. #1352
-
Fixed the (Python-only)
terminology.Mapperclass such that its terminology dict can be updated by the manager. #1356
v1.0.0-beta.2.2
This release introduces new features, and remains source compatible.
The addition of a new virtual method, LoggerInterface.isSeverityLogged, makes this release a binary incompatibility.
New Features
-
Added a C++ plugin system. In particular, hosts can use the
CppPluginSystemManagerImplementationFactoryclass (as a drop-in replacement forPythonPluginSystemManagerImplementationFactory) in order to load C++ manager plugins. Manager plugin authors provide a shared library that exposes anopenassetioPluginfunction that returns aPluginFactoryfunction pointer, which in turn returns aCppPluginSystemManagerPluginobject. #1115 -
openassetio.test.manager, notably used for Api Compliance tests, updated to automatically load C++ plugins if a python plugin of the requested identifier cannot be found. #1294 -
Added
LoggerInterface.isSeverityLoggedto allow users to short-circuit log message construction if the logger indicates the intended severity will be filtered. UpdatedSeverityFilterto use the most pessimistic of its own severity and that of the wrapped logger. #1014 -
Added
utils.substituteproviding a common string substitution format using named placeholders in libfmt/Python format string style syntax. #1213
Improvements
-
Added
getRelationship(s)andentityExistsoverloads for convenience, providing alternatives to the core callback-based workflow. Includes more direct methods for singular queries, as well as exception vs. result object workflows. #973 #1169 -
Added
.pyistub files to the Python package to aid IDE code completion for Python bindings of C++ types. #1252
Deprecated
- Deprecated top level
pluginvariable for python plugins in favour ofopenassetioPlugin, in order to reduce risk of conflict with other plugin systems, and maintain consistency with the C++ plugin system. #1290
v1.0.0-beta.2.1
Improvements
-
Updated
FileUrlPathConverter.pathFromUrlto automatically convert long Windows paths, which exceed the WindowsMAX_PATHlimit, to UNC non-normalised device paths (i.e.\\?\-prefixed). #1257 -
Added
entityTraitsoverloads for convenience, providing alternatives to the core callback-based workflow. Includes a more direct method for resolving a single entity reference, and exception vs. result object workflows. #1217
v1.0.0-beta.2.0
Breaking changes
-
Added new required core API method
Manager/ManagerInterface.entityTraits, which can be used to determine the traits that an existing entity has, or that a new entity must have, for a given entity reference. #31 -
Renamed access policy for resolving future entities,
ResolveAccess.kWritetoResolveAccess.kManagerDriven. This is then consistent with the newly addedmanagementPolicyaccess mode. #1209 -
Access policy keyword argument names in the Python bindings for
ManagerInterfacehas changed to"resolveAccess"forresolveand"policyAccess"formanagementPolicy, in order to conform to the corresponding C++ argument names.
New Features
-
Added convenience
utils.FileUrlPathConverterutility class for convertingfile://URLs to and from paths. Both POSIX and Windows paths (including UNC) are supported in a platform-agnostic way (i.e. Windows paths can be processed on POSIX hosts and vice versa). #1117 -
Propagate
OpenAssetIOException-derived Python exceptions as a corresponding C++ exception if a Python method implementation raises when transparently called from C++. #947 -
Add version accessor methods to allow runtime introspection of OpenAssetIO library version.
version.hheader distributed with install to allow compile time introspection. #1173 -
Add
managementPolicysupport for querying traits whose required properties must be set in order for a publish to succeed, via akRequiredaccess mode; and support for querying traits whose properties the manager wishes to dictate when publishing, via akManagerDrivenaccess mode. #1209
Improvements
-
Added the string representation of an
EntityReferencewhenrepr'd in Python. #1186 -
Added basic string representation of a
TraitsDatawhenrepr'd in Python. #1209
Bug fixes
v1.0.0-beta.1.0
Deprecated
Note
The following deprecated code paths are still available in this release, but will be removed in a future version.
-
Moved
TraitsDatainto thetraitnamespace along with its peer container/type definitions. #1127 -
Removed python
exceptionsmodule in favour of newerrorsmodule. #1071 -
Moved
BatchElementErrorandBatchElementExceptioninto theerrorsnamespace. #1071 #1073 -
Removed all subtypes of
BatchElementException, in favour of a single exception type for batch errors raised by the exception throwing convenience overloads. #1073
Breaking changes
-
Updated
ManagerInterfaceto reflect which methods are required and which are optional, default method implementations have been updated:- Pre-initialization methods are a no-op or return empty data.
- Post-initialization methods raise a
NotImplementedException.
Note that in order to support multi-language plugins, pure virtual/ABC is not used to denote required methods in all cases. See the class API documentation for more details. #163
-
Added the (required)
Manager/ManagerInterfacehasCapabilitymethod. A mechanism to query which particular capabilities a manager implements. This allows a Host to avoidNotImplementedExceptions when a specific capability has not been implemented by any given manager. #DR022, #1113 -
Removed non-paged versions of the
Manager/ManagerInterfacerelationship query methods and renamed the paged methods to remove thePagedsuffix.PagedRelationshipSuccessCallbackhas been renamed toRelationshipQuerySuccessCallbackto better reflect the default of pagination, and reduce ambiguity when relationship creation methods are added in the future. #1125 -
Attempting to retrieve a trait property with
TraitsData.getTraitPropertyor using trait view classes no longer raises an exception if the trait itself is missing. This simplifies many common access patterns, and can remove the need forhasTrait/isImbuedTochecks. #970 -
Removed
constfrom the majority of interface methods to allow implementations to make use of private state for efficiency reasons. #518 -
errors.hrenamed toerrors/errorCodes.h#1073 -
Removed the "Sample Asset Manager" example, which was wholly out of date, and has been superseded by the standalone manager template repository.
-
Changed success/return type of
defaultEntityReferenceto wrap instd::optional. Updated expected manager response such that an optional without a value signals that no default is available for an otherwise valid query. Changed default implementation to respond with an empty optional in the success callback, rather than error. #1100 -
The middleware will validate that the manager's implementation provides the
kEntityReferenceIdentificationandkManagementPolicyQuerycapabilities upon initialization. #1148
New Features
-
Added new exception types, allowing all OpenAssetIO exceptions to share a common base. #1071
-
Exceptional conveniences now provide additional information such as entityReference, index, access, and error type in the message of the exception. #1073
Improvements
-
Modified Python bindings for all non-trivial methods such that they release the GIL before calling any underlying C++ implementation. #554
-
Improved error messaging when
defaultManagerForInterfacepoints to a directory not a file. -
Added some protection for accidental overwrites of a CMake installed
openassetioPython package, by installing a.dist-infometadata directory alongside the package.pip installwill then fail/warn against accidental overwrites/overrides. Added a CMake variableOPENASSETIO_ENABLE_PYTHON_INSTALL_DIST_INFOto disable this feature. #1088 -
Manager.createContextdoes not callManagerInterface.createStateif manager is not capable ofkStatefulContexts, in which case theContextis returned without amanagerState. #163 -
Removed the unused
PythonPluginSystemManagerPlugin.uiDelegatemethod, along with associated UI related documentation that referenced non-existent functionality. #1150 -
Clarified
ManagerInterfacedocumentation around the relative "stateless" nature of the API and its reentrant design. #1143
v1.0.0-alpha.14
Breaking changes
Warning
Removed
Context.Accessand instead added per-workflow access mode enumerations under anaccessnamespace. Added these enums as required arguments to various API functions, replacing the usage ofContext.Access. #1054Changed signature of
preflightto accept aTraitsDataper reference, rather than a single trait set. The host is now expected to communicate any relevant information that it owns and is known atpreflighttime. #1028
-
Relaxed the restriction on
registerthat all trait sets of the providedTraitsDataelements must match. This allows batched publishing of heterogeneous entity types. #1029 -
Removed
cpythondependency fromconanfile.py. When building OpenAssetIO, it is now expected that a development install of the appropriate Python version is discoverable on the system. #1038 -
Migrated manager methods
entityExistsanddefaultEntityReferenceto C++ with Python bindings, and redesigned to use a callback based batch API. #992 #993 -
Migrated
ManagerInterface/ManagerupdateTerminologyto C++ with Python bindings. Tweaked interface to be returned based rather than out-param based. #996 -
Removed
kWriteMultipleandkReadMultipleaccess patterns, due to not having coherent use cases. #1016 -
Removed
Context.Retentiondue to not having coherent use cases. #1048
New Features
-
Added
kCreateRelatedaccess pattern, to indicate when a workflow specifically creates a new entity as a relation to an existing one. #1016 -
Added
BatchElementError.ErrorCode.kInvalidTraitSetandInvalidTraitSetBatchElementException. #992
Improvements
-
Increased verbosity when running the
openassetio.test.managerAPI compliance suite test harness. The report includes tests that were skipped, helping to detect accidentally omitted fixtures. 1032 -
Added some aliases to the Doxygen API documentation. In particular,
PtrandConstPtraliases are now cross-referencable. -
Altered the fixture that causes a skip in relationship based API compliance tests, to be the more specific relationship traitset. #1022
-
Set the correct context for various tests in the API Compliance
openassetio.manager.testtest harness.
v1.0.0-alpha.13
Breaking changes
-
Refactored
getRelatedReferencesintogetWithRelationshipandgetWithRelationshipsto better define the two possible batch-axis, and simplify implementation on both sides of the API. This also changes the methods over to callback signatures for consistency with the rest of the API, and migrates them to C++ with Python bindings. #847 #919 #913 -
Removed version query APIs (
entityVersion,entityVersions,finalizedEntityVersion) in favour of use of the more generalresolveandgetWithRelationshipmethods. See DR017 for details. #980 -
Updated
castToPyObjectto convert anullptrinput to a PythonNone, rather than throwing an exception. #988 -
Removed out of date constants from the Python
openassetio.constantsmodule. These have been replaced by domain-specific traits and specifications defined in their own repositories, such as OpenAssetIO-MediaCreation. -
Migrated remaining constants to C++ with Python bindings. This means that
from openassetio.constants import <name>no longer works - theconstantsmodule must be imported wholesale. #998
Deprecated
- Renamed manager info dictionary key constants, which were prefixed with
kField_, to use anInfoKey_prefix instead. The deprecated constant variables will be removed in a future release. #998
Improvements
-
Added paged implementations of
getWithRelationshipandgetWithRelationships, calledgetWithRelationshipPagedandgetWithRelationshipsPaged. These methods are the equivalent of the non-paged versions, but provide anEntityReferencePagerobject, rather than a direct list of results, allowing for correct handling of extremely large/unbounded data sets. #971 -
Added default implementations of
getWithRelationshipandgetWithRelationshipsthat return empty lists, making these methods opt-in for manager implementations. #163 -
Added coverage of the
getWithRelationship[s]andgetWithRelationship[s]Pagedmethods of theManagerInterfaceto theopenassetio.manager.testharness. #914 #972 -
Added
requireEntityReferenceFixtureandrequireEntityReferencesFixtureutility methods for cases written for theopenassetio.test.manager(akaapiComplianceSuite) test harness. These convert a string fixture into anEntityReferenceobject, or a list-of-strings fixture into a list ofEntityReferenceobjects, respectively. #914 -
Migrated the
ManagerInterface/ManagerflushCachesmethod to C++ with Python bindings. #994 -
Added a call to
flushCachesafter everyopenassetio.test.manager(akaapiComplianceSuite) test case, giving the manager plugin a chance to clean up between tests. #994
Bug fixes
- Reintroduced the optional optimized entity reference prefix check for
isEntityReferenceString, allowing the plugin's implementation to be short-circuited. In particular, if the plugin's implementation is written in Python, then a prefix check short-circuits the need for a costly Python function call for this hot code path. #566
v1.0.0-alpha.12
New Features
-
Added an overload of
ManagerFactory.defaultManagerForInterfacethat takes a config file path string argument, rather than using an
environment variable. #937 -
Added support for
${config_dir}interpolation within manager string settings retrieved from the TOML config file used bydefaultManagerForInterface. This token expands to the absolute directory of the TOML config file. #804