Update cabin camera URL.
[kiosk.git] / file_writer.py
index aba7d8f25f5b0efda0df5d5ef55548af0aeb0c26..08be646da19addde1ece563932adef2e521f9043 100644 (file)
@@ -1,42 +1,63 @@
-import constants
+#!/usr/bin/env python3
+
+import logging
 import os
+from uuid import uuid4
+
+import kiosk_constants
+
+
+logger = logging.getLogger(__name__)
 
-def remove_tricky_unicode(x):
-    try:
-        x = x.decode('utf-8')
-        x = x.replace(u"\u2018", "'").replace(u"\u2019", "'")
-        x = x.replace(u"\u201c", '"').replace(u"\u201d", '"')
-        x = x.replace(u"\u2e3a", "-").replace(u"\u2014", "-")
-    except:
-        pass
-    return x
 
 class file_writer:
-    def __init__(self, filename):
-        self.full_filename = os.path.join(constants.pages_dir,
-                                          filename)
-        self.f = open(self.full_filename, 'w')
-        self.xforms = [ remove_tricky_unicode ]
+    """Helper context to write a pages file."""
+
+    def __init__(self, filename: str, *, transformations=[]):
+        temp = "temp-" + str(uuid4())
+        self.temp_filename = os.path.join(kiosk_constants.pages_dir, temp)
+        self.full_filename = os.path.join(kiosk_constants.pages_dir, filename)
+        self.xforms = [file_writer.remove_tricky_unicode]
+        self.xforms.extend(transformations)
+        self.f = None
+        logger.info(f"Writing {self.temp_filename}...")
 
-    def add_xform(self, xform):
-        self.xforms.append(xform)
+    @staticmethod
+    def remove_tricky_unicode(x: str) -> str:
+        try:
+            x = x.replace("\u2018", "'").replace("\u2019", "'")
+            x = x.replace("\u201c", '"').replace("\u201d", '"')
+            x = x.replace("\u2e3a", "-").replace("\u2014", "-")
+        except:
+            pass
+        return x
 
     def write(self, data):
         for xform in self.xforms:
             data = xform(data)
-        self.f.write(data.encode('utf-8'))
+        self.f.write(data.encode("utf-8"))
+
+    def __enter__(self):
+        self.f = open(self.temp_filename, "wb")
+        return self
+
+    def __exit__(self, exc_type, exc_value, exc_traceback):
+        self.close()
+        logger.info(f"Copying {self.temp_filename} to {self.full_filename}")
+        cmd = f'/bin/mv -f {self.temp_filename} "{self.full_filename}"'
+        os.system(cmd)
+        print(cmd)
 
     def done(self):
-        self.f.close()
+        self.close()
 
     def close(self):
-        self.done()
+        self.f.close()
+
 
 # Test
-#def toupper(x):
-#    return x.upper()
-#
-#fw = file_writer("test")
-#fw.add_xform(toupper)
-#fw.write(u"This is a \u201ctest\u201d. \n")
-#fw.done()
+# def toupper(x):
+#   return x.upper()
+
+# with file_writer("test", transformations=[toupper]) as fw:
+#   fw.write(u"Another test!!")