From 8489f6cd6d28138c77c322e18e76da9a24d19239 Mon Sep 17 00:00:00 2001 From: randogoth Date: Wed, 7 Jun 2023 16:04:25 +0300 Subject: [PATCH] fixed universal search --- orvani/__pycache__/orvani.cpython-310.pyc | Bin 10283 -> 10725 bytes orvani/cmd.py | 37 ++++--- orvani/orvani.py | 125 ++++++++++++---------- 3 files changed, 92 insertions(+), 70 deletions(-) diff --git a/orvani/__pycache__/orvani.cpython-310.pyc b/orvani/__pycache__/orvani.cpython-310.pyc index 3ffcf8abed57798bb9011f0001d8b9c6a9149559..59ee027a6dde80692e4fe088590e2d8ea1a84058 100644 GIT binary patch delta 1955 zcmZ1-@HALEpO=@5fq{X+wV@&9kSPPhV-N=!vobI+I503U6#Gon)>lelO<_x6Phm{q zn8Omq?#__HnZnh=kiyl>6vdIk7|fu_Juy$q?H8l=FGh!7jLMoUw>S!l^0QKtONwuC zB>6qXd$7SykDV!|~QNk%)sqAS?DcmVMEi6$YDZHryDSTjE z{3!x0EK#CJB7!MGEi6%DDHdQckyP2K)DOxS8QL-u8sRC(CDLN^-Ei6%TDYhwksRAkb=3o~Yq!_laM#-lb zr5Lv`L@A`0q?ooaL@B12rI@!cL@A{x1~X{d-Qx5wDof1E3`tDC#W2~INnI|4fq|if zA&YSVQw`%n#u|or<{G9NhIp15<{E~0*2z6gii~2D*D?KL}F!j*zCX~ z&%{{2If3sDBjc3Kz5?0IjLSFg6kfu}$UQku^a$he$;x8BjDDL7#6p-DxhEf$sAhb; z*->&9Bjex6ccgYOe%m}%I**BwZ8M9U6ceNDWO;?SdR_(w1`Y-W24;{ete6-WIvBDT z(iu`1=P=c>)G($nNis}eEaK^4SilJKV=XI)mBO6PxR9}yt(_r_5u8#uIvBE;To{@e z7cehmsAUK77O*U2aAAnuQp=IfP{UTkVFNa~hC>o0I;)nmhN;N9hN-@WBb%w%y3nYG zqlUGNp{TQjwT2a>sF|^ZEt{#R6T)+0h_$Wds$nk5so|>O%w{Ue200U?u7*<*Y`i2x z8Dmj4$Rbt-Nw`%YS#t(v1{;P#Z;;M1hN2D>o%L)WL&_M7I`C>`2RrUe4Rg`D8rB+i zNd~YZ)}j~%GifazlZ;@x%NUBzfOOY`tOvOgqzUYYGawcYKY&7st&E}Qb_rVvJ4l@* zLo;JDBZy_gP^ezQQN!5Gn8KFLQuMWi6QrhtVF6bS+d@W=sucDVjuwU#&R(V(mJ}`< zh8mV&hV(#&TJ9RQ1>E4cVyoq;;jZB^XQ<^a{0-7x!wu4iP+r0ba&ro|Bm*dRQ+O~9 z)a0GarL?;~nGsabKrs^o0|N^K1A{OqiODfAFk~>)FvN1#GJ*`NVU%P@VaR4GVya=B z#8k)>%&?NtPm{3-q*#-wC=--r7&BKg7Kt-3Fce9G2q};lr%iEcNpgN}ft@oW14A*$ z4mpM@RY(qtmej8JlRXlgHd_%WHnW`nIPr!Cht>o z<+{b;?C%%i8W9panOWUVega4)1w@pAh*S_U2Sm&V5sN1$s7rW(szpIiqA&v&LM%)y zj3CIy$Ofia7^Rr_ggAuwc!Z>d#6?79gas62WcY+71o*^7#5v44Sa?{9KxSxiPClhB wC$Jo3@(K{K5=3xKPEZ%0%%#CEBLOy^gOP)ghmnPag^`Jgi4g?Z{s^%H07sazzyJUM delta 1538 zcmaDFygEQTpO=@5fq{WxO>{$wrvU@QV-N=!GczzSI503U6x&VI))#SSNMTK3Yhg%X zYi5dKPhkvZ&}5%jqc!oO6l2W9H~RG{OexGMEFd*=SfY4Rc~kjPdD56u*i-paI8yo3 zSW-AsxLR1F1VAEbOex$cJS{9yf+@Tyd@T%7LMi;I>}gCX0x5zmEK$NKLaF>I!eCt@ zDWWYbQ6fkpVkzP+EK#B*;M`%xm5lX`BbqKkR(Tn zLW*JwYm`Ka9n@;&6qOd%D9IFi5I;pNRV;-gRV+n4l|PLmMI%MCg*8elMGNd4?G&9B zmMG~I2V|9LY$>`adM&I`GAa70{Ao-n1}TOuEV)s#DUK;dsr)I%U>BLBn6|J+$)%X3 zn71%Q$){MPShg@kDWq7XShp}lDWnOU%m*Nld@R@Qcym7o+wsMrA)u zmRlUj`FSO&6(z;DI0}mLvr>~wif^%$B&HYNV#&)dNu37DsLwP?Yj9Ffj0O zZmwXt%*d#_*@w-EkX8UbIq>MX{mvrx5!rKFw}q(qXTnX#D>#Ij*1lq+GYVQgkh zVa;YKnpwhL!cqeAHAfBGLPn6P6t)!h7KRj#UZxtB6iyq48kS&&bcR~48ny+T;4omT z<*wnX;WlTeh>(O6QXp140|P@OBLhQG2Ll6xCRdRtNYDmE2!jZH z1_p-7cB&?fJd=x66mClA`_746cB;xlUrQ5sU?Z! zMVTe3MF}7eO`q(h9>)RJ&r&pb@)~tF#+1pQ)jb%MCfjJJvP}jVF=KMNhU?^Q8g?mN zAZ`kXC<76xAYvMbmg%JeV7}>xy6B8372(tZ= zV&@Z_9H1#_s>Q*=!%_s&r^!*o4>DICL 0: table = Table(title=f"Results for `{query}`") + ctx = list(CONTEXTS.keys()) table.add_column("Path", justify="right", style="white", no_wrap=True) - table.add_column("Note", style="#cccccc") - table.add_column("Projects", justify="center", style="cyan") - table.add_column("Contexts", justify="center", style="magenta") - table.add_column("Tags", justify="center", style="green") - note = tags = projects = contexts = tags = '' + styles = ["cyan", "yellow", "magenta", "green"] + for i, c in enumerate(ctx): + table.add_column(ctx[i].title(), style=styles[i]) for file in index['found']: - path = file fc = index['index']['files'][file] - if 'note' in fc: - note = fc['note'] - else: - note = '' - tags = ' '.join(['#' + tag for tag in fc['tags']]) - projects = ' '.join(['+' + p for p in fc['projects']]) - contexts = ' '.join(['@' + c for c in fc['contexts']]) - table.add_row(path, note, projects, contexts, tags) + elements = [] + elements.append(file) + for c in ctx: + if not c in fc: + fc[c] = None + if fc[c]: + if CONTEXTS[c]: + prefix = CONTEXTS[c] + else: + prefix = '' + if not type(fc[c]) == str: + elements.append(' '.join([prefix + tag for tag in fc[c]])) + else: + elements.append(fc[c]) + else: + elements.append(None) + table.add_row(*elements) console.print(table) else: console.print(f"No results found for `{query}`", style="red") diff --git a/orvani/orvani.py b/orvani/orvani.py index 1356224..e3411b0 100644 --- a/orvani/orvani.py +++ b/orvani/orvani.py @@ -7,6 +7,12 @@ from pathlib import Path CONTEXT_FILE = '.context.yaml' CACHE_FILE = '.index.yaml' +CONTEXTS = { + 'projects' : '+', + 'contexts' : '@', + 'tags' : '#', + 'note' : None +} class OrvaniTag: @@ -18,14 +24,9 @@ class OrvaniTag: CONFIG = dict() FILENAME = '' # folder context data filename ('.context.yaml') FILE = '' # holds the folder context file path - CTX = { # default contexts - 'contexts' : '@', - 'projects' : '+', - 'tags' : '#', - 'note' : None - } + CTX = {} - def __init__(self, path: str=CONTEXT_FILE, cache: str=CACHE_FILE, contexts=CTX): + def __init__(self, path: str=CONTEXT_FILE, cache: str=CACHE_FILE, contexts=CONTEXTS): """ Initialization @@ -36,9 +37,10 @@ class OrvaniTag: """ self.FILENAME = os.path.basename(path) self.CACHEFILE = cache + self.CTX = contexts self.INDEX = self.CTX.copy() - for ctx in self.INDEX: - self.INDEX[ctx] = {} + for context_key in self.INDEX: + self.INDEX[context_key] = {} self.INDEX['files'] = {} self.__cd('') @@ -80,23 +82,23 @@ class OrvaniTag: """ context = dict() - for ctx in self.CTX.keys(): - if self.CTX[ctx] != None: - context.update( { ctx : []}) + for context_key in self.CTX.keys(): + if self.CTX[context_key] != None: + context.update( { context_key : []}) for arg in argv: - for ctx in self.CTX.keys(): + for context_key in self.CTX.keys(): if str(arg)[0] in self.CTX.values(): # Schema with prefix - if not self.CTX[ctx] == None: - if str(arg).startswith(self.CTX[ctx]): - context[ctx].append(str(arg)[1:]) + if not self.CTX[context_key] == None: + if str(arg).startswith(self.CTX[context_key]): + context[context_key].append(str(arg)[1:]) else: # Otherwise it's a note - if self.CTX[ctx] == None: + if self.CTX[context_key] == None: if arg != ' ': - context.update( { ctx : str(arg)}) + context.update( { context_key : str(arg)}) else: - context.update( { ctx : None}) + context.update( { context_key : None}) return context def add(self, file: str, *argv: str): @@ -112,12 +114,12 @@ class OrvaniTag: self.__cd(target.parent.name) context = self.__context(argv) if target.name in self.DB: - for ctx in self.CTX.keys(): - if self.CTX[ctx] != None: - self.DB[target.name][ctx] = list(set( self.DB[target.name][ctx] + context[ctx])) + for context_key in self.CTX.keys(): + if self.CTX[context_key] != None: + self.DB[target.name][context_key] = list(set( self.DB[target.name][context_key] + context[context_key])) else: - if ctx in context: - self.DB[target.name][ctx] = context[ctx] + if context_key in context: + self.DB[target.name][context_key] = context[context_key] else: self.DB.update( { target.name : context } ) self.__save() @@ -135,12 +137,12 @@ class OrvaniTag: self.__cd(target.parent.name) context = self.__context(argv) if file in self.DB: - for ctx in self.CTX.keys(): + for context_key in self.CTX.keys(): # Only works for context list items - if self.CTX[ctx] != None: - for item in context[ctx]: - if item in self.DB[file][ctx]: - self.DB[file][ctx].remove(item) + if self.CTX[context_key] != None: + for item in context[context_key]: + if item in self.DB[file][context_key]: + self.DB[file][context_key].remove(item) self.__save() def delete(self, file: str, fop:bool=False): @@ -294,14 +296,14 @@ class OrvaniTag: for file in self.DB.keys(): path = os.path.join(sub, file) self.INDEX['files'].update( { path : self.DB[file]} ) - for ctx in self.CTX.keys(): - if ctx in self.DB[file]: - for item in self.DB[file][ctx]: + for context_key in self.CTX.keys(): + if context_key in self.DB[file]: + for item in self.DB[file][context_key]: filelist = [path] - if ctx in self.INDEX: - if item in self.INDEX[ctx]: - filelist += self.INDEX[ctx][item] - self.INDEX[ctx][item] = filelist + if context_key in self.INDEX: + if item in self.INDEX[context_key]: + filelist += self.INDEX[context_key][item] + self.INDEX[context_key][item] = filelist def __search(self, search, filter: str=None, exact:bool=False): """ @@ -317,30 +319,43 @@ class OrvaniTag: } if search[0]: query = self.__context(search) - ret = self.__context([' ']) - ret['note'] = [] - for ctx in self.CTX.keys(): - for context in self.INDEX[ctx]: - if filter and not filter == ctx: + return_dict = self.__context([' ']) + universal = {i for i in self.CTX if self.CTX[i]==None}.pop() + for context_key in self.CTX.keys(): + return_dict[context_key] = [] + for context in self.INDEX[context_key]: + if filter and not filter == context_key: continue - if ctx in query: - for q in query[ctx]: - if exact: - if q == context: - if self.INDEX[ctx][context] not in ret[ctx]: - ret[ctx] += self.INDEX[ctx][context] - else: - if q in context: - if self.INDEX[ctx][context] not in ret[ctx]: - ret[ctx] += self.INDEX[ctx][context] - ret[ctx] = list(set(ret[ctx])) + if context_key in query: + # Is it a list of context items? + if type(query[context_key]) == list: + for q in query[context_key]: + if exact: + if q == context: + if self.INDEX[context_key][context] not in return_dict[context_key]: + return_dict[context_key] += self.INDEX[context_key][context] + else: + if q in context: + if self.INDEX[context_key][context] not in return_dict[context_key]: + return_dict[context_key] += self.INDEX[context_key][context] + if universal in query: + if exact: + if query[universal] == context: + if self.INDEX[context_key][context] not in return_dict[context_key]: + return_dict[context_key] += self.INDEX[context_key][context] + else: + if query[universal] in context: + if self.INDEX[context_key][context] not in return_dict[context_key]: + return_dict[context_key] += self.INDEX[context_key][context] + if context_key in return_dict: + return_dict[context_key] = list(set(return_dict[context_key])) if len(search) > 1: - result['found'] = sorted(list(set(self.__intersect(ret))), key=lambda x: x.count('/')) + result['found'] = sorted(list(set(self.__intersect(return_dict))), key=lambda x: x.count('/')) else: min = [] - for sublist in ret.values(): + for sublist in return_dict.values(): min += sublist - result['found'] = min + result['found'] = list(set(min)) else: result['found'] = sorted(self.INDEX['files'].keys(), key=lambda x: x.count('/')) return result