diff --git a/tests/test_config.py b/tests/test_config.py index a8e53d5..bd92092 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -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 diff --git a/tldp/config.py b/tldp/config.py index 954b032..972b71a 100644 --- a/tldp/config.py +++ b/tldp/config.py @@ -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',