فهرست منبع

Add nice output

theenglishway (time) 6 سال پیش
والد
کامیت
fca2152b06
4فایلهای تغییر یافته به همراه50 افزوده شده و 7 حذف شده
  1. 11 3
      pyplanner/cli.py
  2. 6 3
      pyplanner/models/__init__.py
  3. 33 0
      pyplanner/output.py
  4. 0 1
      requirements.txt

+ 11 - 3
pyplanner/cli.py

@@ -1,6 +1,8 @@
 import click
 from .database import Database
+from .output import TerminalOutput
 from .models import *
+from .utils import Term
 
 
 @click.group()
@@ -10,6 +12,7 @@ def main(ctx, db_url):
     """Basic CLI project-handling"""
     ctx.ensure_object(dict)
     ctx.obj['db'] = Database(db_url)
+    ctx.obj['output'] = TerminalOutput()
 
 
 @main.command()
@@ -18,6 +21,7 @@ def main(ctx, db_url):
 def dump(ctx, file):
     db = ctx.obj['db']
     db.dump(file)
+    click.echo(Term.success(f"Data dumped to {file}"))
 
 
 @main.command()
@@ -26,6 +30,7 @@ def dump(ctx, file):
 def load(ctx, file):
     db = ctx.obj['db']
     db.load(file)
+    click.echo(Term.success(f"Data loaded from {file}"))
 
 
 @main.group()
@@ -66,9 +71,9 @@ def new(ctx, **data):
     db = ctx.obj['db']
     try:
         instance = db.add(model, data)
-        click.echo(instance)
+        click.echo(Term.success(instance))
     except ValueError as e:
-        click.echo(e.args[0])
+        click.echo(Term.failure(e.args[0]))
 
 
 @click.command('list')
@@ -77,7 +82,10 @@ def list(ctx):
     """List content"""
     model = ctx.obj['model']
     db = ctx.obj['db']
-    click.echo(db.list(model))
+    output = ctx.obj['output']
+
+    for i in db.list(model):
+        click.echo(output.output_data(i))
 
 
 milestone.add_command(new)

+ 6 - 3
pyplanner/models/__init__.py

@@ -19,7 +19,6 @@ class Base:
 
     @classmethod
     def to_yaml(cls, representer, node):
-        print(cls, node)
         return representer.represent_data(
             {k: v for k, v in node.__dict__.items() if not k.startswith('_')}
         )
@@ -28,15 +27,19 @@ class Base:
     def from_yaml(cls, constructor, node):
         return cls()
 
+    @property
+    def short_uuid(self):
+        return self.uuid[:8]
+
 
 from .milestones import Milestone
 from .sprints import Sprint
-from .items import Item
+from .items import Item, Limitation, Constraint, Feature, Unknown
 from .comments import Comment
 
 __all__ = [
     'Milestone',
     'Sprint',
-    'Item',
+    'Item', 'Limitation', 'Constraint', 'Feature', 'Unknown',
     'Comment'
 ]

+ 33 - 0
pyplanner/output.py

@@ -0,0 +1,33 @@
+from jinja2 import Environment
+from .models import *
+from .utils import Term
+
+
+class TerminalOutput:
+    def __init__(self):
+        self.env = Environment()
+        self.templates = {
+            Milestone: """{{ Term.bold('Milestone') }} {{ Term.uuid(obj.short_uuid) }} # {{ obj.name }} 
+    {% for item in obj.sprints %}
+      {{- output(item) }}
+    {% endfor %}""",
+            Sprint: """{{ Term.bold('Sprint') }} {{ Term.uuid(obj.short_uuid) }} # {{ obj.name }} 
+    {%- for item in obj.items %}
+      {{ output(item) }}
+    {%- endfor %}""",
+            Item: """{{ obj.type_term }} {{ Term.uuid(obj.short_uuid) }} # {{ obj.name }} ({{ obj.priority }}, {{ obj.length }})
+    {%- for comment in obj.comments %}
+      {{ comment.as_term }}
+    {%- endfor %}""",
+            Comment: """{{ obj.text }} {{ Term.uuid(obj.short_uuid) }}"""
+        }
+        self.templates.update({
+            subclass: self.templates[Item] for subclass in [Feature, Limitation, Unknown, Constraint]
+        })
+
+    def output_data(self, instance):
+        class_ = type(instance)
+        return self.env.from_string(
+            self.templates[class_],
+            globals={'Term': Term, 'output': self.output_data}
+        ).render(obj=instance)

+ 0 - 1
requirements.txt

@@ -2,6 +2,5 @@ Click
 colorama
 Jinja2
 pydantic
-PyYaml
 SQLAlchemy
 termcolor