Ticket 733: Fixed some more encoding things jenkins-baltrad-db-415
authorAnders Henja <anders@henjab.se>
Mon, 2 Apr 2018 08:54:49 +0000 (10:54 +0200)
committerAnders Henja <anders@henjab.se>
Mon, 2 Apr 2018 08:54:49 +0000 (10:54 +0200)
client/python/src/baltrad/bdbclient/cmd.py
common/src/baltrad/bdbcommon/oh5/hasher.py
common/test/oh5/hasher_test.py

index 568e868..0994344 100644 (file)
@@ -30,6 +30,15 @@ import pkg_resources
 from baltrad.bdbcommon import expr, oh5
 from baltrad.bdbclient import db
 
+import sys
+
+##
+# In python27 it's not possible to pipe a string unless encoding it somewhat
+def fix_pipeable_string(s):
+    if sys.version_info < (3,):
+        return unicode(s).encode('utf-8')
+    return s
+
 logger = logging.getLogger("baltrad.bdbclient.cmd")
 
 class ExecutionError(RuntimeError):
@@ -146,12 +155,12 @@ class PrintSources(Command):
     def execute(self, database, opts, args):
         sources = sorted(
             database.get_sources(),
-            cmp=lambda x, y: cmp(x.name, y.name)
+            key=lambda x: x.name
         )
 
         for source in sources:
-            str = source.name + "\t" + source.to_string()
-            print(unicode(str).encode('utf-8')) #To get strings pipeable...
+            s = source.name + "\t" + source.to_string()
+            print(fix_pipeable_string(s))
 
 class ImportSources(Command):
     def update_optionparser(self, parser):
index d2b2913..a936acc 100644 (file)
@@ -1,7 +1,11 @@
 import hashlib
-
+import sys
 from . node import Attribute
 
+encoding_necessary=False
+if sys.version_info >= (3,):
+  encoding_necessary=True
+
 class MetadataHasher(object):
   
     def hash(self, metadata):
@@ -11,9 +15,10 @@ class MetadataHasher(object):
                 attribute_strings.append(self.attribute_string(node))
         attribute_strings.sort()
         hashfunc = hashlib.sha1()
-        for string in attribute_strings:
-            string = string.encode('utf-8')
-            hashfunc.update(string)
+        for s in attribute_strings:
+            if encoding_necessary:
+              s = s.encode('utf-8')
+            hashfunc.update(s)
         return hashfunc.hexdigest()
     
     def attribute_string(self, attr):
index 88fcdbc..97ef85d 100644 (file)
@@ -1,3 +1,4 @@
+# -*- coding: utf-8 -*- 
 import datetime
 
 #from mock import patch, sentinel, Mock
@@ -41,3 +42,15 @@ class TestMetadataHasher(object):
             "469fa750ff4f575f1c30c794bb80e16a6a99ed2c",
             self.hasher.hash(meta)
         )
+
+    def test_concrete_digest3(self):
+        meta = Metadata();
+        meta.add_node("/", Group("what"))
+        meta.add_node("/what", Attribute("source", "WMO:02606,PLC:LuleĆ„"))
+        meta.add_node("/what", Attribute("date", datetime.date(2001, 1, 2)))
+        meta.add_node("/what", Attribute("time", datetime.time(12, 5)))
+        meta.add_node("/what", Attribute("object", "pvol"))
+        eq_(
+            "2c16830c04d40911c799c946f89278c58c0feeb8",
+            self.hasher.hash(meta)
+        )