Added django-compress.
[redakcja.git] / apps / compress / versioning / hash / __init__.py
diff --git a/apps/compress/versioning/hash/__init__.py b/apps/compress/versioning/hash/__init__.py
new file mode 100644 (file)
index 0000000..74721fe
--- /dev/null
@@ -0,0 +1,47 @@
+import cStringIO
+from hashlib import md5, sha1
+import os
+
+from compress.conf import settings
+from compress.utils import concat, get_output_filename
+from compress.versioning.base import VersioningBase
+
+class HashVersioningBase(VersioningBase):
+    def __init__(self, hash_method):
+        self.hash_method = hash_method
+    
+    def needs_update(self, output_file, source_files, version):
+        output_file_name = get_output_filename(output_file, version)
+        ph = settings.COMPRESS_VERSION_PLACEHOLDER
+        of = output_file
+        try:
+            phi = of.index(ph)
+            old_version = output_file_name[phi:phi+len(ph)-len(of)]
+            return (version != old_version), version
+        except ValueError:
+            # no placeholder found, do not update, manual update if needed
+            return False, version
+            
+    def get_version(self, source_files):
+        buf = concat(source_files)
+        s = cStringIO.StringIO(buf)
+        version = self.get_hash(s)
+        s.close()
+        return version            
+            
+    def get_hash(self, f, CHUNK=2**16):
+        m = self.hash_method()
+        while 1:
+            chunk = f.read(CHUNK)
+            if not chunk:
+                break
+            m.update(chunk)
+        return m.hexdigest()
+
+class MD5Versioning(HashVersioningBase):
+    def __init__(self):
+        super(MD5Versioning, self).__init__(md5)
+
+class SHA1Versioning(HashVersioningBase):
+    def __init__(self):
+        super(SHA1Versioning, self).__init__(sha1)
\ No newline at end of file