diff --git a/.pit/pit-956ed1a521100b3b b/.pit/pit-956ed1a521100b3b index b4faf58..4dac007 100644 --- a/.pit/pit-956ed1a521100b3b +++ b/.pit/pit-956ed1a521100b3b @@ -1,7 +1,7 @@ [header] title = citekey support id = 956ed1a521100b3b0bb0638f61b3b5a03204ffa6 -status = open +status = closed type = feature author = Fabien Benureau mail = fabien.benureau+git@gmail.com @@ -9,6 +9,7 @@ date = 2012-10-05 at 15:00 UCT [eventlog] opened[0] = opened the 2012-10-05 at 15:00 UCT by Fabien Benureau +closed[1] = closed the 2012-10-11 at 17:57(UCT) by Fabien Benureau [discussion] desc = # enter your description here diff --git a/.pit/pit-ac8c05c020d251c6 b/.pit/pit-ac8c05c020d251c6 index 14a1e05..e753aba 100644 --- a/.pit/pit-ac8c05c020d251c6 +++ b/.pit/pit-ac8c05c020d251c6 @@ -1,7 +1,7 @@ [header] title = remove configparser for internal mapping id = ac8c05c020d251c6fa9ac5fc239038837b636b3b -status = open +status = closed type = bug author = Fabien Benureau mail = fabien.benureau+git@gmail.com @@ -9,6 +9,7 @@ date = 2012-10-11 at 07:25 UCT [eventlog] opened[0] = opened the 2012-10-11 at 07:25 UCT by Fabien Benureau +closed[1] = closed the 2012-10-11 at 17:57(UCT) by Fabien Benureau [discussion] desc = # enter your description here diff --git a/papers/commands/init_cmd.py b/papers/commands/init_cmd.py index f38bc5e..66fd3f9 100644 --- a/papers/commands/init_cmd.py +++ b/papers/commands/init_cmd.py @@ -26,12 +26,11 @@ def command(config): os.makedirs(papersdir+os.sep+'bibdata') os.makedirs(papersdir+os.sep+'meta') - papers = configparser.ConfigParser() - papers.add_section('header') - papers.set('header', 'count', 0) - papers.add_section('citekeys') - papers.add_section('numbers') - files.write_papers(papers) + papers = {} + papers['count'] = 0 + papers['citekeys'] = {} + papers['numbers'] = {} + files.save_papers(papers) else: print('{}error {} : papers already present in {}{}{}'.format( diff --git a/papers/commands/list_cmd.py b/papers/commands/list_cmd.py index fc19cc3..9e49bd5 100644 --- a/papers/commands/list_cmd.py +++ b/papers/commands/list_cmd.py @@ -13,10 +13,10 @@ def command(config): rp = repo.Repository() articles = [] - for n in rp.numbers: + for n in sorted(rp.numbers.keys()): paper = rp.paper_from_number(n, fatal = True) - bibdesc = pretty.bib_oneliner(paper.bibdata) - articles.append('{:3d} {}{}{}{} {}'.format(int(paper.number), color.purple, citekey, color.end, (8-len(paper.citekey))*' ', bibdesc)) + bibdesc = pretty.bib_oneliner(paper.bib_data) + articles.append('{:3d} {}{}{}{} {}'.format(int(paper.number), color.purple, paper.citekey, color.end, (8-len(paper.citekey))*' ', bibdesc)) with tempfile.NamedTemporaryFile(suffix=".tmp", delete=True) as tmpf: tmpf.write('\n'.join(articles)) diff --git a/papers/commands/open_cmd.py b/papers/commands/open_cmd.py index 9780751..8788a25 100644 --- a/papers/commands/open_cmd.py +++ b/papers/commands/open_cmd.py @@ -11,7 +11,7 @@ def parser(subparsers, config): def command(config, citekey): rp = repo.Repository() paper = rp.paper_from_any(citekey, fatal = True) - filepath = paper.metadata.get('metadata', 'path') + filepath = paper.metadata['path'] p = subprocess.Popen(['open', filepath]) print('{}{}{} opened.{}'.format(color.filepath, filepath, color.normal, color.end)) \ No newline at end of file diff --git a/papers/files.py b/papers/files.py index 7673e39..ee98ca7 100644 --- a/papers/files.py +++ b/papers/files.py @@ -8,6 +8,8 @@ try: except ImportError: import configparser +import yaml + import color try: @@ -66,29 +68,46 @@ def check_file(filepath): print '{}error{}: {}{}{} is not a file{}'.format( color.red, color.grey, color.cyan, filepath, color.grey, color.end) exit(-1) + +# yaml I/O -def write_configfile(config, filepath): +def write_yamlfile(filepath, datamap): try: with open(filepath, 'w') as f: - config.write(f) + yaml.dump(datamap, f) except IOError as e: - print '{}error{} : impossible to write on file {}{:s}{}'.format( + print '{}error{} : impossible to read file {}{:s}{}'.format( color.red, color.grey, color.cyan, filepath, color.end) - print 'Verify permissions' exit(-1) -def read_configfile(filepath): +def read_yamlfile(filepath): + check_file(filepath) try: with open(filepath, 'r') as f: - config = configparser.ConfigParser() - config.readfp(f) - return config + return yaml.load(f) except IOError as e: print '{}error{} : impossible to read file {}{:s}{}'.format( - color.red, color.grey, color.cyan, filepath, color.end) - print 'Verify permissions' + color.red, color.grey, color.cyan, paperdir, color.end) exit(-1) +def save_papers(datamap): + paperyaml = find_papersdir() + os.sep + 'papers.yaml' + write_yamlfile(paperyaml, datamap) + +def load_papers(): + paperyaml = find_papersdir() + os.sep + 'papers.yaml' + return read_yamlfile(paperyaml) + +def save_meta(meta_data, filename): + filepath = find_papersdir() + os.sep + 'meta' + os.sep + filename + '.meta' + write_yamlfile(filepath, meta_data) + +def load_meta(filename): + filepath = find_papersdir() + os.sep + 'meta' + os.sep + filename + '.meta' + return read_yamlfile(filepath) + +# specific to bibliography data + def load_externalbibfile(fullbibpath): check_file(fullbibpath) @@ -109,31 +128,17 @@ def load_externalbibfile(fullbibpath): return bib_data - -def write_papers(config): - write_configfile(config, find_papersdir() + os.sep + 'papers') - -def load_papers(): - return read_configfile(find_papersdir() + os.sep + 'papers') - def load_bibdata(filename): fullbibpath = find_papersdir() + os.sep + 'bibdata' + os.sep + filename + '.bibyaml' return load_externalbibfile(fullbibpath) -def write_bibdata(bib_data, filename): +def save_bibdata(bib_data, filename): filepath = find_papersdir() + os.sep + 'bibdata' + os.sep + filename + '.bibyaml' with open(filepath, 'w') as f: parser = pybtex.database.output.bibyaml.Writer() parser.write_stream(bib_data, f) -def write_meta(meta_data, filename): - filepath = find_papersdir() + os.sep + 'meta' + os.sep + filename + '.meta' - write_configfile(meta_data, filepath) - -def load_meta(filename): - filepath = find_papersdir() + os.sep + 'meta' + os.sep + filename + '.meta' - return read_configfile(filepath) - +# vim input try: EDITOR = os.environ['EDITOR'] diff --git a/papers/paper.py b/papers/paper.py index 19ad81f..2ad9073 100644 --- a/papers/paper.py +++ b/papers/paper.py @@ -1,8 +1,4 @@ import os -try: - import ConfigParser as configparser -except ImportError: - import configparser import files import color @@ -15,8 +11,8 @@ class Paper(object): @classmethod def from_disc(cls, name, citekey = None, number = None): - bib_data = files.load_bibdata(self.name) - metadata = files.load_meta(self.name) + bib_data = files.load_bibdata(name) + metadata = files.load_meta(name) p = Paper(name, bib_data = bib_data, metadata = metadata, citekey = citekey, number = number) return p @@ -24,7 +20,7 @@ class Paper(object): @classmethod def from_bibpdffiles(cls, pdfpath, bibpath): bib_data = cls.import_bibdata(bibpath) - name, meta = cls.import_meta(pdfpath, bib_data) + name, meta = cls.create_meta(pdfpath, bib_data) p = Paper(name, bib_data = bib_data, metadata = meta) return p @@ -38,14 +34,13 @@ class Paper(object): self.number = number def save_to_disc(self): - files.write_bibdata(self.bib_data, self.name) - files.write_meta(self.metadata, self.name) + files.save_bibdata(self.bib_data, self.name) + files.save_meta(self.metadata, self.name) @classmethod def import_bibdata(cls, bibfile): """Import bibligraphic data from a .bibyaml, .bib or .bibtex file""" fullbibpath = os.path.abspath(bibfile) - files.check_file(fullbibpath) bib_data = files.load_externalbibfile(fullbibpath) print('{}bibliographic data present in {}{}{}'.format( @@ -55,20 +50,19 @@ class Paper(object): return bib_data @classmethod - def import_meta(cls, pdfpath, bib_data): + def create_meta(cls, pdfpath, bib_data): fullpdfpath = os.path.abspath(pdfpath) files.check_file(fullpdfpath) name, ext = files.name_from_path(pdfpath) - meta = configparser.ConfigParser() - meta.add_section('metadata') + meta = {} - meta.set('metadata', 'name', name) - meta.set('metadata', 'extension', ext) - meta.set('metadata', 'path', os.path.normpath(fullpdfpath)) + meta['name'] = name + meta['extension'] = ext + meta['path'] = fullpdfpath - meta.add_section('notes') + meta['notes'] = [] return name, meta diff --git a/papers/repo.py b/papers/repo.py index 405691b..9fdb980 100644 --- a/papers/repo.py +++ b/papers/repo.py @@ -1,8 +1,3 @@ -try: - import ConfigParser as configparser -except ImportError: - import configparser - import files import color from paper import Paper @@ -15,16 +10,18 @@ class Repository(object): def __init__(self): self.paperdir = files.find_papersdir() self.papers_config = files.load_papers() - self.citekeys = dict((ck, name) for ck, name in self.papers_config.items('citekeys')) - self.numbers = sorted(n[2:] for n in self.papers_config.options('numbers')) + self.citekeys = self.papers_config['citekeys'] + self.numbers = self.papers_config['numbers'] # loading existing papers def paper_from_number(self, number, fatal = True): try: - citekey = self.papers_config.get('numbers', 'ck'+number) - return self.paper_from_citekey(citekey) - except configparser.NoOptionError: + citekey = self.numbers[int(number)] + paper = self.paper_from_citekey(citekey) + paper.number = int(number) + return paper + except KeyError: if fatal: print('{}error{}: no paper with number {}{}{}'.format( color.error, color.normal, color.citekey, citekey, color.end)) @@ -34,11 +31,9 @@ class Repository(object): def paper_from_citekey(self, citekey, fatal = True): """Load a paper by its citekey from disk, if necessary.""" try: - paper = self.citekeys[citekey] - if paper is None: - name = self.papers_config.get('citekeys', citekey) - paper = Paper.from_disc(name, citekey = citekey) - self.citekeys[citekey] = paper + name = self.citekeys[citekey] + paper = Paper.from_disc(name, citekey = citekey) + paper.citekey = citekey return paper except KeyError: if fatal: @@ -70,15 +65,14 @@ class Repository(object): p.citekey = self.create_citekey(p.bib_data) p.number = self.create_number() - self.papers_config.set('citekeys', p.citekey, p.name) - self.papers_config.set('numbers', 'ck' + str(p.number), p.citekey) + self.papers_config['citekeys'][p.citekey] = p.name + self.papers_config['numbers'][p.number] = p.citekey self.citekeys[p.citekey] = p.name - self.numbers.append(str(p.number)) - self.numbers.sort() + self.numbers[p.number] = p.citekey # writing all to disk - files.write_papers(self.papers_config) + files.save_papers(self.papers_config) p.save_to_disc() return p @@ -101,6 +95,6 @@ class Repository(object): return citekey def create_number(self): - count = self.papers_config.getint('header', 'count') - self.papers_config.set('header', 'count', count + 1) + count = int(self.papers_config['count']) + self.papers_config['count'] = count + 1 return count \ No newline at end of file