def save_traceback(app: "Sphinx") -> str: """Save the current exception's traceback in a temporary file.""" import platform import docutils import jinja2 import sphinx exc = sys.exc_info()[1] if isinstance(exc, SphinxParallelError): exc_format = '(Error in parallel process)\n' + exc.traceback else: exc_format = traceback.format_exc() fd, path = tempfile.mkstemp('.log', 'sphinx-err-') last_msgs = '' if app is not None: last_msgs = '\n'.join('# %s' % strip_colors(s).strip() for s in app.messagelog) os.write(fd, (_DEBUG_HEADER % (sphinx.__display_version__, platform.python_version(), platform.python_implementation(), docutils.__version__, docutils.__version_details__, jinja2.__version__, last_msgs)).encode()) if app is not None: for ext in app.extensions.values(): modfile = getattr(ext.module, '__file__', 'unknown') if ext.version != 'builtin': os.write(fd, ('# %s (%s) from %s\n' % (ext.name, ext.version, modfile)).encode()) os.write(fd, exc_format.encode()) os.close(fd) return path
def save_traceback(app): # type: (Any) -> unicode """Save the current exception's traceback in a temporary file.""" import sphinx import jinja2 import docutils import platform exc = sys.exc_info()[1] if isinstance(exc, SphinxParallelError): exc_format = '(Error in parallel process)\n' + exc.traceback else: exc_format = traceback.format_exc() fd, path = tempfile.mkstemp('.log', 'sphinx-err-') last_msgs = '' if app is not None: last_msgs = '\n'.join('# %s' % strip_colors(force_decode(s, 'utf-8')).strip() for s in app.messagelog) os.write(fd, (_DEBUG_HEADER % (sphinx.__display_version__, platform.python_version(), platform.python_implementation(), docutils.__version__, docutils.__version_details__, jinja2.__version__, last_msgs)).encode('utf-8')) if app is not None: for extname, extmod in iteritems(app._extensions): modfile = getattr(extmod, '__file__', 'unknown') if isinstance(modfile, bytes): modfile = modfile.decode(fs_encoding, 'replace') version = app._extension_metadata[extname]['version'] if version != 'builtin': os.write(fd, ('# %s (%s) from %s\n' % (extname, version, modfile)).encode('utf-8')) os.write(fd, exc_format.encode('utf-8')) os.close(fd) return path
def save_traceback(app): # type: (Any) -> str """Save the current exception's traceback in a temporary file.""" import sphinx import jinja2 import docutils import platform exc = sys.exc_info()[1] if isinstance(exc, SphinxParallelError): exc_format = '(Error in parallel process)\n' + exc.traceback else: exc_format = traceback.format_exc() fd, path = tempfile.mkstemp('.log', 'sphinx-err-') last_msgs = '' if app is not None: last_msgs = '\n'.join( '# %s' % strip_colors(s).strip() for s in app.messagelog) os.write(fd, (_DEBUG_HEADER % (sphinx.__display_version__, platform.python_version(), platform.python_implementation(), docutils.__version__, docutils.__version_details__, jinja2.__version__, # type: ignore last_msgs)).encode()) if app is not None: for ext in app.extensions.values(): modfile = getattr(ext.module, '__file__', 'unknown') if ext.version != 'builtin': os.write(fd, ('# %s (%s) from %s\n' % (ext.name, ext.version, modfile)).encode()) os.write(fd, exc_format.encode()) os.close(fd) return path
def save_traceback(app): """Save the current exception's traceback in a temporary file.""" import platform exc = sys.exc_info()[1] if isinstance(exc, SphinxParallelError): exc_format = '(Error in parallel process)\n' + exc.traceback else: exc_format = traceback.format_exc() fd, path = tempfile.mkstemp('.log', 'sphinx-err-') last_msgs = '' if app is not None: last_msgs = '\n'.join( '# %s' % strip_colors(force_decode(s, 'utf-8')).strip() for s in app.messagelog) os.write(fd, (_DEBUG_HEADER % (sphinx.__display_version__, platform.python_version(), platform.python_implementation(), docutils.__version__, docutils.__version_details__, jinja2.__version__, last_msgs)).encode('utf-8')) if app is not None: for extname, extmod in iteritems(app._extensions): modfile = getattr(extmod, '__file__', 'unknown') if isinstance(modfile, bytes): modfile = modfile.decode(fs_encoding, 'replace') os.write(fd, ('# %s (%s) from %s\n' % ( extname, app._extension_metadata[extname]['version'], modfile)).encode('utf-8')) os.write(fd, exc_format.encode('utf-8')) os.close(fd) return path
def test_too_many_requests_retry_after_int_delay(app, capsys, status): with http_server(make_retry_after_handler([(429, "0"), (200, None)])), \ mock.patch("sphinx.builders.linkcheck.DEFAULT_DELAY", 0), \ mock.patch("sphinx.builders.linkcheck.QUEUE_POLL_SECS", 0.01): app.build() content = (app.outdir / 'output.json').read_text() assert json.loads(content) == { "filename": "index.rst", "lineno": 1, "status": "working", "code": 0, "uri": "http://localhost:7777/", "info": "", } rate_limit_log = "-rate limited- http://localhost:7777/ | sleeping...\n" assert rate_limit_log in strip_colors(status.getvalue()) _stdout, stderr = capsys.readouterr() assert stderr == textwrap.dedent("""\ 127.0.0.1 - - [] "HEAD / HTTP/1.1" 429 - 127.0.0.1 - - [] "HEAD / HTTP/1.1" 200 - """)