comparison venv/lib/python2.7/site-packages/click/exceptions.py @ 0:d67268158946 draft

planemo upload commit a3f181f5f126803c654b3a66dd4e83a48f7e203b
author bcclaywell
date Mon, 12 Oct 2015 17:43:33 -0400
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:d67268158946
1 from ._compat import PY2, filename_to_ui, get_text_stderr
2 from .utils import echo
3
4
5 class ClickException(Exception):
6 """An exception that Click can handle and show to the user."""
7
8 #: The exit code for this exception
9 exit_code = 1
10
11 def __init__(self, message):
12 if PY2:
13 if message is not None:
14 message = message.encode('utf-8')
15 Exception.__init__(self, message)
16 self.message = message
17
18 def format_message(self):
19 return self.message
20
21 def show(self, file=None):
22 if file is None:
23 file = get_text_stderr()
24 echo('Error: %s' % self.format_message(), file=file)
25
26
27 class UsageError(ClickException):
28 """An internal exception that signals a usage error. This typically
29 aborts any further handling.
30
31 :param message: the error message to display.
32 :param ctx: optionally the context that caused this error. Click will
33 fill in the context automatically in some situations.
34 """
35 exit_code = 2
36
37 def __init__(self, message, ctx=None):
38 ClickException.__init__(self, message)
39 self.ctx = ctx
40
41 def show(self, file=None):
42 if file is None:
43 file = get_text_stderr()
44 color = None
45 if self.ctx is not None:
46 color = self.ctx.color
47 echo(self.ctx.get_usage() + '\n', file=file, color=color)
48 echo('Error: %s' % self.format_message(), file=file, color=color)
49
50
51 class BadParameter(UsageError):
52 """An exception that formats out a standardized error message for a
53 bad parameter. This is useful when thrown from a callback or type as
54 Click will attach contextual information to it (for instance, which
55 parameter it is).
56
57 .. versionadded:: 2.0
58
59 :param param: the parameter object that caused this error. This can
60 be left out, and Click will attach this info itself
61 if possible.
62 :param param_hint: a string that shows up as parameter name. This
63 can be used as alternative to `param` in cases
64 where custom validation should happen. If it is
65 a string it's used as such, if it's a list then
66 each item is quoted and separated.
67 """
68
69 def __init__(self, message, ctx=None, param=None,
70 param_hint=None):
71 UsageError.__init__(self, message, ctx)
72 self.param = param
73 self.param_hint = param_hint
74
75 def format_message(self):
76 if self.param_hint is not None:
77 param_hint = self.param_hint
78 elif self.param is not None:
79 param_hint = self.param.opts or [self.param.human_readable_name]
80 else:
81 return 'Invalid value: %s' % self.message
82 if isinstance(param_hint, (tuple, list)):
83 param_hint = ' / '.join('"%s"' % x for x in param_hint)
84 return 'Invalid value for %s: %s' % (param_hint, self.message)
85
86
87 class MissingParameter(BadParameter):
88 """Raised if click required an option or argument but it was not
89 provided when invoking the script.
90
91 .. versionadded:: 4.0
92
93 :param param_type: a string that indicates the type of the parameter.
94 The default is to inherit the parameter type from
95 the given `param`. Valid values are ``'parameter'``,
96 ``'option'`` or ``'argument'``.
97 """
98
99 def __init__(self, message=None, ctx=None, param=None,
100 param_hint=None, param_type=None):
101 BadParameter.__init__(self, message, ctx, param, param_hint)
102 self.param_type = param_type
103
104 def format_message(self):
105 if self.param_hint is not None:
106 param_hint = self.param_hint
107 elif self.param is not None:
108 param_hint = self.param.opts or [self.param.human_readable_name]
109 else:
110 param_hint = None
111 if isinstance(param_hint, (tuple, list)):
112 param_hint = ' / '.join('"%s"' % x for x in param_hint)
113
114 param_type = self.param_type
115 if param_type is None and self.param is not None:
116 param_type = self.param.param_type_name
117
118 msg = self.message
119 msg_extra = self.param.type.get_missing_message(self.param)
120 if msg_extra:
121 if msg:
122 msg += '. ' + msg_extra
123 else:
124 msg = msg_extra
125
126 return 'Missing %s%s%s%s' % (
127 param_type,
128 param_hint and ' %s' % param_hint or '',
129 msg and '. ' or '.',
130 msg or '',
131 )
132
133
134 class NoSuchOption(UsageError):
135 """Raised if click attempted to handle an option that does not
136 exist.
137
138 .. versionadded:: 4.0
139 """
140
141 def __init__(self, option_name, message=None, possibilities=None,
142 ctx=None):
143 if message is None:
144 message = 'no such option: %s' % option_name
145 UsageError.__init__(self, message, ctx)
146 self.option_name = option_name
147 self.possibilities = possibilities
148
149 def format_message(self):
150 bits = [self.message]
151 if self.possibilities:
152 if len(self.possibilities) == 1:
153 bits.append('Did you mean %s?' % self.possibilities[0])
154 else:
155 possibilities = sorted(self.possibilities)
156 bits.append('(Possible options: %s)' % ', '.join(possibilities))
157 return ' '.join(bits)
158
159
160 class BadOptionUsage(UsageError):
161 """Raised if an option is generally supplied but the use of the option
162 was incorrect. This is for instance raised if the number of arguments
163 for an option is not correct.
164
165 .. versionadded:: 4.0
166 """
167
168 def __init__(self, option_name, message, ctx=None):
169 UsageError.__init__(self, message, ctx)
170
171
172 class FileError(ClickException):
173 """Raised if a file cannot be opened."""
174
175 def __init__(self, filename, hint=None):
176 ui_filename = filename_to_ui(filename)
177 if hint is None:
178 hint = 'unknown error'
179 ClickException.__init__(self, hint)
180 self.ui_filename = ui_filename
181 self.filename = filename
182
183 def format_message(self):
184 return 'Could not open file %s: %s' % (self.ui_filename, self.message)
185
186
187 class Abort(RuntimeError):
188 """An internal signalling exception that signals Click to abort."""