diff --git a/mkdocs/config.py b/mkdocs/config.py index a9cf05c7..d89b8801 100644 --- a/mkdocs/config.py +++ b/mkdocs/config.py @@ -2,9 +2,9 @@ from mkdocs import utils from mkdocs.compat import urlparse -import errno +from mkdocs.exceptions import ConfigurationError + import os -import sys import yaml DEFAULT_CONFIG = { @@ -76,8 +76,7 @@ def load_config(filename='mkdocs.yml', options=None): if 'config' in options: filename = options['config'] if not os.path.exists(filename): - sys.stderr.write("Config file '%s' does not exist." % filename) - sys.exit(errno.ENOENT) + raise ConfigurationError("Config file '%s' does not exist." % filename) with open(filename, 'r') as fp: user_config = yaml.load(fp) user_config.update(options) @@ -89,8 +88,7 @@ def validate_config(user_config): config.update(user_config) if not config['site_name']: - sys.stderr.write("Config must contain 'site_name' setting.") - sys.exit(errno.EINVAL) + raise ConfigurationError("Config must contain 'site_name' setting.") # If not specified, then the 'pages' config simply includes all # markdown files in the docs dir, without generating any header items diff --git a/mkdocs/exceptions.py b/mkdocs/exceptions.py new file mode 100644 index 00000000..1e3580dd --- /dev/null +++ b/mkdocs/exceptions.py @@ -0,0 +1,2 @@ +class ConfigurationError(Exception): + """Error in configuration""" diff --git a/mkdocs/main.py b/mkdocs/main.py index c73bdfac..ebbd5309 100755 --- a/mkdocs/main.py +++ b/mkdocs/main.py @@ -2,12 +2,14 @@ # coding: utf-8 from __future__ import print_function +import sys + from mkdocs.build import build from mkdocs.config import load_config +from mkdocs.exceptions import ConfigurationError from mkdocs.gh_deploy import gh_deploy from mkdocs.new import new from mkdocs.serve import serve -import sys def arg_to_option(arg): @@ -53,7 +55,11 @@ def run_main(): """ cmd = sys.argv[1] if len(sys.argv) >= 2 else None opts = [arg_to_option(arg) for arg in sys.argv[2:] if arg.startswith('--')] - main(cmd, args=sys.argv[2:], options=dict(opts)) + try: + main(cmd, args=sys.argv[2:], options=dict(opts)) + except ConfigurationError as e: + print(e.args[0], file=sys.stderr) + if __name__ == '__main__': run_main() diff --git a/mkdocs/serve.py b/mkdocs/serve.py index a98d05bb..cf97b79f 100644 --- a/mkdocs/serve.py +++ b/mkdocs/serve.py @@ -103,9 +103,13 @@ def serve(config, options=None): print('Running at: http://%s:%s/' % (host, port)) print('Live reload enabled.') print('Hold ctrl+c to quit.') - server.serve_forever() + try: + server.serve_forever() + except KeyboardInterrupt: + print('Stopping server...') # Clean up observer.stop() observer.join() shutil.rmtree(tempdir) + print('Quit complete') diff --git a/mkdocs/test.py b/mkdocs/test.py index 7f45e51b..7fa470bb 100755 --- a/mkdocs/test.py +++ b/mkdocs/test.py @@ -4,6 +4,7 @@ from mkdocs import build, nav, toc, utils, config from mkdocs.compat import PY2, zip +from mkdocs.exceptions import ConfigurationError import markdown import os import shutil @@ -26,12 +27,12 @@ class ConfigTests(unittest.TestCase): def load_missing_config(): options = {'config': 'bad_filename.yaml'} config.load_config(options=options) - self.assertRaises(SystemExit, load_missing_config) + self.assertRaises(ConfigurationError, load_missing_config) def test_missing_site_name(self): def load_missing_site_name(): config.validate_config({}) - self.assertRaises(SystemExit, load_missing_site_name) + self.assertRaises(ConfigurationError, load_missing_site_name) def test_config_option(self): """