misc. fixes, it runs now, but HTML output is corrupt (no flattening)
authorTero Marttila <terom@fixme.fi>
Fri, 05 Jun 2009 23:59:14 +0300
changeset 77 2a53c5ade434
parent 76 e22d9f699081
child 78 d580323b4bfa
misc. fixes, it runs now, but HTML output is corrupt (no flattening)
.hgignore
degal/config.py
degal/filesystem.py
degal/folder.py
degal/format.py
degal/gallery.py
degal/html.py
degal/image.py
degal/render.py
degal/templates.py
--- a/.hgignore	Fri Jun 05 23:42:03 2009 +0300
+++ b/.hgignore	Fri Jun 05 23:59:14 2009 +0300
@@ -2,5 +2,6 @@
 
 ^MANIFEST$
 ^dist/
+^test/
 \.sw[op]$
 \.pyc$
--- a/degal/config.py	Fri Jun 05 23:42:03 2009 +0300
+++ b/degal/config.py	Fri Jun 05 23:59:14 2009 +0300
@@ -66,4 +66,6 @@
 
     # XXX: move elsewhere?
     def get_renderer (self) :
+        import render
+
         return render.RenderMachine(self)
--- a/degal/filesystem.py	Fri Jun 05 23:42:03 2009 +0300
+++ b/degal/filesystem.py	Fri Jun 05 23:59:14 2009 +0300
@@ -205,9 +205,11 @@
             else :
                 raise
     
-    # alias str/unicode
-    __str__ = path
-    __unicode__ = unicodepath
+    def __str__ (self) :
+        return self.path
+
+    def __unicode__ (self) :
+        return self.unicodepath
     
     def __repr__ (self) :
         """
@@ -314,7 +316,8 @@
 
         _, fileext = os.path.splitext(self.name)
 
-        return fileext.rstrip('.')
+        # strip leading .
+        return fileext[1:]
 
     def matchext (self, ext_list) :
         """
@@ -347,14 +350,14 @@
             return codecs.open(self.path, mode, encoding, errors, bufsize)
 
         else :
-            return open(self.path, mode, bufsize)
+            return open(self.path, mode, *(arg for arg in (bufsize, ) if arg is not None))
 
-    def open_write (self, encoding=None, errors=None, bufsize=None) :
+    def open_write (self, *args, **kwargs) :
         """
             Open for write using open('w').
         """
 
-        return self.open('w', encoding, errors, bufsize)
+        return self.open('w', *args, **kwargs)
 
     def copy_from (self, file) :
         """
@@ -393,7 +396,7 @@
             # create it!
             subdir.mkdir()
 
-        return dir
+        return subdir
     
     def test_subdir (self, name, create=False) :
         """
@@ -429,7 +432,7 @@
             Returns a File object representing the name underneath this dir
         """
 
-        return Directory(self, name=name)
+        return File(self, name=name)
 
     def test (self) :
         """
--- a/degal/folder.py	Fri Jun 05 23:42:03 2009 +0300
+++ b/degal/folder.py	Fri Jun 05 23:59:14 2009 +0300
@@ -67,7 +67,7 @@
                 continue
             
             # create new
-            img = image.Image(node, prev)
+            img = image.Image(node)
 
             # link up
             if prev :
--- a/degal/format.py	Fri Jun 05 23:42:03 2009 +0300
+++ b/degal/format.py	Fri Jun 05 23:59:14 2009 +0300
@@ -28,5 +28,5 @@
         Returns a human-readable string describing the given file timestamp
     """
 
-    return datetime.fromtimestamp(ts).strftime("%Y-%m-%d %H:%M:%S")
+    return datetime.datetime.fromtimestamp(ts).strftime("%Y-%m-%d %H:%M:%S")
 
--- a/degal/gallery.py	Fri Jun 05 23:42:03 2009 +0300
+++ b/degal/gallery.py	Fri Jun 05 23:59:14 2009 +0300
@@ -46,3 +46,10 @@
 
         return stylesheet
 
+    @lazy_load
+    def version (self) :
+        """
+            Return version string
+        """
+
+        return "???"
--- a/degal/html.py	Fri Jun 05 23:42:03 2009 +0300
+++ b/degal/html.py	Fri Jun 05 23:59:14 2009 +0300
@@ -27,7 +27,7 @@
             [u'<xx>\\n', u'\\tyy\\n', u'</xx>\\n']
         """
 
-        for line in self.render_raw_lines(indent) :
+        for line in self.render_raw_lines(indent=indent) :
             yield line + newline
 
     def render_unicode (self, **render_opts) :
@@ -69,7 +69,7 @@
             Render output to given file, overwriteing anything already there
         """
 
-        self.render_out(self, file.open_write(encoding), **render_opts)
+        self.render_out(file.open_write(encoding), **render_opts)
 
     # default output
     __str__ = render_str
--- a/degal/image.py	Fri Jun 05 23:42:03 2009 +0300
+++ b/degal/image.py	Fri Jun 05 23:59:14 2009 +0300
@@ -4,7 +4,7 @@
 
 from __future__ import with_statement
 
-import filesystem, render, html
+import filesystem, render, html, format
 from utils import lazy_load
 
 import PIL.Image
@@ -20,7 +20,7 @@
             Initialize as an Image based on the given Node, linked with the given previous node
         """
 
-        super(Image, self).__init__(node)
+        super(Image, self).__init__(*args, **kwargs)
 
         # links
         self.prev = None
@@ -33,77 +33,65 @@
         self.title = self.name
         self.description = None
 
-        # lazy-loading
-        self.img = None
-        self.exif = None
-        self.metadata = None
-        self.stat_data = None
-
-    def load_stat (self) :
+    @lazy_load
+    def stat (self) :
         """
             Load and return the os.stat info for this file
         """
 
-        if not self.stat_data :
-            self.stat_data = self.stat()
-
-        return self.stat_data
-
-    def load_image (self) :
+        return super(Image, self).stat()
+    
+    @lazy_load
+    def image (self) :
         """
             Loads the image as a PIL.Image
         """
         
-        if not self.img :
-            # open it up
-            self.img = PIL.Image.open(self.path)
+        # open it up
+        return PIL.Image.open(self.path)
 
-        return self.img
-
-    def load_exif (self) :
+    @lazy_load
+    def exif (self) :
         """
             Loads the EXIF data for the image and returns as a dict of EXIF tag names -> values.
 
             Returns None if no exif data was found
         """
 
-        if self.exif is None :
-            # load
-            with self.open('rb') as fh :
-                # XXX: details=False?
-                self.exif = EXIF.process_file(fh)
+        # load
+        with self.open('rb') as fh :
+            # XXX: details=False?
+            exif = EXIF.process_file(fh)
             
         # empty dict -> no exif data
-        if self.exif :
-            return self.exif
+        if exif :
+            return exif
 
         else :
             return None
-
-    def load_metadata (self) :
+    
+    @lazy_load
+    def metadata (self) :
         """
             Load and return the metadata for the image as a dictionary
         """
 
-        if not self.metadata :
-            # load stuff
-            stat = self.load_stat()
-            exif = self.load_exif()
+        # load stuff
+        stat = self.stat
+        exif = self.exif
 
-            # XXX: avoid having to open the image?
-            size = self.load_image().size
-            
-            # build
-            self.metadata = dict({
-                "File name":        self.name,
-                "Resolution":       "%dx%d" % size,
-                "File size":        format.filesize(stat.st_size),
-                "Last modified":    format.filetime(stat.st_mtime),
-            }, **dict(
-                (name, exif[tag]) for tag, name in self.config.exif_tags if exif and tag in exif
-            ))
-
-        return self.metadata
+        # XXX: avoid having to open the image?
+        size = self.image.size
+        
+        # build
+        return dict({
+            "File name":        self.name,
+            "Resolution":       "%dx%d" % size,
+            "File size":        format.filesize(stat.st_size),
+            "Last modified":    format.filetime(stat.st_mtime),
+        }, **dict(
+            (name, exif[tag]) for tag, name in self.config.exif_tags if exif and tag in exif
+        ))
     
     @lazy_load
     def thumb (self) :
@@ -117,7 +105,7 @@
 
         # render if needed
         return render_machine.render_lazy(self,
-            self.config.thumb_size, self.parent.load_thumb_dir.subnode(self.name)
+            self.config.thumb_size, self.parent.thumb_dir.subnode(self.name)
         )
     
     @lazy_load
@@ -131,6 +119,6 @@
         render_machine = self.config.get_renderer()
 
         return render_machine.render_lazy(self, 
-            self.config.preview_size, self.parent.load_preview_dir.subnode(self.name)
+            self.config.preview_size, self.parent.preview_dir.subnode(self.name)
         )
 
--- a/degal/render.py	Fri Jun 05 23:42:03 2009 +0300
+++ b/degal/render.py	Fri Jun 05 23:59:14 2009 +0300
@@ -26,7 +26,7 @@
         """
 
         # load the PIL.Image
-        img = image.load_image()
+        img = image.image
 
         # we need to create a copy, as .thumbnail mutates the Image
         img_out = img.copy()
@@ -48,10 +48,10 @@
         out_stat = out.stat(soft=True)
 
         # compare
-        if not out_stat or out_stat.st_mtime < image.load_stat().st_mtime :
+        if not out_stat or out_stat.st_mtime < image.stat.st_mtime :
             # render anew
-            return self.render_out(image, size, file)
+            return self.render_out(image, size, out)
 
         else :
             # already rendered
-            return file
+            return out
--- a/degal/templates.py	Fri Jun 05 23:42:03 2009 +0300
+++ b/degal/templates.py	Fri Jun 05 23:59:14 2009 +0300
@@ -14,12 +14,12 @@
 
     return tags.a(href=to_page.path_from(from_page))
 
-def image_link (from_page, image) :
+def image_link (from_page, image, image_html) :
     """
         Link to the given image
     """
 
-    return link_from(from_page, imgae.html)(
+    return link_from(from_page, image_html)(
         tags.img(src=image.path_from(from_page))
     )
 
@@ -36,13 +36,13 @@
             # image-links
             tags.p(
                 # prev thumb
-                image_link(image.html, image.prev.thumb) if image.prev else None,
+                image_link(image.html, image.prev.thumb, image.prev.html) if image.prev else None,
 
                 # preview
-                image_link(image.html, image.preview),
+                image_link(image.html, image.preview, image),
 
                 # next thumb
-                image_link(image.html, image.next.thumb) if image.next else None
+                image_link(image.html, image.next.thumb, image.next.html) if image.next else None
             ),
 
             # optional description
@@ -122,7 +122,7 @@
 
         # image thumbnails
         ((
-            image_link(folder, image)
+            image_link(folder, image, image.html)
         ) for image in folder.images),
 
         # lower paginate