Skip to content

Instantly share code, notes, and snippets.

@tk0miya
Created June 15, 2019 09:12
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tk0miya/388f07da7bc13f9d2b593d7110c8aa8a to your computer and use it in GitHub Desktop.
Save tk0miya/388f07da7bc13f9d2b593d7110c8aa8a to your computer and use it in GitHub Desktop.
# extension testbed
from datetime import datetime, timedelta
from itertools import islice
from operator import itemgetter
from typing import Dict, List
from sphinx.domains import Domain
from sphinx.util import logging
logger = logging.getLogger(__name__)
class ReadingDurationDomain(Domain):
name = 'duration'
@property
def durations(self) -> Dict[str, timedelta]:
return self.data.setdefault('durations', {})
def note_duration(self, duration: timedelta):
self.durations[self.env.docname] = duration
def clear(self):
self.durations.clear()
def clear_doc(self, docname: str) -> None:
self.durations.pop(docname, None)
def merge_domaindata(self, docnames: List[str], otherdata: Dict[str, timedelta]) -> None:
for docname, duration in otherdata.items():
if docname in docnames:
self.durations[docname] = duration
def on_builder_inited(app):
domain = app.env.get_domain('duration')
domain.clear()
def on_source_read(app, docname: str, content: List[str]) -> None:
app.env.temp_data['started_at'] = datetime.now()
def on_doctree_read(app, doctree):
started_at = app.env.temp_data.get('started_at')
duration = datetime.now() - started_at
domain = app.env.get_domain('duration')
domain.note_duration(duration)
def on_build_finished(app, error):
domain = app.env.get_domain('duration')
durations = sorted(domain.durations.items(), key=itemgetter(1), reverse=True)
if not durations:
return
logger.info('')
logger.info('=========================== slowest reading durations ============================')
for docname, d in islice(durations, 5):
logger.info('%d.%03d %s ', d.seconds, d.microseconds / 1000, docname)
def setup(app):
app.add_domain(ReadingDurationDomain)
app.connect('builder-inited', on_builder_inited)
app.connect('source-read', on_source_read)
app.connect('doctree-read', on_doctree_read)
app.connect('build-finished', on_build_finished)
return {
'parallel_read_safe': True,
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment