#! /usr/bin/env python3 #=============================== # # viewer # # 2019/02/07 Kuninori Morimoto #=============================== import yaml import sys import os import re import base #==================================== # # viewer # #==================================== class viewer(base.base): #-------------------- # parse # # -f : with file # -r : with relationships # --oneline: one line #-------------------- def parse(self, arg): for arg in arg: if (arg == "-f"): self.with_file = 1 elif (arg == "-r"): self.with_rel = 1 elif (arg == "--oneline"): self.one_line = 1 elif (os.path.exists(arg) and re.match("{}/projects".format(self.top()), os.path.abspath(arg))): self.files += [arg] #-------------------- # __init__ #-------------------- def __init__(self, arg): self.text = "" self.files = [] self.with_file = 0 self.with_rel = 0 self.one_line = 0 self.parse(arg) self.data = {} self.file = "" #-------------------- # get_item #-------------------- def get_item(self, data): # Ughhhh # All Yaml data is "dictionary", and not simple to getting data !! # ( `⌒´)d I hate you !! return list(data)[0] #-------------------- # get_related_file #-------------------- def get_related_file(self, data): file = self.run("egrep -l \"key:\s+{}\" -r {}/projects".\ format(data, self.top())) if (file): return file else: return data #-------------------- # set_data # get_data #-------------------- def set_data(self, file): F = open(file, "r+") self.data = yaml.safe_load(F) F.close() self.file = file def get_data(self, key): if (key in self.data): data = self.data[key] if (data): return data return [] #-------------------- # make_one # for --oneline #-------------------- def make_one(self, tag, file): if (len(self.text) > 0): self.text += "\n" if (tag): self.text += "{:<22}".format(self.color("tag", tag)) if (not os.path.exists(file)): self.text += self.color("error", "No such task ({})".format(file)) return self.set_data(file) # show "key" self.text += "{}: {}".format( self.color("key", self.get_data("key")), self.get_data("title")) # show relationships relationships = self.get_data("relationships") if ((not tag) and self.with_rel and relationships): for d in relationships: self.make_one(self.get_item(d.keys()), self.get_related_file(self.get_item(d.values()))) #-------------------- # make_full # for normal #-------------------- def make_full(self, tag, file): if (len(self.text) > 0): self.text += "\n" if (tag): self.text += "{:<22}".format(self.color("tag", tag)) if (not os.path.exists(file)): self.text += self.color("error", "No such task ({})".format(file)) return self.set_data(file) # show "key" self.text += "{}, {}, {}\n".format( self.color("key", self.get_data("key")), self.color("status", self.get_data("status")), self.color("team", self.get_data("team"))); # show title self.text += "Title: {}\n".format(self.get_data("title")) # show assignee assignee = self.get_data("assignee") if (len(assignee)): self.text += "Assignee: {}\n".format(assignee) if (self.with_file): self.text += "File: {}\n".format( os.path.abspath(file).replace("{}/".format(self.top()), "")) # show comments comments = self.get_data("comments") if (comments): for comment in comments: self.text += "\n{}".format(comment) # show relationships relationships = self.get_data("relationships") if ((not tag) and self.with_rel and relationships): for d in relationships: self.make_full(self.get_item(d.keys()), self.get_related_file(self.get_item(d.values()))) #-------------------- # show #-------------------- def show(self): for f in self.files: if (self.one_line): self.make_one(None, f) else: self.make_full(None, f) # escape " -> \" # otherwise " will be disappeared self.text = self.text.replace("\"", "\\\""); self.do("echo \"{}\" | {}".format( self.text, self.config("viewer"))) #==================================== # # As command # #==================================== if __name__=='__main__': viewer(sys.argv).show()