OSDN Git Service

Re implement idxfile.py.
[fukui-no-namari/fukui-no-namari.git] / src / FukuiNoNamari / idxfile.py
index b89ce87..be2a4cf 100644 (file)
@@ -18,6 +18,7 @@
 import os
 import os.path
 import traceback
+import itertools
 
 import misc
 
@@ -42,25 +43,24 @@ def load_idx(bbs_type):
     idxfile_path = misc.get_thread_idx_path(bbs_type)
     datadic = default_dict.copy()
 
-    try:
-        for line in file(idxfile_path):
-            key_equal_value = line.rstrip()
+    def adjust_type(name, value):
+        if name in int_data:
             try:
-                index = key_equal_value.index("=")
-            except ValueError:
-                pass
-            else:
-                key = key_equal_value[:index]
-                if key in metadata_namelist:
-                    value = key_equal_value[index+1:]
-                    if key in int_data:
-                        try:
-                            value = int(value)
-                        except:
-                            value = 0
-                    datadic[key] = value
+                value = int(value)
+            except:
+                value = 0
+        return name, value
+
+    try:
+        iterable = itertools.imap(lambda l: l.rstrip(), file(idxfile_path))
+        iterable = itertools.imap(misc.split_key_and_value, iterable)
+        iterable = itertools.ifilter(None, iterable)
+        iterable = misc.unpack_ifilter(
+            lambda name, value: name in metadata_namelist, iterable)
+        iterable = itertools.starmap(adjust_type, iterable)
+        for name, value in iterable: datadic[name] = value
     except IOError:
-        traceback.print_exc()
+        pass
 
     return datadic
 
@@ -72,23 +72,28 @@ def save_idx(bbs_type, datadic):
     no need to save empty or non-existing metadata
     """
 
-    # create a directory where idx file should belong if does not exist
-    idxfile_path = misc.get_thread_idx_path(bbs_type)
-    basedir = os.path.dirname(idxfile_path)
-    if not os.path.isdir(basedir):
-        os.makedirs(basedir)
-
-    f = file(idxfile_path, "w")
-    for name, value in datadic.iteritems():
-        
-        # save metadata only if its name exists in metadata_namelist
-        if name not in metadata_namelist:
-            continue
-
-        # no need to save an empty or invalid field
+    def validate(name, value):
         if name in int_data and value > 0:
-            f.write(name + "=" + str(value) + "\n")
+            return True
         elif name not in int_data and value:
-            f.write(name + "=" + value + "\n")
+            return True
+        return False
+
+    iterable = datadic.iteritems()
 
-    f.close()
+    # save metadata only if its name exists in metadata_namelist
+    iterable = misc.unpack_ifilter(
+        lambda name, value: name in metadata_namelist, iterable)
+
+    # no need to save an empty or invalid field
+    iterable = misc.unpack_ifilter(validate, iterable)
+
+    # format
+    iterable = itertools.starmap(lambda n,v: "%s=%s\n" % (n, str(v)), iterable)
+
+    # write
+    idx_file = misc.FileWrap(misc.get_thread_idx_path(bbs_type), "w")
+    try:
+        idx_file.writelines(iterable)
+    except IOError:
+        traceback.print_exc()