diff options
-rw-r--r-- | README.md | 10 | ||||
-rw-r--r-- | dotbot/config.py | 12 | ||||
-rw-r--r-- | test/test-lib.bash | 9 | ||||
-rw-r--r-- | test/tests/config-json-tabs.bash | 20 | ||||
-rw-r--r-- | test/tests/config-json.bash | 20 |
5 files changed, 63 insertions, 8 deletions
@@ -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 <<EOF +[{ + "link": { + "~/.i": "h" + } +}] +EOF +' + +test_expect_success 'test' ' +grep "grape" ~/.i +' diff --git a/test/tests/config-json.bash b/test/tests/config-json.bash new file mode 100644 index 0000000..94ef0ac --- /dev/null +++ b/test/tests/config-json.bash @@ -0,0 +1,20 @@ +test_description='json config allowed' +. '../test-lib.bash' + +test_expect_success 'setup' ' +echo "grape" > ${DOTFILES}/h +' + +test_expect_success 'run' ' +run_dotbot_json <<EOF +[{ + "link": { + "~/.i": "h" + } +}] +EOF +' + +test_expect_success 'test' ' +grep "grape" ~/.i +' |