Browse Source

python: expose pluginmanager.PluginMetadata.

next
Vladimír Vondruš 3 years ago
parent
commit
1f75e4ea71
  1. 5
      doc/python/pages/changelog.rst
  2. 14
      src/python/corrade/pluginmanager.cpp
  3. 39
      src/python/magnum/test/test_trade.py

5
doc/python/pages/changelog.rst

@ -125,8 +125,9 @@ Changelog
- Exposed the :ref:`text` library - Exposed the :ref:`text` library
- Exposed the minimal interface of :ref:`utility.ConfigurationGroup` and - Exposed the minimal interface of :ref:`utility.ConfigurationGroup` and
:ref:`utility.Configuration` :ref:`utility.Configuration`
- Exposed :ref:`pluginmanager.AbstractManager.set_preferred_plugins()` and - Exposed :ref:`pluginmanager.AbstractManager.set_preferred_plugins()`, the
the base :ref:`pluginmanager.AbstractPlugin` class base :ref:`pluginmanager.AbstractPlugin` class and
:ref:`pluginmanager.PluginMetadata`
- Fixed issues with an in-source build (see :gh:`mosra/magnum-bindings#13`) - Fixed issues with an in-source build (see :gh:`mosra/magnum-bindings#13`)
- All CMake build options are now prefixed with ``MAGNUM_``. For backwards - All CMake build options are now prefixed with ``MAGNUM_``. For backwards
compatibility, unless ``MAGNUM_BUILD_DEPRECATED`` is disabled and unless a compatibility, unless ``MAGNUM_BUILD_DEPRECATED`` is disabled and unless a

14
src/python/corrade/pluginmanager.cpp

@ -31,6 +31,7 @@
#include <Corrade/Containers/StringIterable.h> #include <Corrade/Containers/StringIterable.h>
#include <Corrade/PluginManager/AbstractManager.h> #include <Corrade/PluginManager/AbstractManager.h>
#include <Corrade/PluginManager/AbstractPlugin.h> #include <Corrade/PluginManager/AbstractPlugin.h>
#include <Corrade/PluginManager/PluginMetadata.h>
#include "Corrade/PythonBindings.h" #include "Corrade/PythonBindings.h"
@ -57,6 +58,12 @@ void pluginmanager(py::module_& m) {
.value("USED", PluginManager::LoadState::Used); .value("USED", PluginManager::LoadState::Used);
corrade::enumOperators(loadState); corrade::enumOperators(loadState);
py::class_<PluginManager::PluginMetadata>{m, "PluginMetadata", "Plugin metadata"}
.def_property_readonly("name", &PluginManager::PluginMetadata::name, "Plugin name")
.def_property_readonly("depends", &PluginManager::PluginMetadata::depends, "Plugins on which this plugin depends")
.def_property_readonly("used_by", &PluginManager::PluginMetadata::usedBy, "Plugins which depend on this plugin")
.def_property_readonly("provides", &PluginManager::PluginMetadata::provides, "Plugins which are provided by this plugin");
PyNonDestructibleClass<PluginManager::AbstractManager> manager{m, "AbstractManager", "Base for plugin managers"}; PyNonDestructibleClass<PluginManager::AbstractManager> manager{m, "AbstractManager", "Base for plugin managers"};
manager.attr("VERSION") = PluginManager::AbstractManager::Version; manager.attr("VERSION") = PluginManager::AbstractManager::Version;
manager manager
@ -99,7 +106,9 @@ void pluginmanager(py::module_& m) {
out.push_back(i); out.push_back(i);
return out; return out;
}, "List of all available alias names") }, "List of all available alias names")
/** @todo metadata() (figure out the ownership) */ .def("metadata", [](PluginManager::AbstractManager& self, const std::string& plugin) {
return self.metadata(plugin);
}, "Plugin metadata", py::arg("plugin"), py::return_value_policy::reference_internal)
/** @todo drop std::string in favor of our own string caster */ /** @todo drop std::string in favor of our own string caster */
.def("load_state", [](PluginManager::AbstractManager& self, const std::string& plugin) { .def("load_state", [](PluginManager::AbstractManager& self, const std::string& plugin) {
return self.loadState(plugin); return self.loadState(plugin);
@ -133,7 +142,8 @@ void pluginmanager(py::module_& m) {
.def_property_readonly("plugin", [](PluginManager::AbstractPlugin& self) { .def_property_readonly("plugin", [](PluginManager::AbstractPlugin& self) {
/** @todo drop std::string in favor of our own string caster */ /** @todo drop std::string in favor of our own string caster */
return std::string{self.plugin()}; return std::string{self.plugin()};
}, "Plugin identifier string"); }, "Plugin identifier string")
.def_property_readonly("metadata", &PluginManager::AbstractPlugin::metadata, "Plugin metadata", py::return_value_policy::reference_internal);
} }
} }

39
src/python/magnum/test/test_trade.py

@ -1042,6 +1042,45 @@ class Importer(unittest.TestCase):
with self.assertRaises(KeyError): with self.assertRaises(KeyError):
manager.set_preferred_plugins('ApngImporter', []) manager.set_preferred_plugins('ApngImporter', [])
def test_metadata(self):
manager = trade.ImporterManager()
manager.set_preferred_plugins('PngImporter', ['StbImageImporter'])
manager_refcount = sys.getrefcount(manager)
metadata = manager.metadata('PngImporter')
self.assertEqual(sys.getrefcount(manager), manager_refcount + 1)
self.assertEqual(metadata.name, 'StbImageImporter')
self.assertEqual(metadata.provides, ['BmpImporter', 'GifImporter', 'HdrImporter', 'JpegImporter', 'PgmImporter', 'PicImporter', 'PngImporter', 'PpmImporter', 'PsdImporter', 'TgaImporter'])
del metadata
self.assertEqual(sys.getrefcount(manager), manager_refcount)
metadata = manager.metadata('GltfImporter')
self.assertEqual(sys.getrefcount(manager), manager_refcount + 1)
self.assertEqual(metadata.depends, ['AnyImageImporter'])
importer = manager.load_and_instantiate('GltfImporter')
importer_refcount = sys.getrefcount(importer)
self.assertEqual(sys.getrefcount(manager), manager_refcount + 2)
metadata = manager.metadata('AnyImageImporter')
# Replacing the previous metadata instance so it stays the same
self.assertEqual(sys.getrefcount(manager), manager_refcount + 2)
self.assertEqual(metadata.used_by, ['GltfImporter'])
# Retrieving metadata from the plugin instance should be the same
# instance
metadata_from_plugin = importer.metadata
self.assertEqual(sys.getrefcount(importer), importer_refcount + 1)
self.assertEqual(metadata_from_plugin.depends, ['AnyImageImporter'])
del metadata_from_plugin
self.assertEqual(sys.getrefcount(importer), importer_refcount)
del importer
del metadata
self.assertEqual(sys.getrefcount(manager), manager_refcount)
def test_no_file_opened(self): def test_no_file_opened(self):
importer = trade.ImporterManager().load_and_instantiate('StbImageImporter') importer = trade.ImporterManager().load_and_instantiate('StbImageImporter')
self.assertFalse(importer.is_opened) self.assertFalse(importer.is_opened)

Loading…
Cancel
Save