Hide keyboard shortcuts

Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

# vim: ft=python fileencoding=utf-8 sts=4 sw=4 et: 

 

# Copyright 2014-2018 Florian Bruhin (The Compiler) <mail@qutebrowser.org> 

# 

# This file is part of qutebrowser. 

# 

# qutebrowser is free software: you can redistribute it and/or modify 

# it under the terms of the GNU General Public License as published by 

# the Free Software Foundation, either version 3 of the License, or 

# (at your option) any later version. 

# 

# qutebrowser is distributed in the hope that it will be useful, 

# but WITHOUT ANY WARRANTY; without even the implied warranty of 

# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 

# GNU General Public License for more details. 

# 

# You should have received a copy of the GNU General Public License 

# along with qutebrowser. If not, see <http://www.gnu.org/licenses/>. 

 

"""Exceptions related to config parsing.""" 

 

import attr 

 

from qutebrowser.utils import jinja 

 

 

class Error(Exception): 

 

"""Base exception for config-related errors.""" 

 

pass 

 

 

class BackendError(Error): 

 

"""Raised when this setting is unavailable with the current backend.""" 

 

def __init__(self, name, backend): 

super().__init__("The {} setting is not available with the {} " 

"backend!".format(name, backend.name)) 

 

 

class ValidationError(Error): 

 

"""Raised when a value for a config type was invalid. 

 

Attributes: 

value: Config value that triggered the error. 

msg: Additional error message. 

""" 

 

def __init__(self, value, msg): 

super().__init__("Invalid value '{}' - {}".format(value, msg)) 

self.option = None 

 

 

class KeybindingError(Error): 

 

"""Raised for issues with keybindings.""" 

 

 

class NoOptionError(Error): 

 

"""Raised when an option was not found.""" 

 

def __init__(self, option, *, deleted=False, renamed=None): 

if deleted: 

assert renamed is None 

suffix = ' (this option was removed from qutebrowser)' 

elif renamed is not None: 

suffix = ' (this option was renamed to {!r})'.format(renamed) 

else: 

suffix = '' 

 

super().__init__("No option {!r}{}".format(option, suffix)) 

self.option = option 

 

 

@attr.s 

class ConfigErrorDesc: 

 

"""A description of an error happening while reading the config. 

 

Attributes: 

text: The text to show. 

exception: The exception which happened. 

traceback: The formatted traceback of the exception. 

""" 

 

text = attr.ib() 

exception = attr.ib() 

traceback = attr.ib(None) 

 

def __str__(self): 

if self.traceback: 

return '{} - {}: {}'.format(self.text, 

self.exception.__class__.__name__, 

self.exception) 

return '{}: {}'.format(self.text, self.exception) 

 

def with_text(self, text): 

"""Get a new ConfigErrorDesc with the given text appended.""" 

return self.__class__(text='{} ({})'.format(self.text, text), 

exception=self.exception, 

traceback=self.traceback) 

 

 

class ConfigFileErrors(Error): 

 

"""Raised when multiple errors occurred inside the config.""" 

 

def __init__(self, basename, errors): 

super().__init__("Errors occurred while reading {}:\n{}".format( 

basename, '\n'.join(' {}'.format(e) for e in errors))) 

self.basename = basename 

self.errors = errors 

 

def to_html(self): 

"""Get the error texts as a HTML snippet.""" 

template = jinja.environment.from_string(""" 

Errors occurred while reading {{ basename }}: 

 

<ul> 

{% for error in errors %} 

<li> 

<b>{{ error.text }}</b>: {{ error.exception }} 

{% if error.traceback != none %} 

<pre> 

""".rstrip() + "\n{{ error.traceback }}" + """ 

</pre> 

{% endif %} 

</li> 

{% endfor %} 

</ul> 

""") 

return template.render(basename=self.basename, errors=self.errors)