Source code for envisage.tests.test_egg_plugin_manager
# (C) Copyright 2007-2023 Enthought, Inc., Austin, TX
# All rights reserved.
#
# This software is provided without warranty under the terms of the BSD
# license included in LICENSE.txt and may be redistributed only under
# the conditions described in the aforementioned license. The license
# is also available online at http://www.enthought.com/licenses/BSD.txt
#
# Thanks for using Enthought open source!
""" Tests for the Egg plugin manager. """
# 3rd party imports.
import pkg_resources
# Enthought library imports.
from envisage.api import EggPluginManager
# Local imports.
from .test_egg_based import EggBasedTestCase
[docs]class EggPluginManagerTestCase(EggBasedTestCase):
"""Tests for the Egg plugin manager."""
###########################################################################
# Tests.
###########################################################################
# fixme: Depending how many eggs are on sys.path, this test may take too
# long to be part of the TDD cycle.
[docs] def test_no_include_or_exclude(self):
"""no include or exclude"""
# Add all of the eggs in the egg basket.
self._add_eggs_on_path([self.egg_dir])
# Make sure that the plugin manager only includes those plugins.
with self.assertWarns(DeprecationWarning):
plugin_manager = EggPluginManager()
# We don't know how many plugins we will actually get - it depends on
# what eggs are on sys.path! What we *do* know however is the the 3
# 'acme' test eggs should be in there!
ids = [plugin.id for plugin in plugin_manager]
self.assertTrue("acme.foo" in ids)
self.assertTrue("acme.bar" in ids)
self.assertTrue("acme.baz" in ids)
[docs] def test_include_specific(self):
"""include specific"""
# Add all of the eggs in the egg basket.
self._add_eggs_on_path([self.egg_dir])
# The Ids of the plugins that we expect the plugin manager to find.
expected = ["acme.foo", "acme.bar"]
# We explicitly limit the plugins to be just the 'acme' test plugins
# because otherwise the egg plugin manager will pick up *every* plugin
# in *every* egg on sys.path!
include = [r"acme\.foo", r"acme\.bar"]
# Make sure that the plugin manager only includes those plugins.
with self.assertWarns(DeprecationWarning):
plugin_manager = EggPluginManager(include=include)
# Make sure the plugin manager found only the required plugins and that
# it starts and stops them correctly..
self._test_start_and_stop(plugin_manager, expected)
[docs] def test_include_multiple(self):
"""include multiple"""
# Add all of the eggs in the egg basket.
self._add_eggs_on_path([self.egg_dir])
# The Ids of the plugins that we expect the plugin manager to find.
expected = ["acme.foo", "acme.bar", "acme.baz"]
# We explicitly limit the plugins to be just the 'acme' test plugins
# because otherwise the egg plugin manager will pick up *every* plugin
# in *every* egg on sys.path!
include = ["acme.*"]
# Make sure that the plugin manager only includes those plugins.
with self.assertWarns(DeprecationWarning):
plugin_manager = EggPluginManager(include=include)
# Make sure the plugin manager found only the required plugins and that
# it starts and stops them correctly..
self._test_start_and_stop(plugin_manager, expected)
[docs] def test_exclude_specific(self):
"""exclude specific"""
# Add all of the eggs in the egg basket.
self._add_eggs_on_path([self.egg_dir])
# The Ids of the plugins that we expect the plugin manager to find.
expected = ["acme.bar"]
# We explicitly limit the plugins to be just the 'acme' test plugins
# because otherwise the egg plugin manager will pick up *every* plugin
# in *every* egg on sys.path!
include = ["acme.*"]
# Now exclude all but 'acme.bar'...
exclude = [r"acme\.foo", r"acme\.baz"]
# Make sure that the plugin manager excludes the specified plugins.
with self.assertWarns(DeprecationWarning):
plugin_manager = EggPluginManager(include=include, exclude=exclude)
# Make sure the plugin manager found only the required plugins and that
# it starts and stops them correctly..
self._test_start_and_stop(plugin_manager, expected)
[docs] def test_exclude_multiple(self):
"""exclude multiple"""
# Add all of the eggs in the egg basket.
self._add_eggs_on_path([self.egg_dir])
# The Ids of the plugins that we expect the plugin manager to find.
expected = ["acme.foo"]
# We explicitly limit the plugins to be just the 'acme' test plugins
# because otherwise the egg plugin manager will pick up *every* plugin
# in *every* egg on sys.path!
include = ["acme.*"]
# Now exclude every plugin that starts with 'acme.b'.
exclude = [r"acme\.b.*"]
# Make sure that the plugin manager excludes the specified plugins.
with self.assertWarns(DeprecationWarning):
plugin_manager = EggPluginManager(include=include, exclude=exclude)
# Make sure the plugin manager found only the required plugins and that
# it starts and stops them correctly..
self._test_start_and_stop(plugin_manager, expected)
[docs] def test_uses_global_working_set_by_default(self):
original_working_set = pkg_resources.working_set
try:
# Create fresh working set for this test, to make sure that the
# plugin manager picks up the *current* value of
# pkg_resources.working_set.
pkg_resources.working_set = pkg_resources.WorkingSet()
with self.assertWarns(DeprecationWarning):
plugin_manager = EggPluginManager()
self.assertEqual(
plugin_manager.working_set,
pkg_resources.working_set,
)
finally:
pkg_resources.working_set = original_working_set
###########################################################################
# Private interface.
###########################################################################
def _test_start_and_stop(self, plugin_manager, expected):
"""
Make sure the plugin manager starts and stops the expected plugins.
"""
# Make sure the plugin manager found only the required plugins.
self.assertEqual(expected, [plugin.id for plugin in plugin_manager])
# Start the plugin manager. This starts all of the plugin manager's
# plugins.
plugin_manager.start()
# Make sure all of the the plugins were started.
for id in expected:
plugin = plugin_manager.get_plugin(id)
self.assertNotEqual(None, plugin)
self.assertEqual(True, plugin.started)
# Stop the plugin manager. This stops all of the plugin manager's
# plugins.
plugin_manager.stop()
# Make sure all of the the plugins were stopped.
for id in expected:
plugin = plugin_manager.get_plugin(id)
self.assertNotEqual(None, plugin)
self.assertEqual(True, plugin.stopped)