~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_plugins.py

  • Committer: Robert Collins
  • Date: 2007-02-02 16:17:55 UTC
  • mto: (2257.1.1 integration)
  • mto: This revision was merged to the branch mainline in revision 2258.
  • Revision ID: robertc@robertcollins.net-20070202161755-zy2d68928wqwehj6
Allow 'import bzrlib.plugins.NAME' to work when the plugin NAME has not
yet been loaded by load_plugins(). This allows plugins to depend on each
other for code reuse without requiring users to perform file-renaming
gymnastics. (Robert Collins)

Show diffs side-by-side

added added

removed removed

Lines of Context:
22
22
 
23
23
import os
24
24
from StringIO import StringIO
 
25
import sys
25
26
import zipfile
26
27
 
27
28
import bzrlib.plugin
28
29
import bzrlib.plugins
29
30
import bzrlib.commands
30
31
import bzrlib.help
31
 
from bzrlib.tests import TestCaseInTempDir
 
32
from bzrlib.tests import TestCase, TestCaseInTempDir
32
33
from bzrlib.osutils import pathjoin, abspath
33
34
 
34
35
 
43
44
 
44
45
# TODO: Write a test for plugin decoration of commands.
45
46
 
46
 
class TestOneNamedPluginOnly(TestCaseInTempDir):
 
47
class TestLoadingPlugins(TestCaseInTempDir):
47
48
 
48
49
    activeattributes = {}
49
50
 
50
51
    def test_plugins_with_the_same_name_are_not_loaded(self):
51
 
        # This test tests that having two plugins in different
52
 
        # directories does not result in both being loaded.
53
 
        # get a file name we can use which is also a valid attribute
54
 
        # for accessing in activeattributes. - we cannot give import parameters.
 
52
        # This test tests that having two plugins in different directories does
 
53
        # not result in both being loaded when they have the same name.  get a
 
54
        # file name we can use which is also a valid attribute for accessing in
 
55
        # activeattributes. - we cannot give import parameters.
55
56
        tempattribute = "0"
56
57
        self.failIf(tempattribute in self.activeattributes)
57
58
        # set a place for the plugins to record their loading, and at the same
58
59
        # time validate that the location the plugins should record to is
59
60
        # valid and correct.
60
 
        bzrlib.tests.test_plugins.TestOneNamedPluginOnly.activeattributes \
 
61
        bzrlib.tests.test_plugins.TestLoadingPlugins.activeattributes \
61
62
            [tempattribute] = []
62
63
        self.failUnless(tempattribute in self.activeattributes)
63
64
        # create two plugin directories
65
66
        os.mkdir('second')
66
67
        # write a plugin that will record when its loaded in the 
67
68
        # tempattribute list.
68
 
        template = ("from bzrlib.tests.test_plugins import TestOneNamedPluginOnly\n"
69
 
                    "TestOneNamedPluginOnly.activeattributes[%r].append('%s')\n")
 
69
        template = ("from bzrlib.tests.test_plugins import TestLoadingPlugins\n"
 
70
                    "TestLoadingPlugins.activeattributes[%r].append('%s')\n")
70
71
        print >> file(os.path.join('first', 'plugin.py'), 'w'), template % (tempattribute, 'first')
71
72
        print >> file(os.path.join('second', 'plugin.py'), 'w'), template % (tempattribute, 'second')
72
73
        try:
73
 
            bzrlib.plugin.load_from_dirs(['first', 'second'])
74
 
            self.assertEqual(['first'], self.activeattributes[tempattribute])
 
74
            bzrlib.plugin.load_from_path(['first', 'second'])
 
75
            self.assertEqual(['first'], self.activeattributes[tempattribute])
 
76
        finally:
 
77
            # remove the plugin 'plugin'
 
78
            del self.activeattributes[tempattribute]
 
79
            if getattr(bzrlib.plugins, 'plugin', None):
 
80
                del bzrlib.plugins.plugin
 
81
        self.failIf(getattr(bzrlib.plugins, 'plugin', None))
 
82
 
 
83
    def test_plugins_from_different_dirs_can_demand_load(self):
 
84
        # This test tests that having two plugins in different
 
85
        # directories with different names allows them both to be loaded, when
 
86
        # we do a direct import statement.
 
87
        # Determine a file name we can use which is also a valid attribute
 
88
        # for accessing in activeattributes. - we cannot give import parameters.
 
89
        tempattribute = "different-dirs"
 
90
        self.failIf(tempattribute in self.activeattributes)
 
91
        # set a place for the plugins to record their loading, and at the same
 
92
        # time validate that the location the plugins should record to is
 
93
        # valid and correct.
 
94
        bzrlib.tests.test_plugins.TestLoadingPlugins.activeattributes \
 
95
            [tempattribute] = []
 
96
        self.failUnless(tempattribute in self.activeattributes)
 
97
        # create two plugin directories
 
98
        os.mkdir('first')
 
99
        os.mkdir('second')
 
100
        # write plugins that will record when they are loaded in the 
 
101
        # tempattribute list.
 
102
        template = ("from bzrlib.tests.test_plugins import TestLoadingPlugins\n"
 
103
                    "TestLoadingPlugins.activeattributes[%r].append('%s')\n")
 
104
        print >> file(os.path.join('first', 'pluginone.py'), 'w'), template % (tempattribute, 'first')
 
105
        print >> file(os.path.join('second', 'plugintwo.py'), 'w'), template % (tempattribute, 'second')
 
106
        oldpath = bzrlib.plugins.__path__
 
107
        try:
 
108
            bzrlib.plugins.__path__ = ['first', 'second']
 
109
            exec "import bzrlib.plugins.pluginone"
 
110
            self.assertEqual(['first'], self.activeattributes[tempattribute])
 
111
            exec "import bzrlib.plugins.plugintwo"
 
112
            self.assertEqual(['first', 'second'],
 
113
                self.activeattributes[tempattribute])
75
114
        finally:
76
115
            # remove the plugin 'plugin'
77
116
            del self.activeattributes[tempattribute]
89
128
        # write a plugin that _cannot_ fail to load.
90
129
        print >> file('plugin.py', 'w'), ""
91
130
        try:
92
 
            bzrlib.plugin.load_from_dirs(['.'])
 
131
            bzrlib.plugin.load_from_path(['.'])
93
132
            self.failUnless('plugin' in bzrlib.plugin.all_plugins())
94
133
            self.failUnless(getattr(bzrlib.plugins, 'plugin', None))
95
134
            self.assertEqual(bzrlib.plugin.all_plugins()['plugin'],
96
135
                             bzrlib.plugins.plugin)
97
136
        finally:
98
137
            # remove the plugin 'plugin'
 
138
            if 'bzrlib.plugins.plugin' in sys.modules:
 
139
                del sys.modules['bzrlib.plugins.plugin']
99
140
            if getattr(bzrlib.plugins, 'plugin', None):
100
141
                del bzrlib.plugins.plugin
101
142
        self.failIf(getattr(bzrlib.plugins, 'plugin', None))
143
184
 
144
185
        try:
145
186
            # Check its help
146
 
            bzrlib.plugin.load_from_dirs(['plugin_test'])
 
187
            bzrlib.plugin.load_from_path(['plugin_test'])
147
188
            bzrlib.commands.register_command( bzrlib.plugins.myplug.cmd_myplug)
148
189
            help = self.capture('help myplug')
149
190
            self.assertContainsRe(help, 'From plugin "myplug"')
169
210
        self.assertFalse(plugin_name in dir(bzrlib.plugins),
170
211
                         'Plugin already loaded')
171
212
        try:
172
 
            bzrlib.plugin.load_from_zips([zip_name])
 
213
            bzrlib.plugin.load_from_zip(zip_name)
173
214
            self.assertTrue(plugin_name in dir(bzrlib.plugins),
174
215
                            'Plugin is not loaded')
175
216
        finally:
184
225
    def test_load_package(self):
185
226
        self.make_zipped_plugin('./test.zip', 'ziplug/__init__.py')
186
227
        self.check_plugin_load('./test.zip', 'ziplug')
 
228
 
 
229
 
 
230
class TestSetPluginsPath(TestCase):
 
231
    
 
232
    def test_set_plugins_path(self):
 
233
        """set_plugins_path should set the module __path__ correctly."""
 
234
        old_path = bzrlib.plugins.__path__
 
235
        try:
 
236
            bzrlib.plugins.__path__ = []
 
237
            expected_path = bzrlib.plugin.set_plugins_path()
 
238
            self.assertEqual(expected_path, bzrlib.plugins.__path__)
 
239
        finally:
 
240
            bzrlib.plugins.__path__ = old_path