Skip to content

Commit c7eaf17

Browse files
authored
linkcheck: Use pattern matching for redirected requests (sphinx-doc#13206)
1 parent 0fbf88a commit c7eaf17

File tree

1 file changed

+28
-23
lines changed

1 file changed

+28
-23
lines changed

sphinx/builders/linkcheck.py

Lines changed: 28 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -99,13 +99,14 @@ def finish(self) -> None:
9999

100100
def process_result(self, result: CheckResult) -> None:
101101
filename = self.env.doc2path(result.docname, False)
102+
res_uri = result.uri
102103

103104
linkstat: dict[str, str | int | _Status] = {
104105
'filename': str(filename),
105106
'lineno': result.lineno,
106107
'status': result.status,
107108
'code': result.code,
108-
'uri': result.uri,
109+
'uri': res_uri,
109110
'info': result.message,
110111
}
111112
self.write_linkstat(linkstat)
@@ -119,71 +120,75 @@ def process_result(self, result: CheckResult) -> None:
119120
pass
120121
case _Status.IGNORED:
121122
if result.message:
122-
msg = f'{result.uri}: {result.message}'
123+
msg = f'{res_uri}: {result.message}'
123124
else:
124-
msg = result.uri
125+
msg = res_uri
125126
logger.info(darkgray('-ignored- ') + msg)
126127
case _Status.WORKING:
127-
logger.info(darkgreen('ok ') + f'{result.uri}{result.message}')
128+
logger.info(darkgreen('ok ') + f'{res_uri}{result.message}')
128129
case _Status.TIMEOUT:
129130
if self.app.quiet:
130-
msg = 'timeout ' + f'{result.uri}{result.message}'
131+
msg = 'timeout ' + f'{res_uri}{result.message}'
131132
logger.warning(msg, location=(result.docname, result.lineno))
132133
else:
133-
msg = red('timeout ') + result.uri + red(f' - {result.message}')
134+
msg = red('timeout ') + res_uri + red(f' - {result.message}')
134135
logger.info(msg)
135136
self.write_entry(
136137
_Status.TIMEOUT,
137138
result.docname,
138139
filename,
139140
result.lineno,
140-
f'{result.uri}: {result.message}',
141+
f'{res_uri}: {result.message}',
141142
)
142143
self.timed_out_hyperlinks += 1
143144
case _Status.BROKEN:
144145
if self.app.quiet:
145146
logger.warning(
146147
__('broken link: %s (%s)'),
147-
result.uri,
148+
res_uri,
148149
result.message,
149150
location=(result.docname, result.lineno),
150151
)
151152
else:
152-
msg = red('broken ') + result.uri + red(f' - {result.message}')
153+
msg = red('broken ') + res_uri + red(f' - {result.message}')
153154
logger.info(msg)
154155
self.write_entry(
155156
_Status.BROKEN,
156157
result.docname,
157158
filename,
158159
result.lineno,
159-
f'{result.uri}: {result.message}',
160+
f'{res_uri}: {result.message}',
160161
)
161162
self.broken_hyperlinks += 1
162163
case _Status.REDIRECTED:
163-
try:
164-
text, color = {
165-
301: ('permanently', purple),
166-
302: ('with Found', purple),
167-
303: ('with See Other', purple),
168-
307: ('temporarily', turquoise),
169-
308: ('permanently', purple),
170-
}[result.code]
171-
except KeyError:
172-
text, color = ('with unknown code', purple)
164+
match result.code:
165+
case 301:
166+
text = 'permanently'
167+
case 302:
168+
text = 'with Found'
169+
case 303:
170+
text = 'with See Other'
171+
case 307:
172+
text = 'temporarily'
173+
case 308:
174+
text = 'permanently'
175+
case _:
176+
text = 'with unknown code'
173177
linkstat['text'] = text
174178
redirection = f'{text} to {result.message}'
175179
if self.config.linkcheck_allowed_redirects:
176-
msg = f'redirect {result.uri} - {redirection}'
180+
msg = f'redirect {res_uri} - {redirection}'
177181
logger.warning(msg, location=(result.docname, result.lineno))
178182
else:
179-
msg = color('redirect ') + result.uri + color(' - ' + redirection)
183+
colour = turquoise if result.code == 307 else purple
184+
msg = colour('redirect ') + res_uri + colour(f' - {redirection}')
180185
logger.info(msg)
181186
self.write_entry(
182187
f'redirected {text}',
183188
result.docname,
184189
filename,
185190
result.lineno,
186-
f'{result.uri} to {result.message}',
191+
f'{res_uri} to {result.message}',
187192
)
188193
case _Status.UNKNOWN:
189194
msg = 'Unknown status.'

0 commit comments

Comments
 (0)