celerydocs.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. from docutils import nodes
  2. from sphinx.environment import NoUri
  3. from sphinx.util.nodes import make_refnode
  4. ABBR = {
  5. "": "celery.app.base.Celery",
  6. "amqp": "celery.app.amqp.AMQP",
  7. "backend": "celery.backends.base.BaseBackend",
  8. "control": "celery.app.control.Control",
  9. "events": "celery.events.Events",
  10. "loader": "celery.app.loaders.base.BaseLoader",
  11. "log": "celery.app.log.Logging",
  12. "pool": "kombu.connection.ConnectionPool",
  13. "tasks": "celery.app.registry.Registry",
  14. "AsyncResult": "celery.result.AsyncResult",
  15. "TaskSetResult": "celery.result.TaskSetResult",
  16. "Worker": "celery.apps.worker.Worker",
  17. "WorkController": "celery.worker.WorkController",
  18. "Beat": "celery.apps.beat.Beat",
  19. "Task": "celery.app.task.BaseTask",
  20. }
  21. ABBR_EMPTY = {
  22. "exc": "celery.exceptions",
  23. }
  24. DEFAULT_EMPTY = "celery.app.base.Celery"
  25. def shorten(S, base):
  26. if S.startswith('@-'):
  27. return S[2:]
  28. elif S.startswith('@'):
  29. print("S: %r BASE: %r" % (S, base))
  30. return '.'.join([base, S[1:]])
  31. return S
  32. def resolve(S, type):
  33. X = S
  34. if S.startswith('@'):
  35. S = S.lstrip('@-')
  36. try:
  37. pre, rest = S.split('.', 1)
  38. except ValueError:
  39. pre, rest = '', S
  40. return '.'.join([ABBR[pre] if pre
  41. else ABBR_EMPTY.get(type, DEFAULT_EMPTY),
  42. rest])
  43. def pkg_of(module_fqdn):
  44. return module_fqdn.split('.', 1)[0]
  45. def modify_textnode(T, newtarget, node):
  46. src = node.children[0].rawsource
  47. return nodes.Text(
  48. T.lstrip('@') if '~' in src else shorten(T, pkg_of(newtarget)),
  49. src
  50. )
  51. def maybe_resolve_abbreviations(app, env, node, contnode):
  52. domainname = node.get('refdomain')
  53. target = node["reftarget"]
  54. type = node["reftype"]
  55. if target.startswith('@'):
  56. newtarget = node["reftarget"] = resolve(target, type)
  57. # shorten text if '~' is not enabled.
  58. if len(contnode) and isinstance(contnode[0], nodes.Text):
  59. contnode[0] = modify_textnode(target, newtarget, node)
  60. if domainname:
  61. try:
  62. domain = env.domains[node.get("refdomain")]
  63. except KeyError:
  64. raise NoUri
  65. return domain.resolve_xref(env, node["refdoc"], app.builder,
  66. type, newtarget,
  67. node, contnode)
  68. def setup(app):
  69. app.connect('missing-reference', maybe_resolve_abbreviations)
  70. app.add_crossref_type(
  71. directivename="setting",
  72. rolename="setting",
  73. indextemplate="pair: %s; setting",
  74. )
  75. app.add_crossref_type(
  76. directivename="sig",
  77. rolename="sig",
  78. indextemplate="pair: %s; sig",
  79. )
  80. app.add_crossref_type(
  81. directivename="state",
  82. rolename="state",
  83. indextemplate="pair: %s; state",
  84. )
  85. app.add_crossref_type(
  86. directivename="control",
  87. rolename="control",
  88. indextemplate="pair: %s; control",
  89. )
  90. app.add_crossref_type(
  91. directivename="signal",
  92. rolename="signal",
  93. indextemplate="pair: %s; signal",
  94. )