From 681ae65c9ee8626bbc62a902c189195bacd738b0 Mon Sep 17 00:00:00 2001 From: Olivier Mangin Date: Fri, 4 Dec 2015 23:38:11 -0500 Subject: [PATCH] Fixes issue #35. pubs tag non-existing-citekey some-tag Know fails as expected. The commit however removes the option of listing tags as separate arguments. --- pubs/commands/tag_cmd.py | 21 +++++++-------------- pubs/uis.py | 2 ++ tests/test_tag.py | 18 +++++++++--------- 3 files changed, 18 insertions(+), 23 deletions(-) diff --git a/pubs/commands/tag_cmd.py b/pubs/commands/tag_cmd.py index cb259d3..7e07b94 100644 --- a/pubs/commands/tag_cmd.py +++ b/pubs/commands/tag_cmd.py @@ -30,7 +30,7 @@ def parser(subparsers): parser = subparsers.add_parser('tag', help="add, remove and show tags") parser.add_argument('citekeyOrTag', nargs='?', default=None, help='citekey or tag.') - parser.add_argument('tags', nargs='*', default=None, + parser.add_argument('tags', nargs='?', default=None, help='If the previous argument was a citekey, then ' 'a list of tags separated by a +.') # TODO find a way to display clear help for multiple command semantics, @@ -38,14 +38,6 @@ def parser(subparsers): return parser -def _parse_tags(list_tags): - """Transform 'math-ai network -search' in ['+math', '-ai', '+network', '-search']""" - tags = [] - for s in list_tags: - tags += _parse_tag_seq(s) - return tags - - def _parse_tag_seq(s): """Transform 'math-ai' in ['+math', '-ai']""" tags = [] @@ -93,20 +85,21 @@ def command(args): else: if rp.databroker.exists(citekeyOrTag): p = rp.pull_paper(citekeyOrTag) - if tags == []: + if tags is None: ui.message(color.dye_out(' '.join(sorted(p.tags)), color.tag)) else: - add_tags, remove_tags = _tag_groups(_parse_tags(tags)) + add_tags, remove_tags = _tag_groups(_parse_tag_seq(tags)) for tag in add_tags: p.add_tag(tag) for tag in remove_tags: p.remove_tag(tag) rp.push_paper(p, overwrite=True) + elif tags is not None: + ui.error(ui.error('no entry found for citekey {}.'.format(citekeyOrTag))) + ui.exit() else: # case where we want to find papers with specific tags - all_tags = [citekeyOrTag] - all_tags += tags - included, excluded = _tag_groups(_parse_tags(all_tags)) + included, excluded = _tag_groups(_parse_tag_seq(citekeyOrTag)) papers_list = [] for p in rp.all_papers(): if (p.tags.issuperset(included) and diff --git a/pubs/uis.py b/pubs/uis.py index c019105..df878a3 100644 --- a/pubs/uis.py +++ b/pubs/uis.py @@ -27,11 +27,13 @@ def _get_encoding(conf): return enc or 'utf-8' return conf.get('terminal-encoding', enc or 'utf-8') + def get_ui(): if _ui is None: return PrintUI() # no editor support. (#FIXME?) return _ui + def init_ui(conf): global _ui _ui = InputUI(conf) diff --git a/tests/test_tag.py b/tests/test_tag.py index 409ebc5..0e6db53 100644 --- a/tests/test_tag.py +++ b/tests/test_tag.py @@ -2,25 +2,25 @@ import unittest import dotdot -from pubs.commands.tag_cmd import _parse_tags, _tag_groups +from pubs.commands.tag_cmd import _parse_tag_seq, _tag_groups class TestTag(unittest.TestCase): def test_parse_tags(self): - self.assertEqual(['+abc', '+def9'], _parse_tags([ 'abc+def9'])) - self.assertEqual(['+abc', '-def9'], _parse_tags([ 'abc-def9'])) - self.assertEqual(['-abc', '-def9'], _parse_tags(['-abc-def9'])) - self.assertEqual(['+abc', '-def9'], _parse_tags(['+abc-def9'])) + self.assertEqual(['+abc', '+def9'], _parse_tag_seq('abc+def9')) + self.assertEqual(['+abc', '-def9'], _parse_tag_seq('abc-def9')) + self.assertEqual(['-abc', '-def9'], _parse_tag_seq('-abc-def9')) + self.assertEqual(['+abc', '-def9'], _parse_tag_seq('+abc-def9')) def test_tag_groups(self): self.assertEqual(({'math', 'romance'}, {'war'}), - _tag_groups(_parse_tags(['-war+math+romance']))) + _tag_groups(_parse_tag_seq('-war+math+romance'))) self.assertEqual(({'math', 'romance'}, {'war'}), - _tag_groups(_parse_tags([':war+math+romance']))) + _tag_groups(_parse_tag_seq(':war+math+romance'))) self.assertEqual(({'math', 'romance'}, {'war'}), - _tag_groups(_parse_tags(['+math+romance-war']))) + _tag_groups(_parse_tag_seq('+math+romance-war'))) self.assertEqual(({'math', 'romance'}, {'war'}), - _tag_groups(_parse_tags(['math+romance-war']))) + _tag_groups(_parse_tag_seq('math+romance-war'))) if __name__ == '__main__':