Author: janne.t.harkonen
Date: Tue Nov 25 07:59:47 2008
New Revision: 1109

Modified:
    trunk/src/robot/errors.py
    trunk/src/robot/utils/argumentparser.py
    trunk/utest/utils/test_argumentparser.py

Log:
changed argumentparser to handle --version, --help and variable number of  
args

Modified: trunk/src/robot/errors.py
==============================================================================
--- trunk/src/robot/errors.py   (original)
+++ trunk/src/robot/errors.py   Tue Nov 25 07:59:47 2008
@@ -51,3 +51,5 @@
          RobotError.__init__(self, message)
          self.traceback = traceback

+class Information(RobotError):
+    """Used by argument parser with --help or --version"""

Modified: trunk/src/robot/utils/argumentparser.py
==============================================================================
--- trunk/src/robot/utils/argumentparser.py     (original)
+++ trunk/src/robot/utils/argumentparser.py     Tue Nov 25 07:59:47 2008
@@ -14,14 +14,13 @@


  import getopt     # optparse not supported by Jython 2.2
-import os.path
  import os
  import re
  import sys
  import glob
  import string

-from robot.errors import DataError, FrameworkError
+from robot.errors import DataError, FrameworkError, Information

  from misc import seq2str, plural_or_not
  from robottypes import is_list, is_boolean
@@ -83,11 +82,13 @@
      \s*$              #
      ''', re.VERBOSE | re.IGNORECASE)

-    def __init__(self, usage):
+    def __init__(self, usage, version='No version information available'):
          """Initialization is done using a usage doc explaining options.

          See for example 'runner.py' and 'rebot.py' for usage examples.
          """
+        self._usage = usage
+        self._version = version
          self._short_opts = ''
          self._long_opts = []
          self._multi_opts = []
@@ -98,7 +99,7 @@
          self._parse_usage(usage)

      def parse_args(self, args_list, unescape=None, argfile=None,  
pythonpath=None,
-                   check_args=False):
+                   help=None, version=None, check_args=False):
          """Parse given arguments and return options and positional  
arguments.

          Arguments must be given as a list and are typically sys.argv[1:].
@@ -137,6 +138,10 @@
          opts, args = self._parse_args(args_list)
          if unescape:
              opts, args = self._unescape_opts_and_args(opts, args, unescape)
+        if help and opts[help]:
+            raise Information(self._usage)
+        if version and opts[version]:
+            raise Information(self._version)
          if pythonpath:
              sys.path = self._get_pythonpath(opts[pythonpath]) + sys.path
          if check_args:
@@ -157,6 +162,8 @@
              return
          elif len(args) < len(self._expected_args):
              msg = 'Required argument%s missing.' %  
plural_or_not(self._expected_args)
+        elif self._expected_args and self._expected_args[-1].endswith('s'):
+            return
          else:
              msg = 'Too many arguments.'
          msg += ' Expected %s' % seq2str(self._expected_args)

Modified: trunk/utest/utils/test_argumentparser.py
==============================================================================
--- trunk/utest/utils/test_argumentparser.py    (original)
+++ trunk/utest/utils/test_argumentparser.py    Tue Nov 25 07:59:47 2008
@@ -1,8 +1,7 @@
  import unittest
-import sys
  import os

-from robot.utils.argumentparser import *
+from robot.utils.argumentparser import ArgumentParser
  from robot.utils.asserts import *
  from robot.errors import *

@@ -129,11 +128,18 @@
      def test_check_args_with_correct_args(self):
          for args in [ ('hello',), ('hello world',) ]:
              self.ap.check_args(args)
-
+
      def test_check_args_with_wrong_number_of_args(self):
          for args in [ (), ('arg1','arg2','arg3') ]:
              assert_raises(DataError, self.ap.check_args, args)

+    def test_check_variable_number_of_args(self):
+        ap = ArgumentParser('usage:  robot.py [options] args')
+        ap.check_args(['one_is_ok'])
+        ap.check_args(['two', 'ok'])
+        ap.check_args(['this', 'should', 'also', 'work', 'pretty', 'well'])
+        assert_raises(DataError, ap.check_args, [])
+
      def test_unescape_options(self):
          cli = '--escape quot:Q -E space:SP -E lt:LT -E gt:GT ' \
                  + '-N QQQLTmySPfineSPnameGTQQQ sourceSPwithSPspaces'
@@ -165,6 +171,25 @@
          assert_equals(ap._get_pythonpath([p1,p2]), [p1,p2])
          assert_equals(ap._get_pythonpath([p1 + ':' + p2]), [p1,p2])
          assert_true(p1 in ap._get_pythonpath(os.path.join(p2,'*')))
+
+
+class TestPrintHelpAndVersion(unittest.TestCase):
+
+    def setUp(self):
+        self.ap = ArgumentParser(usage, version='testing 1.0')
+
+    def test_print_help(self):
+        assert_raises_with_msg(Information, usage,
+                               self.ap.parse_args, ['--help'], help='help')
+
+    def test_print_version(self):
+        assert_raises_with_msg(Information, 'testing 1.0',
+                               self.ap.parse_args, ['--version'],  
version='version')
+
+    def test_print_version_when_version_not_set(self):
+        ap = ArgumentParser(usage)
+        assert_raises_with_msg(Information, "No version information  
available",
+                               ap.parse_args, ['--version'],  
version='version')


  if __name__ == "__main__":

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"robotframework-commit" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/robotframework-commit?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to