2015-08-11 21:17:38 +02:00
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
#
|
|
|
|
# Python Telegram Bot documentation build configuration file, created by
|
|
|
|
# sphinx-quickstart on Mon Aug 10 22:25:07 2015.
|
|
|
|
#
|
|
|
|
# This file is execfile()d with the current directory set to its
|
|
|
|
# containing dir.
|
|
|
|
#
|
|
|
|
# Note that not all possible configuration values are present in this
|
|
|
|
# autogenerated file.
|
|
|
|
#
|
|
|
|
# All configuration values have a default; values that are commented out
|
|
|
|
# serve to show the default.
|
2022-05-05 09:27:54 +02:00
|
|
|
import inspect
|
|
|
|
import os
|
2022-02-09 17:30:16 +01:00
|
|
|
import re
|
2022-05-05 09:27:54 +02:00
|
|
|
import subprocess
|
2015-08-11 21:17:38 +02:00
|
|
|
import sys
|
2021-10-19 18:28:19 +02:00
|
|
|
from enum import Enum
|
2022-02-09 17:30:16 +01:00
|
|
|
from pathlib import Path
|
2021-10-19 18:28:19 +02:00
|
|
|
from typing import Tuple
|
2015-08-11 21:17:38 +02:00
|
|
|
|
|
|
|
# If extensions (or modules to document with autodoc) are in another directory,
|
|
|
|
# add these directories to sys.path here. If the directory is relative to the
|
|
|
|
# documentation root, use os.path.abspath to make it absolute, like shown here.
|
2021-10-19 18:28:19 +02:00
|
|
|
from docutils.nodes import Element
|
|
|
|
from sphinx.application import Sphinx
|
|
|
|
from sphinx.domains.python import PyXRefRole
|
|
|
|
from sphinx.environment import BuildEnvironment
|
|
|
|
from sphinx.util import logging
|
|
|
|
|
2015-08-11 21:17:38 +02:00
|
|
|
sys.path.insert(0, os.path.abspath('../..'))
|
|
|
|
|
|
|
|
# -- General configuration ------------------------------------------------
|
|
|
|
|
|
|
|
# If your documentation needs a minimal Sphinx version, state it here.
|
2022-05-05 09:27:54 +02:00
|
|
|
needs_sphinx = '4.5.0'
|
2015-08-11 21:17:38 +02:00
|
|
|
|
|
|
|
# Add any Sphinx extension module names here, as strings. They can be
|
|
|
|
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
|
|
|
|
# ones.
|
|
|
|
extensions = [
|
|
|
|
'sphinx.ext.autodoc',
|
2021-12-13 18:21:38 +01:00
|
|
|
'sphinx.ext.napoleon',
|
2022-02-09 17:30:16 +01:00
|
|
|
'sphinx.ext.intersphinx',
|
|
|
|
'sphinx.ext.linkcode',
|
|
|
|
'sphinx_paramlinks',
|
2015-08-11 21:17:38 +02:00
|
|
|
]
|
2021-12-13 18:21:38 +01:00
|
|
|
|
|
|
|
# Use intersphinx to reference the python builtin library docs
|
|
|
|
intersphinx_mapping = {
|
|
|
|
'python': ('https://docs.python.org/3', None),
|
|
|
|
'APScheduler': ('https://apscheduler.readthedocs.io/en/3.x/', None)
|
|
|
|
}
|
|
|
|
|
2021-02-19 19:07:48 +01:00
|
|
|
# Don't show type hints in the signature - that just makes it hardly readable
|
|
|
|
# and we document the types anyway
|
2021-03-14 16:46:37 +01:00
|
|
|
autodoc_typehints = 'none'
|
2015-08-11 21:17:38 +02:00
|
|
|
|
|
|
|
# Add any paths that contain templates here, relative to this directory.
|
|
|
|
templates_path = ['_templates']
|
|
|
|
|
2022-02-09 17:30:16 +01:00
|
|
|
# Fail on warnings & unresolved references etc
|
|
|
|
nitpicky = True
|
|
|
|
|
|
|
|
# Paramlink style
|
|
|
|
paramlinks_hyperlink_param = 'name'
|
|
|
|
|
|
|
|
|
2015-08-11 21:17:38 +02:00
|
|
|
# The suffix(es) of source filenames.
|
|
|
|
# You can specify multiple suffix as a list of string:
|
|
|
|
# source_suffix = ['.rst', '.md']
|
|
|
|
source_suffix = '.rst'
|
|
|
|
|
|
|
|
# The encoding of source files.
|
2021-10-19 18:28:19 +02:00
|
|
|
# source_encoding = 'utf-8-sig'
|
2015-08-11 21:17:38 +02:00
|
|
|
|
|
|
|
# The master toctree document.
|
|
|
|
master_doc = 'index'
|
|
|
|
|
|
|
|
# General information about the project.
|
2021-04-30 10:47:41 +02:00
|
|
|
project = u'python-telegram-bot'
|
2021-01-03 10:12:51 +01:00
|
|
|
copyright = u'2015-2021, Leandro Toledo'
|
2015-08-11 21:17:38 +02:00
|
|
|
author = u'Leandro Toledo'
|
|
|
|
|
|
|
|
# The version info for the project you're documenting, acts as replacement for
|
|
|
|
# |version| and |release|, also used in various other places throughout the
|
|
|
|
# built documents.
|
|
|
|
#
|
|
|
|
# The short X.Y version.
|
2022-02-02 21:16:36 +01:00
|
|
|
version = '13.11' # telegram.__version__[:3]
|
2015-08-11 21:17:38 +02:00
|
|
|
# The full version, including alpha/beta/rc tags.
|
2022-02-02 21:16:36 +01:00
|
|
|
release = '13.11' # telegram.__version__
|
2015-08-11 21:17:38 +02:00
|
|
|
|
|
|
|
# The language for content autogenerated by Sphinx. Refer to documentation
|
|
|
|
# for a list of supported languages.
|
|
|
|
#
|
|
|
|
# This is also used if you do content translation via gettext catalogs.
|
|
|
|
# Usually you set "language" from the command line for these cases.
|
|
|
|
language = None
|
|
|
|
|
|
|
|
# There are two options for replacing |today|: either, you set today to some
|
|
|
|
# non-false value, then it is used:
|
|
|
|
#today = ''
|
|
|
|
# Else, today_fmt is used as the format for a strftime call.
|
|
|
|
#today_fmt = '%B %d, %Y'
|
|
|
|
|
|
|
|
# List of patterns, relative to source directory, that match files and
|
|
|
|
# directories to ignore when looking for source files.
|
|
|
|
exclude_patterns = []
|
|
|
|
|
|
|
|
# The reST default role (used for this markup: `text`) to use for all
|
|
|
|
# documents.
|
|
|
|
#default_role = None
|
|
|
|
|
|
|
|
# If true, '()' will be appended to :func: etc. cross-reference text.
|
|
|
|
#add_function_parentheses = True
|
|
|
|
|
|
|
|
# If true, the current module name will be prepended to all description
|
|
|
|
# unit titles (such as .. function::).
|
|
|
|
#add_module_names = True
|
|
|
|
|
|
|
|
# If true, sectionauthor and moduleauthor directives will be shown in the
|
|
|
|
# output. They are ignored by default.
|
|
|
|
#show_authors = False
|
|
|
|
|
|
|
|
# The name of the Pygments (syntax highlighting) style to use.
|
|
|
|
pygments_style = 'sphinx'
|
|
|
|
|
2022-04-24 12:38:09 +02:00
|
|
|
# Decides the language used for syntax highlighting of code blocks.
|
|
|
|
highlight_language = 'python3'
|
|
|
|
|
2015-08-11 21:17:38 +02:00
|
|
|
# A list of ignored prefixes for module index sorting.
|
|
|
|
#modindex_common_prefix = []
|
|
|
|
|
|
|
|
# If true, keep warnings as "system message" paragraphs in the built documents.
|
|
|
|
#keep_warnings = False
|
|
|
|
|
|
|
|
# If true, `todo` and `todoList` produce output, else they produce nothing.
|
|
|
|
todo_include_todos = False
|
|
|
|
|
|
|
|
|
|
|
|
# -- Options for HTML output ----------------------------------------------
|
|
|
|
|
|
|
|
# The theme to use for HTML and HTML Help pages. See the documentation for
|
|
|
|
# a list of builtin themes.
|
2022-02-09 17:30:16 +01:00
|
|
|
html_theme = 'furo'
|
2015-08-11 21:17:38 +02:00
|
|
|
|
|
|
|
# Theme options are theme-specific and customize the look and feel of a theme
|
|
|
|
# further. For a list of options available for each theme, see the
|
|
|
|
# documentation.
|
2021-04-30 10:47:41 +02:00
|
|
|
html_theme_options = {
|
2022-02-09 17:30:16 +01:00
|
|
|
'navigation_with_keys': True,
|
|
|
|
'dark_css_variables': {'admonition-title-font-size': '0.95rem',
|
|
|
|
'admonition-font-size': '0.92rem'},
|
|
|
|
'light_css_variables': {'admonition-title-font-size': '0.95rem',
|
|
|
|
'admonition-font-size': '0.92rem'},
|
|
|
|
"announcement": 'PTB has undergone significant changes in v14. Please read the documentation '
|
|
|
|
'carefully and also check out the transition guide in the '
|
|
|
|
'<a href="https://github.com/python-telegram-bot/python-telegram-bot/wiki">'
|
2022-04-24 12:38:09 +02:00
|
|
|
'wiki</a>.',
|
2021-04-30 10:47:41 +02:00
|
|
|
}
|
2015-08-11 21:17:38 +02:00
|
|
|
|
|
|
|
# Add any paths that contain custom themes here, relative to this directory.
|
|
|
|
#html_theme_path = []
|
|
|
|
|
|
|
|
# The name for this set of Sphinx documents. If None, it defaults to
|
|
|
|
# "<project> v<release> documentation".
|
2022-02-09 17:30:16 +01:00
|
|
|
html_title = f"python-telegram-bot<br>v{version}"
|
2015-08-11 21:17:38 +02:00
|
|
|
|
|
|
|
# A shorter title for the navigation bar. Default is the same as html_title.
|
|
|
|
#html_short_title = None
|
|
|
|
|
|
|
|
# The name of an image file (relative to this directory) to place at the top
|
|
|
|
# of the sidebar.
|
2022-02-09 17:30:16 +01:00
|
|
|
html_logo = 'ptb-logo_1024.png'
|
2015-08-11 21:17:38 +02:00
|
|
|
|
|
|
|
# The name of an image file (within the static path) to use as favicon of the
|
|
|
|
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
|
|
|
|
# pixels large.
|
2022-02-09 17:30:16 +01:00
|
|
|
html_favicon = 'ptb-logo_1024.ico'
|
2015-08-11 21:17:38 +02:00
|
|
|
|
|
|
|
# Add any paths that contain custom static files (such as style sheets) here,
|
|
|
|
# relative to this directory. They are copied after the builtin static files,
|
|
|
|
# so a file named "default.css" will overwrite the builtin "default.css".
|
|
|
|
html_static_path = ['_static']
|
|
|
|
|
2022-02-09 17:30:16 +01:00
|
|
|
html_css_files = ['style_external_link.css']
|
|
|
|
|
2015-08-11 21:17:38 +02:00
|
|
|
# Add any extra paths that contain custom files (such as robots.txt or
|
|
|
|
# .htaccess) here, relative to this directory. These files are copied
|
|
|
|
# directly to the root of the documentation.
|
|
|
|
#html_extra_path = []
|
|
|
|
|
|
|
|
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
|
|
|
|
# using the given strftime format.
|
|
|
|
#html_last_updated_fmt = '%b %d, %Y'
|
|
|
|
|
|
|
|
# If true, SmartyPants will be used to convert quotes and dashes to
|
|
|
|
# typographically correct entities.
|
|
|
|
#html_use_smartypants = True
|
|
|
|
|
|
|
|
# Custom sidebar templates, maps document names to template names.
|
|
|
|
#html_sidebars = {}
|
|
|
|
|
|
|
|
# Additional templates that should be rendered to pages, maps page names to
|
|
|
|
# template names.
|
|
|
|
#html_additional_pages = {}
|
|
|
|
|
|
|
|
# If false, no module index is generated.
|
|
|
|
#html_domain_indices = True
|
|
|
|
|
|
|
|
# If false, no index is generated.
|
|
|
|
#html_use_index = True
|
|
|
|
|
|
|
|
# If true, the index is split into individual pages for each letter.
|
|
|
|
#html_split_index = False
|
|
|
|
|
|
|
|
# If true, links to the reST sources are added to the pages.
|
|
|
|
#html_show_sourcelink = True
|
|
|
|
|
|
|
|
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
|
|
|
|
#html_show_sphinx = True
|
|
|
|
|
|
|
|
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
|
|
|
|
#html_show_copyright = True
|
|
|
|
|
|
|
|
# If true, an OpenSearch description file will be output, and all pages will
|
|
|
|
# contain a <link> tag referring to it. The value of this option must be the
|
|
|
|
# base URL from which the finished HTML is served.
|
|
|
|
#html_use_opensearch = ''
|
|
|
|
|
|
|
|
# This is the file name suffix for HTML files (e.g. ".xhtml").
|
|
|
|
#html_file_suffix = None
|
|
|
|
|
|
|
|
# Language to be used for generating the HTML full-text search index.
|
|
|
|
# Sphinx supports the following languages:
|
|
|
|
# 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja'
|
|
|
|
# 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr'
|
|
|
|
#html_search_language = 'en'
|
|
|
|
|
|
|
|
# A dictionary with options for the search language support, empty by default.
|
|
|
|
# Now only 'ja' uses this config value
|
|
|
|
#html_search_options = {'type': 'default'}
|
|
|
|
|
|
|
|
# The name of a javascript file (relative to the configuration directory) that
|
|
|
|
# implements a search results scorer. If empty, the default will be used.
|
|
|
|
#html_search_scorer = 'scorer.js'
|
|
|
|
|
|
|
|
# Output file base name for HTML help builder.
|
2021-04-30 10:47:41 +02:00
|
|
|
htmlhelp_basename = 'python-telegram-bot-doc'
|
2015-08-11 21:17:38 +02:00
|
|
|
|
|
|
|
# -- Options for LaTeX output ---------------------------------------------
|
|
|
|
|
|
|
|
latex_elements = {
|
2016-11-01 07:54:04 +01:00
|
|
|
|
2015-08-11 21:17:38 +02:00
|
|
|
# The paper size ('letterpaper' or 'a4paper').
|
2016-11-01 07:54:04 +01:00
|
|
|
'papersize': 'a4paper',
|
2015-08-11 21:17:38 +02:00
|
|
|
|
|
|
|
# The font size ('10pt', '11pt' or '12pt').
|
|
|
|
#'pointsize': '10pt',
|
|
|
|
|
|
|
|
# Additional stuff for the LaTeX preamble.
|
2016-11-01 07:54:04 +01:00
|
|
|
'preamble': r'''\setcounter{tocdepth}{2}
|
|
|
|
\usepackage{enumitem}
|
|
|
|
\setlistdepth{99}''',
|
2015-08-11 21:17:38 +02:00
|
|
|
|
|
|
|
# Latex figure (float) alignment
|
|
|
|
#'figure_align': 'htbp',
|
|
|
|
}
|
|
|
|
|
|
|
|
# Grouping the document tree into LaTeX files. List of tuples
|
|
|
|
# (source start file, target name, title,
|
|
|
|
# author, documentclass [howto, manual, or own class]).
|
|
|
|
latex_documents = [
|
2021-04-30 10:47:41 +02:00
|
|
|
(master_doc, 'python-telegram-bot.tex', u'python-telegram-bot Documentation',
|
2016-11-01 07:54:04 +01:00
|
|
|
author, 'manual'),
|
2015-08-11 21:17:38 +02:00
|
|
|
]
|
|
|
|
|
|
|
|
# The name of an image file (relative to this directory) to place at the top of
|
|
|
|
# the title page.
|
2016-11-01 08:09:25 +01:00
|
|
|
latex_logo = 'ptb-logo_1024.png'
|
2015-08-11 21:17:38 +02:00
|
|
|
|
|
|
|
# For "manual" documents, if this is true, then toplevel headings are parts,
|
|
|
|
# not chapters.
|
|
|
|
#latex_use_parts = False
|
|
|
|
|
|
|
|
# If true, show page references after internal links.
|
|
|
|
#latex_show_pagerefs = False
|
|
|
|
|
|
|
|
# If true, show URL addresses after external links.
|
|
|
|
#latex_show_urls = False
|
|
|
|
|
|
|
|
# Documents to append as an appendix to all manuals.
|
|
|
|
#latex_appendices = []
|
|
|
|
|
|
|
|
# If false, no module index is generated.
|
|
|
|
#latex_domain_indices = True
|
|
|
|
|
|
|
|
|
|
|
|
# -- Options for manual page output ---------------------------------------
|
|
|
|
|
|
|
|
# One entry per manual page. List of tuples
|
|
|
|
# (source start file, name, description, authors, manual section).
|
|
|
|
man_pages = [
|
2021-04-30 10:47:41 +02:00
|
|
|
(master_doc, 'python-telegram-bot', u'python-telegram-bot Documentation',
|
2015-08-11 21:17:38 +02:00
|
|
|
[author], 1)
|
|
|
|
]
|
|
|
|
|
|
|
|
# If true, show URL addresses after external links.
|
|
|
|
#man_show_urls = False
|
|
|
|
|
|
|
|
|
|
|
|
# -- Options for Texinfo output -------------------------------------------
|
|
|
|
|
|
|
|
# Grouping the document tree into Texinfo files. List of tuples
|
|
|
|
# (source start file, target name, title, author,
|
|
|
|
# dir menu entry, description, category)
|
|
|
|
texinfo_documents = [
|
2021-04-30 10:47:41 +02:00
|
|
|
(master_doc, 'python-telegram-bot', u'python-telegram-bot Documentation',
|
|
|
|
author, 'python-telegram-bot', "We have made you a wrapper you can't refuse",
|
2015-08-11 21:17:38 +02:00
|
|
|
'Miscellaneous'),
|
|
|
|
]
|
|
|
|
|
|
|
|
# Documents to append as an appendix to all manuals.
|
|
|
|
#texinfo_appendices = []
|
|
|
|
|
|
|
|
# If false, no module index is generated.
|
|
|
|
#texinfo_domain_indices = True
|
|
|
|
|
|
|
|
# How to display URL addresses: 'footnote', 'no', or 'inline'.
|
|
|
|
#texinfo_show_urls = 'footnote'
|
|
|
|
|
|
|
|
# If true, do not generate a @detailmenu in the "Top" node's menu.
|
|
|
|
#texinfo_no_detailmenu = False
|
2017-06-07 12:40:09 +02:00
|
|
|
|
2019-02-18 20:04:52 +01:00
|
|
|
# Napoleon stuff
|
|
|
|
|
|
|
|
napoleon_use_admonition_for_examples = True
|
|
|
|
|
2017-06-07 12:40:09 +02:00
|
|
|
# -- script stuff --------------------------------------------------------
|
|
|
|
|
2021-10-19 18:28:19 +02:00
|
|
|
# get the sphinx(!) logger
|
|
|
|
# Makes sure logs render in red and also plays nicely with e.g. the `nitpicky` option.
|
|
|
|
sphinx_logger = logging.getLogger(__name__)
|
|
|
|
|
|
|
|
CONSTANTS_ROLE = 'tg-const'
|
|
|
|
import telegram # We need this so that the `eval` below works
|
|
|
|
|
|
|
|
|
|
|
|
class TGConstXRefRole(PyXRefRole):
|
|
|
|
"""This is a bit of Sphinx magic. We add a new role type called tg-const that allows us to
|
|
|
|
reference values from the `telegram.constants.module` while using the actual value as title
|
|
|
|
of the link.
|
|
|
|
|
|
|
|
Example:
|
|
|
|
|
|
|
|
:tg-const:`telegram.constants.MessageLimit.TEXT_LENGTH` renders as `4096` but links to the
|
|
|
|
constant.
|
|
|
|
"""
|
|
|
|
def process_link(self, env: BuildEnvironment, refnode: Element,
|
|
|
|
has_explicit_title: bool, title: str, target: str) -> Tuple[str, str]:
|
|
|
|
title, target = super().process_link(env, refnode, has_explicit_title, title, target)
|
|
|
|
try:
|
|
|
|
# We use `eval` to get the value of the expression. Maybe there are better ways to
|
|
|
|
# do this via importlib or so, but it does the job for now
|
|
|
|
value = eval(target)
|
|
|
|
# Maybe we need a better check if the target is actually from tg.constants
|
|
|
|
# for now checking if it's an Enum suffices since those are used nowhere else in PTB
|
|
|
|
if isinstance(value, Enum):
|
|
|
|
# Special casing for file size limits
|
|
|
|
if isinstance(value, telegram.constants.FileSizeLimit):
|
|
|
|
return f'{int(value.value / 1e6)} MB', target
|
|
|
|
return repr(value.value), target
|
2022-05-03 18:21:50 +02:00
|
|
|
# Just for Bot API version number auto add in constants:
|
|
|
|
if isinstance(value, str) and target == 'telegram.constants.BOT_API_VERSION':
|
|
|
|
return value, target
|
2021-10-19 18:28:19 +02:00
|
|
|
sphinx_logger.warning(
|
|
|
|
f'%s:%d: WARNING: Did not convert reference %s. :{CONSTANTS_ROLE}: is not supposed'
|
|
|
|
' to be used with this type of target.',
|
|
|
|
refnode.source,
|
|
|
|
refnode.line,
|
|
|
|
refnode.rawsource,
|
|
|
|
)
|
|
|
|
return title, target
|
|
|
|
except Exception as exc:
|
|
|
|
sphinx_logger.exception(
|
|
|
|
f'%s:%d: WARNING: Did not convert reference %s due to an exception.',
|
|
|
|
refnode.source,
|
|
|
|
refnode.line,
|
|
|
|
refnode.rawsource,
|
|
|
|
exc_info=exc
|
|
|
|
)
|
|
|
|
return title, target
|
|
|
|
|
2017-06-07 12:40:09 +02:00
|
|
|
|
|
|
|
def autodoc_skip_member(app, what, name, obj, skip, options):
|
2021-11-20 11:36:18 +01:00
|
|
|
"""We use this to not document certain members like filter() or check_update() for filters.
|
|
|
|
See https://www.sphinx-doc.org/en/master/usage/extensions/autodoc.html#skipping-members"""
|
|
|
|
|
|
|
|
included = {'MessageFilter', 'UpdateFilter'} # filter() and check_update() only for these.
|
|
|
|
included_in_obj = any(inc in repr(obj) for inc in included)
|
|
|
|
|
|
|
|
if included_in_obj: # it's difficult to see if check_update is from an inherited-member or not
|
|
|
|
for frame in inspect.stack(): # From https://github.com/sphinx-doc/sphinx/issues/9533
|
|
|
|
if frame.function == "filter_members":
|
|
|
|
docobj = frame.frame.f_locals["self"].object
|
|
|
|
if not any(inc in str(docobj) for inc in included) and name == 'check_update':
|
|
|
|
return True
|
|
|
|
break
|
|
|
|
|
|
|
|
if name == 'filter' and obj.__module__ == 'telegram.ext.filters':
|
|
|
|
if not included_in_obj:
|
|
|
|
return True # return True to exclude from docs.
|
2017-06-07 12:40:09 +02:00
|
|
|
|
|
|
|
|
2022-02-09 17:30:16 +01:00
|
|
|
# ------------------------------------------------------------------------------------------------
|
|
|
|
# This part is for getting the [source] links on the classes, methods etc link to the correct
|
|
|
|
# files & lines on github. Can be simplified once https://github.com/sphinx-doc/sphinx/issues/1556
|
|
|
|
# is closed
|
|
|
|
|
|
|
|
line_numbers = {}
|
|
|
|
file_root = Path(inspect.getsourcefile(telegram)).parent.parent.resolve()
|
|
|
|
import telegram.ext # Needed for checking if an object is a BaseFilter
|
|
|
|
|
|
|
|
|
|
|
|
def autodoc_process_docstring(app: Sphinx, what, name: str, obj: object, options, lines):
|
|
|
|
"""We misuse this autodoc hook to get the file names & line numbers because we have access
|
|
|
|
to the actual object here.
|
|
|
|
"""
|
|
|
|
# Ce can't properly handle ordinary attributes.
|
|
|
|
# In linkcode_resolve we'll resolve to the `__init__` or module instead
|
|
|
|
if what == 'attribute':
|
|
|
|
return
|
|
|
|
|
|
|
|
# Special casing for properties
|
|
|
|
if hasattr(obj, 'fget'):
|
|
|
|
obj = obj.fget
|
|
|
|
|
|
|
|
# Special casing for filters
|
|
|
|
if isinstance(obj, telegram.ext.filters.BaseFilter):
|
|
|
|
obj = obj.__class__
|
|
|
|
|
|
|
|
try:
|
|
|
|
source_lines, start_line = inspect.getsourcelines(obj)
|
|
|
|
end_line = start_line + len(source_lines)
|
|
|
|
file = Path(inspect.getsourcefile(obj)).relative_to(file_root)
|
|
|
|
line_numbers[name] = (file, start_line, end_line)
|
|
|
|
except Exception:
|
|
|
|
pass
|
|
|
|
|
|
|
|
# Since we don't document the `__init__`, we call this manually to have it available for
|
|
|
|
# attributes -- see the note above
|
|
|
|
if what == 'class':
|
|
|
|
autodoc_process_docstring(app, 'method', f'{name}.__init__', obj.__init__, options, lines)
|
|
|
|
|
|
|
|
|
|
|
|
def _git_branch() -> str:
|
|
|
|
"""Get's the current git sha if available or fall back to `master`"""
|
|
|
|
try:
|
|
|
|
output = subprocess.check_output( # skipcq: BAN-B607
|
2022-04-24 12:38:09 +02:00
|
|
|
["git", "describe", "--tags", "--always"], stderr=subprocess.STDOUT
|
2022-02-09 17:30:16 +01:00
|
|
|
)
|
|
|
|
return output.decode().strip()
|
2022-04-24 12:38:09 +02:00
|
|
|
except Exception as exc:
|
|
|
|
sphinx_logger.exception(
|
|
|
|
f'Failed to get a description of the current commit. Falling back to `master`.',
|
|
|
|
exc_info=exc
|
|
|
|
)
|
2022-02-09 17:30:16 +01:00
|
|
|
return 'master'
|
|
|
|
|
|
|
|
|
|
|
|
git_branch = _git_branch()
|
|
|
|
base_url = "https://github.com/python-telegram-bot/python-telegram-bot/blob/"
|
|
|
|
|
|
|
|
|
|
|
|
def linkcode_resolve(_, info):
|
|
|
|
"""See www.sphinx-doc.org/en/master/usage/extensions/linkcode.html"""
|
|
|
|
combined = '.'.join((info['module'], info['fullname']))
|
|
|
|
# special casing for ExtBot which is due to the special structure of extbot.rst
|
|
|
|
combined = combined.replace('ExtBot.ExtBot', 'ExtBot')
|
|
|
|
|
|
|
|
line_info = line_numbers.get(combined)
|
|
|
|
|
|
|
|
if not line_info:
|
|
|
|
# Try the __init__
|
|
|
|
line_info = line_numbers.get(f"{combined.rsplit('.', 1)[0]}.__init__")
|
|
|
|
if not line_info:
|
|
|
|
# Try the class
|
|
|
|
line_info = line_numbers.get(f"{combined.rsplit('.', 1)[0]}")
|
|
|
|
if not line_info:
|
|
|
|
# Try the module
|
|
|
|
line_info = line_numbers.get(info['module'])
|
|
|
|
|
|
|
|
if not line_info:
|
|
|
|
return
|
|
|
|
|
|
|
|
file, start_line, end_line = line_info
|
|
|
|
return f"{base_url}{git_branch}/{file}#L{start_line}-L{end_line}"
|
|
|
|
|
|
|
|
# End of logic for the [source] links
|
|
|
|
# ------------------------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
|
|
# Some base classes are implementation detail
|
|
|
|
# We want to instead show *their* base class
|
|
|
|
PRIVATE_BASE_CLASSES = {
|
|
|
|
'_ChatUserBaseFilter': 'MessageFilter',
|
|
|
|
'_Dice': 'MessageFilter',
|
|
|
|
'_BaseThumbedMedium': 'TelegramObject',
|
|
|
|
'_BaseMedium': 'TelegramObject',
|
|
|
|
'_CredentialsBase': 'TelegramObject',
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
def autodoc_process_bases(app, name, obj, option, bases: list):
|
|
|
|
"""Here we fine tune how the base class's classes are displayed."""
|
|
|
|
for idx, base in enumerate(bases):
|
|
|
|
# let's use a string representation of the object
|
|
|
|
base = str(base)
|
|
|
|
|
|
|
|
# Special case because base classes are in std lib:
|
2022-04-24 12:38:09 +02:00
|
|
|
if "StringEnum" in base == "<enum 'StringEnum'>":
|
2022-02-09 17:30:16 +01:00
|
|
|
bases[idx] = ":class:`enum.Enum`"
|
|
|
|
bases.insert(0, ':class:`str`')
|
|
|
|
continue
|
|
|
|
|
|
|
|
# Drop generics (at least for now)
|
|
|
|
if base.endswith("]"):
|
|
|
|
base = base.split("[", maxsplit=1)[0]
|
|
|
|
bases[idx] = f':class:`{base}`'
|
|
|
|
|
|
|
|
# Now convert `telegram._message.Message` to `telegram.Message` etc
|
2022-04-24 12:38:09 +02:00
|
|
|
match = re.search(pattern=r"(telegram(\.ext|))\.[_\w\.]+", string=base)
|
|
|
|
if not match or '_utils' in base:
|
|
|
|
return
|
2022-02-09 17:30:16 +01:00
|
|
|
|
2022-04-24 12:38:09 +02:00
|
|
|
parts = match.group(0).split(".")
|
2022-02-09 17:30:16 +01:00
|
|
|
|
2022-04-24 12:38:09 +02:00
|
|
|
# Remove private paths
|
|
|
|
for index, part in enumerate(parts):
|
|
|
|
if part.startswith("_"):
|
|
|
|
parts = parts[:index] + parts[-1:]
|
|
|
|
break
|
2022-02-09 17:30:16 +01:00
|
|
|
|
2022-04-24 12:38:09 +02:00
|
|
|
# Replace private base classes with their respective parent
|
|
|
|
parts = [PRIVATE_BASE_CLASSES.get(part, part) for part in parts]
|
2022-02-09 17:30:16 +01:00
|
|
|
|
2022-04-24 12:38:09 +02:00
|
|
|
base = ".".join(parts)
|
|
|
|
|
|
|
|
bases[idx] = f':class:`{base}`'
|
2022-02-09 17:30:16 +01:00
|
|
|
|
|
|
|
|
2021-10-19 18:28:19 +02:00
|
|
|
def setup(app: Sphinx):
|
2017-06-07 12:40:09 +02:00
|
|
|
app.connect('autodoc-skip-member', autodoc_skip_member)
|
2022-02-09 17:30:16 +01:00
|
|
|
app.connect('autodoc-process-bases', autodoc_process_bases)
|
|
|
|
app.connect('autodoc-process-docstring', autodoc_process_docstring)
|
2021-10-19 18:28:19 +02:00
|
|
|
app.add_role_to_domain('py', CONSTANTS_ROLE, TGConstXRefRole())
|