summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Ipsum <richard.ipsum@codethink.co.uk>2015-03-14 17:29:43 +0000
committerRichard Ipsum <richard.ipsum@codethink.co.uk>2015-03-18 16:08:12 +0000
commit2455c32ced2d9316cb937e8a627afd409c2d1517 (patch)
tree16a567ff27b09d0d8675af49b4baf166897c1911
parent283f6c08eeb8657a65cdec6a4f605c356130c17d (diff)
downloadmorph-2455c32ced2d9316cb937e8a627afd409c2d1517.tar.gz
Add write_from_dict to util
A function to read lines from a dictionary and append them to a file
-rw-r--r--morphlib/util.py32
1 files changed, 32 insertions, 0 deletions
diff --git a/morphlib/util.py b/morphlib/util.py
index a3a07cce..e733af9d 100644
--- a/morphlib/util.py
+++ b/morphlib/util.py
@@ -644,3 +644,35 @@ def error_message_for_containerised_commandline(
'Containerisation settings: %s\n' \
'Error output:\n%s' \
% (argv_string, container_kwargs, err)
+
+
+def write_from_dict(filepath, d, validate=lambda x, y: True): #pragma: no cover
+ '''Takes a dictionary and appends the contents to a file
+
+ An optional validation callback can be passed to perform validation on
+ each value in the dictionary.
+
+ e.g.
+
+ def validation_callback(dictionary_key, dictionary_value):
+ if not dictionary_value.isdigit():
+ raise Exception('value contains non-digit character(s)')
+
+ Any callback supplied to this function should raise an exception
+ if validation fails.
+ '''
+
+ # Sort items asciibetically
+ # the output of the deployment should not depend
+ # on the locale of the machine running the deployment
+ items = sorted(d.iteritems(), key=lambda (k, v): [ord(c) for c in v])
+
+ for (k, v) in items:
+ validate(k, v)
+
+ with open(filepath, 'a') as f:
+ for (_, v) in items:
+ f.write('%s\n' % v)
+
+ os.fchown(f.fileno(), 0, 0)
+ os.fchmod(f.fileno(), 0644)