From c9b24f349dc28f4af37b633e7cf407035700011e Mon Sep 17 00:00:00 2001
From: Henning Glawe <glaweh@debian.org>
Date: Mon, 1 Aug 2016 11:48:02 +0200
Subject: [PATCH] sort json dict keys and start/endRe events

---
 common/python/nomadcore/parser_backend.py | 20 ++++++++++----------
 common/python/nomadcore/simple_parser.py  |  8 ++++----
 2 files changed, 14 insertions(+), 14 deletions(-)

diff --git a/common/python/nomadcore/parser_backend.py b/common/python/nomadcore/parser_backend.py
index a288197..f03d9ef 100644
--- a/common/python/nomadcore/parser_backend.py
+++ b/common/python/nomadcore/parser_backend.py
@@ -69,7 +69,7 @@ class JsonParseEventsWriterBackend(object):
                "data":self.stats}
         url = 'https://nomad-dev.rz-berlin.mpg.de/parsers/addStat'
         #url = 'http://127.0.0.1:8081/parsers/addStat'
-        data = json.dumps(stats)
+        data = json.dumps(stats, sort_keys=True)
         req = urllib.request.Request(url, data)
         response = urllib.request.urlopen(req)
         the_page = response.read()
@@ -94,7 +94,7 @@ class JsonParseEventsWriterBackend(object):
             self.fileOut.write(", ")
         else:
             self.__writeComma = True
-        json.dump(dic, self.fileOut, indent = 2, separators = (',', ':')) # default = self.__numpyEncoder)
+        json.dump(dic, self.fileOut, indent = 2, separators = (',', ':'), sort_keys=True) # default = self.__numpyEncoder)
 
     def startedParsingSession(self, mainFileUri, parserInfo, parserStatus = None, parserErrors = None):
         """should be called when the parsing starts, parserInfo should be a valid json dictionary"""
@@ -104,13 +104,13 @@ class JsonParseEventsWriterBackend(object):
         self.sessionParserStatus = parserStatus
         self.sessionParserErrors = parserErrors
         if mainFileUri is not None:
-            self.fileOut.write(",\n  \"mainFileUri\": " + json.dumps(mainFileUri))
+            self.fileOut.write(",\n  \"mainFileUri\": " + json.dumps(mainFileUri, sort_keys=True))
         if parserInfo is not None:
-            self.fileOut.write(",\n  \"parserInfo\": " + json.dumps(parserInfo, indent = 2, separators = (',', ':')))
+            self.fileOut.write(",\n  \"parserInfo\": " + json.dumps(parserInfo, indent = 2, separators = (',', ':'), sort_keys=True))
         if parserStatus is not None:
-            self.fileOut.write(",\n  \"parserStatus\": " + json.dumps(parserStatus, indent = 2, separators = (',', ':')))
+            self.fileOut.write(",\n  \"parserStatus\": " + json.dumps(parserStatus, indent = 2, separators = (',', ':'), sort_keys=True))
         if parserErrors is not None:
-            self.fileOut.write(",\n  \"parserStatus\": " + json.dumps(parserErrors, indent = 2, separators = (',', ':')))
+            self.fileOut.write(",\n  \"parserStatus\": " + json.dumps(parserErrors, indent = 2, separators = (',', ':'), sort_keys=True))
         self.fileOut.write(""",
   "events": [""")
 
@@ -118,13 +118,13 @@ class JsonParseEventsWriterBackend(object):
         """should be called when the parsing finishes"""
         self.fileOut.write("]")
         if mainFileUri is not None and self.sessionMainFileUri is None:
-            self.fileOut.write(",\n  \"mainFileUri\": " + json.dumps(mainFileUri))
+            self.fileOut.write(",\n  \"mainFileUri\": " + json.dumps(mainFileUri, sort_keys=True))
         if parserInfo is not None and self.sessionParserInfo is None:
-            self.fileOut.write(",\n  \"parserInfo\": " + json.dumps(parserInfo, indent = 2, separators = (',', ':')))
+            self.fileOut.write(",\n  \"parserInfo\": " + json.dumps(parserInfo, indent = 2, separators = (',', ':'), sort_keys=True))
         if parserStatus is not None and self.sessionParserStatus is None:
-            self.fileOut.write(",\n  \"parserStatus\": " + json.dumps(parserStatus, indent = 2, separators = (',', ':')))
+            self.fileOut.write(",\n  \"parserStatus\": " + json.dumps(parserStatus, indent = 2, separators = (',', ':'), sort_keys=True))
         if parserErrors is not None and self.sessionParserErrors is None:
-            self.fileOut.write(",\n  \"parserErrors\": " + json.dumps(parserErrors, indent = 2, separators = (',', ':')))
+            self.fileOut.write(",\n  \"parserErrors\": " + json.dumps(parserErrors, indent = 2, separators = (',', ':'), sort_keys=True))
         self.fileOut.write("""
 }""")
         self.fileOut.flush()
diff --git a/common/python/nomadcore/simple_parser.py b/common/python/nomadcore/simple_parser.py
index 33664bc..d19e1c6 100644
--- a/common/python/nomadcore/simple_parser.py
+++ b/common/python/nomadcore/simple_parser.py
@@ -581,14 +581,14 @@ class CompiledMatcher(object):
             raise Exception("Expected to match %s on %r" % (self.startRe.pattern, line))
         self.annotate(m,line,parser,self.matcher,0)
         result_dict = {}
-        for k,v in m.groupdict().items():
+        for k,v in sorted(m.groupdict().items()):
             if v is None:
                 # a group may be optional (subexpression of ? or | in regex)
                 continue
             k_converted, v_converted = self.addStrValue(parser.backend, k, v)
             result_dict[k_converted] = v_converted
         if self.matcher.fixedStartValues:
-            for k,v in self.matcher.fixedStartValues.items():
+            for k,v in sorted(self.matcher.fixedStartValues.items()):
                 k_converted, v_converted = self.addStrValue(parser.backend, k, v)
                 result_dict[k_converted] = v_converted
         if self.matcher.forwardMatch:
@@ -601,14 +601,14 @@ class CompiledMatcher(object):
         m = self.endRe.match(line) #, re.MULTILINE)
         self.annotate(m,line,parser,self.matcher,1)
         result_dict = {}
-        for k,v in m.groupdict().items():
+        for k,v in sorted(m.groupdict().items()):
             if v is None:
                 # a group may be optional (subexpression of ? or | in regex)
                 continue
             k_converted, v_converted = self.addStrValue(parser.backend, k, v)
             result_dict[k_converted] = v_converted
         if self.matcher.fixedEndValues:
-            for k,v in self.matcher.fixedEndValues.items():
+            for k,v in sorted(self.matcher.fixedEndValues.items()):
                 k_converted, v_converted = self.addStrValue(parser.backend, k, v)
                 result_dict[k_converted] = v_converted
         return result_dict
-- 
GitLab