celerydocs.py 4.0 KB

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