summaryrefslogtreecommitdiff
path: root/qutebrowser
diff options
context:
space:
mode:
authorFlorian Bruhin <me@the-compiler.org>2021-01-26 17:21:09 +0100
committerFlorian Bruhin <me@the-compiler.org>2021-01-26 17:49:39 +0100
commita5063283dee2da81c44e440d308e078242412f49 (patch)
tree397cee04cc3cb6468f874d609f79ddbf321b44ef /qutebrowser
parent5593c8f4117fd64328d312523f756ba9ed650822 (diff)
downloadqutebrowser-a5063283dee2da81c44e440d308e078242412f49.tar.gz
qutebrowser-a5063283dee2da81c44e440d308e078242412f49.zip
Separate utils.read_file and read_file_binary
See #4467
Diffstat (limited to 'qutebrowser')
-rw-r--r--qutebrowser/browser/pdfjs.py2
-rw-r--r--qutebrowser/browser/qutescheme.py6
-rw-r--r--qutebrowser/utils/jinja.py2
-rw-r--r--qutebrowser/utils/utils.py55
4 files changed, 35 insertions, 30 deletions
diff --git a/qutebrowser/browser/pdfjs.py b/qutebrowser/browser/pdfjs.py
index 3bde1b8a4..5656fbfc2 100644
--- a/qutebrowser/browser/pdfjs.py
+++ b/qutebrowser/browser/pdfjs.py
@@ -149,7 +149,7 @@ def get_pdfjs_res_and_path(path):
if content is None:
res_path = '3rdparty/pdfjs/{}'.format(path)
try:
- content = utils.read_file(res_path, binary=True)
+ content = utils.read_file_binary(res_path)
except FileNotFoundError:
raise PDFJSNotFound(path) from None
except OSError as e:
diff --git a/qutebrowser/browser/qutescheme.py b/qutebrowser/browser/qutescheme.py
index 3f95dae32..612bccdc0 100644
--- a/qutebrowser/browser/qutescheme.py
+++ b/qutebrowser/browser/qutescheme.py
@@ -270,7 +270,7 @@ def qute_javascript(url: QUrl) -> _HandlerRet:
path = url.path()
if path:
path = "javascript" + os.sep.join(path.split('/'))
- return 'text/html', utils.read_file(path, binary=False)
+ return 'text/html', utils.read_file(path)
else:
raise UrlInvalidError("No file specified")
@@ -371,7 +371,7 @@ def qute_help(url: QUrl) -> _HandlerRet:
path = 'html/doc/{}'.format(urlpath)
if not urlpath.endswith('.html'):
try:
- bdata = utils.read_file(path, binary=True)
+ bdata = utils.read_file_binary(path)
except OSError as e:
raise SchemeOSError(e)
mimetype = utils.guess_mimetype(urlpath)
@@ -574,7 +574,7 @@ def qute_resource(url: QUrl) -> _HandlerRet:
path = url.path().lstrip('/')
mimetype = utils.guess_mimetype(path, fallback=True)
try:
- data = utils.read_file(path, binary=True)
+ data = utils.read_file_binary(path)
except FileNotFoundError as e:
raise NotFoundError(str(e))
return mimetype, data
diff --git a/qutebrowser/utils/jinja.py b/qutebrowser/utils/jinja.py
index 4eaa53ead..59e887126 100644
--- a/qutebrowser/utils/jinja.py
+++ b/qutebrowser/utils/jinja.py
@@ -120,7 +120,7 @@ class Environment(jinja2.Environment):
def _data_url(self, path: str) -> str:
"""Get a data: url for the broken qutebrowser logo."""
- data = utils.read_file(path, binary=True)
+ data = utils.read_file_binary(path)
mimetype = utils.guess_mimetype(path)
return urlutils.data_url(mimetype, data).toString()
diff --git a/qutebrowser/utils/utils.py b/qutebrowser/utils/utils.py
index 483a9a6f3..18654749b 100644
--- a/qutebrowser/utils/utils.py
+++ b/qutebrowser/utils/utils.py
@@ -33,6 +33,7 @@ import contextlib
import posixpath
import shlex
import mimetypes
+import pathlib
import ctypes
import ctypes.util
from typing import (Any, Callable, IO, Iterator, Optional, Sequence, Tuple, Type, Union,
@@ -179,9 +180,22 @@ def compact_text(text: str, elidelength: int = None) -> str:
return out
+def _resource_path(filename: str) -> pathlib.Path:
+ """Get a pathlib.Path object for a resource."""
+ assert not posixpath.isabs(filename), filename
+ assert os.path.pardir not in filename.split(posixpath.sep), filename
+
+ if hasattr(sys, 'frozen'):
+ # For PyInstaller, where we can't store resource files in a qutebrowser/ folder
+ # because the executable is already named "qutebrowser" (at least on macOS).
+ return pathlib.Path(sys.executable).parent / filename
+
+ return importlib_resources.files(qutebrowser) / filename
+
+
def preload_resources() -> None:
"""Load resource files into the cache."""
- resource_path = importlib_resources.files(qutebrowser)
+ resource_path = _resource_path('')
for subdir, pattern in [('html', '*.html'), ('javascript', '*.js')]:
path = resource_path / subdir
for full_path in path.glob(pattern):
@@ -189,42 +203,33 @@ def preload_resources() -> None:
_resource_cache[sub_path] = read_file(sub_path)
-# FIXME:typing Return value should be bytes/str
-def read_file(filename: str, binary: bool = False) -> Any:
+def read_file(filename: str) -> str:
"""Get the contents of a file contained with qutebrowser.
Args:
filename: The filename to open as string.
- binary: Whether to return a binary string.
- If False, the data is UTF-8-decoded.
Return:
The file contents as string.
"""
- assert not posixpath.isabs(filename), filename
- assert os.path.pardir not in filename.split(posixpath.sep), filename
-
- if not binary and filename in _resource_cache:
+ if filename in _resource_cache:
return _resource_cache[filename]
- if hasattr(sys, 'frozen'):
- # For PyInstaller, where we can't store resource files in a qutebrowser/ folder
- # because the executable is already named "qutebrowser" (at least on macOS).
- fn = os.path.join(os.path.dirname(sys.executable), filename)
- if binary:
- f: IO
- with open(fn, 'rb') as f:
- return f.read()
- else:
- with open(fn, 'r', encoding='utf-8') as f:
- return f.read()
- else:
- p = importlib_resources.files(qutebrowser) / filename
+ path = _resource_path(filename)
+ return path.read_text(encoding='utf-8')
+
- if binary:
- return p.read_bytes()
+def read_file_binary(filename: str) -> bytes:
+ """Get the contents of a binary file contained with qutebrowser.
- return p.read_text()
+ Args:
+ filename: The filename to open as string.
+
+ Return:
+ The file contents as a bytes object.
+ """
+ path = _resource_path(filename)
+ return path.read_bytes()
def parse_version(version: str) -> VersionNumber: