From 8a4e47ebcbacad4e93e292e9cd9db4d4b13d77e7 Mon Sep 17 00:00:00 2001 From: Ng Zhi An Date: Sat, 25 Oct 2014 15:46:10 -0400 Subject: [PATCH 1/7] Add ConfigurationError exception class --- mkdocs/config.py | 2 ++ mkdocs/exceptions.py | 3 +++ 2 files changed, 5 insertions(+) create mode 100644 mkdocs/exceptions.py diff --git a/mkdocs/config.py b/mkdocs/config.py index a9cf05c7..f1bff23e 100644 --- a/mkdocs/config.py +++ b/mkdocs/config.py @@ -2,6 +2,8 @@ from mkdocs import utils from mkdocs.compat import urlparse +from mkdocs.exceptions import ConfigurationError + import errno import os import sys diff --git a/mkdocs/exceptions.py b/mkdocs/exceptions.py new file mode 100644 index 00000000..859d1f79 --- /dev/null +++ b/mkdocs/exceptions.py @@ -0,0 +1,3 @@ +class ConfigurationError(Exception): + """Error in configuration""" + pass From 5549682ec904225317288662e68035259dcfd120 Mon Sep 17 00:00:00 2001 From: Ng Zhi An Date: Sat, 25 Oct 2014 15:47:21 -0400 Subject: [PATCH 2/7] Throw ConfigurationError on problems with loading config Try to improve error handling. #172 --- mkdocs/config.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/mkdocs/config.py b/mkdocs/config.py index f1bff23e..c73f6df2 100644 --- a/mkdocs/config.py +++ b/mkdocs/config.py @@ -78,8 +78,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) @@ -91,8 +90,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 From 2a0909d2f0d464c1b6336192f16f1df8f53ffacb Mon Sep 17 00:00:00 2001 From: Ng Zhi An Date: Sat, 25 Oct 2014 15:47:34 -0400 Subject: [PATCH 3/7] Update tests to check for Configuration Error --- mkdocs/test.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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): """ From 0e66b3ac2e2ec9c7b1ced09d4d80c611706b3a18 Mon Sep 17 00:00:00 2001 From: Ng Zhi An Date: Sat, 25 Oct 2014 15:47:56 -0400 Subject: [PATCH 4/7] Catch KeyboardInterrupt when serving --- mkdocs/serve.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) 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') From 89325ec6ebb25c6c995238ee2a016aeef0fa56fb Mon Sep 17 00:00:00 2001 From: Ng Zhi An Date: Sat, 25 Oct 2014 18:58:33 -0400 Subject: [PATCH 5/7] Remove unused imports --- mkdocs/config.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/mkdocs/config.py b/mkdocs/config.py index c73f6df2..d89b8801 100644 --- a/mkdocs/config.py +++ b/mkdocs/config.py @@ -4,9 +4,7 @@ from mkdocs import utils from mkdocs.compat import urlparse from mkdocs.exceptions import ConfigurationError -import errno import os -import sys import yaml DEFAULT_CONFIG = { From 7b458f340c7a806dd8763e0425dc279ebb16e855 Mon Sep 17 00:00:00 2001 From: Ng Zhi An Date: Sun, 26 Oct 2014 18:37:16 -0400 Subject: [PATCH 6/7] Remove pass in ConfigurationExpection --- mkdocs/exceptions.py | 1 - 1 file changed, 1 deletion(-) diff --git a/mkdocs/exceptions.py b/mkdocs/exceptions.py index 859d1f79..1e3580dd 100644 --- a/mkdocs/exceptions.py +++ b/mkdocs/exceptions.py @@ -1,3 +1,2 @@ class ConfigurationError(Exception): """Error in configuration""" - pass From c80a887367b2793e036fb307ae6c03596343efe4 Mon Sep 17 00:00:00 2001 From: Ng Zhi An Date: Sun, 26 Oct 2014 18:37:55 -0400 Subject: [PATCH 7/7] Reduce noise when configuration has error --- mkdocs/main.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) 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()