wrap long lines, and tolerate various-width wrappings of the --help output 170/head
authorBrian Warner <warner@lothar.com>
Tue, 26 May 2015 18:32:14 +0000 (11:32 -0700)
committerBrian Warner <warner@lothar.com>
Tue, 26 May 2015 18:40:17 +0000 (11:40 -0700)
test_cli.Help was too sensitive to the way that the --help output was
wrapped, which caused failures on travis when COLUMNS= was set low and
the expected strings were split across separate lines.

src/allmydata/scripts/startstop_node.py
src/allmydata/test/test_cli.py

index b1aad6acdc35cb4d252ce69152348bafd22e2547..e3b2e72c4489e02636a0a45625c9a703fdaafa7b 100644 (file)
@@ -11,22 +11,26 @@ from allmydata.util.encodingutil import listdir_unicode, quote_local_unicode_pat
 class StartOptions(BasedirOptions):
     subcommand_name = "start"
     optParameters = [
-        ("basedir", "C", None, "Specify which Tahoe base directory should be used. This has the same effect as the global --node-directory option. [default: %s]"
-         % quote_local_unicode_path(_default_nodedir)),
+        ("basedir", "C", None,
+         "Specify which Tahoe base directory should be used."
+         " This has the same effect as the global --node-directory option."
+         " [default: %s]" % quote_local_unicode_path(_default_nodedir)),
         ]
 
     def parseArgs(self, basedir=None, *twistd_args):
         # This can't handle e.g. 'tahoe start --nodaemon', since '--nodaemon'
-        # looks like an option to the tahoe subcommand, not to twistd.
-        # So you can either use 'tahoe start' or 'tahoe start NODEDIR --TWISTD-OPTIONS'.
-        # Note that 'tahoe --node-directory=NODEDIR start --TWISTD-OPTIONS' also
-        # isn't allowed, unfortunately.
+        # looks like an option to the tahoe subcommand, not to twistd. So you
+        # can either use 'tahoe start' or 'tahoe start NODEDIR
+        # --TWISTD-OPTIONS'. Note that 'tahoe --node-directory=NODEDIR start
+        # --TWISTD-OPTIONS' also isn't allowed, unfortunately.
 
         BasedirOptions.parseArgs(self, basedir)
         self.twistd_args = twistd_args
 
     def getSynopsis(self):
-        return "Usage:  %s [global-options] %s [options] [NODEDIR [twistd-options]]" % (self.command_name, self.subcommand_name)
+        return ("Usage:  %s [global-options] %s [options]"
+                " [NODEDIR [twistd-options]]"
+                % (self.command_name, self.subcommand_name))
 
     def getUsage(self, width=None):
         t = BasedirOptions.getUsage(self, width) + "\n"
@@ -45,7 +49,8 @@ class StopOptions(BasedirOptions):
         BasedirOptions.parseArgs(self, basedir)
 
     def getSynopsis(self):
-        return "Usage:  %s [global-options] stop [options] [NODEDIR]" % (self.command_name,)
+        return ("Usage:  %s [global-options] stop [options] [NODEDIR]"
+                % (self.command_name,))
 
 class RestartOptions(StartOptions):
     subcommand_name = "restart"
@@ -235,9 +240,9 @@ def restart(config, stdout, stderr):
 
 def run(config, stdout, stderr):
     config.twistd_args = config.twistd_args + ("--nodaemon",)
-    # Previously we would do the equivalent of adding ("--logfile", "tahoesvc.log"),
-    # but that redirects stdout/stderr which is often unhelpful, and the user can
-    # add that option explicitly if they want.
+    # Previously we would do the equivalent of adding ("--logfile",
+    # "tahoesvc.log"), but that redirects stdout/stderr which is often
+    # unhelpful, and the user can add that option explicitly if they want.
 
     return start(config, stdout, stderr)
 
index 3caf7687ff9fb33a20a3fa1267e0d5568ed92be6..5d39814924c9c0969e88df0ad6942abc2d4f4308 100644 (file)
@@ -561,6 +561,11 @@ class CLI(CLITestMixin, unittest.TestCase):
 
 
 class Help(unittest.TestCase):
+    def failUnlessInNormalized(self, x, y):
+        # helper function to deal with the --help output being wrapped to
+        # various widths, depending on the $COLUMNS environment variable
+        self.failUnlessIn(x.replace("\n", " "), y.replace("\n", " "))
+
     def test_get(self):
         help = str(cli.GetOptions())
         self.failUnlessIn("[options] REMOTE_FILE LOCAL_FILE", help)
@@ -586,22 +591,22 @@ class Help(unittest.TestCase):
     def test_mv(self):
         help = str(cli.MvOptions())
         self.failUnlessIn("[options] FROM TO", help)
-        self.failUnlessIn("Use 'tahoe mv' to move files", help)
+        self.failUnlessInNormalized("Use 'tahoe mv' to move files", help)
 
     def test_cp(self):
         help = str(cli.CpOptions())
         self.failUnlessIn("[options] FROM.. TO", help)
-        self.failUnlessIn("Use 'tahoe cp' to copy files", help)
+        self.failUnlessInNormalized("Use 'tahoe cp' to copy files", help)
 
     def test_ln(self):
         help = str(cli.LnOptions())
         self.failUnlessIn("[options] FROM_LINK TO_LINK", help)
-        self.failUnlessIn("Use 'tahoe ln' to duplicate a link", help)
+        self.failUnlessInNormalized("Use 'tahoe ln' to duplicate a link", help)
 
     def test_mkdir(self):
         help = str(cli.MakeDirectoryOptions())
         self.failUnlessIn("[options] [REMOTE_DIR]", help)
-        self.failUnlessIn("Create a new directory", help)
+        self.failUnlessInNormalized("Create a new directory", help)
 
     def test_backup(self):
         help = str(cli.BackupOptions())
@@ -670,13 +675,13 @@ class Help(unittest.TestCase):
     def test_debug_trial(self):
         help = str(debug.TrialOptions())
         self.failUnlessIn(" [global-options] debug trial [options] [[file|package|module|TestCase|testmethod]...]", help)
-        self.failUnlessIn("The 'tahoe debug trial' command uses the correct imports", help)
+        self.failUnlessInNormalized("The 'tahoe debug trial' command uses the correct imports", help)
 
     def test_debug_flogtool(self):
         options = debug.FlogtoolOptions()
         help = str(options)
         self.failUnlessIn(" [global-options] debug flogtool ", help)
-        self.failUnlessIn("The 'tahoe debug flogtool' command uses the correct imports", help)
+        self.failUnlessInNormalized("The 'tahoe debug flogtool' command uses the correct imports", help)
 
         for (option, shortcut, oClass, desc) in options.subCommands:
             subhelp = str(oClass())