celerydocs.py 4.0 KB

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