From a3bc61c97d3092828b065c07a36aef2b219fda8d Mon Sep 17 00:00:00 2001 From: Brian Knobbs Date: Fri, 12 Jun 2015 10:10:47 -0400 Subject: [PATCH 1/2] Trying out ordered YAML --- dotbot/config.py | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/dotbot/config.py b/dotbot/config.py index a6ee9da..6ff3d75 100644 --- a/dotbot/config.py +++ b/dotbot/config.py @@ -1,5 +1,24 @@ import yaml from .util import string +from collections import OrderedDict + + +def ordered_load(stream, Loader=yaml.Loader, object_pairs_hook=OrderedDict): + """ Stolen from SO - http://stackoverflow.com/questions/5121931/in-python-how-can-you-load-yaml-mappings-as-ordereddicts + + Loads a YAML file using an OrderedDict so the ordering of the values are + maintained + """ + class OrderedLoader(Loader): + pass + def construct_mapping(loader, node): + loader.flatten_mapping(node) + return object_pairs_hook(loader.construct_pairs(node)) + OrderedLoader.add_constructor( + yaml.resolver.BaseResolver.DEFAULT_MAPPING_TAG, + construct_mapping) + return yaml.load(stream, OrderedLoader) + class ConfigReader(object): def __init__(self, config_file_path): @@ -8,7 +27,7 @@ class ConfigReader(object): def _read(self, config_file_path): try: with open(config_file_path) as fin: - data = yaml.load(fin) + data = ordered_load(fin) return data except Exception as e: msg = string.indent_lines(str(e)) From 57dde3bf99136fd8e929e411957a749bc146641d Mon Sep 17 00:00:00 2001 From: Brian Knobbs Date: Sun, 14 Jun 2015 19:46:31 -0400 Subject: [PATCH 2/2] Added test to check ordered config --- test/tests/config-ordered.bash | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 test/tests/config-ordered.bash diff --git a/test/tests/config-ordered.bash b/test/tests/config-ordered.bash new file mode 100644 index 0000000..ea45a05 --- /dev/null +++ b/test/tests/config-ordered.bash @@ -0,0 +1,26 @@ +test_description='config loaded in order' +. '../test-lib.bash' + +test_expect_success 'setup' ' +mkdir ${DOTFILES}/a && +mkdir ${DOTFILES}/b && +mkdir ${DOTFILES}/c +echo "orange" > ${DOTFILES}/d +' + +test_expect_success 'run' ' +run_dotbot <