390
394
def test_dev_fallback__version__with_version_info(self):
391
395
self.setup_plugin("version_info = (1, 2, 3, 'dev', 4)")
392
396
plugin = bzrlib.plugin.plugins()['plugin']
393
self.assertEqual("1.2.3.dev.4", plugin.__version__)
397
self.assertEqual("1.2.3dev4", plugin.__version__)
395
399
def test_final__version__with_version_info(self):
396
400
self.setup_plugin("version_info = (1, 2, 3, 'final', 0)")
397
401
plugin = bzrlib.plugin.plugins()['plugin']
398
402
self.assertEqual("1.2.3", plugin.__version__)
404
def test_final_fallback__version__with_version_info(self):
405
self.setup_plugin("version_info = (1, 2, 3, 'final', 2)")
406
plugin = bzrlib.plugin.plugins()['plugin']
407
self.assertEqual("1.2.3.final.2", plugin.__version__)
401
410
class TestPluginHelp(TestCaseInTempDir):
454
463
delattr(bzrlib.plugins, 'myplug')
457
class TestSetPluginsPath(TestCase):
459
def test_set_plugins_path(self):
460
"""set_plugins_path should set the module __path__ correctly."""
461
old_path = bzrlib.plugins.__path__
463
bzrlib.plugins.__path__ = []
464
expected_path = bzrlib.plugin.set_plugins_path()
465
self.assertEqual(expected_path, bzrlib.plugins.__path__)
467
bzrlib.plugins.__path__ = old_path
469
def test_set_plugins_path_with_trailing_slashes(self):
470
"""set_plugins_path should set the module __path__ based on
471
BZR_PLUGIN_PATH after removing all trailing slashes."""
472
old_path = bzrlib.plugins.__path__
473
old_env = os.environ.get('BZR_PLUGIN_PATH')
475
bzrlib.plugins.__path__ = []
476
os.environ['BZR_PLUGIN_PATH'] = "first\\//\\" + os.pathsep + \
478
bzrlib.plugin.set_plugins_path()
479
# We expect our nominated paths to have all path-seps removed,
480
# and this is testing only that.
481
expected_path = ['first', 'second']
482
self.assertEqual(expected_path,
483
bzrlib.plugins.__path__[:len(expected_path)])
485
bzrlib.plugins.__path__ = old_path
486
if old_env is not None:
487
os.environ['BZR_PLUGIN_PATH'] = old_env
489
del os.environ['BZR_PLUGIN_PATH']
492
466
class TestHelpIndex(tests.TestCase):
493
467
"""Tests for the PluginsHelpIndex class."""
597
571
self.assertEqual('foo_bar', topic.get_help_topic())
600
def clear_plugins(test_case):
601
# Save the attributes that we're about to monkey-patch.
602
old_plugins_path = bzrlib.plugins.__path__
603
old_loaded = plugin._loaded
604
old_load_from_path = plugin.load_from_path
605
# Change bzrlib.plugin to think no plugins have been loaded yet.
606
bzrlib.plugins.__path__ = []
607
plugin._loaded = False
608
# Monkey-patch load_from_path to stop it from actually loading anything.
609
def load_from_path(dirs):
611
plugin.load_from_path = load_from_path
612
def restore_plugins():
613
bzrlib.plugins.__path__ = old_plugins_path
614
plugin._loaded = old_loaded
615
plugin.load_from_path = old_load_from_path
616
test_case.addCleanup(restore_plugins)
619
class TestPluginPaths(tests.TestCase):
574
class TestLoadFromPath(tests.TestCaseInTempDir):
577
super(TestLoadFromPath, self).setUp()
578
# Save the attributes that we're about to monkey-patch.
579
old_plugins_path = bzrlib.plugins.__path__
580
old_loaded = plugin._loaded
581
old_load_from_path = plugin.load_from_path
584
bzrlib.plugins.__path__ = old_plugins_path
585
plugin._loaded = old_loaded
586
plugin.load_from_path = old_load_from_path
588
self.addCleanup(restore)
590
# Change bzrlib.plugin to think no plugins have been loaded yet.
591
bzrlib.plugins.__path__ = []
592
plugin._loaded = False
594
# Monkey-patch load_from_path to stop it from actually loading anything.
595
def load_from_path(dirs):
597
plugin.load_from_path = load_from_path
621
599
def test_set_plugins_path_with_args(self):
623
600
plugin.set_plugins_path(['a', 'b'])
624
601
self.assertEqual(['a', 'b'], bzrlib.plugins.__path__)
626
603
def test_set_plugins_path_defaults(self):
628
604
plugin.set_plugins_path()
629
605
self.assertEqual(plugin.get_standard_plugins_path(),
630
606
bzrlib.plugins.__path__)
632
608
def test_get_standard_plugins_path(self):
633
609
path = plugin.get_standard_plugins_path()
634
self.assertEqual(plugin.get_default_plugin_path(), path[0])
635
610
for directory in path:
636
self.assertNotContainsRe(r'\\/$', directory)
611
self.assertNotContainsRe(directory, r'\\/$')
638
613
from distutils.sysconfig import get_python_lib
639
614
except ImportError:
663
636
self.assertEqual(bzrlib.plugins.__path__, ['.'])
665
638
def test_load_plugins_default(self):
667
639
plugin.load_plugins()
668
640
path = plugin.get_standard_plugins_path()
669
641
self.assertEqual(path, bzrlib.plugins.__path__)
644
class TestEnvPluginPath(tests.TestCaseInTempDir):
647
super(TestEnvPluginPath, self).setUp()
648
old_default = plugin.DEFAULT_PLUGIN_PATH
651
plugin.DEFAULT_PLUGIN_PATH = old_default
653
self.addCleanup(restore)
655
plugin.DEFAULT_PLUGIN_PATH = None
657
self.user = plugin.get_user_plugin_path()
658
self.site = plugin.get_site_plugin_path()
659
self.core = plugin.get_core_plugin_path()
661
def _list2paths(self, *args):
664
plugin._append_new_path(paths, p)
667
def _set_path(self, *args):
668
path = os.pathsep.join(self._list2paths(*args))
669
osutils.set_or_unset_env('BZR_PLUGIN_PATH', path)
671
def check_path(self, expected_dirs, setting_dirs):
673
self._set_path(*setting_dirs)
674
actual = plugin.get_standard_plugins_path()
675
self.assertEquals(self._list2paths(*expected_dirs), actual)
677
def test_default(self):
678
self.check_path([self.user, self.core, self.site],
681
def test_adhoc_policy(self):
682
self.check_path([self.user, self.core, self.site],
683
['+user', '+core', '+site'])
685
def test_fallback_policy(self):
686
self.check_path([self.core, self.site, self.user],
687
['+core', '+site', '+user'])
689
def test_override_policy(self):
690
self.check_path([self.user, self.site, self.core],
691
['+user', '+site', '+core'])
693
def test_disable_user(self):
694
self.check_path([self.core, self.site], ['-user'])
696
def test_disable_user_twice(self):
697
# Ensures multiple removals don't left cruft
698
self.check_path([self.core, self.site], ['-user', '-user'])
700
def test_duplicates_are_removed(self):
701
self.check_path([self.user, self.core, self.site],
703
# And only the first reference is kept (since the later references will
704
# onnly produce <plugin> already loaded mutters)
705
self.check_path([self.user, self.core, self.site],
706
['+user', '+user', '+core',
707
'+user', '+site', '+site',
710
def test_disable_overrides_disable(self):
711
self.check_path([self.core, self.site], ['-user', '+user'])
713
def test_disable_core(self):
714
self.check_path([self.site], ['-core'])
715
self.check_path([self.user, self.site], ['+user', '-core'])
717
def test_disable_site(self):
718
self.check_path([self.core], ['-site'])
719
self.check_path([self.user, self.core], ['-site', '+user'])
721
def test_override_site(self):
722
self.check_path(['mysite', self.user, self.core],
723
['mysite', '-site', '+user'])
724
self.check_path(['mysite', self.core],
727
def test_override_core(self):
728
self.check_path(['mycore', self.user, self.site],
729
['mycore', '-core', '+user', '+site'])
730
self.check_path(['mycore', self.site],
733
def test_my_plugin_only(self):
734
self.check_path(['myplugin'], ['myplugin', '-user', '-core', '-site'])
736
def test_my_plugin_first(self):
737
self.check_path(['myplugin', self.core, self.site, self.user],
738
['myplugin', '+core', '+site', '+user'])
740
def test_bogus_references(self):
741
self.check_path(['+foo', '-bar', self.core, self.site],