Advertisement
Guest User

Untitled

a guest
Jun 26th, 2019
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.06 KB | None | 0 0
  1. # extension testbed
  2.  
  3. from datetime import datetime, timedelta
  4. from itertools import islice
  5. from operator import itemgetter
  6. from typing import Dict, List
  7.  
  8. from sphinx.domains import Domain
  9. from sphinx.util import logging
  10.  
  11. logger = logging.getLogger(__name__)
  12.  
  13.  
  14. class ReadingDurationDomain(Domain):
  15. name = 'duration'
  16.  
  17. @property
  18. def durations(self) -> Dict[str, timedelta]:
  19. return self.data.setdefault('durations', {})
  20.  
  21. def note_duration(self, duration: timedelta):
  22. self.durations[self.env.docname] = duration
  23.  
  24. def clear(self):
  25. self.durations.clear()
  26.  
  27. def clear_doc(self, docname: str) -> None:
  28. self.durations.pop(docname, None)
  29.  
  30. def merge_domaindata(self, docnames: List[str], otherdata: Dict[str, timedelta]) -> None:
  31. for docname, duration in otherdata.items():
  32. if docname in docnames:
  33. self.durations[docname] = duration
  34.  
  35.  
  36. def on_builder_inited(app):
  37. domain = app.env.get_domain('duration')
  38. domain.clear()
  39.  
  40.  
  41. def on_source_read(app, docname: str, content: List[str]) -> None:
  42. app.env.temp_data['started_at'] = datetime.now()
  43.  
  44.  
  45. def on_doctree_read(app, doctree):
  46. started_at = app.env.temp_data.get('started_at')
  47. duration = datetime.now() - started_at
  48. domain = app.env.get_domain('duration')
  49. domain.note_duration(duration)
  50.  
  51.  
  52. def on_build_finished(app, error):
  53. domain = app.env.get_domain('duration')
  54. durations = sorted(domain.durations.items(), key=itemgetter(1), reverse=True)
  55. if not durations:
  56. return
  57.  
  58. logger.info('')
  59. logger.info('=========================== slowest reading durations ============================')
  60. for docname, d in islice(durations, 5):
  61. logger.info('%d.%03d %s ', d.seconds, d.microseconds / 1000, docname)
  62.  
  63.  
  64. def setup(app):
  65. app.add_domain(ReadingDurationDomain)
  66. app.connect('builder-inited', on_builder_inited)
  67. app.connect('source-read', on_source_read)
  68. app.connect('doctree-read', on_doctree_read)
  69. app.connect('build-finished', on_build_finished)
  70.  
  71. return {
  72. 'parallel_read_safe': True,
  73. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement