From 49f4fb41ee377dc41d31d71077f61ea66115dff5 Mon Sep 17 00:00:00 2001 From: Phyks Date: Fri, 25 Apr 2014 15:36:54 +0200 Subject: [PATCH] Deletion working --- README.md | 10 +++++++ main.py | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 83 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 498a709..2dd5ba5 100644 --- a/README.md +++ b/README.md @@ -81,3 +81,13 @@ A list of ideas and TODO. Don't hesitate to give feedback on the ones you really * Options to ignore auto check, manual check etc. * anti-duplicates * Split main.py + +## Roadmap + +* Working with local files + [x] Import + [x] Deletion + [ ] Update ? +* Get distant files + * cf paperbot +* Search engine / list diff --git a/main.py b/main.py index 7d2891c..0a63bac 100755 --- a/main.py +++ b/main.py @@ -19,11 +19,12 @@ except: from StringIO import StringIO from bibtexparser.bparser import BibTexParser from bibtexparser.customization import homogeneize_latex_encoding +from termios import tcflush, TCIOFLUSH import params def rawInput(string): - sys.stdout.flush() + tcflush(sys.stdin, TCIOFLUSH) return raw_input(string) @@ -35,6 +36,9 @@ def warning(*objs): def parsed2Bibtex(parsed): + """ + Convert a single bibtex entry dict to bibtex string + """ bibtex = '@'+parsed['type']+'{'+parsed['id']+"\n" for field in [i for i in sorted(parsed) if i not in ['type', 'id']]: @@ -46,11 +50,22 @@ def parsed2Bibtex(parsed): def bibtexAppend(data): """ Append data to the main bibtex file - data is a dict as the one from bibtexparser output + data is a dict for one entry in bibtex, as the one from bibtexparser output """ with open(params.folder+'index.bib', 'a') as fh: fh.write(parsed2Bibtex(data)+"\n") +def bibtexRewrite(data): + """ + Rewrite the bibtex index file. + data is a dict of bibtex entry dict. + """ + bibtex = '' + for entry in data.keys(): + bibtex += parsed2Bibtex(data[entry])+"\n" + with open(params.folder+'index.bib', 'w') as fh: + fh.write(bibtex) + def replaceAll(text, dic): for i, j in dic.iteritems(): @@ -267,7 +282,6 @@ def addFile(src, filetype): for i in authors])) new_name = params.folder+_slugify(new_name)+getExtension(src) - bibtex['file'] = new_name while os.path.exists(new_name): warning("file "+new_name+" already exists.") @@ -278,18 +292,59 @@ def addFile(src, filetype): new_name = default_rename else: new_name = rename - + bibtex['file'] = new_name try: shutil.copy2(src, new_name) except IOError: sys.exit("Unable to move file to library dir " + params.folder+".") - # TODO bibtexAppend(bibtex) print("File " + src + " successfully imported.") +def delete_id(ident): + """ + Delete a file based on its id in the bibtex file + """ + with open(params.folder+'index.bib', 'r') as fh: + bibtex = BibTexParser(fh).get_entry_dict() + + if ident not in bibtex.keys(): + return False + + try: + os.remove(bibtex[ident]['file']) + except: + warning("Unable to delete file associated to id "+ident+" : " + + bibtex[ident]['file']) + del(bibtex[ident]) + bibtexRewrite(bibtex) + return True + + +def delete_file(filename): + """ + Delete a file based on its filename + """ + with open(params.folder+'index.bib', 'r') as fh: + bibtex = BibTexParser(fh).get_entry_dict() + + found = False + for key in bibtex.keys(): + if bibtex[key]['file'] == filename: + found = True + try: + os.remove(bibtex[key]['file']) + except: + warning("Unable to delete file associated to id "+key+" : " + + bibtex[key]['file']) + del(bibtex[key]) + if found: + bibtexRewrite(bibtex) + return found + + if __name__ == '__main__': try: if len(sys.argv) < 2: @@ -310,12 +365,24 @@ if __name__ == '__main__': sys.exit() elif sys.argv[1] == 'delete': - raise Exception('TODO') + if len(sys.argv) < 3: + sys.exit("Usage : " + sys.argv[0] + " delete FILE|ID") + + if not delete_id(sys.argv[2]): + if not delete_file(sys.argv[2]): + warning("Unable to delete "+sys.argv[2]) + sys.exit(1) + + print(sys.argv[2]+" successfully deleted.") + sys.exit() elif sys.argv[1] == 'list': raise Exception('TODO') elif sys.argv[1] == 'search': raise Exception('TODO') + + elif sys.argv[1] == 'rebuild': + raise Exception('TODO') except KeyboardInterrupt: sys.exit()