diff --git a/pubs/commands/list_cmd.py b/pubs/commands/list_cmd.py index b615e54..a382544 100644 --- a/pubs/commands/list_cmd.py +++ b/pubs/commands/list_cmd.py @@ -54,7 +54,7 @@ def command(conf, args): papers = sorted(papers, key=date_added) if len(papers) > 0: ui.message('\n'.join( - pretty.paper_oneliner(p, citekey_only=args.citekeys) + pretty.paper_oneliner(p, citekey_only=args.citekeys, n_authors=conf['main']['n_authors']) for p in papers)) rp.close() diff --git a/pubs/config/spec.py b/pubs/config/spec.py index 4c50f4c..a31d1b4 100644 --- a/pubs/config/spec.py +++ b/pubs/config/spec.py @@ -27,6 +27,9 @@ edit_cmd = string(default='') # Which default extension to use when creating a note file. note_extension = string(default='txt') +# How many authors to display in +n_authors = integer(default=3) + # If true debug mode is on which means exceptions are not catched and # the full python stack is printed. debug = boolean(default=False) diff --git a/pubs/pretty.py b/pubs/pretty.py index 0c951e6..369c3e4 100644 --- a/pubs/pretty.py +++ b/pubs/pretty.py @@ -23,19 +23,30 @@ def person_repr(p): ' '.join(p.lineage(abbr=True))] if s) -def short_authors(bibdata): +def short_authors(bibdata, n_authors=3): + """ + :param n_authors: number of authors to display completely. Additional authors will be + represented by 'et al.'. + """ try: authors = [p for p in bibdata['author']] - if len(authors) < 3: - return ' and '.join(authors) + if 0 < n_authors < len(authors): + authors_str = '{} et al.'.format(authors[0]) else: - return authors[0] + (' et al.' if len(authors) > 1 else '') + authors_str = ' and '.join(authors) + + # if n_authors > 0: + # authors = authors[:n_authors] + # authors_str = ' and '.join(authors) + # if 0 < n_authors < len(bibdata['author']): + # authors_str += ' et al.' + return authors_str except KeyError: # When no author is defined return '' -def bib_oneliner(bibdata): - authors = short_authors(bibdata) +def bib_oneliner(bibdata, n_authors=3): + authors = short_authors(bibdata, n_authors=n_authors) journal = '' if 'journal' in bibdata: journal = ' ' + bibdata['journal'] @@ -60,11 +71,11 @@ def bib_desc(bib_data): return s -def paper_oneliner(p, citekey_only=False): +def paper_oneliner(p, citekey_only=False, n_authors=3): if citekey_only: return p.citekey else: - bibdesc = bib_oneliner(p.get_unicode_bibdata()) + bibdesc = bib_oneliner(p.get_unicode_bibdata(), n_authors=n_authors) doc_str = '' if p.docpath is not None: doc_extension = os.path.splitext(p.docpath)[1] diff --git a/tests/test_pretty.py b/tests/test_pretty.py index 0c09211..cc9f4f4 100644 --- a/tests/test_pretty.py +++ b/tests/test_pretty.py @@ -28,5 +28,15 @@ class TestPretty(unittest.TestCase): line = 'Page, Lawrence et al. "The PageRank Citation Ranking: Bringing Order to the Web."' self.assertEqual(color.undye(pretty.bib_oneliner(bibdata['Page99'])), line) + def test_oneliner_n_authors(self): + decoder = endecoder.EnDecoder() + bibdata = decoder.decode_bibdata(bibtex_raw0) + for n_authors in [1, 2, 3]: + line = 'Page, Lawrence et al. "The PageRank Citation Ranking: Bringing Order to the Web." (1999)' + self.assertEqual(color.undye(pretty.bib_oneliner(bibdata['Page99'], n_authors=n_authors)), line) + for n_authors in [-1, 0, 4, 5, 10]: + line = 'Page, Lawrence and Brin, Sergey and Motwani, Rajeev and Winograd, Terry "The PageRank Citation Ranking: Bringing Order to the Web." (1999)' + self.assertEqual(color.undye(pretty.bib_oneliner(bibdata['Page99'], n_authors=n_authors)), line) + if __name__ == '__main__': unittest.main() diff --git a/tests/test_usecase.py b/tests/test_usecase.py index 348366e..5004919 100644 --- a/tests/test_usecase.py +++ b/tests/test_usecase.py @@ -1079,7 +1079,8 @@ class TestUsecase(DataCommandTestCase): 'pubs add -d data/no-ext data/pagerank.bib', 'pubs list', ] - self.assertEqual(correct, self.execute_cmds(cmds, capture_output=True)) + actual = self.execute_cmds(cmds, capture_output=True) + self.assertEqual(correct, actual) @mock.patch('pubs.apis.requests.get', side_effect=mock_requests.mock_requests_get) def test_readme(self, reqget):