Fixes ˇpubs tag citekey :sometagˇ not working.

Also adds a few tests for the tag command.
main
Olivier Mangin 9 years ago
parent da4723d6db
commit 5480f79d8d

@ -19,23 +19,25 @@ The different use cases are :
import re
from ..repo import Repository, InvalidReference
from ..repo import Repository
from ..configs import config
from ..uis import get_ui
from .. import pretty
from .. import color
def parser(subparsers):
parser = subparsers.add_parser('tag', help="add, remove and show tags")
parser.add_argument('citekeyOrTag', nargs='?', default = None,
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 '
'then a list of tags separated by a +.')
'a list of tags separated by a +.')
# TODO find a way to display clear help for multiple command semantics,
# indistinguisable for argparse. (fabien, 201306)
return parser
def _parse_tags(list_tags):
"""Transform 'math-ai network -search' in ['+math', '-ai', '+network', '-search']"""
tags = []
@ -43,9 +45,12 @@ def _parse_tags(list_tags):
tags += _parse_tag_seq(s)
return tags
def _parse_tag_seq(s):
"""Transform 'math-ai' in ['+math', '-ai']"""
tags = []
if s[0] == ':':
s = '-' + s[1:]
if s[0] not in ['+', '-']:
s = '+' + s
last = 0
@ -62,6 +67,7 @@ def _parse_tag_seq(s):
tags.append(s[last:])
return tags
def _tag_groups(tags):
plus_tags, minus_tags = [], []
for tag in tags:
@ -72,6 +78,7 @@ def _tag_groups(tags):
minus_tags.append(tag[1:])
return set(plus_tags), set(minus_tags)
def command(args):
"""Add, remove and show tags"""
@ -79,7 +86,6 @@ def command(args):
citekeyOrTag = args.citekeyOrTag
tags = args.tags
rp = Repository(config())
if citekeyOrTag is None:
@ -88,8 +94,7 @@ def command(args):
if rp.databroker.exists(citekeyOrTag):
p = rp.pull_paper(citekeyOrTag)
if tags == []:
ui.message(color.dye_out(' '.join(sorted(p.tags)),
color.tag))
ui.message(color.dye_out(' '.join(sorted(p.tags)), color.tag))
else:
add_tags, remove_tags = _tag_groups(_parse_tags(tags))
for tag in add_tags:
@ -109,4 +114,4 @@ def command(args):
papers_list.append(p)
ui.message('\n'.join(pretty.paper_oneliner(p)
for p in papers_list))
for p in papers_list))

@ -6,16 +6,21 @@ from pubs.commands.tag_cmd import _parse_tags, _tag_groups
class TestTag(unittest.TestCase):
def test_tag_parsing(self):
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(({'math', 'romance'}, {'war'}), _tag_groups(_parse_tags(['-war+math+romance'])))
self.assertEqual(({'math', 'romance'}, {'war'}), _tag_groups(_parse_tags(['+math+romance-war'])))
self.assertEqual(({'math', 'romance'}, {'war'}), _tag_groups(_parse_tags(['math+romance-war'])))
def test_tag_groups(self):
self.assertEqual(({'math', 'romance'}, {'war'}),
_tag_groups(_parse_tags(['-war+math+romance'])))
self.assertEqual(({'math', 'romance'}, {'war'}),
_tag_groups(_parse_tags([':war+math+romance'])))
self.assertEqual(({'math', 'romance'}, {'war'}),
_tag_groups(_parse_tags(['+math+romance-war'])))
self.assertEqual(({'math', 'romance'}, {'war'}),
_tag_groups(_parse_tags(['math+romance-war'])))
if __name__ == '__main__':

@ -116,7 +116,7 @@ class DataCommandTestCase(CommandTestCase):
"""
def setUp(self):
CommandTestCase.setUp(self)
super(DataCommandTestCase, self).setUp()
fake_env.copy_dir(self.fs, os.path.join(os.path.dirname(__file__), 'data'), 'data')
@ -249,6 +249,76 @@ class TestList(DataCommandTestCase):
self.assertEqual(0 + 1, len(outs[-1].split('\n')))
class TestTag(DataCommandTestCase):
def setUp(self):
super(TestTag, self).setUp()
init = ['pubs init',
'pubs add data/pagerank.bib',
'pubs add -k Turing1950 data/turing1950.bib',
]
self.execute_cmds(init)
def test_add_tag(self):
cmds = ['pubs tag Page99 search',
'pubs tag Turing1950 ai',
'pubs list',
]
correct = ['',
'',
'[Page99] Page, Lawrence et al. "The PageRank Citation Ranking: Bringing Order to the Web." (1999) | search\n' +
'[Turing1950] Turing, Alan M "Computing machinery and intelligence" Mind (1950) | ai\n',
]
out = self.execute_cmds(cmds)
self.assertEqual(out, correct)
def test_add_tags(self):
"""Adds several tags at once.
Also checks that tags printed in alphabetic order.
"""
cmds = ['pubs tag Page99 search+network',
'pubs list',
]
correct = ['',
'[Page99] Page, Lawrence et al. "The PageRank Citation Ranking: Bringing Order to the Web." (1999) | network,search\n' +
'[Turing1950] Turing, Alan M "Computing machinery and intelligence" Mind (1950) \n',
]
out = self.execute_cmds(cmds)
self.assertEqual(out, correct)
def test_remove_tag(self):
cmds = ['pubs tag Page99 search+network',
'pubs tag Page99 :network',
'pubs list',
]
correct = ['',
'',
'[Page99] Page, Lawrence et al. "The PageRank Citation Ranking: Bringing Order to the Web." (1999) | search\n' +
'[Turing1950] Turing, Alan M "Computing machinery and intelligence" Mind (1950) \n',
]
out = self.execute_cmds(cmds)
self.assertEqual(out, correct)
def test_add_remove_tag(self):
cmds = ['pubs tag Page99 a',
'pubs tag Page99 b-a',
'pubs list',
]
correct = ['',
'',
'[Page99] Page, Lawrence et al. "The PageRank Citation Ranking: Bringing Order to the Web." (1999) | b\n' +
'[Turing1950] Turing, Alan M "Computing machinery and intelligence" Mind (1950) \n',
]
out = self.execute_cmds(cmds)
self.assertEqual(out, correct)
def test_wrong_citekey(self):
cmds = ['pubs tag Page999 a',
]
with self.assertRaises(SystemExit):
self.execute_cmds(cmds)
class TestUsecase(DataCommandTestCase):
def test_first(self):

Loading…
Cancel
Save