diff --git a/doc/python/conf.py b/doc/python/conf.py index 1c37f9b..c81fab9 100644 --- a/doc/python/conf.py +++ b/doc/python/conf.py @@ -117,6 +117,7 @@ INPUT_PAGES = [ INPUT_DOCS = [ 'corrade.rst', 'corrade.containers.rst', + 'corrade.pluginmanager.rst', 'magnum.rst', 'magnum.gl.rst', diff --git a/doc/python/corrade.pluginmanager.rst b/doc/python/corrade.pluginmanager.rst new file mode 100644 index 0000000..b491734 --- /dev/null +++ b/doc/python/corrade.pluginmanager.rst @@ -0,0 +1,36 @@ +.. + This file is part of Magnum. + + Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 + Vladimír Vondruš + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +.. + +.. py:class:: corrade.pluginmanager.AbstractManager + :data VERSION: Plugin ABI version + +.. py:function:: corrade.pluginmanager.AbstractManager.load + :raise RuntimeError: When loading fails + :return: `LoadState.LOADED`, possibly combined with other flags such as + `LoadState.STATIC` + +.. py:function:: corrade.pluginmanager.AbstractManager.unload + :raise RuntimeError: When unloading fails + :return: Either `LoadState.NOT_LOADED` or `LoadState.STATIC` diff --git a/src/python/corrade/pluginmanager.cpp b/src/python/corrade/pluginmanager.cpp index 3e9d593..acfc0de 100644 --- a/src/python/corrade/pluginmanager.cpp +++ b/src/python/corrade/pluginmanager.cpp @@ -63,8 +63,28 @@ void pluginmanager(py::module& m) { .def_property_readonly("alias_list", &PluginManager::AbstractManager::aliasList, "List of all available alias names") /** @todo metadata() (figure out the ownership) */ .def("load_state", &PluginManager::AbstractManager::loadState, "Load state of a plugin") - .def("load", &PluginManager::AbstractManager::load, "Load a plugin") - .def("unload", &PluginManager::AbstractManager::unload, "Unload a plugin"); + .def("load", [](PluginManager::AbstractManager& self, const std::string& plugin) { + /** @todo log redirection -- but we'd need assertions to not be + part of that so when it dies, the user can still see why */ + const PluginManager::LoadState state = self.load(plugin); + if(!(state & PluginManager::LoadState::Loaded)) { + PyErr_Format(PyExc_RuntimeError, "can't load plugin %s", plugin.data()); + throw py::error_already_set{}; + } + + return state; + }, "Load a plugin") + .def("unload", [](PluginManager::AbstractManager& self, const std::string& plugin) { + /** @todo log redirection -- but we'd need assertions to not be + part of that so when it dies, the user can still see why */ + const PluginManager::LoadState state = self.unload(plugin); + if(state != PluginManager::LoadState::NotLoaded && state != PluginManager::LoadState::Static) { + PyErr_Format(PyExc_RuntimeError, "can't unload plugin %s", plugin.data()); + throw py::error_already_set{}; + } + + return state; + }, "Unload a plugin"); } }