Merge branch 'relapaths' of https://github.com/lamarpavel/qutebrowser into lamarpavel-relapaths
This commit is contained in:
commit
171a0f201b
@ -34,6 +34,7 @@ from PyQt5.QtWidgets import QTabWidget, QTabBar
|
||||
|
||||
from qutebrowser.commands import cmdutils
|
||||
from qutebrowser.config import configexc
|
||||
from qutebrowser.utils import standarddir
|
||||
|
||||
|
||||
SYSTEM_PROXY = object() # Return value for Proxy type
|
||||
@ -798,6 +799,17 @@ class File(BaseType):
|
||||
|
||||
typestr = 'file'
|
||||
|
||||
def transform(self, value):
|
||||
if not value:
|
||||
return None
|
||||
value = os.path.expanduser(value)
|
||||
value = os.path.expandvars(value)
|
||||
if not os.path.isabs(value):
|
||||
cfgdir = standarddir.config()
|
||||
if cfgdir is not None:
|
||||
return os.path.join(cfgdir, value)
|
||||
return value
|
||||
|
||||
def validate(self, value):
|
||||
if not value:
|
||||
if self._none_ok:
|
||||
@ -805,20 +817,26 @@ class File(BaseType):
|
||||
else:
|
||||
raise configexc.ValidationError(value, "may not be empty!")
|
||||
value = os.path.expanduser(value)
|
||||
value = os.path.expandvars(value)
|
||||
try:
|
||||
if not os.path.isfile(value):
|
||||
raise configexc.ValidationError(value, "must be a valid file!")
|
||||
if not os.path.isabs(value):
|
||||
cfgdir = standarddir.config()
|
||||
if cfgdir is None:
|
||||
raise configexc.ValidationError(
|
||||
value, "must be an absolute path when not using a "
|
||||
"config directory!")
|
||||
elif not os.path.isfile(os.path.join(cfgdir, value)):
|
||||
raise configexc.ValidationError(
|
||||
value, "must be a valid path relative to the config "
|
||||
"directory!")
|
||||
else:
|
||||
return
|
||||
elif not os.path.isfile(value):
|
||||
raise configexc.ValidationError(
|
||||
value, "must be an absolute path!")
|
||||
value, "must be a valid file!")
|
||||
except UnicodeEncodeError as e:
|
||||
raise configexc.ValidationError(value, e)
|
||||
|
||||
def transform(self, value):
|
||||
if not value:
|
||||
return None
|
||||
return os.path.expanduser(value)
|
||||
|
||||
|
||||
class Directory(BaseType):
|
||||
|
||||
@ -1151,6 +1169,16 @@ class UserStyleSheet(File):
|
||||
def __init__(self):
|
||||
super().__init__(none_ok=True)
|
||||
|
||||
def transform(self, value):
|
||||
if not value:
|
||||
return None
|
||||
path = super().transform(value)
|
||||
if os.path.exists(path):
|
||||
return QUrl.fromLocalFile(path)
|
||||
else:
|
||||
data = base64.b64encode(value.encode('utf-8')).decode('ascii')
|
||||
return QUrl("data:text/css;charset=utf-8;base64,{}".format(data))
|
||||
|
||||
def validate(self, value):
|
||||
if not value:
|
||||
if self._none_ok:
|
||||
@ -1160,31 +1188,17 @@ class UserStyleSheet(File):
|
||||
value = os.path.expandvars(value)
|
||||
value = os.path.expanduser(value)
|
||||
try:
|
||||
if not os.path.isabs(value):
|
||||
# probably a CSS, so we don't handle it as filename.
|
||||
# FIXME We just try if it is encodable, maybe we should
|
||||
# validate CSS?
|
||||
# https://github.com/The-Compiler/qutebrowser/issues/115
|
||||
try:
|
||||
super().validate(value)
|
||||
except configexc.ValidationError:
|
||||
try:
|
||||
if not os.path.isabs(value):
|
||||
# probably a CSS, so we don't handle it as filename.
|
||||
# FIXME We just try if it is encodable, maybe we should
|
||||
# validate CSS?
|
||||
# https://github.com/The-Compiler/qutebrowser/issues/115
|
||||
value.encode('utf-8')
|
||||
except UnicodeEncodeError as e:
|
||||
raise configexc.ValidationError(value, str(e))
|
||||
return
|
||||
elif not os.path.isfile(value):
|
||||
raise configexc.ValidationError(value, "must be a valid file!")
|
||||
except UnicodeEncodeError as e:
|
||||
raise configexc.ValidationError(value, e)
|
||||
|
||||
def transform(self, value):
|
||||
path = os.path.expandvars(value)
|
||||
path = os.path.expanduser(path)
|
||||
if not value:
|
||||
return None
|
||||
elif os.path.isabs(path):
|
||||
return QUrl.fromLocalFile(path)
|
||||
else:
|
||||
data = base64.b64encode(value.encode('utf-8')).decode('ascii')
|
||||
return QUrl("data:text/css;charset=utf-8;base64,{}".format(data))
|
||||
except UnicodeEncodeError as e:
|
||||
raise configexc.ValidationError(value, str(e))
|
||||
|
||||
|
||||
class AutoSearch(BaseType):
|
||||
|
@ -1362,6 +1362,7 @@ class TestFile:
|
||||
def test_validate_does_not_exist(self, os_path):
|
||||
"""Test validate with a file which does not exist."""
|
||||
os_path.expanduser.side_effect = lambda x: x
|
||||
os_path.expandvars.side_effect = lambda x: x
|
||||
os_path.isfile.return_value = False
|
||||
with pytest.raises(configexc.ValidationError):
|
||||
self.t.validate('foobar')
|
||||
@ -1369,26 +1370,50 @@ class TestFile:
|
||||
def test_validate_exists_abs(self, os_path):
|
||||
"""Test validate with a file which does exist."""
|
||||
os_path.expanduser.side_effect = lambda x: x
|
||||
os_path.expandvars.side_effect = lambda x: x
|
||||
os_path.isfile.return_value = True
|
||||
os_path.isabs.return_value = True
|
||||
self.t.validate('foobar')
|
||||
|
||||
def test_validate_exists_not_abs(self, os_path):
|
||||
"""Test validate with a file which does exist but is not absolute."""
|
||||
def test_validate_exists_rel(self, os_path, monkeypatch):
|
||||
"""Test validate with a relative path to an existing file."""
|
||||
monkeypatch.setattr(
|
||||
'qutebrowser.config.configtypes.standarddir.config',
|
||||
lambda: '/home/foo/.config/')
|
||||
os_path.expanduser.side_effect = lambda x: x
|
||||
os_path.expandvars.side_effect = lambda x: x
|
||||
os_path.isfile.return_value = True
|
||||
os_path.isabs.return_value = False
|
||||
self.t.validate('foobar')
|
||||
os_path.join.assert_called_once_with('/home/foo/.config/', 'foobar')
|
||||
|
||||
def test_validate_rel_config_none(self, os_path, monkeypatch):
|
||||
"""Test with a relative path and standarddir.config returning None."""
|
||||
monkeypatch.setattr(
|
||||
'qutebrowser.config.configtypes.standarddir.config', lambda: None)
|
||||
os_path.isabs.return_value = False
|
||||
with pytest.raises(configexc.ValidationError):
|
||||
self.t.validate('foobar')
|
||||
|
||||
def test_validate_expanduser(self, os_path):
|
||||
"""Test if validate expands the user correctly."""
|
||||
os_path.expanduser.side_effect = lambda x: x.replace('~', '/home/foo')
|
||||
os_path.expandvars.side_effect = lambda x: x
|
||||
os_path.isfile.side_effect = lambda path: path == '/home/foo/foobar'
|
||||
os_path.isabs.return_value = True
|
||||
self.t.validate('~/foobar')
|
||||
os_path.expanduser.assert_called_once_with('~/foobar')
|
||||
|
||||
def test_validate_expandvars(self, os_path):
|
||||
"""Test if validate expands the environment vars correctly."""
|
||||
os_path.expanduser.side_effect = lambda x: x
|
||||
os_path.expandvars.side_effect = lambda x: x.replace(
|
||||
'$HOME', '/home/foo')
|
||||
os_path.isfile.side_effect = lambda path: path == '/home/foo/foobar'
|
||||
os_path.isabs.return_value = True
|
||||
self.t.validate('$HOME/foobar')
|
||||
os_path.expandvars.assert_called_once_with('$HOME/foobar')
|
||||
|
||||
def test_validate_invalid_encoding(self, os_path, unicode_encode_err):
|
||||
"""Test validate with an invalid encoding, e.g. LC_ALL=C."""
|
||||
os_path.isfile.side_effect = unicode_encode_err
|
||||
@ -1399,6 +1424,7 @@ class TestFile:
|
||||
def test_transform(self, os_path):
|
||||
"""Test transform."""
|
||||
os_path.expanduser.side_effect = lambda x: x.replace('~', '/home/foo')
|
||||
os_path.expandvars.side_effect = lambda x: x
|
||||
assert self.t.transform('~/foobar') == '/home/foo/foobar'
|
||||
os_path.expanduser.assert_called_once_with('~/foobar')
|
||||
|
||||
@ -1930,13 +1956,21 @@ class TestUserStyleSheet:
|
||||
"""Test transform with an empty value."""
|
||||
assert self.t.transform('') is None
|
||||
|
||||
def test_transform_file(self):
|
||||
def test_transform_file(self, os_path, mocker):
|
||||
"""Test transform with a filename."""
|
||||
qurl = mocker.patch('qutebrowser.config.configtypes.QUrl',
|
||||
autospec=True)
|
||||
qurl.fromLocalFile.return_value = QUrl("file:///foo/bar")
|
||||
os_path.exists.return_value = True
|
||||
path = os.path.join(os.path.sep, 'foo', 'bar')
|
||||
assert self.t.transform(path) == QUrl("file:///foo/bar")
|
||||
|
||||
def test_transform_file_expandvars(self, monkeypatch):
|
||||
def test_transform_file_expandvars(self, os_path, monkeypatch, mocker):
|
||||
"""Test transform with a filename (expandvars)."""
|
||||
qurl = mocker.patch('qutebrowser.config.configtypes.QUrl',
|
||||
autospec=True)
|
||||
qurl.fromLocalFile.return_value = QUrl("file:///foo/bar")
|
||||
os_path.exists.return_value = True
|
||||
monkeypatch.setenv('FOO', 'foo')
|
||||
path = os.path.join(os.path.sep, '$FOO', 'bar')
|
||||
assert self.t.transform(path) == QUrl("file:///foo/bar")
|
||||
|
Loading…
Reference in New Issue
Block a user