diff --git a/README.md b/README.md index 7971de9..6dae828 100644 --- a/README.md +++ b/README.md @@ -118,13 +118,9 @@ Configuration ------------- Dotbot uses YAML or JSON formatted configuration files to let you specify how -to set up your dotfiles. The YAML format is recommended because it looks -cleaner. JSON will be parsed as a subset of YAML, so tab characters are not -permitted. - -Currently, Dotbot knows how to [link](#link) files and folders, execute -[shell](#shell) commands, and [clean](#clean) directories of broken symbolic -links. +to set up your dotfiles. Currently, Dotbot knows how to [link](#link) files and +folders, execute [shell](#shell) commands, and [clean](#clean) directories of +broken symbolic links. **Ideally, bootstrap configurations should be idempotent. That is, the installer should be able to be run multiple times without causing any diff --git a/dotbot/config.py b/dotbot/config.py index 9ecf9ac..a9aafa0 100644 --- a/dotbot/config.py +++ b/dotbot/config.py @@ -1,4 +1,5 @@ import yaml +import json from .util import string class ConfigReader(object): @@ -8,7 +9,16 @@ class ConfigReader(object): def _read(self, config_file_path): try: with open(config_file_path) as fin: - data = yaml.safe_load(fin) + try: + data = yaml.safe_load(fin) + except Exception as e: + # try falling back to JSON, but return original exception + # if that fails too + try: + fin.seek(0) + data = json.load(fin) + except Exception: + raise e return data except Exception as e: msg = string.indent_lines(str(e)) diff --git a/test/test-lib.bash b/test/test-lib.bash index 425ae56..bb4b234 100644 --- a/test/test-lib.bash +++ b/test/test-lib.bash @@ -1,6 +1,7 @@ DEBUG=false DOTFILES='/home/vagrant/dotfiles' INSTALL_CONF='install.conf.yaml' +INSTALL_CONF_JSON='install.conf.json' test_run_() { if ! ${DEBUG}; then @@ -48,4 +49,12 @@ run_dotbot() { ) } +run_dotbot_json() { + ( + cd "${DOTFILES}" + cat > "${INSTALL_CONF_JSON}" + /dotbot/bin/dotbot -d . -c "${INSTALL_CONF_JSON}" "${@}" + ) +} + initialize diff --git a/test/tests/config-json-tabs.bash b/test/tests/config-json-tabs.bash new file mode 100644 index 0000000..4acc230 --- /dev/null +++ b/test/tests/config-json-tabs.bash @@ -0,0 +1,20 @@ +test_description='json config with tabs allowed' +. '../test-lib.bash' + +test_expect_success 'setup' ' +echo "grape" > ${DOTFILES}/h +' + +test_expect_success 'run' ' +run_dotbot_json < ${DOTFILES}/h +' + +test_expect_success 'run' ' +run_dotbot_json <