provide directory existence feedback to user

instead of bailing with an obnoxious error message, or silently ignoring a
command-line option of a directory, squawk to STDERR with the problem and
provide (possibly redundant, but maybe informative) traceback
This commit is contained in:
Martin A. Brown 2016-03-28 11:11:22 -07:00
parent a84a285168
commit 8cbdeab558
2 changed files with 39 additions and 4 deletions

View File

@ -21,5 +21,12 @@ class TestConfigWorks(unittest.TestCase):
config, args = collectconfiguration('tag', ['--pubdir', '.'])
self.assertEqual(config.pubdir, '.')
def test_nonexistent_directory(self):
argv = ['--pubdir', '/path/to/nonexistent/directory']
with self.assertRaises(ValueError) as ecm:
config, args = collectconfiguration('tag', argv)
e = ecm.exception
self.assertTrue("/path/to/nonexistent/directory" in e.args[0])
#
# -- end of file

View File

@ -4,9 +4,13 @@
from __future__ import absolute_import, division, print_function
from __future__ import unicode_literals
import os
import argparse
import copy as _copy
import logging
from tldp.utils import arg_isdirectory, arg_isloglevel, arg_isreadablefile
from tldp.utils import arg_isloglevel, arg_isreadablefile
from tldp.cascadingconfig import CascadingConfig, DefaultFreeArgumentParser
import tldp.typeguesser
@ -16,6 +20,30 @@ logger = logging.getLogger(__name__)
DEFAULT_CONFIGFILE = '/etc/ldptool/ldptool.ini'
class DirectoriesExist(argparse._AppendAction):
def __call__(self, parser, namespace, values, option_string=None):
if not os.path.isdir(values):
message = "No such directory: %r for option %r, removing..."
message = message % (values, option_string)
logger.critical(message)
raise ValueError(message)
items = _copy.copy(argparse._ensure_value(namespace, self.dest, []))
items.append(values)
setattr(namespace, self.dest, items)
class DirectoryExists(argparse._StoreAction):
def __call__(self, parser, namespace, values, option_string=None):
if not os.path.isdir(values):
message = "No such directory: %r for option %r, removing..."
message = message % (values, option_string)
logger.critical(message)
raise ValueError(message)
setattr(namespace, self.dest, values)
def collectconfiguration(tag, argv):
ap = DefaultFreeArgumentParser()
@ -63,15 +91,15 @@ def collectconfiguration(tag, argv):
help='subdirs to copy during build [%(default)s]')
ap.add_argument('--sourcedir', '--source-dir', '--source-directory',
'-s',
action='append', default='', type=arg_isdirectory,
default=[], action=DirectoriesExist,
help='a directory containing LDP source documents')
ap.add_argument('--pubdir', '--output', '--outputdir', '--outdir',
'-o',
default=None, type=arg_isdirectory,
default=None, action=DirectoryExists,
help='a directory containing LDP output documents')
ap.add_argument('--builddir', '--build-dir', '--build-directory',
'-d',
default=None, type=arg_isdirectory,
default=None, action=DirectoryExists,
help='a scratch directory used for building')
ap.add_argument('--configfile', '--config-file', '--cfg',
'-c',