aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGertjan van den Burg <gertjanvandenburg@gmail.com>2020-01-07 15:16:04 +0000
committerGertjan van den Burg <gertjanvandenburg@gmail.com>2020-01-07 15:16:04 +0000
commitc6f959b5aff132698ff068de39b8cabf6319da67 (patch)
tree7afaea609e07202acb7e10793f560bdddfe1b25d
parentMerge branch 'bugfix/provider_acm' (diff)
downloadpaper2remarkable-c6f959b5aff132698ff068de39b8cabf6319da67.tar.gz
paper2remarkable-c6f959b5aff132698ff068de39b8cabf6319da67.zip
Raise exceptions instead of hard exiting
-rw-r--r--paper2remarkable/exceptions.py110
-rw-r--r--paper2remarkable/providers/acm.py10
-rw-r--r--paper2remarkable/providers/arxiv.py13
-rw-r--r--paper2remarkable/providers/citeseerx.py8
-rw-r--r--paper2remarkable/providers/neurips.py4
-rw-r--r--paper2remarkable/providers/openreview.py4
-rw-r--r--paper2remarkable/providers/pdf_url.py8
-rw-r--r--paper2remarkable/providers/pmlr.py6
-rw-r--r--paper2remarkable/providers/pubmed.py4
-rw-r--r--paper2remarkable/providers/springer.py4
-rw-r--r--paper2remarkable/utils.py9
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.")