diff --git a/pubs/endecoder.py b/pubs/endecoder.py index 346af3a..e289ddc 100644 --- a/pubs/endecoder.py +++ b/pubs/endecoder.py @@ -119,18 +119,18 @@ class EnDecoder(object): keyword for keyword in entry['keyword']) return entry - def decode_bibdata(self, bibdata): + def decode_bibdata(self, bibstr): """Decodes bibdata from string. If the decoding fails, returns a BibDecodingError. """ - if len(bibdata) == 0: + if len(bibstr) == 0: error_msg = 'parsing error: the provided string has length zero.' - raise self.BibDecodingError(error_msg, bibdata) + raise self.BibDecodingError(error_msg, bibstr) try: entries = bp.bparser.BibTexParser( - bibdata, common_strings=True, customization=customizations, - homogenize_fields=True).get_entry_dict() + bibstr, common_strings=True, customization=customizations, + homogenize_fields=True, ignore_nonstandard_types=False).get_entry_dict() # Remove id from bibtexparser attribute which is stored as citekey for e in entries: entries[e].pop(BP_ID_KEY) @@ -147,13 +147,13 @@ class EnDecoder(object): return entries else: raise self.BibDecodingError(('no valid entry found in the provided data: ' - ' {}').format(bibdata), bibdata) + ' {}').format(bibstr), bibstr) except (pyparsing.ParseException, pyparsing.ParseSyntaxException) as e: error_msg = self._format_parsing_error(e) - raise self.BibDecodingError(error_msg, bibdata) + raise self.BibDecodingError(error_msg, bibstr) except bibtexparser.bibdatabase.UndefinedString as e: error_msg = 'parsing error: undefined string in provided data: {}'.format(e) - raise self.BibDecodingError(error_msg, bibdata) + raise self.BibDecodingError(error_msg, bibstr) @classmethod def _format_parsing_error(cls, e): diff --git a/tests/data/collection.bib b/tests/data/three_articles.bib similarity index 100% rename from tests/data/collection.bib rename to tests/data/three_articles.bib diff --git a/tests/data_non_standard/non_standard_collection.bib b/tests/data_non_standard/non_standard_collection.bib new file mode 100644 index 0000000..0dbd1f2 --- /dev/null +++ b/tests/data_non_standard/non_standard_collection.bib @@ -0,0 +1,9 @@ +@collection{Geometric_phases, + title = {Geometric phases in physics}, + editor = {Shapere, Alfred and Wilczek, Frank}, + year = {1989}, + series = {Advanced Series in Mathematical Physics}, + volume = {5}, + publisher = {World Scientific}, + isbn = {9789971506216} +} diff --git a/tests/data_non_standard/non_standard_software.bib b/tests/data_non_standard/non_standard_software.bib new file mode 100644 index 0000000..87ecd7b --- /dev/null +++ b/tests/data_non_standard/non_standard_software.bib @@ -0,0 +1,7 @@ +@software{hadoop, + author = {{Apache Software Foundation}}, + title = {Hadoop}, + url = {https://hadoop.apache.org}, + version = {0.20.2}, + date = {2010-02-19}, +} diff --git a/tests/fake_env.py b/tests/fake_env.py index 6d790a3..41d22d7 100644 --- a/tests/fake_env.py +++ b/tests/fake_env.py @@ -43,8 +43,8 @@ def capture(f, verbose=False): """ def newf(*args, **kwargs): old_stderr, old_stdout = sys.stderr, sys.stdout - sys.stdout = _fake_stdio(additional_out=old_stderr if verbose else None) - sys.stderr = _fake_stdio(additional_out=old_stderr if False else None) + sys.stdout = _fake_stdio(additional_out=old_stdout if verbose else None) + sys.stderr = _fake_stdio(additional_out=old_stderr if verbose else None) try: return f(*args, **kwargs), _get_fake_stdio_ucontent(sys.stdout), _get_fake_stdio_ucontent(sys.stderr) finally: diff --git a/tests/test_usecase.py b/tests/test_usecase.py index b0044fa..f213d11 100644 --- a/tests/test_usecase.py +++ b/tests/test_usecase.py @@ -1091,6 +1091,22 @@ class TestUsecase(DataCommandTestCase): actual = self.execute_cmds(cmds, capture_output=True) self.assertEqual(correct, actual) + def test_add_non_standard(self): + """Test that non-standard bibtex are correctly added""" + self.fs.add_real_directory(os.path.join(self.rootpath, 'data_non_standard'), read_only=False) + correct = ['Initializing pubs in /pubs\n', + 'added to pubs:\n[Geometric_phases] "Geometric phases in physics" (1989) \n', + 'added to pubs:\n[hadoop] Foundation, Apache Software "Hadoop" \n', + ] + cmds = ['pubs init -p /pubs', + 'pubs add data_non_standard/non_standard_collection.bib', + 'pubs add data_non_standard/non_standard_software.bib', + # 'pubs list', + ] + 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): """Test that the readme example work.""" @@ -1099,7 +1115,7 @@ class TestUsecase(DataCommandTestCase): self.fs.add_real_file(os.path.join(self.rootpath, 'data/pagerank.pdf'), target_path='data/Knuth1995.pdf') cmds = ['pubs init', - 'pubs import data/collection.bib', + 'pubs import data/three_articles.bib', 'pubs add data/pagerank.bib -d data/pagerank.pdf', #'pubs add -D 10.1007/s00422-012-0514-6 -d data/pagerank.pdf', 'pubs add -I 978-0822324669 -d data/oyama2000the.pdf',