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
# Change bzrlib.plugin to think no plugins have been loaded yet.
579
self.overrideAttr(bzrlib.plugins, '__path__', [])
580
self.overrideAttr(plugin, '_loaded', False)
582
# Monkey-patch load_from_path to stop it from actually loading anything.
583
self.overrideAttr(plugin, 'load_from_path', lambda dirs: None)
621
585
def test_set_plugins_path_with_args(self):
623
586
plugin.set_plugins_path(['a', 'b'])
624
587
self.assertEqual(['a', 'b'], bzrlib.plugins.__path__)
626
589
def test_set_plugins_path_defaults(self):
628
590
plugin.set_plugins_path()
629
591
self.assertEqual(plugin.get_standard_plugins_path(),
630
592
bzrlib.plugins.__path__)
632
594
def test_get_standard_plugins_path(self):
633
595
path = plugin.get_standard_plugins_path()
634
self.assertEqual(plugin.get_default_plugin_path(), path[0])
635
596
for directory in path:
636
597
self.assertNotContainsRe(directory, r'\\/$')
663
622
self.assertEqual(bzrlib.plugins.__path__, ['.'])
665
624
def test_load_plugins_default(self):
667
625
plugin.load_plugins()
668
626
path = plugin.get_standard_plugins_path()
669
627
self.assertEqual(path, bzrlib.plugins.__path__)
630
class TestEnvPluginPath(tests.TestCaseInTempDir):
633
super(TestEnvPluginPath, self).setUp()
634
self.overrideAttr(plugin, 'DEFAULT_PLUGIN_PATH', None)
636
self.user = plugin.get_user_plugin_path()
637
self.site = plugin.get_site_plugin_path()
638
self.core = plugin.get_core_plugin_path()
640
def _list2paths(self, *args):
643
plugin._append_new_path(paths, p)
646
def _set_path(self, *args):
647
path = os.pathsep.join(self._list2paths(*args))
648
osutils.set_or_unset_env('BZR_PLUGIN_PATH', path)
650
def check_path(self, expected_dirs, setting_dirs):
652
self._set_path(*setting_dirs)
653
actual = plugin.get_standard_plugins_path()
654
self.assertEquals(self._list2paths(*expected_dirs), actual)
656
def test_default(self):
657
self.check_path([self.user, self.core, self.site],
660
def test_adhoc_policy(self):
661
self.check_path([self.user, self.core, self.site],
662
['+user', '+core', '+site'])
664
def test_fallback_policy(self):
665
self.check_path([self.core, self.site, self.user],
666
['+core', '+site', '+user'])
668
def test_override_policy(self):
669
self.check_path([self.user, self.site, self.core],
670
['+user', '+site', '+core'])
672
def test_disable_user(self):
673
self.check_path([self.core, self.site], ['-user'])
675
def test_disable_user_twice(self):
676
# Ensures multiple removals don't left cruft
677
self.check_path([self.core, self.site], ['-user', '-user'])
679
def test_duplicates_are_removed(self):
680
self.check_path([self.user, self.core, self.site],
682
# And only the first reference is kept (since the later references will
683
# onnly produce <plugin> already loaded mutters)
684
self.check_path([self.user, self.core, self.site],
685
['+user', '+user', '+core',
686
'+user', '+site', '+site',
689
def test_disable_overrides_disable(self):
690
self.check_path([self.core, self.site], ['-user', '+user'])
692
def test_disable_core(self):
693
self.check_path([self.site], ['-core'])
694
self.check_path([self.user, self.site], ['+user', '-core'])
696
def test_disable_site(self):
697
self.check_path([self.core], ['-site'])
698
self.check_path([self.user, self.core], ['-site', '+user'])
700
def test_override_site(self):
701
self.check_path(['mysite', self.user, self.core],
702
['mysite', '-site', '+user'])
703
self.check_path(['mysite', self.core],
706
def test_override_core(self):
707
self.check_path(['mycore', self.user, self.site],
708
['mycore', '-core', '+user', '+site'])
709
self.check_path(['mycore', self.site],
712
def test_my_plugin_only(self):
713
self.check_path(['myplugin'], ['myplugin', '-user', '-core', '-site'])
715
def test_my_plugin_first(self):
716
self.check_path(['myplugin', self.core, self.site, self.user],
717
['myplugin', '+core', '+site', '+user'])
719
def test_bogus_references(self):
720
self.check_path(['+foo', '-bar', self.core, self.site],