Sfoglia il codice sorgente

Add templating for terminal output

theenglishway@shineon 6 anni fa
parent
commit
1e72ffe529

+ 2 - 1
planner/cli.py

@@ -133,12 +133,13 @@ def list(ctx):
     """List"""
     model = ctx.obj['model']
     list = model.list()
-    click.echo('\n'.join([i.__terminal__() for i in list]))
+    click.echo('\n'.join([i.as_term for i in list]))
 
 
 milestone.add_command(list)
 sprint.add_command(list)
 item.add_command(list)
+comment.add_command(list)
 
 
 if __name__ == '__main__':

+ 3 - 0
planner/models/comments.py

@@ -8,6 +8,9 @@ from .items import Item
 @dataclass(repr=False)
 class Comment(SchemaMixin, DbMixin):
     cache_keys = ('item_id', 'date_added')
+    template_term = """
+    {{ obj.uuid }} {{ obj.text }}
+    """
 
     document: dict
     text: str

+ 9 - 4
planner/models/items.py

@@ -11,12 +11,18 @@ from planner import db
 @dataclass(repr=False)
 class Item(SchemaMixin, DbMixin):
     cache_keys = ('name', 'milestone_id', 'sprint_id')
+    template_term = """
+    {{ obj.uuid }} {{ obj.name }}
+    {% for comment in obj.comments %}
+        {{- comment.as_term }}
+    {% endfor %}
+    """
 
     document: dict
     name: str
     description: str
     category: str
-    comments: List['Comment'] = None
+    comments: List['Comment'] = field(default_factory=lambda: [])
     milestone_id: int = None
     milestone: Milestone = field(init=False)
     sprint_id: int = None
@@ -75,7 +81,7 @@ class Item(SchemaMixin, DbMixin):
         return 'item'
 
     @classmethod
-    def get(cls, document):
+    def get_class(cls, document):
         category_to_kls = {
             'feature': Feature,
             'limitation': Limitation,
@@ -83,8 +89,7 @@ class Item(SchemaMixin, DbMixin):
             'unknown': Unknown,
         }
 
-        kls = category_to_kls[document.get('category')]
-        return kls(document=document, **document)
+        return category_to_kls[document.get('category')]
 
     def __repr__(self):
         return "{}(name='{}', milestone='{}')".format(self.__class__.__qualname__, self.name, repr(self.milestone))

+ 7 - 0
planner/models/milestones.py

@@ -1,5 +1,6 @@
 import click
 from typing import List
+from jinja2 import Template
 
 from dataclasses import dataclass, field
 from datetime import datetime
@@ -11,6 +12,12 @@ from .mixins import SchemaMixin, DbMixin
 @dataclass(repr=False)
 class Milestone(SchemaMixin, DbMixin):
     cache_keys = ('name',)
+    template_term = """
+    {{- obj.uuid }} {{ obj.name }}
+    {% for item in obj.items %}
+        {{- item.as_term }}
+    {% endfor %}"""
+
     document: dict
     name: str
     description: str

+ 19 - 7
planner/models/mixins.py

@@ -1,9 +1,16 @@
 import yaml
+from jinja2 import Template
 import uuid
 from planner import db, validator
 
 
 class SchemaMixin:
+    template_term = """{{ obj.uuid }} {{ obj }}"""
+
+    @property
+    def as_term(self):
+        return Template(self.template_term).render(obj=self)
+
     @classmethod
     def class_name(cls):
         return cls.__qualname__.lower()
@@ -32,24 +39,29 @@ class DbMixin:
 
     @classmethod
     def _get_cache_key(cls, document):
-        return tuple([cls] + [document[k] for k in cls.cache_keys])
+        return tuple([cls] + [document[k] if k in document else 'None' for k in cls.cache_keys])
 
     def load_reverse(self):
         ...
 
+    @classmethod
+    def get_class(cls, document):
+        return cls
+
     @classmethod
     def get(cls, document):
-        key = cls._get_cache_key(document)
-        if key in cls.cache:
-            instance = cls.cache[key]
+        kls = cls.get_class(document)
+        key = kls._get_cache_key(document)
+        if key in kls.cache:
+            instance = kls.cache[key]
         else:
-            instance = cls(document=document, **document)
+            instance = kls(document=document, **document)
             # The cache is updated a first time so that instances looking up
             # for this instance during the load_reverse can find it
-            cls.cache[key] = instance
+            kls.cache[key] = instance
             instance.load_reverse()
             # The cache value is updated with its final value
-            cls.cache[key] = instance
+            kls.cache[key] = instance
         return instance
 
     @classmethod