Kaynağa Gözat

Extend tags class

Oz N Tiram 9 yıl önce
ebeveyn
işleme
e3904190e9
2 değiştirilmiş dosya ile 40 ekleme ve 30 silme
  1. 30 28
      blogit2.py
  2. 10 2
      test_blogit2.py

+ 30 - 28
blogit2.py

@@ -77,16 +77,38 @@ jinja_env = Environment(loader=FileSystemLoader(CONFIG['templates']))
 
 class Tag(object):
     def __init__(self, name):
-        super(Tag, self).__init__()
         self.name = name
         self.prepare()
         self.permalink = GLOBAL_TEMPLATE_CONTEXT["site_url"]
+        self.table = DB['tags']
 
     def prepare(self):
         _slug = self.name.lower()
         _slug = re.sub(r'[;;,. ]', '-', _slug)
         self.slug = _slug
 
+    @property
+    def posts(self):
+        """
+        return a list of posts tagged with Tag
+        """
+        Tags = Query()
+        tag = self.table.get(Tags.name == self.name)
+        return tag['post_ids']
+
+    @posts.setter
+    def posts(self, post_ids):
+        if not isinstance(post_ids, list):
+            raise ValueError("post_ids must be of type list")
+        Tags = Query()
+        tag = self.table.get(Tags.name == self.name)
+        if tag:
+            new = set(post_ids) - set(tag['post_ids'])
+            tag['post_ids'].extend(list(new))
+            self.table.update({'post_ids': tag['post_ids']}, eids=[tag.eid])
+        else:
+            self.table.insert({'name': self.name, 'post_ids': post_ids})
+
 
 class Entry(object):
     def __init__(self, path):
@@ -176,7 +198,7 @@ class Entry(object):
         tags = list()
         for t in self.header['tags']:
             tags.append(Tag(t))
-        return tags
+        return [Tag(t) for t in self.header['tags']]
 
     def _read_header(self, file):
         header = ['---']
@@ -200,9 +222,7 @@ class Entry(object):
                 except:
                     pass
 
-        body = list()
-        for line in file.readlines():
-            body.append(line)
+        body = file.readlines()
 
         self.body = ''.join(body)
         file.close()
@@ -326,11 +346,11 @@ def render_atom_feed(entries, render_to=None):
 def render_tag_pages(tag_tree):
     """
     tag_tree is a dictionary witht the following structure:
-        {'python': {'tag': <__main__.Tag object at 0x7f0e56200ed0>, 
-                    'entries': [post1.md, post2.md, post3.md]}, 
-         'git': {'tag': <__main__.Tag object at 0x7f0e5623c2d0>, 
-                    'entries': [post1.md, post2.md, post3.md]}, 
-         'bash': {'tag': <__main__.Tag object at 0x7f0e5623c0d0>, 
+        {'python': {'tag': <__main__.Tag object at 0x7f0e56200ed0>,
+                    'entries': [post1.md, post2.md, post3.md]},
+         'git': {'tag': <__main__.Tag object at 0x7f0e5623c2d0>,
+                    'entries': [post1.md, post2.md, post3.md]},
+         'bash': {'tag': <__main__.Tag object at 0x7f0e5623c0d0>,
                     'entries': [post1.md, post2.md, post3.md]}}
     """
     context = GLOBAL_TEMPLATE_CONTEXT.copy()
@@ -365,20 +385,6 @@ def find_new_posts(posts_table):
                     yield post_id, filename
 
 
-
-def get_entry_tags(tags_table, entry_tags, entry_id):
-    Tags = Query()
-    for t.name in entry_tags:
-        tag = tags_table.get(Tags.name == t.name)
-        if tag:
-            tag['post_ids'].append(entry_id)
-            tags_table.update({'post_ids': tag['post_ids']})
-            yield tag
-        else:
-            eid = tags_table.insert({'name': t, 'post_ids': [entry_id]})
-            yield tags_table.get(eid=eid)
-
-
 def new_build():
     """
 
@@ -403,9 +409,6 @@ def new_build():
             entry = Entry(os.path.join(root, post))
             if entry.render():
                 entries.append(entry)
-            for tag in get_entry_tags(DB['tags'], entry.tags, post_id):
-                pass
-
             print "     %s" % entry.path
         except Exception as e:
             print "Found some problem in: ", filename
@@ -423,7 +426,6 @@ def build():
     for root, dirs, files in os.walk(CONFIG['content_root']):
         for filename in files:
             try:
-                import pdb; pdb.set_trace()
                 if filename.endswith(('md', 'markdown')):
                     entry = Entry(os.path.join(root, filename))
                     if entry.render():

+ 10 - 2
test_blogit2.py

@@ -1,8 +1,8 @@
 import os
 import shutil
 from tinydb import Query
-from blogit2 import find_new_posts, DB
-
+from blogit2 import find_new_posts, DB, Entry, Tag
+from blogit2 import CONFIG
 
 post_dummy = """title: Blog post {}
 author: Famous author
@@ -42,4 +42,12 @@ def test_find_new_posts():
     assert len(DB['posts'])  == 4
     assert len(new) == 3
 
+
+def test_tags():
+    t = Tag('foo')
+    t.posts = [1]
+    assert t.posts == [1]
+    t.posts = [1,3,4,5]
+    assert t.posts == [1,3,4,5]
+
 os.unlink('blogit.db')