diff --git a/backend.py b/backend.py index 470af40..97a9a6f 100644 --- a/backend.py +++ b/backend.py @@ -36,7 +36,7 @@ def getNewName(src, bibtex, tag='', override_format=None): new_name = override_format try: new_name = new_name.replace("%j", bibtex['journal']) - except: + except KeyError: pass elif bibtex['type'] == 'book': if override_format is None: @@ -47,7 +47,7 @@ def getNewName(src, bibtex, tag='', override_format=None): new_name = new_name.replace("%t", bibtex['title']) try: new_name = new_name.replace("%Y", bibtex['year']) - except: + except KeyError: pass new_name = new_name.replace("%f", authors[0].split(',')[0].strip()) new_name = new_name.replace("%l", authors[-1].split(',')[0].strip()) @@ -72,7 +72,7 @@ def getNewName(src, bibtex, tag='', override_format=None): if not os.path.isdir(config.get("folder") + tag): try: os.mkdir(config.get("folder") + tag) - except: + except OSError: tools.warning("Unable to create tag dir " + config.get("folder")+tag+".") @@ -91,7 +91,7 @@ def bibtexAppend(data): with open(config.get("folder")+'index.bib', 'a', encoding='utf-8') \ as fh: fh.write(tools.parsed2Bibtex(data)+"\n") - except Exception as e: + except IOError as e: raise e tools.warning("Unable to open index file.") return False @@ -105,7 +105,7 @@ def bibtexEdit(ident, modifs): as fh: bibtex = BibTexParser(fh.read()) bibtex = bibtex.get_entry_dict() - except: + except (IOError, TypeError): tools.warning("Unable to open index file.") return False @@ -126,7 +126,7 @@ def bibtexRewrite(data): with open(config.get("folder")+'index.bib', 'w', encoding='utf-8') \ as fh: fh.write(bibtex) - except: + except (IOError, TypeError): tools.warning("Unable to open index file.") return False @@ -138,7 +138,7 @@ def deleteId(ident): as fh: bibtex = BibTexParser(fh.read().decode('utf-8')) bibtex = bibtex.get_entry_dict() - except: + except (IOError, TypeError): tools.warning("Unable to open index file.") return False @@ -147,14 +147,14 @@ def deleteId(ident): try: os.remove(bibtex[ident]['file']) - except: + except (KeyError, OSError): tools.warning("Unable to delete file associated to id "+ident+" : " + bibtex[ident]['file']) try: if not os.listdir(os.path.dirname(bibtex[ident]['file'])): os.rmdir(os.path.dirname(bibtex[ident]['file'])) - except: + except (KeyError, OSError): tools.warning("Unable to delete empty tag dir " + os.path.dirname(bibtex[ident]['file'])) @@ -174,7 +174,7 @@ def deleteFile(filename): as fh: bibtex = BibTexParser(fh.read().decode('utf-8')) bibtex = bibtex.get_entry_dict() - except: + except (TypeError, IOError): tools.warning("Unable to open index file.") return False @@ -185,14 +185,14 @@ def deleteFile(filename): found = True try: os.remove(bibtex[key]['file']) - except: + except (KeyError, OSError): tools.warning("Unable to delete file associated to id " + key+" : "+bibtex[key]['file']) try: if not os.listdir(os.path.dirname(filename)): os.rmdir(os.path.dirname(filename)) - except: + except OSError: tools.warning("Unable to delete empty tag dir " + os.path.dirname(filename)) @@ -201,7 +201,7 @@ def deleteFile(filename): except KeyError: tools.warning("No associated bibtex entry in index for " + "file " + bibtex[key]['file']) - except: + except (KeyError, OSError): pass if found: bibtexRewrite(bibtex) @@ -224,7 +224,7 @@ def diffFilesIndex(): as fh: index = BibTexParser(fh.read()) index_diff = index.get_entry_dict() - except: + except (TypeError, IOError): tools.warning("Unable to open index file.") return False @@ -252,7 +252,7 @@ def getBibtex(entry, file_id='both', clean=False): as fh: bibtex = BibTexParser(fh.read()) bibtex = bibtex.get_entry_dict() - except: + except (TypeError, IOError): tools.warning("Unable to open index file.") return False @@ -284,7 +284,7 @@ def getEntries(): as fh: bibtex = BibTexParser(fh.read()) bibtex = bibtex.get_entry_dict() - except: + except (TypeError, IOError): tools.warning("Unable to open index file.") return False diff --git a/bmc.py b/bmc.py index f65b5af..2815512 100755 --- a/bmc.py +++ b/bmc.py @@ -39,12 +39,12 @@ def checkBibtex(filename, bibtex_string): check = tools.rawInput("Is it correct? [Y/n] ") except KeyboardInterrupt: sys.exit() - except: + except (KeyError, AssertionError): check = 'n' try: old_filename = bibtex['file'] - except: + except KeyError: old_filename = False while check.lower() == 'n': @@ -58,7 +58,7 @@ def checkBibtex(filename, bibtex_string): bibtex = bibtex.get_entry_dict() try: bibtex = bibtex[bibtex.keys()[0]] - except: + except KeyError: tools.warning("Invalid bibtex entry") bibtex_string = '' tools.rawInput("Press Enter to go back to editor.") @@ -83,7 +83,7 @@ def checkBibtex(filename, bibtex_string): try: print("Moving file to new location…") shutil.move(old_filename, bibtex['file']) - except: + except shutil.Error: tools.warning("Unable to move file "+old_filename+" to " + bibtex['file']+". You should check it manually.") @@ -205,7 +205,7 @@ def addFile(src, filetype, manual, autoconfirm, tag): try: shutil.copy2(src, new_name) - except IOError: + except shutil.Error: new_name = False sys.exit("Unable to move file to library dir " + config.get("folder")+".") @@ -214,7 +214,7 @@ def addFile(src, filetype, manual, autoconfirm, tag): try: if 'IOP' in bibtex['publisher'] and bibtex['type'] == 'article': tearpages.main(new_name) - except: + except (KeyError, shutil.Error, IOError): pass backend.bibtexAppend(bibtex) @@ -254,14 +254,14 @@ def editEntry(entry, file_id='both'): try: shutil.move(bibtex['file'], new_bibtex['file']) - except: - raise Exception('Unable to move file '+bibtex['file']+' to ' + - new_bibtex['file'] + ' according to tag edit.') + except shutil.Error: + tools.warning('Unable to move file '+bibtex['file']+' to ' + + new_bibtex['file'] + ' according to tag edit.') try: if not os.listdir(os.path.dirname(bibtex['file'])): os.rmdir(os.path.dirname(bibtex['file'])) - except: + except OSError: tools.warning("Unable to delete empty tag dir " + os.path.dirname(bibtex['file'])) @@ -270,7 +270,7 @@ def editEntry(entry, file_id='both'): as fh: index = BibTexParser(fh.read()) index = index.get_entry_dict() - except: + except (TypeError, IOError): tools.warning("Unable to open index file.") return False @@ -305,7 +305,7 @@ def openFile(ident): as fh: bibtex = BibTexParser(fh.read()) bibtex = bibtex.get_entry_dict() - except: + except (TypeError, IOError): tools.warning("Unable to open index file.") return False @@ -370,7 +370,7 @@ def resync(): shutil.copy2(filename, new_name) print("Imported new file "+filename+" for entry " + entry['id']+".") - except IOError: + except shutil.Error: new_name = False sys.exit("Unable to move file to library dir " + config.get("folder")+".") @@ -388,7 +388,7 @@ def resync(): filetype = tools.getExtension(entry['file']) try: os.remove(entry['file']) - except: + except OSError: tools.warning("Unable to delete file "+entry['file']) if not addFile(tmp.name, filetype): tools.warning("Unable to reimport file "+entry['file']) @@ -402,7 +402,7 @@ def resync(): if os.path.isdir(i) and not os.listdir(config.get("folder") + i): try: os.rmdir(config.get("folder") + i) - except: + except OSError: tools.warning("Found empty tag dir "+config.get("folder") + i + " but could not delete it.") diff --git a/fetcher.py b/fetcher.py index 73a5dba..dd7700f 100644 --- a/fetcher.py +++ b/fetcher.py @@ -117,7 +117,7 @@ def isbn2Bib(isbn): # Default merges results from worldcat.org and google books try: return fmtbib('bibtex', isbntools.meta(isbn, 'default')) - except: + except TypeError: return '' @@ -268,7 +268,7 @@ def arXiv2Bib(arxiv): fetched_bibtex = fetched_bibtex[fetched_bibtex.keys()[0]] try: del(fetched_bibtex['file']) - except: + except KeyError: pass return tools.parsed2Bibtex(fetched_bibtex) return '' diff --git a/tests/test_config.py b/tests/test_config.py new file mode 100644 index 0000000..52af6f7 --- /dev/null +++ b/tests/test_config.py @@ -0,0 +1,72 @@ +# -*- coding: utf8 -*- +# ----------------------------------------------------------------------------- +# "THE NO-ALCOHOL BEER-WARE LICENSE" (Revision 42): +# Phyks (webmaster@phyks.me) wrote this file. As long as you retain this notice +# you can do whatever you want with this stuff (and you can also do whatever +# you want with this stuff without retaining it, but that's not cool...). If we +# meet some day, and you think this stuff is worth it, you can buy me a +# beer soda in return. +# Phyks +# ----------------------------------------------------------------------------- +import unittest +from config import Config +import json +import os +import tempfile +import shutil + + +class TestConfig(unittest.TestCase): + def setUp(self): + self.folder = tempfile.mkdtemp()+"/" + self.default_config = {"folder": os.path.expanduser("~/Papers/"), + "proxies": [''], + "format_articles": "%f_%l-%j-%Y%v", + "format_books": "%a-%t", + "format_custom": [], + "ignore_fields": ["file", "doi", "tag"]} + + def tearDown(self): + shutil.rmtree(self.folder) + + def test_load_without_file(self): + config = Config(base_config_path=self.folder) + self.assertEqual(config.as_dict(), self.default_config) + with open(self.folder+"bmc.json", 'r') as fh: + read = json.loads(fh.read()) + self.assertEqual(read, self.default_config) + + def test_load_with_file(self): + config = self.default_config + config["foo"] = "bar" + with open(self.folder+"bmc.json", 'w') as fh: + json.dump(config, fh) + config_read = Config(base_config_path=self.folder) + self.assertEqual(config, config_read.as_dict()) + + def test_get(self): + config = Config(base_config_path=self.folder) + self.assertEqual(config.get("proxies"), ['']) + + def test_set(self): + config = Config(base_config_path=self.folder) + config.set("foo", "bar") + self.assertEqual(config.get("foo"), "bar") + + def test_save(self): + config = Config(base_config_path=self.folder) + config.set("foo", "bar") + config.save() + with open(self.folder+"bmc.json", 'r') as fh: + read = json.loads(fh.read()) + self.assertEqual(read, config.as_dict()) + + def test_masks(self): + with open(self.folder+"masks.py", 'w') as fh: + fh.write("def f(x): return x") + config = Config(base_config_path=self.folder) + self.assertEqual("foo", config.get("format_custom")[0]("foo")) + + +if __name__ == '__main__': + unittest.main()