~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_options.py

  • Committer: Martin Pool
  • Date: 2007-07-10 10:20:27 UTC
  • mto: This revision was merged to the branch mainline in revision 2599.
  • Revision ID: mbp@sourcefrog.net-20070710102027-2os88re33c57m522
Add test for and documentation of option style, fix up existing options to comply

Show diffs side-by-side

added added

removed removed

Lines of Context:
14
14
# along with this program; if not, write to the Free Software
15
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
16
 
 
17
import re
 
18
 
17
19
from bzrlib import (
18
20
    builtins,
19
21
    bzrdir,
 
22
    commands,
20
23
    errors,
21
24
    option,
22
25
    repository,
267
270
        opts, args = self.parse(
268
271
            options, ['--hello=a', '--hello=b', '--hello=-', '--hello=c'])
269
272
        self.assertEqual(['c'], opts.hello)
 
273
 
 
274
 
 
275
class TestOptionDefinitions(TestCase):
 
276
    """Tests for options in the Bazaar codebase."""
 
277
 
 
278
    def get_all_options(self):
 
279
        """Return a list of all options used by Bazaar, both global and command.
 
280
        
 
281
        The list returned contains elements of (scope, option) where 'scope' 
 
282
        is either None for global options, or a command name.
 
283
 
 
284
        This includes options provided by plugins.
 
285
        """
 
286
        g = [(None, opt) for name, opt
 
287
             in sorted(option.Option.OPTIONS.items())]
 
288
        for cmd_name, cmd_class in sorted(commands.get_all_cmds()):
 
289
            cmd = cmd_class()
 
290
            for opt_name, opt in sorted(cmd.options().items()):
 
291
                g.append((cmd_name, opt))
 
292
        return g
 
293
 
 
294
    def test_get_all_options(self):
 
295
        all = self.get_all_options()
 
296
        self.assertTrue(len(all) > 100,
 
297
                "too few options found: %r" % all)
 
298
 
 
299
    def test_option_grammar(self):
 
300
        msgs = []
 
301
        option_re = re.compile(r'^[A-Z]')
 
302
        for scope, option in self.get_all_options():
 
303
            if not option.help:
 
304
                # TODO: Also complain about options that have no help message?
 
305
                continue
 
306
            if not option_re.match(option.help):
 
307
                msgs.append('%-16s %-16s %s' %
 
308
                        ((scope or 'GLOBAL'), option.name, option.help))
 
309
        if msgs:
 
310
            self.fail("The following options don't match the style guide:\n"
 
311
                    + '\n'.join(msgs))
 
312
 
 
313
    # TODO: Scan for global options that aren't used by any command?
 
314
    #
 
315
    # TODO: Check that there are two spaces between sentences.