1
Fork 0
mirror of https://github.com/RGBCube/GitHubWrapper synced 2025-05-14 21:24:59 +00:00

Cleaned up docs/

- Linted
- Changed Github-Api-Wrapper to GitHub-API-Wrapper
This commit is contained in:
RGBCube 2022-06-25 14:07:43 +03:00
parent a33985c69b
commit f6b9852167
10 changed files with 219 additions and 174 deletions

View file

@ -1,7 +1,7 @@
MIT License MIT License
Copyright (c) 2015-2022 Rapptz Copyright (c) 2015-2022 Rapptz
Copyright (c) 2022-present VarMonke and sudosnok Copyright (c) 2022-present VarMonke, sudosnok & contributors
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal

View file

@ -58,8 +58,8 @@
{#- The main navigation header #} {#- The main navigation header #}
<header class="grid-item"> <header class="grid-item">
<nav> <nav>
<a href="{{ pathto(master_doc)|e }}" class="main-heading">Github-API-Wrapper</a> <a href="{{ pathto(master_doc)|e }}" class="main-heading">GitHub-API-Wrapper</a>
<a href="https://github.com/VarMonke/Github-API-Wrapper" title="GitHub"><span class="material-icons custom-icons">github</span></a> <a href="https://github.com/Varmonke/GitHub-API-Wrapper" title="GitHub"><span class="material-icons custom-icons">github</span></a>
<a href="{{ discord_invite }}" title="{{ _('Discord') }}"><span class="material-icons custom-icons">discord</span></a> <a href="{{ discord_invite }}" title="{{ _('Discord') }}"><span class="material-icons custom-icons">discord</span></a>
<a href="{{ pathto('faq') }}" title="FAQ"><span class="material-icons">help_center</span></a> <a href="{{ pathto('faq') }}" title="FAQ"><span class="material-icons">help_center</span></a>
{#- If we have more links we can put them here #} {#- If we have more links we can put them here #}

View file

@ -6,8 +6,8 @@ import sys
# If extensions (or modules to document with autodoc) are in another directory, # 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 # 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. # documentation root, use os.path.abspath to make it absolute, like shown here.
sys.path.insert(0, os.path.abspath('..')) sys.path.insert(0, os.path.abspath(".."))
sys.path.append(os.path.abspath('extensions')) sys.path.append(os.path.abspath("extensions"))
# -- General configuration ------------------------------------------------ # -- General configuration ------------------------------------------------
@ -18,34 +18,34 @@ sys.path.append(os.path.abspath('extensions'))
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones. # ones.
extensions = [ extensions = [
'builder', "builder",
'sphinx.ext.autodoc', "sphinx.ext.autodoc",
'sphinx.ext.extlinks', "sphinx.ext.extlinks",
'sphinx.ext.intersphinx', "sphinx.ext.intersphinx",
'sphinx.ext.napoleon', "sphinx.ext.napoleon",
'sphinxcontrib_trio', "sphinxcontrib_trio",
'details', "details",
'exception_hierarchy', "exception_hierarchy",
'attributetable', "attributetable",
'resourcelinks', "resourcelinks",
'nitpick_file_ignorer', "nitpick_file_ignorer",
] ]
autodoc_member_order = 'bysource' autodoc_member_order = "bysource"
autodoc_typehints = 'none' autodoc_typehints = "none"
# autodoc_mock_imports = ['sphinxcontrib_trio','sphinxcontrib-serializinghtml','sphinxcontrib-qthelp','sphinxcontrib-jsmath','sphinxcontrib-htmlhelp','sphinxcontrib-devhelp','sphinxcontrib-applehelp ','typing_extensions'] # autodoc_mock_imports = ['sphinxcontrib_trio','sphinxcontrib-serializinghtml','sphinxcontrib-qthelp','sphinxcontrib-jsmath','sphinxcontrib-htmlhelp','sphinxcontrib-devhelp','sphinxcontrib-applehelp ','typing_extensions']
# maybe consider this? # maybe consider this?
# napoleon_attr_annotations = False # napoleon_attr_annotations = False
extlinks = { extlinks = {
'issue': ('https://github.com/VarMonke/Github-Api-Wrapper/issues/%s', 'GH-'), "issue": ("https://github.com/Varmonke/GitHub-API-Wrapper/issues/%s", "GH-"),
} }
# Links used for cross-referencing stuff in other documentation # Links used for cross-referencing stuff in other documentation
intersphinx_mapping = { intersphinx_mapping = {
'py': ('https://docs.python.org/3', None), "py": ("https://docs.python.org/3", None),
'aio': ('https://docs.aiohttp.org/en/stable/', None), "aio": ("https://docs.aiohttp.org/en/stable/", None),
'req': ('https://docs.python-requests.org/en/latest/', None), "req": ("https://docs.python-requests.org/en/latest/", None),
} }
rst_prolog = """ rst_prolog = """
@ -56,20 +56,20 @@ rst_prolog = """
""" """
# Add any paths that contain templates here, relative to this directory. # Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates'] templates_path = ["_templates"]
# The suffix of source filenames. # The suffix of source filenames.
source_suffix = '.rst' source_suffix = ".rst"
# The encoding of source files. # The encoding of source files.
# source_encoding = 'utf-8-sig' # source_encoding = 'utf-8-sig'
# The master toctree document. # The master toctree document.
master_doc = 'index' master_doc = "index"
# General information about the project. # General information about the project.
project = 'Github-API-Wrapper' project = "GitHub-API-Wrapper"
copyright = '2022 - Present, VarMonke & sudosnok' copyright = "2022-present, VarMonke, sudosnok & contributors"
# The version info for the project you're documenting, acts as replacement for # The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the # |version| and |release|, also used in various other places throughout the
@ -77,15 +77,15 @@ copyright = '2022 - Present, VarMonke & sudosnok'
# #
# The short X.Y version. # The short X.Y version.
version = '' version = ""
with open('../github/__init__.py') as f: with open("../github/__init__.py") as f:
version = re.search(r'^__version__\s*=\s*[\'"]([^\'"]*)[\'"]', f.read(), re.MULTILINE).group(1) # type: ignore version = re.search(r'^__version__\s*=\s*[\'"]([^\'"]*)[\'"]', f.read(), re.MULTILINE).group(1) # type: ignore
# The full version, including alpha/beta/rc tags. # The full version, including alpha/beta/rc tags.
release = version release = version
# This assumes a tag is available for final releases # This assumes a tag is available for final releases
branch = 'master' if version.endswith('a') else f"v{version}" branch = "master" if version.endswith("a") else f"v{version}"
# The language for content autogenerated by Sphinx. Refer to documentation # The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages. # for a list of supported languages.
@ -94,7 +94,7 @@ branch = 'master' if version.endswith('a') else f"v{version}"
# Usually you set "language" from the command line for these cases. # Usually you set "language" from the command line for these cases.
language = None language = None
locale_dirs = ['locale/'] locale_dirs = ["locale/"]
gettext_compact = False gettext_compact = False
# There are two options for replacing |today|: either, you set today to some # There are two options for replacing |today|: either, you set today to some
@ -105,7 +105,7 @@ gettext_compact = False
# List of patterns, relative to source directory, that match files and # List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files. # directories to ignore when looking for source files.
exclude_patterns = ['_build'] exclude_patterns = ["_build"]
# The reST default role (used for this markup: `text`) to use for all # The reST default role (used for this markup: `text`) to use for all
# documents. # documents.
@ -123,7 +123,7 @@ exclude_patterns = ['_build']
# show_authors = False # show_authors = False
# The name of the Pygments (syntax highlighting) style to use. # The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'friendly' pygments_style = "friendly"
# A list of ignored prefixes for module index sorting. # A list of ignored prefixes for module index sorting.
# modindex_common_prefix = [] # modindex_common_prefix = []
@ -136,13 +136,13 @@ pygments_style = 'friendly'
def _i18n_warning_filter(record: logging.LogRecord) -> bool: def _i18n_warning_filter(record: logging.LogRecord) -> bool:
return not record.msg.startswith( return not record.msg.startswith(
( (
'inconsistent references in translated message', "inconsistent references in translated message",
'inconsistent term references in translated message', "inconsistent term references in translated message",
) )
) )
_i18n_logger = logging.getLogger('sphinx') _i18n_logger = logging.getLogger("sphinx")
_i18n_logger.addFilter(_i18n_warning_filter) _i18n_logger.addFilter(_i18n_warning_filter)
# -- Options for HTML output ---------------------------------------------- # -- Options for HTML output ----------------------------------------------
@ -151,21 +151,21 @@ html_experimental_html5_writer = True
# The theme to use for HTML and HTML Help pages. See the documentation for # The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes. # a list of builtin themes.
html_theme = 'basic' html_theme = "basic"
html_context = { html_context = {
'discord_invite': 'https://discord.gg/r3sSKJJ', "discord_invite": "https://discord.gg/r3sSKJJ",
'discord_extensions': [ "discord_extensions": [
('discord.ext.commands', 'ext/commands'), ("discord.ext.commands", "ext/commands"),
('discord.ext.tasks', 'ext/tasks'), ("discord.ext.tasks", "ext/tasks"),
], ],
} }
resource_links = { resource_links = {
'discord': 'https://discord.gg/W2SDTtMrZA', "discord": "https://discord.gg/W2SDTtMrZA",
'issues': 'https://github.com/VarMonke/Github-Api-Wrapper/issues', "issues": "https://github.com/Varmonke/GitHub-API-Wrapper/issues",
'discussions': 'https://github.com/VarMonke/Github-Api-Wrapper/discussions', "discussions": "https://github.com/Varmonke/GitHub-API-Wrapper/discussions",
'examples': f'https://github.com/VarMonke/Github-Api-Wrapper/examples', "examples": f"https://github.com/Varmonke/GitHub-API-Wrapper/examples",
} }
# Theme options are theme-specific and customize the look and feel of a theme # Theme options are theme-specific and customize the look and feel of a theme
@ -191,12 +191,12 @@ resource_links = {
# The name of an image file (within the static path) to use as favicon of the # 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 # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
# pixels large. # pixels large.
html_favicon = './images/icon.ico' html_favicon = "./images/icon.ico"
# Add any paths that contain custom static files (such as style sheets) here, # 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, # relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css". # so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['_static'] html_static_path = ["_static"]
# Add any extra paths that contain custom files (such as robots.txt or # Add any extra paths that contain custom files (such as robots.txt or
# .htaccess) here, relative to this directory. These files are copied # .htaccess) here, relative to this directory. These files are copied
@ -256,12 +256,12 @@ html_static_path = ['_static']
# The name of a javascript file (relative to the configuration directory) that # The name of a javascript file (relative to the configuration directory) that
# implements a search results scorer. If empty, the default will be used. # implements a search results scorer. If empty, the default will be used.
html_search_scorer = '_static/scorer.js' html_search_scorer = "_static/scorer.js"
html_js_files = ['custom.js', 'settings.js', 'copy.js', 'sidebar.js'] html_js_files = ["custom.js", "settings.js", "copy.js", "sidebar.js"]
# Output file base name for HTML help builder. # Output file base name for HTML help builder.
htmlhelp_basename = 'Github-API-Wrapper.doc' htmlhelp_basename = "GitHub-API-Wrapper.doc"
# -- Options for LaTeX output --------------------------------------------- # -- Options for LaTeX output ---------------------------------------------
@ -280,7 +280,13 @@ latex_elements = {
# (source start file, target name, title, # (source start file, target name, title,
# author, documentclass [howto, manual, or own class]). # author, documentclass [howto, manual, or own class]).
latex_documents = [ latex_documents = [
('index', 'Github-API-Wrapper.tex', 'Github-API-Wrapper Documentation', 'VarMonke & sudosnok', 'manual'), (
"index",
"GitHub-API-Wrapper.tex",
"GitHub-API-Wrapper Documentation",
"VarMonke, sudosnok & contributors",
"manual",
),
] ]
# The name of an image file (relative to this directory) to place at the top of # The name of an image file (relative to this directory) to place at the top of
@ -308,7 +314,15 @@ latex_documents = [
# One entry per manual page. List of tuples # One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section). # (source start file, name, description, authors, manual section).
man_pages = [('index', 'Github-API-Wrapper', 'Github-API-Wrapper Documentation', ['VarMonke & sudosnok'], 1)] man_pages = [
(
"index",
"GitHub-API-Wrapper",
"GitHub-API-Wrapper Documentation",
["VarMonke, sudosnok & contributors"],
1,
)
]
# If true, show URL addresses after external links. # If true, show URL addresses after external links.
# man_show_urls = False # man_show_urls = False
@ -321,13 +335,13 @@ man_pages = [('index', 'Github-API-Wrapper', 'Github-API-Wrapper Documentation',
# dir menu entry, description, category) # dir menu entry, description, category)
texinfo_documents = [ texinfo_documents = [
( (
'index', "index",
'Github-API-Wrapper', "GitHub-API-Wrapper",
'Github-API-Wrapper Documentation', "GitHub-API-Wrapper Documentation",
'VarMonke & sudosnok', "VarMonke, sudosnok & contributors",
'Github-API-Wrapper', "GitHub-API-Wrapper",
'One line description of project.', "One line description of project.",
'Miscellaneous', "Miscellaneous",
), ),
] ]
@ -345,7 +359,7 @@ texinfo_documents = [
def setup(app): def setup(app):
if app.config.language == 'ja': if app.config.language == "ja":
app.config.intersphinx_mapping['py'] = ('https://docs.python.org/ja/3', None) app.config.intersphinx_mapping["py"] = ("https://docs.python.org/ja/3", None)
app.config.html_context['discord_invite'] = 'W2SDTtMrZA' app.config.html_context["discord_invite"] = "W2SDTtMrZA"
app.config.resource_links['discord'] = 'W2SDTtMrZA' app.config.resource_links["discord"] = "W2SDTtMrZA"

View file

@ -42,51 +42,51 @@ class attributetable_item(nodes.Part, nodes.Element):
def visit_attributetable_node(self: DPYHTML5Translator, node: attributetable) -> None: def visit_attributetable_node(self: DPYHTML5Translator, node: attributetable) -> None:
class_ = node['python-class'] class_ = node["python-class"]
self.body.append(f'<div class="py-attribute-table" data-move-to-id="{class_}">') self.body.append(f'<div class="py-attribute-table" data-move-to-id="{class_}">')
def visit_attributetablecolumn_node(self: DPYHTML5Translator, node: attributetablecolumn) -> None: def visit_attributetablecolumn_node(self: DPYHTML5Translator, node: attributetablecolumn) -> None:
self.body.append(self.starttag(node, 'div', CLASS='py-attribute-table-column')) self.body.append(self.starttag(node, "div", CLASS="py-attribute-table-column"))
def visit_attributetabletitle_node(self: DPYHTML5Translator, node: attributetabletitle) -> None: def visit_attributetabletitle_node(self: DPYHTML5Translator, node: attributetabletitle) -> None:
self.body.append(self.starttag(node, 'span')) self.body.append(self.starttag(node, "span"))
def visit_attributetablebadge_node(self: DPYHTML5Translator, node: attributetablebadge) -> None: def visit_attributetablebadge_node(self: DPYHTML5Translator, node: attributetablebadge) -> None:
attributes = { attributes = {
'class': 'py-attribute-table-badge', "class": "py-attribute-table-badge",
'title': node['badge-type'], "title": node["badge-type"],
} }
self.body.append(self.starttag(node, 'span', **attributes)) self.body.append(self.starttag(node, "span", **attributes))
def visit_attributetable_item_node(self: DPYHTML5Translator, node: attributetable_item) -> None: def visit_attributetable_item_node(self: DPYHTML5Translator, node: attributetable_item) -> None:
self.body.append(self.starttag(node, 'li', CLASS='py-attribute-table-entry')) self.body.append(self.starttag(node, "li", CLASS="py-attribute-table-entry"))
def depart_attributetable_node(self: DPYHTML5Translator, node: attributetable) -> None: def depart_attributetable_node(self: DPYHTML5Translator, node: attributetable) -> None:
self.body.append('</div>') self.body.append("</div>")
def depart_attributetablecolumn_node(self: DPYHTML5Translator, node: attributetablecolumn) -> None: def depart_attributetablecolumn_node(self: DPYHTML5Translator, node: attributetablecolumn) -> None:
self.body.append('</div>') self.body.append("</div>")
def depart_attributetabletitle_node(self: DPYHTML5Translator, node: attributetabletitle) -> None: def depart_attributetabletitle_node(self: DPYHTML5Translator, node: attributetabletitle) -> None:
self.body.append('</span>') self.body.append("</span>")
def depart_attributetablebadge_node(self: DPYHTML5Translator, node: attributetablebadge) -> None: def depart_attributetablebadge_node(self: DPYHTML5Translator, node: attributetablebadge) -> None:
self.body.append('</span>') self.body.append("</span>")
def depart_attributetable_item_node(self: DPYHTML5Translator, node: attributetable_item) -> None: def depart_attributetable_item_node(self: DPYHTML5Translator, node: attributetable_item) -> None:
self.body.append('</li>') self.body.append("</li>")
_name_parser_regex = re.compile(r'(?P<module>[\w.]+\.)?(?P<name>\w+)') _name_parser_regex = re.compile(r"(?P<module>[\w.]+\.)?(?P<name>\w+)")
class PyAttributeTable(SphinxDirective): class PyAttributeTable(SphinxDirective):
@ -99,16 +99,18 @@ class PyAttributeTable(SphinxDirective):
def parse_name(self, content: str) -> Tuple[str, str]: def parse_name(self, content: str) -> Tuple[str, str]:
match = _name_parser_regex.match(content) match = _name_parser_regex.match(content)
if match is None: if match is None:
raise RuntimeError(f"content {content} somehow doesn't match regex in {self.env.docname}.") raise RuntimeError(
f"content {content} somehow doesn't match regex in {self.env.docname}."
)
path, name = match.groups() path, name = match.groups()
if path: if path:
modulename = path.rstrip('.') modulename = path.rstrip(".")
else: else:
modulename = self.env.temp_data.get('autodoc:module') modulename = self.env.temp_data.get("autodoc:module")
if not modulename: if not modulename:
modulename = self.env.ref_context.get('py:module') modulename = self.env.ref_context.get("py:module")
if modulename is None: if modulename is None:
raise RuntimeError(f'modulename somehow None for {content} in {self.env.docname}.') raise RuntimeError(f"modulename somehow None for {content} in {self.env.docname}.")
return modulename, name return modulename, name
@ -140,12 +142,12 @@ class PyAttributeTable(SphinxDirective):
replaced. replaced.
""" """
content = self.arguments[0].strip() content = self.arguments[0].strip()
node = attributetableplaceholder('') node = attributetableplaceholder("")
modulename, name = self.parse_name(content) modulename, name = self.parse_name(content)
node['python-doc'] = self.env.docname node["python-doc"] = self.env.docname
node['python-module'] = modulename node["python-module"] = modulename
node['python-class'] = name node["python-class"] = name
node['python-full-name'] = f'{modulename}.{name}' node["python-full-name"] = f"{modulename}.{name}"
return [node] return [node]
@ -153,20 +155,20 @@ def build_lookup_table(env: Optional[BuildEnvironment]) -> Dict[str, List[str]]:
# Given an environment, load up a lookup table of # Given an environment, load up a lookup table of
# full-class-name: objects # full-class-name: objects
result = {} result = {}
domain = env.domains['py'] # type: ignore domain = env.domains["py"] # type: ignore
ignored = { ignored = {
'data', "data",
'exception', "exception",
'module', "module",
'class', "class",
} }
for fullname, _, objtype, docname, _, _ in domain.get_objects(): for fullname, _, objtype, docname, _, _ in domain.get_objects():
if objtype in ignored: if objtype in ignored:
continue continue
classname, _, child = fullname.rpartition('.') classname, _, child = fullname.rpartition(".")
try: try:
result[classname].append(child) result[classname].append(child)
except KeyError: except KeyError:
@ -186,15 +188,19 @@ def process_attributetable(app: Sphinx, doctree: nodes.Node, fromdocname: str) -
lookup = build_lookup_table(env) lookup = build_lookup_table(env)
for node in doctree.traverse(attributetableplaceholder): for node in doctree.traverse(attributetableplaceholder):
modulename, classname, fullname = node['python-module'], node['python-class'], node['python-full-name'] modulename, classname, fullname = (
node["python-module"],
node["python-class"],
node["python-full-name"],
)
groups = get_class_results(lookup, modulename, classname, fullname) groups = get_class_results(lookup, modulename, classname, fullname)
table = attributetable('') table = attributetable("")
for label, subitems in groups.items(): for label, subitems in groups.items():
if not subitems: if not subitems:
continue continue
table.append(class_results_to_node(label, sorted(subitems, key=lambda c: c.label))) table.append(class_results_to_node(label, sorted(subitems, key=lambda c: c.label)))
table['python-class'] = fullname table["python-class"] = fullname
if not table: if not table:
node.replace_self([]) node.replace_self([])
@ -209,8 +215,8 @@ def get_class_results(
cls = getattr(module, name) cls = getattr(module, name)
groups: Dict[str, List[TableElement]] = { groups: Dict[str, List[TableElement]] = {
_('Attributes'): [], _("Attributes"): [],
_('Methods'): [], _("Methods"): [],
} }
try: try:
@ -219,8 +225,8 @@ def get_class_results(
return groups return groups
for attr in members: for attr in members:
attrlookup = f'{fullname}.{attr}' attrlookup = f"{fullname}.{attr}"
key = _('Attributes') key = _("Attributes")
badge = None badge = None
label = attr label = attr
value = None value = None
@ -231,30 +237,30 @@ def get_class_results(
break break
if value is not None: if value is not None:
doc = value.__doc__ or '' doc = value.__doc__ or ""
if inspect.iscoroutinefunction(value) or doc.startswith('|coro|'): if inspect.iscoroutinefunction(value) or doc.startswith("|coro|"):
key = _('Methods') key = _("Methods")
badge = attributetablebadge('async', 'async') badge = attributetablebadge("async", "async")
badge['badge-type'] = _('coroutine') badge["badge-type"] = _("coroutine")
elif isinstance(value, classmethod): elif isinstance(value, classmethod):
key = _('Methods') key = _("Methods")
label = f'{name}.{attr}' label = f"{name}.{attr}"
badge = attributetablebadge('cls', 'cls') badge = attributetablebadge("cls", "cls")
badge['badge-type'] = _('classmethod') badge["badge-type"] = _("classmethod")
elif inspect.isfunction(value): elif inspect.isfunction(value):
if doc.startswith(('A decorator', 'A shortcut decorator')): if doc.startswith(("A decorator", "A shortcut decorator")):
# finicky but surprisingly consistent # finicky but surprisingly consistent
key = _('Methods') key = _("Methods")
badge = attributetablebadge('@', '@') badge = attributetablebadge("@", "@")
badge['badge-type'] = _('decorator') badge["badge-type"] = _("decorator")
elif inspect.isasyncgenfunction(value): elif inspect.isasyncgenfunction(value):
key = _('Methods') key = _("Methods")
badge = attributetablebadge('async for', 'async for') badge = attributetablebadge("async for", "async for")
badge['badge-type'] = _('async iterable') badge["badge-type"] = _("async iterable")
else: else:
key = _('Methods') key = _("Methods")
badge = attributetablebadge('def', 'def') badge = attributetablebadge("def", "def")
badge['badge-type'] = _('method') badge["badge-type"] = _("method")
groups[key].append(TableElement(fullname=attrlookup, label=label, badge=badge)) groups[key].append(TableElement(fullname=attrlookup, label=label, badge=badge))
@ -263,26 +269,40 @@ def get_class_results(
def class_results_to_node(key: str, elements: Sequence[TableElement]) -> attributetablecolumn: def class_results_to_node(key: str, elements: Sequence[TableElement]) -> attributetablecolumn:
title = attributetabletitle(key, key) title = attributetabletitle(key, key)
ul = nodes.bullet_list('') ul = nodes.bullet_list("")
for element in elements: for element in elements:
ref = nodes.reference( ref = nodes.reference(
'', '', internal=True, refuri=f'#{element.fullname}', anchorname='', *[nodes.Text(element.label)] "",
"",
internal=True,
refuri=f"#{element.fullname}",
anchorname="",
*[nodes.Text(element.label)],
) )
para = addnodes.compact_paragraph('', '', ref) para = addnodes.compact_paragraph("", "", ref)
if element.badge is not None: if element.badge is not None:
ul.append(attributetable_item('', element.badge, para)) ul.append(attributetable_item("", element.badge, para))
else: else:
ul.append(attributetable_item('', para)) ul.append(attributetable_item("", para))
return attributetablecolumn('', title, ul) return attributetablecolumn("", title, ul)
def setup(app: Sphinx) -> None: def setup(app: Sphinx) -> None:
app.add_directive('attributetable', PyAttributeTable) app.add_directive("attributetable", PyAttributeTable)
app.add_node(attributetable, html=(visit_attributetable_node, depart_attributetable_node)) app.add_node(attributetable, html=(visit_attributetable_node, depart_attributetable_node))
app.add_node(attributetablecolumn, html=(visit_attributetablecolumn_node, depart_attributetablecolumn_node)) app.add_node(
app.add_node(attributetabletitle, html=(visit_attributetabletitle_node, depart_attributetabletitle_node)) attributetablecolumn,
app.add_node(attributetablebadge, html=(visit_attributetablebadge_node, depart_attributetablebadge_node)) html=(visit_attributetablecolumn_node, depart_attributetablecolumn_node),
app.add_node(attributetable_item, html=(visit_attributetable_item_node, depart_attributetable_item_node)) )
app.add_node(
attributetabletitle, html=(visit_attributetabletitle_node, depart_attributetabletitle_node)
)
app.add_node(
attributetablebadge, html=(visit_attributetablebadge_node, depart_attributetablebadge_node)
)
app.add_node(
attributetable_item, html=(visit_attributetable_item_node, depart_attributetable_item_node)
)
app.add_node(attributetableplaceholder) app.add_node(attributetableplaceholder)
app.connect('doctree-resolved', process_attributetable) app.connect("doctree-resolved", process_attributetable)

View file

@ -6,11 +6,11 @@ from sphinx.writers.html5 import HTML5Translator
class DPYHTML5Translator(HTML5Translator): class DPYHTML5Translator(HTML5Translator):
def visit_section(self, node): def visit_section(self, node):
self.section_level += 1 self.section_level += 1
self.body.append(self.starttag(node, 'section')) self.body.append(self.starttag(node, "section"))
def depart_section(self, node): def depart_section(self, node):
self.section_level -= 1 self.section_level -= 1
self.body.append('</section>\n') self.body.append("</section>\n")
def visit_table(self, node): def visit_table(self, node):
self.body.append('<div class="table-wrapper">') self.body.append('<div class="table-wrapper">')
@ -18,7 +18,7 @@ class DPYHTML5Translator(HTML5Translator):
def depart_table(self, node): def depart_table(self, node):
super().depart_table(node) super().depart_table(node)
self.body.append('</div>') self.body.append("</div>")
class DPYStandaloneHTMLBuilder(StandaloneHTMLBuilder): class DPYStandaloneHTMLBuilder(StandaloneHTMLBuilder):
@ -32,45 +32,46 @@ class DPYStandaloneHTMLBuilder(StandaloneHTMLBuilder):
indexcounts.append(sum(1 + len(subitems) for _, (_, subitems, _) in entries)) indexcounts.append(sum(1 + len(subitems) for _, (_, subitems, _) in entries))
genindexcontext = { genindexcontext = {
'genindexentries': genindex, "genindexentries": genindex,
'genindexcounts': indexcounts, "genindexcounts": indexcounts,
'split_index': self.config.html_split_index, "split_index": self.config.html_split_index,
} }
if self.config.html_split_index: if self.config.html_split_index:
self.handle_page('genindex', genindexcontext, 'genindex-split.html') self.handle_page("genindex", genindexcontext, "genindex-split.html")
self.handle_page('genindex-all', genindexcontext, 'genindex.html') self.handle_page("genindex-all", genindexcontext, "genindex.html")
for (key, entries), count in zip(genindex, indexcounts): for (key, entries), count in zip(genindex, indexcounts):
ctx = {'key': key, 'entries': entries, 'count': count, 'genindexentries': genindex} ctx = {"key": key, "entries": entries, "count": count, "genindexentries": genindex}
self.handle_page(f"genindex-{key}", ctx, 'genindex-single.html') self.handle_page(f"genindex-{key}", ctx, "genindex-single.html")
else: else:
self.handle_page('genindex', genindexcontext, 'genindex.html') self.handle_page("genindex", genindexcontext, "genindex.html")
def add_custom_jinja2(app): def add_custom_jinja2(app):
env = app.builder.templates.environment env = app.builder.templates.environment
env.tests['prefixedwith'] = str.startswith env.tests["prefixedwith"] = str.startswith
env.tests['suffixedwith'] = str.endswith env.tests["suffixedwith"] = str.endswith
def add_builders(app): def add_builders(app):
"""This is necessary because RTD injects their own for some reason.""" """This is necessary because RTD injects their own for some reason."""
app.set_translator('html', DPYHTML5Translator, override=True) app.set_translator("html", DPYHTML5Translator, override=True)
app.add_builder(DPYStandaloneHTMLBuilder, override=True) app.add_builder(DPYStandaloneHTMLBuilder, override=True)
try: try:
original = app.registry.builders['readthedocs'] original = app.registry.builders["readthedocs"]
except KeyError: except KeyError:
pass pass
else: else:
injected_mro = tuple( injected_mro = tuple(
base if base is not StandaloneHTMLBuilder else DPYStandaloneHTMLBuilder for base in original.mro()[1:] base if base is not StandaloneHTMLBuilder else DPYStandaloneHTMLBuilder
for base in original.mro()[1:]
) )
new_builder = type(original.__name__, injected_mro, {'name': 'readthedocs'}) new_builder = type(original.__name__, injected_mro, {"name": "readthedocs"})
app.set_translator('readthedocs', DPYHTML5Translator, override=True) app.set_translator("readthedocs", DPYHTML5Translator, override=True)
app.add_builder(new_builder, override=True) app.add_builder(new_builder, override=True)
def setup(app): def setup(app):
add_builders(app) add_builders(app)
app.connect('builder-inited', add_custom_jinja2) app.connect("builder-inited", add_custom_jinja2)

View file

@ -13,20 +13,20 @@ class summary(nodes.General, nodes.Element):
def visit_details_node(self, node): def visit_details_node(self, node):
self.body.append(self.starttag(node, 'details', CLASS=node.attributes.get('class', ''))) self.body.append(self.starttag(node, "details", CLASS=node.attributes.get("class", "")))
def visit_summary_node(self, node): def visit_summary_node(self, node):
self.body.append(self.starttag(node, 'summary', CLASS=node.attributes.get('summary-class', ''))) self.body.append(self.starttag(node, "summary", CLASS=node.attributes.get("summary-class", "")))
self.body.append(node.rawsource) self.body.append(node.rawsource)
def depart_details_node(self, node): def depart_details_node(self, node):
self.body.append('</details>\n') self.body.append("</details>\n")
def depart_summary_node(self, node): def depart_summary_node(self, node):
self.body.append('</summary>') self.body.append("</summary>")
class DetailsDirective(Directive): class DetailsDirective(Directive):
@ -34,8 +34,8 @@ class DetailsDirective(Directive):
optional_arguments = 1 optional_arguments = 1
option_spec = { option_spec = {
'class': directives.class_option, "class": directives.class_option,
'summary-class': directives.class_option, "summary-class": directives.class_option,
} }
has_content = True has_content = True
@ -44,12 +44,14 @@ class DetailsDirective(Directive):
set_classes(self.options) set_classes(self.options)
self.assert_has_content() self.assert_has_content()
text = '\n'.join(self.content) text = "\n".join(self.content)
node = details(text, **self.options) node = details(text, **self.options)
if self.arguments: if self.arguments:
summary_node = summary(self.arguments[0], **self.options) summary_node = summary(self.arguments[0], **self.options)
summary_node.source, summary_node.line = self.state_machine.get_source_and_line(self.lineno) summary_node.source, summary_node.line = self.state_machine.get_source_and_line(
self.lineno
)
node += summary_node node += summary_node
self.state.nested_parse(self.content, self.content_offset, node) self.state.nested_parse(self.content, self.content_offset, node)
@ -59,4 +61,4 @@ class DetailsDirective(Directive):
def setup(app): def setup(app):
app.add_node(details, html=(visit_details_node, depart_details_node)) app.add_node(details, html=(visit_details_node, depart_details_node))
app.add_node(summary, html=(visit_summary_node, depart_summary_node)) app.add_node(summary, html=(visit_summary_node, depart_summary_node))
app.add_directive('details', DetailsDirective) app.add_directive("details", DetailsDirective)

View file

@ -7,11 +7,11 @@ class exception_hierarchy(nodes.General, nodes.Element):
def visit_exception_hierarchy_node(self, node): def visit_exception_hierarchy_node(self, node):
self.body.append(self.starttag(node, 'div', CLASS='exception-hierarchy-content')) self.body.append(self.starttag(node, "div", CLASS="exception-hierarchy-content"))
def depart_exception_hierarchy_node(self, node): def depart_exception_hierarchy_node(self, node):
self.body.append('</div>\n') self.body.append("</div>\n")
class ExceptionHierarchyDirective(Directive): class ExceptionHierarchyDirective(Directive):
@ -19,11 +19,13 @@ class ExceptionHierarchyDirective(Directive):
def run(self): def run(self):
self.assert_has_content() self.assert_has_content()
node = exception_hierarchy('\n'.join(self.content)) node = exception_hierarchy("\n".join(self.content))
self.state.nested_parse(self.content, self.content_offset, node) self.state.nested_parse(self.content, self.content_offset, node)
return [node] return [node]
def setup(app): def setup(app):
app.add_node(exception_hierarchy, html=(visit_exception_hierarchy_node, depart_exception_hierarchy_node)) app.add_node(
app.add_directive('exception_hierarchy', ExceptionHierarchyDirective) exception_hierarchy, html=(visit_exception_hierarchy_node, depart_exception_hierarchy_node)
)
app.add_directive("exception_hierarchy", ExceptionHierarchyDirective)

View file

@ -10,12 +10,12 @@ class NitpickFileIgnorer(logging.Filter):
super().__init__() super().__init__()
def filter(self, record: sphinx_logging.SphinxLogRecord) -> bool: def filter(self, record: sphinx_logging.SphinxLogRecord) -> bool:
if getattr(record, 'type', None) == 'ref': if getattr(record, "type", None) == "ref":
return record.location.get('refdoc') not in self.app.config.nitpick_ignore_files return record.location.get("refdoc") not in self.app.config.nitpick_ignore_files
return True return True
def setup(app: Sphinx): def setup(app: Sphinx):
app.add_config_value('nitpick_ignore_files', [], '') app.add_config_value("nitpick_ignore_files", [], "")
f = NitpickFileIgnorer(app) f = NitpickFileIgnorer(app)
sphinx_logging.getLogger('sphinx.transforms.post_transforms').logger.addFilter(f) sphinx_logging.getLogger("sphinx.transforms.post_transforms").logger.addFilter(f)

View file

@ -15,7 +15,13 @@ from sphinx.util.typing import RoleFunction
def make_link_role(resource_links: Dict[str, str]) -> RoleFunction: def make_link_role(resource_links: Dict[str, str]) -> RoleFunction:
def role( def role(
typ: str, rawtext: str, text: str, lineno: int, inliner: Inliner, options: Dict = {}, content: List[str] = [] typ: str,
rawtext: str,
text: str,
lineno: int,
inliner: Inliner,
options: Dict = {},
content: List[str] = [],
) -> Tuple[List[Node], List[system_message]]: ) -> Tuple[List[Node], List[system_message]]:
text = utils.unescape(text) text = utils.unescape(text)
@ -30,10 +36,10 @@ def make_link_role(resource_links: Dict[str, str]) -> RoleFunction:
def add_link_role(app: Sphinx) -> None: def add_link_role(app: Sphinx) -> None:
app.add_role('resource', make_link_role(app.config.resource_links)) app.add_role("resource", make_link_role(app.config.resource_links))
def setup(app: Sphinx) -> Dict[str, Any]: def setup(app: Sphinx) -> Dict[str, Any]:
app.add_config_value('resource_links', {}, 'env') app.add_config_value("resource_links", {}, "env")
app.connect('builder-inited', add_link_role) app.connect("builder-inited", add_link_role)
return {'version': sphinx.__display_version__, 'parallel_read_safe': True} return {"version": sphinx.__display_version__, "parallel_read_safe": True}

View file

@ -1,9 +1,9 @@
.. Github-API-Wrapper documentation master file, created by .. GitHub-API-Wrapper documentation master file, created by
sphinx-quickstart on Sun May 1 15:39:50 2022. sphinx-quickstart on Sun May 1 15:39:50 2022.
You can adapt this file completely to your liking, but it should at least You can adapt this file completely to your liking, but it should at least
contain the root `toctree` directive. contain the root `toctree` directive.
Welcome to Github-API-Wrapper. Welcome to GitHub-API-Wrapper.
============================================== ==============================================
.. automodule:: github .. automodule:: github