diff options
| author | Gertjan van den Burg <gertjanvandenburg@gmail.com> | 2020-01-07 15:16:04 +0000 |
|---|---|---|
| committer | Gertjan van den Burg <gertjanvandenburg@gmail.com> | 2020-01-07 15:16:04 +0000 |
| commit | c6f959b5aff132698ff068de39b8cabf6319da67 (patch) | |
| tree | 7afaea609e07202acb7e10793f560bdddfe1b25d | |
| parent | Merge branch 'bugfix/provider_acm' (diff) | |
| download | paper2remarkable-c6f959b5aff132698ff068de39b8cabf6319da67.tar.gz paper2remarkable-c6f959b5aff132698ff068de39b8cabf6319da67.zip | |
Raise exceptions instead of hard exiting
| -rw-r--r-- | paper2remarkable/exceptions.py | 110 | ||||
| -rw-r--r-- | paper2remarkable/providers/acm.py | 10 | ||||
| -rw-r--r-- | paper2remarkable/providers/arxiv.py | 13 | ||||
| -rw-r--r-- | paper2remarkable/providers/citeseerx.py | 8 | ||||
| -rw-r--r-- | paper2remarkable/providers/neurips.py | 4 | ||||
| -rw-r--r-- | paper2remarkable/providers/openreview.py | 4 | ||||
| -rw-r--r-- | paper2remarkable/providers/pdf_url.py | 8 | ||||
| -rw-r--r-- | paper2remarkable/providers/pmlr.py | 6 | ||||
| -rw-r--r-- | paper2remarkable/providers/pubmed.py | 4 | ||||
| -rw-r--r-- | paper2remarkable/providers/springer.py | 4 | ||||
| -rw-r--r-- | paper2remarkable/utils.py | 9 |
11 files changed, 148 insertions, 32 deletions
diff --git a/paper2remarkable/exceptions.py b/paper2remarkable/exceptions.py new file mode 100644 index 0000000..f287ce1 --- /dev/null +++ b/paper2remarkable/exceptions.py @@ -0,0 +1,110 @@ +# -*- coding: utf-8 -*- + +"""Exceptions for paper2remarkable + +""" + +from . import GITHUB_URL + +from subprocess import CalledProcessError + + +class Error(Exception): + """Base class for exceptions in p2r.""" + + +class URLResolutionError(Error): + """Exception raised when the abstract/pdf urls can't be resolved. + + Attributes + ---------- + provider : str + Name of the provider where the error occurred + + url : str + Original url provided + + """ + + def __init__(self, provider, url, reason=None): + self.provider = provider + self.url = url + self.reason = None + + def __str__(self): + msg = "ERROR: Couldn't figure out {provider} URLs from provided url: {url}".format( + provider=self.provider, url=self.url + ) + if self.reason: + msg += "\nReason: {reason}".format(reason=self.reason) + msg += "\nIf you think this might be a bug, please raise an issue on GitHub at {url}".format( + url=GITHUB_URL + ) + return msg + + +class FilenameMissingError(Error): + """Exception raised for providers that need a filename to be provided""" + + def __init__(self, provider): + self.provider = provider + + def __str__(self): + msg = "ERROR: Filename must be given with the {provider} provider (hint: use --filename)".format( + provider=self.provider + ) + msg += "\nIf you think this might be a bug, please raise an issue on GitHub at {url}".format( + url=GITHUB_URL + ) + return msg + + +class FileTypeError(Error): + """Exception raised when we have a mismatch in filetype.""" + + def __init__(self, filename, filetype): + self.filename = filename + self.filetype = filetype + + def __str__(self): + msg = "ERROR: File {filename} isn't of type {filetype}.".format( + filename=self.filename, filetype=self.filetype + ) + msg += "\nIf you think this might be a bug, please raise an issue on GitHub at {url}".format( + url=GITHUB_URL + ) + return msg + + +class RemarkableError(Error): + """Exceptions raised when interacting with the reMarkable fails.""" + + def __init__(self, message): + self.message = message + + def __str__(self): + msg = "ERROR: {message}".format(message=self.message) + msg += "\nIf you think this might be a bug, please raise an issue on GitHub at {url}".format( + url=GITHUB_URL + ) + return msg + + +class _CalledProcessError(CalledProcessError): + """Exception raised when subprocesses fail. + + We subclass the CalledProcessError so we can add our custom error message. + """ + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + def __str__(self): + parent = super().__str__() + msg = ( + parent + + "\nIf you think this might be a bug, please raise an issue on GitHub at {url}".format( + url=GITHUB_URL + ) + ) + return msg diff --git a/paper2remarkable/providers/acm.py b/paper2remarkable/providers/acm.py index 08e8cb2..45eeacf 100644 --- a/paper2remarkable/providers/acm.py +++ b/paper2remarkable/providers/acm.py @@ -12,9 +12,9 @@ import re from ._base import Provider from ._info import Informer -from .. import GITHUB_URL -from ..utils import exception +from ..exceptions import URLResolutionError from ..log import Logger +from ..utils import exception logger = Logger() @@ -57,7 +57,7 @@ class ACM(Provider): m = re.match(self.re_abs, url) or re.match(self.re_pdf, url) if m: return m["doi"] - exception("Couldn't retrieve ACM publication DOI.") + raise URLResolutionError("ACM", url, reason="Failed to retrieve DOI.") def get_abs_pdf_urls(self, url): if re.match(self.re_abs, url): @@ -71,9 +71,7 @@ class ACM(Provider): doi = self._get_doi(url) abs_url = "https://dl.acm.org/doi/{doi}".format(doi=doi) else: - exception( - "Couldn't figure out ACM urls from provided url: %s" % url - ) + raise URLResolutionError("ACM", url) return abs_url, pdf_url def validate(src): diff --git a/paper2remarkable/providers/arxiv.py b/paper2remarkable/providers/arxiv.py index 1fd1795..282eb09 100644 --- a/paper2remarkable/providers/arxiv.py +++ b/paper2remarkable/providers/arxiv.py @@ -14,7 +14,10 @@ import subprocess from ._info import Informer from ._base import Provider -from ..utils import exception +from ..exceptions import ( + URLResolutionError, + _CalledProcessError as CalledProcessError, +) from ..log import Logger logger = Logger() @@ -49,7 +52,7 @@ class Arxiv(Provider): abs_url = url[:-4].replace("pdf", "abs") pdf_url = url else: - exception("Couldn't figure out arXiv urls.") + raise URLResolutionError("arXiv", url) return abs_url, pdf_url def validate(src): @@ -72,7 +75,9 @@ class Arxiv(Provider): ] ) if not status == 0: - exception("pdftk failed to uncompress the pdf.") + raise CalledProcessError( + "pdftk failed to uncompress the PDF file." + ) with open(uncompress_file, "rb") as fid: data = fid.read() @@ -94,6 +99,6 @@ class Arxiv(Provider): [self.pdftk_path, removed_file, "output", output_file, "compress"] ) if not status == 0: - exception("pdftk failed to compress the pdf.") + raise CalledProcessError("pdftk failed to compress the PDF file.") return output_file diff --git a/paper2remarkable/providers/citeseerx.py b/paper2remarkable/providers/citeseerx.py index fdc0e8a..82adca7 100644 --- a/paper2remarkable/providers/citeseerx.py +++ b/paper2remarkable/providers/citeseerx.py @@ -12,7 +12,7 @@ import re from ._base import Provider from ._info import Informer -from ..utils import exception +from ..exceptions import URLResolutionError class CiteSeerXInformer(Informer): @@ -38,7 +38,9 @@ class CiteSeerX(Provider): m = re.match(self.re_abs, url) or re.match(self.re_pdf, url) if m: return m["doi"] - exception("Couldn't retrieve CiteSeerX publication doi.") + raise URLResolutionError( + "CiteSeerX", url, reason="Failed to retrieve DOI." + ) def get_abs_pdf_urls(self, url): """ Get the pdf and abstract url from a OpenReview url """ @@ -55,7 +57,7 @@ class CiteSeerX(Provider): doi=doi ) else: - exception("Couldn't figure out CiteSeerX urls.") + raise URLResolutionError("CiteSeerX", url) return abs_url, pdf_url def validate(src): diff --git a/paper2remarkable/providers/neurips.py b/paper2remarkable/providers/neurips.py index 9dce4a5..87cf2c1 100644 --- a/paper2remarkable/providers/neurips.py +++ b/paper2remarkable/providers/neurips.py @@ -12,7 +12,7 @@ import re from ._base import Provider from ._info import Informer -from ..utils import exception +from ..exceptions import URLResolutionError class NeurIPSInformer(Informer): @@ -41,7 +41,7 @@ class NeurIPS(Provider): abs_url = url.replace(".pdf", "") pdf_url = url else: - exception("Couldn't figure out NeurIPS urls.") + raise URLResolutionError("NeurIPS", url) return abs_url, pdf_url def validate(src): diff --git a/paper2remarkable/providers/openreview.py b/paper2remarkable/providers/openreview.py index bfb139d..47c0555 100644 --- a/paper2remarkable/providers/openreview.py +++ b/paper2remarkable/providers/openreview.py @@ -12,7 +12,7 @@ import re from ._base import Provider from ._info import Informer -from ..utils import exception +from ..exceptions import URLResolutionError class OpenReviewInformer(Informer): @@ -41,7 +41,7 @@ class OpenReview(Provider): abs_url = url.replace("pdf", "forum") pdf_url = url else: - exception("Couldn't figure out OpenReview urls.") + raise URLResolutionError("OpenReview", url) return abs_url, pdf_url def validate(src): diff --git a/paper2remarkable/providers/pdf_url.py b/paper2remarkable/providers/pdf_url.py index d80b1a9..5314ec7 100644 --- a/paper2remarkable/providers/pdf_url.py +++ b/paper2remarkable/providers/pdf_url.py @@ -12,15 +12,13 @@ import urllib from ._base import Provider from ._info import Informer -from ..utils import exception +from ..exceptions import FilenameMissingError class PdfUrlInformer(Informer): def get_filename(self, abs_url): - # if this is called, filename must not be provided - exception( - "Filename must be provided with PDFUrlProvider (use --filename)" - ) + # if this is called, filename must not have been provided + raise FilenameMissingError(provider="PDFUrl") class PdfUrl(Provider): diff --git a/paper2remarkable/providers/pmlr.py b/paper2remarkable/providers/pmlr.py index 6981c3b..7b76d8a 100644 --- a/paper2remarkable/providers/pmlr.py +++ b/paper2remarkable/providers/pmlr.py @@ -12,7 +12,7 @@ import re from ._base import Provider from ._info import Informer -from ..utils import exception +from ..exceptions import URLResolutionError class PMLRInformer(Informer): @@ -20,7 +20,7 @@ class PMLRInformer(Informer): meta_date_key = "citation_publication_date" def _format_authors(self, soup_authors): - return super()._format_authors(soup_authors, sep=' ', idx=-1) + return super()._format_authors(soup_authors, sep=" ", idx=-1) class PMLR(Provider): @@ -56,7 +56,7 @@ class PMLR(Provider): abs_url = "/".join(parts[:-1]) + ".html" pdf_url = url else: - exception("Couldn't figure out PLMR urls.") + raise URLResolutionError("PMLR", url) return abs_url, pdf_url def validate(src): diff --git a/paper2remarkable/providers/pubmed.py b/paper2remarkable/providers/pubmed.py index ba4cca0..5387cb0 100644 --- a/paper2remarkable/providers/pubmed.py +++ b/paper2remarkable/providers/pubmed.py @@ -12,7 +12,7 @@ import re from ._base import Provider from ._info import Informer -from ..utils import exception +from ..exceptions import URLResolutionError class PubMedInformer(Informer): @@ -50,7 +50,7 @@ class PubMed(Provider): abs_url = url pdf_url = url.rstrip("/") + "/pdf" # it redirects, usually else: - exception("Couldn't figure out PMC urls.") + raise URLResolutionError("PMC", url) return abs_url, pdf_url def validate(src): diff --git a/paper2remarkable/providers/springer.py b/paper2remarkable/providers/springer.py index ce4acdd..5ce2564 100644 --- a/paper2remarkable/providers/springer.py +++ b/paper2remarkable/providers/springer.py @@ -13,7 +13,7 @@ import urllib from ._base import Provider from ._info import Informer -from ..utils import exception +from ..exceptions import URLResolutionError class SpringerInformer(Informer): @@ -42,7 +42,7 @@ class Springer(Provider): abs_url = url.replace("content/pdf", "article")[: -len(".pdf")] pdf_url = urllib.parse.unquote(url) else: - exception("Couldn't figure out Springer urls.") + raise URLResolutionError("Springer", url) return abs_url, pdf_url def validate(src): diff --git a/paper2remarkable/utils.py b/paper2remarkable/utils.py index de27973..7d68964 100644 --- a/paper2remarkable/utils.py +++ b/paper2remarkable/utils.py @@ -18,6 +18,7 @@ import unidecode from . import GITHUB_URL from .log import Logger +from .exceptions import FileTypeError, RemarkableError HEADERS = { "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) " @@ -64,7 +65,7 @@ def assert_file_is_pdf(filename): del pdf return True except PyPDF2.utils.PdfReadError: - exception("File %s isn't a valid pdf file." % filename) + raise FileTypeError(filename, "pdf") def download_url(url, filename): @@ -122,7 +123,7 @@ def upload_to_remarkable(filepath, remarkable_dir="/", rmapi_path="rmapi"): stdout=subprocess.DEVNULL, ) if not status == 0: - exception( + raise RemarkableError( "Creating directory %s on reMarkable failed" % remarkable_dir ) @@ -132,5 +133,7 @@ def upload_to_remarkable(filepath, remarkable_dir="/", rmapi_path="rmapi"): stdout=subprocess.DEVNULL, ) if not status == 0: - exception("Uploading file %s to reMarkable failed" % filepath) + raise RemarkableError( + "Uploading file %s to reMarkable failed" % filepath + ) logger.info("Upload successful.") |
