Merge pull request #193 from shanewstone/feat/query_citekey
Add CitekeyFilter and FIELD_ALIAS 'key': 'citekey' to query.py
This commit is contained in:
commit
4ab0267d67
@ -7,6 +7,8 @@
|
||||
|
||||
### Implemented enhancements
|
||||
|
||||
- Add `citekey` filter to `query` ([#193](https://github.com/pubs/pubs/pull/193) by [Shane Stone](https://github.com/shanewstone))
|
||||
|
||||
|
||||
### Fixed bugs
|
||||
|
||||
|
@ -6,7 +6,8 @@ from . import bibstruct
|
||||
|
||||
|
||||
QUERY_HELP = ('Paper query ("author:Einstein", "title:learning",'
|
||||
'"year:2000", "year:2000-2010", or "tags:math")')
|
||||
' "year:2000", "year:2000-2010", "citekey:Einstein_1935",'
|
||||
' or "tags:math")')
|
||||
|
||||
|
||||
FIELD_ALIASES = {
|
||||
@ -15,6 +16,7 @@ FIELD_ALIASES = {
|
||||
't': 'title',
|
||||
'tags': 'tag',
|
||||
'y': 'year',
|
||||
'key': 'citekey',
|
||||
}
|
||||
|
||||
|
||||
@ -78,6 +80,12 @@ class AuthorFilter(QueryFilter):
|
||||
for author in paper.bibdata['author']])
|
||||
|
||||
|
||||
class CitekeyFilter(QueryFilter):
|
||||
|
||||
def __call__(self, paper):
|
||||
return self._is_query_in(paper.citekey)
|
||||
|
||||
|
||||
class TagFilter(QueryFilter):
|
||||
|
||||
def __call__(self, paper):
|
||||
@ -137,6 +145,9 @@ def _query_block_to_filter(query_block, case_sensitive=None, strict=False):
|
||||
field, value = _get_field_value(query_block)
|
||||
if field == 'tag':
|
||||
return TagFilter(value, case_sensitive=case_sensitive, strict=strict)
|
||||
elif field == 'citekey':
|
||||
return CitekeyFilter(value, case_sensitive=case_sensitive,
|
||||
strict=strict)
|
||||
elif field == 'author':
|
||||
return AuthorFilter(value, case_sensitive=case_sensitive,
|
||||
strict=strict)
|
||||
|
@ -142,3 +142,4 @@ You can access the self-documented configuration by using `pubs conf`, and all t
|
||||
- [Dennis Wilson](https://github.com/d9w)
|
||||
- [Bill Flynn](https://github.com/wflynny)
|
||||
- [ksunden](https://github.com/ksunden)
|
||||
- [Shane Stone](https://github.com/shanewstone)
|
||||
|
@ -4,9 +4,9 @@ from __future__ import unicode_literals
|
||||
import unittest
|
||||
|
||||
import dotdot
|
||||
from pubs.query import (AuthorFilter, FieldFilter, YearFilter,
|
||||
_query_block_to_filter, get_paper_filter,
|
||||
InvalidQuery)
|
||||
from pubs.query import (AuthorFilter, CitekeyFilter, FieldFilter,
|
||||
YearFilter, _query_block_to_filter,
|
||||
get_paper_filter, InvalidQuery)
|
||||
|
||||
from pubs.paper import Paper
|
||||
|
||||
@ -43,6 +43,49 @@ class TestAuthorFilter(unittest.TestCase):
|
||||
self.assertFalse(AuthorFilter('lawrence')(page_paper))
|
||||
|
||||
|
||||
class TestCitekeyFilter(unittest.TestCase):
|
||||
|
||||
def test_fails_if_no_citekey(self):
|
||||
no_citekey = doe_paper.deepcopy()
|
||||
no_citekey.citekey = ''
|
||||
self.assertFalse(CitekeyFilter('whatever')(no_citekey))
|
||||
|
||||
def test_match_case(self):
|
||||
self.assertTrue(CitekeyFilter('doe201')(doe_paper))
|
||||
self.assertTrue(CitekeyFilter('doe201', case_sensitive=False)(doe_paper))
|
||||
self.assertTrue(CitekeyFilter('Doe201')(doe_paper))
|
||||
|
||||
def test_do_not_match_case(self):
|
||||
self.assertFalse(CitekeyFilter('dOe201')(doe_paper))
|
||||
self.assertFalse(CitekeyFilter('dOe201', case_sensitive=True)(doe_paper))
|
||||
self.assertFalse(CitekeyFilter('doe201', case_sensitive=True)(doe_paper))
|
||||
self.assertTrue(CitekeyFilter('dOe201', case_sensitive=False)(doe_paper))
|
||||
|
||||
def test_latex_enc(self):
|
||||
latexenc_paper = doe_paper.deepcopy()
|
||||
latexenc_paper.citekey = "{G}r{\\\"u}n2013"
|
||||
self.assertTrue(CitekeyFilter('Grün')(latexenc_paper))
|
||||
self.assertTrue(CitekeyFilter('Gr{\\\"u}n')(latexenc_paper))
|
||||
|
||||
def test_normalize_unicode(self):
|
||||
latexenc_paper = doe_paper.deepcopy()
|
||||
latexenc_paper.citekey = "Jalape\u00f1o2013"
|
||||
self.assertTrue(CitekeyFilter("Jalapen\u0303o")(latexenc_paper))
|
||||
|
||||
def test_strict(self):
|
||||
latexenc_paper = doe_paper.deepcopy()
|
||||
latexenc_paper.citekey = "Jalape\u00f1o2013"
|
||||
self.assertFalse(CitekeyFilter("Jalapen\u0303o", strict=True)(latexenc_paper))
|
||||
latexenc_paper.citekey = "{G}ros2013"
|
||||
self.assertFalse(CitekeyFilter("Gros", strict=True)(latexenc_paper))
|
||||
|
||||
def test_strict_implies_case(self):
|
||||
latexenc_paper = doe_paper.deepcopy()
|
||||
latexenc_paper.citekey = "Gros2013"
|
||||
self.assertFalse(
|
||||
CitekeyFilter("gros", case_sensitive=False, strict=True)(latexenc_paper))
|
||||
|
||||
|
||||
class TestCheckTag(unittest.TestCase):
|
||||
pass
|
||||
|
||||
|
@ -505,6 +505,18 @@ class TestList(DataCommandTestCase):
|
||||
outs = self.execute_cmds(cmds)
|
||||
self.assertEqual(1 + 1, len(outs[-1].split('\n')))
|
||||
|
||||
def test_list_with_citekey_query(self):
|
||||
cmds = ['pubs init',
|
||||
'pubs import data/',
|
||||
'pubs list citekey:Page99',
|
||||
'pubs list key:eiNstein_1935',
|
||||
'pubs list --ignore-case key:eiNstein_1935',
|
||||
]
|
||||
outs = self.execute_cmds(cmds)
|
||||
self.assertEqual(1, len(outs[2].splitlines()))
|
||||
self.assertEqual(0, len(outs[3].splitlines()))
|
||||
self.assertEqual(1, len(outs[4].splitlines()))
|
||||
|
||||
|
||||
class TestTag(DataCommandTestCase):
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user