From 8fcc79a2dba356100563f0ba88cc6120f5eca192 Mon Sep 17 00:00:00 2001 From: Adi Roiban Date: Mon, 11 Jul 2022 22:32:22 +0100 Subject: [PATCH 1/6] Use RTD theme and remove trac extension and theme. --- docs/_extensions/traclinks.py | 34 - docs/_themes/twisteddefault/theme.conf | 28 - docs/_themes/twistedtrac/layout.html | 283 -------- docs/_themes/twistedtrac/static/css/trac.css | 609 ------------------ docs/_themes/twistedtrac/static/css/wiki.css | 217 ------- docs/_themes/twistedtrac/static/ctxt_grad.png | Bin 192 -> 0 bytes docs/_themes/twistedtrac/static/extlink.gif | Bin 90 -> 0 bytes .../twistedtrac/static/footer_grad.png | Bin 204 -> 0 bytes docs/_themes/twistedtrac/static/main_grad.png | Bin 174 -> 0 bytes docs/_themes/twistedtrac/static/menu_grad.png | Bin 162 -> 0 bytes docs/_themes/twistedtrac/static/tab.png | Bin 1597 -> 0 bytes docs/_themes/twistedtrac/static/top_grad.png | Bin 180 -> 0 bytes .../twistedtrac/static/trac_banner.png | Bin 20275 -> 0 bytes .../twistedtrac/static/twisted-icon.ico | Bin 1406 -> 0 bytes .../twistedtrac/static/twistedtrac.css | 457 ------------- docs/_themes/twistedtrac/theme.conf | 5 - docs/conf.py | 21 +- setup.cfg | 2 +- 18 files changed, 10 insertions(+), 1646 deletions(-) delete mode 100644 docs/_extensions/traclinks.py delete mode 100644 docs/_themes/twisteddefault/theme.conf delete mode 100644 docs/_themes/twistedtrac/layout.html delete mode 100644 docs/_themes/twistedtrac/static/css/trac.css delete mode 100644 docs/_themes/twistedtrac/static/css/wiki.css delete mode 100644 docs/_themes/twistedtrac/static/ctxt_grad.png delete mode 100644 docs/_themes/twistedtrac/static/extlink.gif delete mode 100644 docs/_themes/twistedtrac/static/footer_grad.png delete mode 100644 docs/_themes/twistedtrac/static/main_grad.png delete mode 100644 docs/_themes/twistedtrac/static/menu_grad.png delete mode 100644 docs/_themes/twistedtrac/static/tab.png delete mode 100644 docs/_themes/twistedtrac/static/top_grad.png delete mode 100644 docs/_themes/twistedtrac/static/trac_banner.png delete mode 100644 docs/_themes/twistedtrac/static/twisted-icon.ico delete mode 100644 docs/_themes/twistedtrac/static/twistedtrac.css delete mode 100644 docs/_themes/twistedtrac/theme.conf diff --git a/docs/_extensions/traclinks.py b/docs/_extensions/traclinks.py deleted file mode 100644 index f54c43dfc2c..00000000000 --- a/docs/_extensions/traclinks.py +++ /dev/null @@ -1,34 +0,0 @@ -""" -Sphinx/docutils extension to create links to a Trac site using a -RestructuredText interpreted text role that looks like this:: - - :trac:`trac_link_text` - -for example:: - - :trac:`#2015` - -creates a link to ticket number 2015. - -adapted from recipe U{here } -""" - -import urllib - -from docutils import nodes, utils - - -def make_trac_link(name, rawtext, text, lineno, inliner, options={}, content=[]): - env = inliner.document.settings.env - trac_url = env.config.traclinks_base_url - ref = trac_url + "/intertrac/" + urllib.quote(text, safe="") - node = nodes.reference(rawtext, utils.unescape(text), refuri=ref, **options) - return [node], [] - - -# setup function to register the extension - - -def setup(app): - app.add_config_value("traclinks_base_url", "https://twistedmatrix.com/trac", "env") - app.add_role("trac", make_trac_link) diff --git a/docs/_themes/twisteddefault/theme.conf b/docs/_themes/twisteddefault/theme.conf deleted file mode 100644 index 7cb2d722bbb..00000000000 --- a/docs/_themes/twisteddefault/theme.conf +++ /dev/null @@ -1,28 +0,0 @@ -[theme] -inherit = default -stylesheet = default.css -pygments_style = sphinx - -[options] -rightsidebar = true -stickysidebar = false - -footerbgcolor = #565656 -footertextcolor = #ffffff -sidebarbgcolor = #565656 -sidebartextcolor = #ffffff -sidebarlinkcolor = #ffffff -relbarbgcolor = #565656 -relbartextcolor = #ffffff -relbarlinkcolor = #ffffff -bgcolor = #ffffff -textcolor = #000000 -headbgcolor = #ffffff -headtextcolor = #83a501 -headlinkcolor = #c60f0f -linkcolor = #517489 -codebgcolor = #eeffcc -codetextcolor = #333333 - -bodyfont = 'Trebuchet MS', arial, verdana, 'Bitstream Vera Sans', helvetica, sans-serif -headfont = 'Trebuchet MS', arial, verdana, 'Bitstream Vera Sans', helvetica, sans-serif diff --git a/docs/_themes/twistedtrac/layout.html b/docs/_themes/twistedtrac/layout.html deleted file mode 100644 index a62435041c7..00000000000 --- a/docs/_themes/twistedtrac/layout.html +++ /dev/null @@ -1,283 +0,0 @@ -{%- block doctype -%} - -{%- endblock %} - -{%- set reldelim1 = reldelim1 is not defined and ' »' or reldelim1 %} -{%- set reldelim2 = reldelim2 is not defined and ' |' or reldelim2 %} - -{%- macro relbar() %} - -{%- endmacro %} - -{%- macro sidebar() %} - {%- if not embedded %}{% if not theme_nosidebar|tobool %} -
-
- {%- block sidebarlogo %} - {%- if logo %} - - {%- endif %} - {%- endblock %} - {%- block sidebartoc %} - {%- if display_toc %} -

{{ _('Table Of Contents') }}

- {{ toc }} - {%- endif %} - {%- endblock %} - {%- block sidebarrel %} - {%- if prev %} -

{{ _('Previous topic') }}

-

{{ prev.title }}

- {%- endif %} - {%- if next %} -

{{ _('Next topic') }}

-

{{ next.title }}

- {%- endif %} - {%- endblock %} - {%- block sidebarsourcelink %} - {%- if show_source and has_source and sourcename %} -

{{ _('This Page') }}

- - {%- endif %} - {%- endblock %} - {%- if customsidebar %} - {% include customsidebar %} - {%- endif %} - {%- block sidebarsearch %} - {%- if pagename != "search" %} - - - {%- endif %} - {%- endblock %} -
-
- {%- endif %}{% endif %} -{%- endmacro %} - - - - - - - {{ metatags }} - {%- if not embedded and docstitle %} - {%- set titlesuffix = " — "|safe + docstitle|e %} - {%- else %} - {%- set titlesuffix = "" %} - {%- endif %} - {{ title|striptags }}{{ titlesuffix }} - - - {%- if not embedded %} - - {%- for scriptfile in script_files %} - - {%- endfor %} - {%- if use_opensearch %} - - {%- endif %} - {%- if favicon %} - - {%- endif %} - {%- endif %} -{%- block linktags %} - {%- if hasdoc('about') %} - - {%- endif %} - {%- if hasdoc('genindex') %} - - {%- endif %} - {%- if hasdoc('search') %} - - {%- endif %} - {%- if hasdoc('copyright') %} - - {%- endif %} - - {%- if parents %} - - {%- endif %} - {%- if next %} - - {%- endif %} - {%- if prev %} - - {%- endif %} -{%- endblock %} -{%- block extrahead %} {% endblock %} - - - - - - - - - -{%- block relbar1 %}{{ relbar() }}{% endblock %} - -
- - - -{%- block sidebar1 %} {# possible location for sidebar #} {% endblock %} - -
-{%- block document %} -
- {%- if not embedded %}{% if not theme_nosidebar|tobool %} -
- {%- endif %}{% endif %} - -
- {% block body %} {% endblock %} -
- {%- if not embedded %}{% if not theme_nosidebar|tobool %} -
- {%- endif %}{% endif %} -
-{%- endblock %} - -{%- block sidebar2 %}{{ sidebar() }}{% endblock %} -
-
- -
- - - - diff --git a/docs/_themes/twistedtrac/static/css/trac.css b/docs/_themes/twistedtrac/static/css/trac.css deleted file mode 100644 index a21fe00271a..00000000000 --- a/docs/_themes/twistedtrac/static/css/trac.css +++ /dev/null @@ -1,609 +0,0 @@ -/* Trac CSS */ -body { - background: #fff; - color: #000; - margin: 0px; /* Modified */ - padding: 0; -} -body, th, td { - font: normal 13px trebuchet ms,verdana,arial,'Bitstream Vera Sans',helvetica,sans-serif; /* Modified */ -} -h1, h2, h3, h4 { - font-family: trebuchet ms,arial,verdana,'Bitstream Vera Sans',helvetica,sans-serif; /* Modified */ - font-weight: normal; /* Modified */ - letter-spacing: -0.018em; - color: #83A501; /* Modified */ - border-width: 0 0 1px 0; /* Modified */ - border-style: dotted; /* Modified */ - border-color: #dddddd; /* Modified */ -} -h1 { font-size: 19px; margin: .15em 1em 0 0 } -h2 { font-size: 16px } -h3 { font-size: 14px } -hr { border: none; border-top: 1px solid #ccb; margin: 2em 0 } -address { font-style: normal } -img { border: none; } - -.underline { text-decoration: underline } -ol.loweralpha { list-style-type: lower-alpha } -ol.upperalpha { list-style-type: upper-alpha } -ol.lowerroman { list-style-type: lower-roman } -ol.upperroman { list-style-type: upper-roman } -ol.arabic { list-style-type: decimal } - -/* Link styles */ -:link, :visited { - text-decoration: none; - color: #517489; /* Modified */ - border-bottom: 0px dotted #bbb; -} -:link:hover, :visited:hover { - background-color: transparent; - color: #555; -} -h1 :link, h1 :visited ,h2 :link, h2 :visited, h3 :link, h3 :visited, -h4 :link, h4 :visited, h5 :link, h5 :visited, h6 :link, h6 :visited { - color: inherit; -} - -/* Heading anchors */ -.anchor:link, .anchor:visited { - border: none; - color: #d7d7d7; - font-size: .8em; - vertical-align: text-top; -} -* > .anchor:link, * > .anchor:visited { - visibility: hidden; -} -h1:hover .anchor, h2:hover .anchor, h3:hover .anchor, -h4:hover .anchor, h5:hover .anchor, h6:hover .anchor { - visibility: visible; -} - -@media screen { - a.ext-link .icon { - background: url(../extlink.gif) left center no-repeat; - padding-left: 16px; - } - * html a.ext-link .icon { display: inline-block; } -} - -/* Forms */ -input, textarea, select { margin: 0px } -input, select { vertical-align: middle } -input[type=button], input[type=submit], input[type=reset] { - background-color: #517489; /* Modified */ - color: #ffffff; /* Modified */ - border: 1px solid #334a57; /* Modified */ - padding: .1em .5em; -} -input[type=button]:hover, input[type=submit]:hover, input[type=reset]:hover { - background: #303030; /* Modified */ - border-color: #292929; /* Modified */ - color: #ffffff; /* Modified */ -} -input[type=button][disabled], input[type=submit][disabled], -input[type=reset][disabled] { - background: #f6f6f6; - border-style: solid; - color: #999; -} -input[type=text], input.textwidget, textarea { border: 1px solid #8caabb; background-color: #d5e1e7; color: #000000; } /* Modified */ -input[type=text], input.textwidget { padding: .2em .5em } -input[type=text]:focus, input.textwidget:focus, textarea:focus { - border-color: #517489; /* Modified */ -} -option { border-bottom: 1px dotted #d7d7d7 } -fieldset { border: 1px solid #d7d7d7; padding: .5em; margin: 0 } -fieldset.iefix { background: transparent; border: none; padding: 0; margin: 0 } -* html fieldset.iefix { width: 98% } -fieldset.iefix p { margin: 0 } -legend { color: #999; padding: 0 .25em; font-size: 90%; font-weight: bold } -label.disabled { color: #d7d7d7 } -.buttons { margin: .5em .5em .5em 0 } -.buttons form, .buttons form div { display: inline } -.buttons input { margin: 1em .5em .1em 0 } -.inlinebuttons input { - font-size: 70%; - border-width: 1px; - border-style: dotted; - margin: 0; - padding: 0.1em; - background: none; -} - -input[type=submit] { - background-color: #517489; -} - -/* Header */ -#header hr { display: none } -#header h1 { margin: 1.5em 0 -1.5em; } -#header img { border: none; margin: 0 0 -3em } -#header :link, #header :visited, #header :link:hover, #header :visited:hover { - background: transparent; - color: #555; - margin-bottom: 2px; - border: none; -} -#header h1 :link:hover, #header h1 :visited:hover { color: #000 } - -/* Quick search */ -#search, #topsearch { - clear: both; - font-size: 10px; - height: 2.2em; - margin: 0 71px 1em 0; /* Modified */ - text-align: right; -} - -#topsearch input, #topsearch input[type=button], #topsearch input[type=submit], #topsearch input[type=reset], #topsearch input[type=text], #topsearch input.textwidget { - font-size: 10px; - background-color: #333; /* Modified */ - color: #ffffff; /* Modified */ - border: 1px solid #222; /* Modified */ -} - -#topsearch input[type=text] { - background-color: #222; /* Modified */ -} - -#search input, #search input[type=button], #search input[type=submit], #search input[type=reset], #search input[type=text], #search input.textwidget { - font-size: 10px; - background-color: #383838; /* Modified */ - color: #ffffff; /* Modified */ - border: 1px solid #333333; /* Modified */ -} -#search, #topsearch label { display: none } - -/* Navigation */ -.nav h2, .nav hr { display: none } -.nav ul { font-size: 10px; list-style: none; margin: 0; text-align: right } -.nav li { - border-right: 0px solid #d7d7d7; /* Modified */ - display: inline; - padding: 0 .75em; - white-space: nowrap; -} -.nav li.last { border-right: none } - -/* Main navigation bar */ -#mainnav { - background: #f7f7f7 url(../menu_grad.png) 0 0; /* Modified */ - border: 0px solid #000; /* Modified */ - font: normal 10px trebuchet ms,verdana,'Bitstream Vera Sans',helvetica,arial,sans-serif; /* Modified */ - margin: 0; /* Modified */ - padding: .3em 50px .3em 0; /* Modified */ -} -#mainnav li { border-right: none; padding: .25em 0 } -#mainnav :link, #mainnav :visited { - background: url(../dots.gif) 0 0 no-repeat; - border-right: 0px solid #fff; /* Modified */ - border-bottom: none; - border-left: 0px solid #555; /* Modified */ - color: #ffffff; /* Modified */ - padding: .3em 20px; /* Modified */ -} -* html #mainnav :link, * html #mainnav :visited { background-position: 1px 0 } -#mainnav :link:hover, #mainnav :visited:hover { - background-color: #444444; /* Modified */ - border-right: 0px solid #ddd; /* Modified */ -} -#mainnav .active :link, #mainnav .active :visited { - background: #444444 0 0 repeat-x; /* Modified */ - border-top: none; - border-right: 0px solid #000; /* Modified */ - color: #eee; - font-weight: bold; -} -#mainnav .active :link:hover, #mainnav .active :visited:hover { - /* - border-right: 1px solid #000; - */ -} - -/* Context-dependent navigation links */ -#ctxtnav { background-image: url(../ctxt_grad.png); height: 30px; padding: 5px 61px 0 0; } /* Modified */ -#ctxtnav li ul { - background: #f7f7f7; - color: #ccc; - border: 1px solid; - padding: 0; - display: inline; - margin: 0; -} -#ctxtnav li li { padding: 0; } -#ctxtnav li li :link, #ctxtnav li li :visited { padding: 0 1em } -#ctxtnav li li :link:hover, #ctxtnav li li :visited:hover { - background: #bba; - color: #fff; -} - -#ctxtnav :link, #ctxtnav :visited { - color: #555555; - -} -#ctxtnav :link:hover, #ctxtnav :visited:hover { - color: #999999; -} - -/* Alternate links */ -#altlinks { clear: both; text-align: center } -#altlinks h3 { font-size: 12px; letter-spacing: normal; margin: 0 } -#altlinks ul { list-style: none; margin: 0; padding: 0 0 1em } -#altlinks li { - border-right: 1px solid #d7d7d7; - display: inline; - font-size: 11px; - line-height: 16px; - padding: 0 1em; - white-space: nowrap; -} -#altlinks li.last { border-right: none } -#altlinks li :link, #altlinks li :visited { - background-position: 0 -1px; - background-repeat: no-repeat; - border: none; -} -#altlinks li a.ics { background-image: url(../ics.png); padding-left: 22px } -#altlinks li a.rss { background-image: url(../xml.png); padding-left: 42px } - -/* Footer */ -#footer { - clear: both; - color: #bbb; - font-size: 10px; - border-top: 0px solid; /* Modified */ - height: 150px; /* Modified */ - background-image: url(../footer_grad.png); /* Modified */ - padding: 50px 50px 0 50px; /* Modified */ -} -#footer :link, #footer :visited { color: #bbb; } -#footer hr { display: none } -#footer #tracpowered { border: 0; float: left } -#footer #tracpowered:hover { background: transparent } -#footer p { margin: 0 } -#footer p.left, p.left2 { - float: left; - margin-left: 1em; - padding: 0 1em; -} - -#footer p.left { - border-left: 1px solid #d7d7d7; - border-right: 1px solid #d7d7d7; -} - -#footer p.left2 { - color: #666; -} - -#footer p.right { - float: right; - text-align: right; -} - -#content { padding:0 50px 0 50px; position: relative } - -#help { - clear: both; - color: #999; - font-size: 90%; - margin: 1em; - text-align: right; -} -#help :link, #help :visited { cursor: help } -#help hr { display: none } - -/* Page preferences form */ -#prefs { - background: #edf9c0; - border: 1px solid #bce715; - float: right; - font-size: 9px; - padding: .8em; - position: relative; - margin: 0 1em 1em; -} -* html #prefs { width: 26em } /* Set width only for IE */ -#prefs input, #prefs select { font-size: 9px; vertical-align: middle } -#prefs fieldset { - background: transparent; - border: none; - margin: .5em; - padding: 0; -} -#prefs fieldset legend { - background: transparent; - color: #000; - font-size: 9px; - font-weight: normal; - margin: 0 0 0 -1.5em; - padding: 0; -} -#prefs .buttons { text-align: right } - -/* Version information (browser, wiki, attachments) */ -#info { - margin: 1em 0 0 0; - background: #f7f7f0; - border: 1px solid #d7d7d7; - border-collapse: collapse; - border-spacing: 0; - clear: both; - width: 100%; -} -#info th, #info td { font-size: 85%; padding: 2px .5em; vertical-align: top } -#info th { font-weight: bold; text-align: left; white-space: nowrap } -#info td.message { width: 100% } -#info .message ul { padding: 0; margin: 0 2em } -#info .message p { margin: 0; padding: 0 } - -/* Wiki */ -.wikipage { padding-left: 18px; margin: 0; } /* Modified */ -.wikipage h1, .wikipage h2, .wikipage h3 { margin-left: -18px } - -a.missing:link, a.missing:visited, span.missing { color: #998 } -a.missing:link, a.missing:visited { background: #fafaf0 } -a.missing:hover { color: #000 } -a.closed:link, a.closed:visited { text-decoration: line-through } - -dl.wiki dt { font-weight: bold } -dl.compact dt { float: left; padding-right: .5em } -dl.compact dd { margin: 0; padding: 0 } - -div.code, pre.wiki, pre.literal-block { - background: #edf9c0; - border-width: 1px 0 1px 0; - border-style: solid; - border-color: #bce715; - margin: 30px; - padding: 10px; - overflow: auto; -} - -blockquote.citation { - margin: -0.6em 0; - border-style: solid; - border-width: 0 0 0 2px; - padding-left: .5em; - border-color: #b44; -} -.citation blockquote.citation { border-color: #4b4; } -.citation .citation blockquote.citation { border-color: #44b; } -.citation .citation .citation blockquote.citation { border-color: #c55; } - -table.wiki { - border: 2px solid #ccc; - border-collapse: collapse; - border-spacing: 0; -} -table.wiki td { border: 1px solid #ccc; padding: .1em .25em; } - -.wikitoolbar { - border: solid #d7d7d7; - border-width: 1px 1px 1px 0; - height: 18px; - width: 208px; -} -.wikitoolbar :link, .wikitoolbar :visited { - background: transparent url(../edit_toolbar.png) no-repeat; - border: 1px solid #fff; - border-left-color: #d7d7d7; - cursor: default; - display: block; - float: left; - width: 24px; - height: 16px; -} -.wikitoolbar :link:hover, .wikitoolbar :visited:hover { - background-color: transparent; - border: 1px solid #fb2; -} -.wikitoolbar a#em { background-position: 0 0 } -.wikitoolbar a#strong { background-position: 0 -16px } -.wikitoolbar a#heading { background-position: 0 -32px } -.wikitoolbar a#link { background-position: 0 -48px } -.wikitoolbar a#code { background-position: 0 -64px } -.wikitoolbar a#hr { background-position: 0 -80px } -.wikitoolbar a#np { background-position: 0 -96px } -.wikitoolbar a#br { background-position: 0 -112px } - -/* Styles for the form for adding attachments. */ -#attachment .field { margin-top: 1.3em } -#attachment label { padding-left: .2em } -#attachment fieldset { margin-top: 2em } -#attachment fieldset .field { float: left; margin: 0 1em .5em 0 } -#attachment .options { float: left; padding: 0 0 1em 1em } -#attachment br { clear: left } -.attachment #preview { margin-top: 1em } - -/* Styles for the list of attachments. */ -#attachments { border: 1px outset #996; padding: 1em } -#attachments .attachments { margin-left: 2em; padding: 0 } -#attachments dt { display: list-item; list-style: square; } -#attachments dd { font-style: italic; margin-left: 0; padding-left: 0; } - - -/* Styles for tabular listings such as those used for displaying directory - contents and report results. */ -table.listing { - clear: both; - border-bottom: 1px solid #d7d7d7; - border-collapse: collapse; - border-spacing: 0; - margin-top: 1em; - width: 100%; -} -table.listing th { text-align: left; padding: 0 1em .1em 0; font-size: 12px } -table.listing thead { background: #f7f7f0 } -table.listing thead th { - border: 1px solid #d7d7d7; - border-bottom-color: #999; - font-size: 11px; - font-weight: bold; - padding: 2px .5em; - vertical-align: bottom; -} -table.listing thead th :link:hover, table.listing thead th :visited:hover { - background-color: transparent; -} -table.listing thead th a { border: none; padding-right: 12px } -table.listing th.asc a, table.listing th.desc a { font-weight: bold } -table.listing th.asc a, table.listing th.desc a { - background-position: 100% 50%; - background-repeat: no-repeat; -} -table.listing th.asc a { background-image: url(../asc.png) } -table.listing th.desc a { background-image: url(../desc.png) } -table.listing tbody td, table.listing tbody th { - border: 1px dotted #ddd; - padding: .33em .5em; - vertical-align: top; -} -table.listing tbody td a:hover, table.listing tbody th a:hover { - background-color: transparent; -} -table.listing tbody tr { border-top: 1px solid #ddd } -table.listing tbody tr.even { background-color: #fcfcfc } -table.listing tbody tr.odd { background-color: #f7f7f7 } -table.listing tbody tr:hover { background: #eed !important } - -/* Styles for the error page (and rst errors) */ -#content.error .message, div.system-message { - background: #fdc; - border: 2px solid #d00; - color: #500; - padding: .5em; - margin: 1em 0; -} -#content.error pre, div.system-message pre { margin-left: 1em; overflow: auto } -div.system-message p { margin: 0; } -div.system-message p.system-message-title { font-weight: bold; } - -/* Styles for search word highlighting */ -@media screen { - .searchword0 { background: #ff9 } - .searchword1 { background: #cfc } - .searchword2 { background: #cff } - .searchword3 { background: #ccf } - .searchword4 { background: #fcf } -} - -@media print { - #header, #altlinks, #footer, #help { display: none } - .nav, form, .buttons form, form .buttons { display: none } - form.printableform { display: block } -} - - -/* Custom */ -#top_grad { - background-image: url(../top_grad.png); - height: 26px; -} -#tab { - height: 32px; - width: 282px; - color: #ffffff; - text-align: center; - margin: -2px 50px 0 0; - background-image: url(../tab.png); - background-repeat: no-repeat; - float: right; -} - -#tab :link, #tab :visited { - background: transparent; - color: #ffffff; - font-size: 12px; - border: none; - padding: 4px; - -} -#tab :link:hover, #tab :visited:hover { - border-width: 0 0 1px 0; - border-style: solid; - border-color: #a4cd0d; -} - -#banner { - background-image: url(../main_grad.png); - height: 135px; -} - -#header { - margin: 20px 0 0 50px; -} - -#metanav { - margin-right: 61px; -} - -#metanav :link, #metanav :visited { - color: #ffffff; - -} - -#metanav :link:hover, #metanav :visited:hover { - color: #bbbbbb; -} - -#metanav ul li.first { - color: #ccc; -} - -#side_bar { - float: right; -// width: 350px; - background-color: #ffffff; - padding: 0 0 0 15px; -} - -#download_top { - height: 145px; - width: 273px; - background-image: url(../dld_top.png); -} - -#download_bottom { - height: 91px; - width: 273px; - background-image: url(../dld_bottom.png); -} - -#download { -// height: 145px; - width: 243px; - background-image: url(../dld_back.png); - background-repeat: repeat-y; - padding: 0 10px 0 20px; -} - - -#download_old { - height: 284px; - width: 269px; -// float: right; - margin: 0; - padding: 0 0 0 19px; - background-image: url(../download.png); - background-repeat: no-repeat; -} - -#donate { - height: 284px; - width: 269px; -// float: right; - margin: 0; - padding: 0 0 0 19px; -} - -#download :link, #download :visited, #download :link:hover, #download :visited:hover { - background: transparent; - color: #9ac300; - font-size: 12px; - border: none; - -} diff --git a/docs/_themes/twistedtrac/static/css/wiki.css b/docs/_themes/twistedtrac/static/css/wiki.css deleted file mode 100644 index 31eaada3317..00000000000 --- a/docs/_themes/twistedtrac/static/css/wiki.css +++ /dev/null @@ -1,217 +0,0 @@ -/* BEGIN inline of code.css */ -/* -div.code { - background: #f7f7f7; - border: 1px solid #d7d7d7; - margin: 1em 1.75em; - padding: .25em; - overflow: auto -} -*/ -div.code pre { margin: 0; } - -table.code { - border: 1px solid #ddd; - border-spacing: 0; - border-top: 0; - empty-cells: show; - font-size: 12px; - line-height: 130%; - padding: 0; - margin: 0 auto; - table-layout: fixed; - width: 100%; -} -table.code th { - border-right: 1px solid #d7d7d7; - border-bottom: 1px solid #998; - font-size: 11px; -} -table.code th.lineno { width: 4em } -table.code thead th { - background: #eee; - border-top: 1px solid #d7d7d7; - color: #999; - padding: 0 .25em; - text-align: center; - white-space: nowrap; -} -table.code tbody th { - background: #eed; - color: #886; - font-weight: normal; - padding: 0 .5em; - text-align: right; - vertical-align: top; -} -table.code tbody th :link, table.code tbody th :visited { - border: none; - color: #886; - text-decoration: none; -} -table.code tbody th :link:hover, table.code tbody th :visited:hover { - color: #000; -} -table.code tbody td { - background: #fff; - font: normal 11px monospace; - overflow: hidden; - padding: 1px 2px; - vertical-align: top; -} - -.image-file { background: #eee; padding: .3em } -.image-file img { background: url(../imggrid.png) } - -/* Default */ -.code-block span { - font-family: monospace; -} - -/* Comments */ -.code-comment, .css_comment, .c_comment, .c_commentdoc, .c_commentline, -.c_commentlinedoc, .h_comment,.pl_commentline, .p_commentblock, -.p_commentline, .hphp_comment, .hphp_commentblock, .hphp_commentline, -.yaml_comment { - color: #998; - font-style: italic; -} - -/* Language keyword */ -.code-keyword, .pl_word { color: #789; font-weight: bold } - -/* Type */ -.code-type, .c_word, .c_word2, .p_classname, .hphp_classname{ - color: #468; - font-weight: bold; -} - -/* Function */ -.code-func, .p_defname { - color: #900; - font-weight: bold; - border-bottom: none; -} - -/* Pre-processor */ -.code-prep, .c_preprocessor, .pl_preprocessor, .yaml_identifier { - color: #999; - font-weight: bold; -} - -/* Language construct */ -.code-lang, .p_word { color: #000; font-weight: bold } - -/* String */ -.code-string, .c_string, .c_stringeol, .css_doublestring, .css_singlestring, -.h_singlestring, .h_doublestring, .pl_string, .pl_string_q, .pl_string_qq, -.pl_string_qr, .pl_string_qw, .pl_string_qx, .pl_backticks, .pl_character, -.p_string, .p_stringeol, .hphp_string, .hphp_stringeol, .hphp_triple, -.hphp_tripledouble, .p_character, .p_triple, .p_tripledouble { - color: #b84; - font-weight: normal; -} - -/* Variable name */ -.code-var { color: #f9f } - -/* SilverCity-specific styles */ -.css_id, .css_class, .css_pseudoclass, .css_tag { color: #900000 } -.css_directive { color: #009000; font-weight: bold } -.css_important { color: blue } -.css_operator { color: #000090; font-weight: bold } -.css_tag { font-weight: bold } -.css_unknown_identifier, .css_unknown_pseudoclass { color: red } -.css_value { color: navy } -.c_commentdockeyword { color: navy; font-weight: bold } -.c_commentdockeyworderror { color: red; font-weight: bold } -.c_character, .c_regex, .c_uuid, .c_verbatim { color: olive } -.c_number { color: #099 } -.h_asp { color: #ff0 } -.h_aspat { color: #ffdf00 } -.h_attribute { color: teal } -.h_attributeunknown { color: red } -.h_cdata { color: #373 } -.h_entity { color: purple } -.h_number { color: #099 } -.h_other { color: purple } -.h_script, .h_tag, .h_tagend { color: navy } -.h_tagunknown { color: red } -.h_xmlend, .h_xmlstart { color: blue } -.pl_datasection { color: olive } -.pl_error { color: red; font-weight: bold } -.pl_hash { color: #000 } -.pl_here_delim, .pl_here_q, .pl_here_qq, .pl_here_qx, .pl_longquote { color: olive } -.pl_number { color: #099 } -.pl_pod { font-style: italic } -.pl_regex, .pl_regsubst { color: olive } -.p_number { color: #099 } -.hphp_character { color: olive } -.hphp_defname { color: #099; font-weight: bold } -.hphp_number { color: #099 } -.hphp_word { color: navy; font-weight: bold } -.yaml_document { color: gray; font-style: italic } -.yaml_keyword { color: #808 } -.yaml_number { color: #800 } -.yaml_reference { color: #088 } -.v_comment { color: gray; font-style: italic } -.v_commentline, .v_commentlinebang { color: red; font-style: italic } -.v_number, .v_preprocessor { color: #099 } -.v_string, .v_stringeol { color: olive } -.v_user{ color: blue; font-weight: bold } -.v_word, .v_word3 { color: navy; font-weight: bold } -.v_word2 { color: green; font-weight: bold } -/* END OF code.css */ -/* @import url(code.css); */ - -/* Styles for the page editing form */ -#edit #rows { float: right; font-size: 80% } -#edit #rows select { font-size: 90% } -#edit #text { clear: both; width: 100% } -#edit .wikitoolbar { float: left; } -#changeinfo { padding: .5em } -#changeinfo .field { float: left; margin: 0 1em .5em 0 } -#changeinfo br { clear: left } -#changeinfo .options { padding: 0 0 1em 1em } -#changeinfo .options, #changeinfo .buttons { clear: left } -#delete { margin-left: 6em } -#preview { - background: #f4f4f4 url(../draft.png); - margin: 1em 0 2em; - overflow: auto; -} - -/* Diff view */ -#overview .multi { color: #999 } -#overview .ipnr { color: #999; font-size: 80% } -#overview .comment { padding: 1em 0 0 } - -/* Styles for the page history table - (extends the styles for "table.listing") */ -#wikihist td { padding: 0 .5em } -#wikihist td.date, #wikihist td.diff, #wikihist td.version, -#wikihist td.author { - white-space: nowrap; -} -#wikihist td.version { text-align: center } -#wikihist td.comment { width: 100% } - -@media print { - th.diff, td.diff { display: none } -} - -/* Styles for the TracGuideToc wikimacro */ -.wiki-toc { - padding: .5em 1em; - margin: 0 0 2em 1em; - float: right; - border: 1px solid #bce715; - background: #edf9c0; - font-size: 85%; - position: relative; -} -.wiki-toc h4 { font-size: 12px; margin: 0; color: #444444; } -.wiki-toc ul, .wiki-toc ol { list-style: none; padding: 0; margin: 0 } -.wiki-toc ul ul, .wiki-toc ol ol { padding-left: 1.2em } -.wiki-toc li { margin: 0; padding: 0 } -.wiki-toc .active { background: #ddf482; position: relative; padding: 2px 0 2px 5px; border-left: 2px solid #bce715; } diff --git a/docs/_themes/twistedtrac/static/ctxt_grad.png b/docs/_themes/twistedtrac/static/ctxt_grad.png deleted file mode 100644 index 606c94d6ec3c43d24e35bff033b89bd426eda163..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 192 zcmeAS@N?(olHy`uVBq!ia0vp^d_b(s!3HFkR9RaBDVAa<&kznEsNqQI0P;BtJR*yM z>aT+^qm#z$3ZS55iEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$Qb0wvo-U3d z7QM-P>i+(!XES2pR#sNF{N>i>rlzK5b=#uFq>qhH*QBpaORjfuqceB!;)Pz!y*>Z` e|5sn_#>Swi$5FZOYxp^!K@6U*elF{r5}E*TEH`if diff --git a/docs/_themes/twistedtrac/static/extlink.gif b/docs/_themes/twistedtrac/static/extlink.gif deleted file mode 100644 index d47e14ca58d68e5b3f66f6a21b3ea7211636c289..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 90 zcmZ?wbhEHbsIv-Z;U{r{1G;!hSv1_l-e9R?r(sbyf6w-C~C iW^qtb;}P&^T69gP2NC6djdb&7< zSoGfQH{?2Cz{8yS_3_^|@`5^R^kl84vN%nP=HuktcJ>`xZvErsbH#TblQ36p4E^dP tG-IYhgRr3B=eLtC*}g4n=Cl0Fzba4#P zn3&AL&HelQkpn>R<^TVBHV$rk$Ch0OGp}4I`+I?pBP-hS3nv55BuhPY?xo*>+88`t L{an^LB{Ts5&e1f0 diff --git a/docs/_themes/twistedtrac/static/menu_grad.png b/docs/_themes/twistedtrac/static/menu_grad.png deleted file mode 100644 index 608b6eeab0bd5b562e72c7d5c312759635e7d7ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^j6f{L!3JU-`?d;5u@pObhHwBu4M$1`kk47*5m^jW ze;tGwoit`w00kvWTq8GM!}I6-krO9QIG7wfa>Qj%63f8@2M#bWJhx+tVNYw604inhboFyt=akR{04!=Q AEdT%j diff --git a/docs/_themes/twistedtrac/static/tab.png b/docs/_themes/twistedtrac/static/tab.png deleted file mode 100644 index 4c3099c3690766ee72769249088f0d3f29b9a137..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1597 zcmV-D2EzG?P)Hs-*tN#LR}=-q(9!jDQ&km3QO0{kQP4*}0BD-_(gK6QfPTMEx7#JywFq`C z8uxrIUfIR3b#nQTLWt>UZWnoYt4gP30BKfOmW64W=(>LB@rVBhjFZZ?ZK5cm+wIb6 z!JX^#oT(ph>8CrG*6?JXL5BfXVkSr(RMVHn1d+R>B4I#(|qpzFA< zOR-oa3`6!B4&i=*%O7pxR(eNjO9*j#h5H4T7w71AbPU75b=`5V=g7Hn+>_8W4d3_a z_xprl$nDSTy!VSus^<=l+oTZUl-PahuyS(_5{**H#Wc+mwRh~G88JCahoR&8UR&Q@qM2#3|YB3hhYw>oNZ5{ zX(2?8_Mh3T+?=Ce7I0m6JWzB}6A2nfhqye?qt$|?>vewin|0hX-AOesgveO9XR&m> zj%iqUo;T69Cl)j#p63w+33t9Y%lp53gr>)nE+K@Nu;D=E&KGCVwZg9l{FpbD$ra5= zp-`aTFS2y4&d-1Qkc`4o2yqNa0!!EGs1zv_3Ypf*G-v=^*X6sd0Z*2yEc|3Q>vBSf zH?;omD#4aZx$I_MEAyaH6b09HS^cKQ?8Shh*U!475aJM>mdWZjwTaG^d7aFI2EZ^3 z4BckwTAdI6@F0(pLWtK`x>m=~?IS-Nd0e>!4S;RiG&duju2eXGc`vWBLWmbUSw2H^ zvxM*4xz)@qXcR@kaU7Nx=b2pyD99+35V`9e7%V>@Wy+(=G?H7;K-z`UdN#MOp5y)B zKaf!+45qYo%J%lZ)Y}N z=2ddNqJi(bP;1}TaLZj8@)jZok8f95`?iMX<=bT%$vtQw?LyhM&A&cBkL~xUEyyDZ zLS$w8v6p_=?EJe-BU1?)NY@@64u^d8*(HAUrxm=aEOIWyq_uX7eD&ESOe0jH}NFPxMf|#qHUgpZL zA9L}_&a_WSi2r*JZ_RM)Zwn~sluFq@VsMzL2hH~@^R@WLUoWt+=JVr^8~8Q3x)I{2 zn%n6N{EgKznx^4-*)9EW6uA#?zl@?Nlu9Mq?KT^$Wj0pJ)Zg3Z2On&3rY>*96ykM~ zL}9PtaPRN)G*&7=x^jYT+t2?#{qN7zuW0_;=&pFD)1k3ap|MiIC=8i-Ct&tsfLrNO zum|Z@jL-~OCRDsVhLK9IW6*2s^x8V%zQxwV59GU3!&M6*Tbt z0ZhXfzY#O)!L$1np53oZ`_zOuwRBxS)*B@Aa_WL+WE40_k}wzyh@yx%j)~)#BuU1b v5N``bQO299s;H`pVHoJTek$(6yv~0Bn^xHep$K6V00000NkvXXu0mjf^FIgX diff --git a/docs/_themes/twistedtrac/static/top_grad.png b/docs/_themes/twistedtrac/static/top_grad.png deleted file mode 100644 index cda17dfee52d2222f156a4a2a161ec6650481035..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 180 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 diff --git a/docs/_themes/twistedtrac/static/twisted-icon.ico b/docs/_themes/twistedtrac/static/twisted-icon.ico deleted file mode 100644 index 341658c28018615ae89abc8830ef38387749a74c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1406 zcmeH{%Wm3G5Qe{VVlbh!p_im>nl@>3X((=qTgUi)otpd_MesKY>7iP$)z=9LBONB9RETZ4-?~aU6$OEJi#YCy_{yOeRUC zQl!&qGMNn7Y?fRuM?RmYP$*C=7AciVl*?r*l?v5rm0GPvyL-)ArwFdPmUjYf>eVTj+aJK2Op2Is)94MZC6Zg^8t(9N&~sNHSU(M@>+ z^b7RyT?yYsp+Dc3@WarqBmP^_&~1J#R&n(kE`P#>OyOJ(QZS{rA)zFf$GOCX a.headerlink, -h2:hover > a.headerlink, -h3:hover > a.headerlink, -h4:hover > a.headerlink, -h5:hover > a.headerlink, -h6:hover > a.headerlink, -dt:hover > a.headerlink { - visibility: visible; -} - -div.body p.caption { - text-align: inherit; -} - -div.body td { - text-align: left; -} - -.field-list ul { - padding-left: 1em; -} - -.first { - margin-top: 0 !important; -} - -p.rubric { - margin-top: 30px; - font-weight: bold; -} - -/* -- sidebars -------------------------------------------------------------- */ - -div.sidebar { - margin: 0 0 0.5em 1em; - border: 1px solid #ddb; - padding: 7px 7px 0 7px; - background-color: #ffe; - width: 40%; - float: right; -} - -p.sidebar-title { - font-weight: bold; -} - -/* -- topics ---------------------------------------------------------------- */ - -div.topic { - border: 1px solid #ccc; - padding: 7px 7px 0 7px; - margin: 10px 0 10px 0; -} - -p.topic-title { - font-size: 1.1em; - font-weight: bold; - margin-top: 10px; -} - -/* -- admonitions ----------------------------------------------------------- */ - -div.admonition { - margin-top: 10px; - margin-bottom: 10px; - padding: 7px; - background-color: #FFFFCC; -} - -div.admonition.warning { - background-color: #FFCCCC; -} - -div.admonition dt { - font-weight: bold; -} - -div.admonition dl { - margin-bottom: 0; -} - -p.admonition-title { - margin: 0px 10px 5px 0px; - font-weight: bold; -} - -div.body p.centered { - text-align: center; - margin-top: 25px; -} - -/* -- tables ---------------------------------------------------------------- */ - -table.docutils { - border: 0; - border-collapse: collapse; -} - -table.docutils td, table.docutils th { - padding: 1px 8px 1px 0; - border-top: 0; - border-left: 0; - border-right: 0; - border-bottom: 1px solid #aaa; -} - -table.field-list td, table.field-list th { - border: 0 !important; -} - -table.footnote td, table.footnote th { - border: 0 !important; -} - -th { - text-align: left; - padding-right: 5px; -} - -/* -- other body styles ----------------------------------------------------- */ - -dl { - margin-bottom: 15px; -} - -dd p { - margin-top: 0px; -} - -dd ul, dd table { - margin-bottom: 10px; -} - -dd { - margin-top: 3px; - margin-bottom: 10px; - margin-left: 30px; -} - -dt:target, .highlight { - /* background-color: #fbe54e; */ - background-color: #eeffcc; -} - -dl.glossary dt { - font-weight: bold; - font-size: 1.1em; -} - -.field-list ul { - margin: 0; - padding-left: 1em; -} - -.field-list p { - margin: 0; -} - -.refcount { - color: #060; -} - -.optional { - font-size: 1.3em; -} - -.versionmodified { - font-style: italic; -} - -.system-message { - background-color: #fda; - padding: 5px; - border: 3px solid red; -} - -.footnote:target { - background-color: #ffa -} - -.line-block { - display: block; - margin-top: 1em; - margin-bottom: 1em; -} - -.line-block .line-block { - margin-top: 0; - margin-bottom: 0; - margin-left: 1.5em; -} - -/* -- code displays --------------------------------------------------------- */ - -pre { - overflow: auto; - - /* optional? */ - padding: 10px; -} - -td.linenos pre { - padding: 5px 0px; - border: 0; - background-color: transparent; - color: #aaa; -} - -table.highlighttable { - margin-left: 0.5em; -} - -table.highlighttable td { - padding: 0 0.5em 0 0.5em; -} - -tt.descname { - background-color: transparent; - font-weight: bold; - font-size: 1.2em; -} - -tt.descclassname { - background-color: transparent; -} - -tt.xref, a tt { - background-color: transparent; - font-weight: bold; -} - -h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt { - background-color: transparent; -} - -/* -- math display ---------------------------------------------------------- */ - -img.math { - vertical-align: middle; -} - -div.body div.math p { - text-align: center; -} - -span.eqno { - float: right; -} - -/* -- printout stylesheet --------------------------------------------------- */ - -/* ----- -@media print { - div.document, - div.documentwrapper, - div.bodywrapper { - margin: 0 !important; - width: 100%; - } - - div.sphinxsidebar, - div.related, - div.footer, - #top-link { - display: none; - } -} - ------ */ - -div.documentwrapper { - float: left; - /* padding: 0 30px; */ /* use padding here? or margin in bodywrapper? */ - /* width: 70%; */ - margin-right: -300px; - width: 100%; -} - -div.bodywrapper { - margin-right: 300px; - padding-left: 40px; -} - -a.api { - font-family: monospace; -} diff --git a/docs/_themes/twistedtrac/theme.conf b/docs/_themes/twistedtrac/theme.conf deleted file mode 100644 index 73821c39a51..00000000000 --- a/docs/_themes/twistedtrac/theme.conf +++ /dev/null @@ -1,5 +0,0 @@ -[theme] -inherit = basic -stylesheet = twistedtrac.css -pygments_style = sphinx - diff --git a/docs/conf.py b/docs/conf.py index e183221fe63..1d870049593 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -45,8 +45,6 @@ except ImportError: pass -extensions.append("traclinks") - from twisted import version as twisted_version_object # Add any paths that contain templates here, relative to this directory. @@ -104,10 +102,10 @@ on_rtd = os.environ.get("READTHEDOCS", None) == "True" if not on_rtd: - html_theme = "twistedtrac" + import sphinx_rtd_theme -# Add any paths that contain custom themes here, relative to this directory. -html_theme_path = ["_themes"] + html_theme = "sphinx_rtd_theme" + html_theme_path = [sphinx_rtd_theme.get_html_theme_path()] # 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, @@ -194,14 +192,15 @@ pprint(dict(os.environ)) print("======") -# Base url for API docs -api_base_url = f"/documents/{release}/api/" +# For dev purposes we always point to latest read the docs to some something. +# In production, this is deployed via RTD and we have a specific version. +api_base_url = "/en/latest/api/" if on_rtd: # For a PR the link is like: # https://twisted--1422.org.readthedocs.build/en/1422/ # For a release: - # https://docs.twistedmatrix.com/en/twisted-20.3.0/ - # https://docs.twistedmatrix.com/en/latest/ + # https://docs.twisted.org/en/twisted-20.3.0/ + # https://docs.twisted.org/en/latest/ api_base_url = "/{}/{}/api/".format( os.environ["READTHEDOCS_LANGUAGE"], os.environ["READTHEDOCS_VERSION"], @@ -226,7 +225,7 @@ "--quiet", f"--html-viewsource-base=https://github.com/twisted/twisted/tree/{_git_reference}/src", "--project-name=Twisted", - "--project-url=https://twistedmatrix.com/", + "--project-url=https://twisted.org/", "--system-class=twisted.python._pydoctor.TwistedSystem", "--docformat=epytext", "--intersphinx=https://docs.python.org/3/objects.inv", @@ -246,8 +245,6 @@ pydoctor_url_path = "/en/{rtd_version}/api/" -traclinks_base_url = "https://twistedmatrix.com/trac" - # A dict mapping unique IDs (which can be used to disambiguate references) to a # tuple of (, ). # The inventory file may be None to use the default location at the given URI. diff --git a/setup.cfg b/setup.cfg index 4993aa166ac..eda454b0a97 100644 --- a/setup.cfg +++ b/setup.cfg @@ -57,7 +57,7 @@ test = dev_release = towncrier ~= 19.2 pydoctor ~= 21.9.0; python_version >= "3.6" - sphinx-rtd-theme ~= 0.5 + sphinx_rtd_theme ~= 1.0 readthedocs-sphinx-ext ~= 2.1 sphinx >= 4.1.2, <6 From 5d203602ef71723b910769715aa4f68850a49346 Mon Sep 17 00:00:00 2001 From: Adi Roiban Date: Mon, 11 Jul 2022 22:35:16 +0100 Subject: [PATCH 2/6] Fix core index. Add newsfragment. --- docs/core/index.rst | 2 -- src/twisted/newsfragments/11573.misc | 0 2 files changed, 2 deletions(-) create mode 100644 src/twisted/newsfragments/11573.misc diff --git a/docs/core/index.rst b/docs/core/index.rst index b6efe0bfe7f..06ffde996b6 100644 --- a/docs/core/index.rst +++ b/docs/core/index.rst @@ -12,13 +12,11 @@ Twisted Core howto/index examples/index specifications/index - development/index - :doc:`Developer guides ` : documentation on using Twisted Core to develop your own applications - :doc:`Examples ` : short code examples using Twisted Core - :doc:`Specifications ` : specification documents for elements of Twisted Core -- :doc:`Development of Twisted ` : for people who want to work on Twisted itself An `API reference `_ is available on the twistedmatrix web site. diff --git a/src/twisted/newsfragments/11573.misc b/src/twisted/newsfragments/11573.misc new file mode 100644 index 00000000000..e69de29bb2d From 0cd5f8c8fa64d9153827e03dd43da53a8675802a Mon Sep 17 00:00:00 2001 From: Adi Roiban Date: Mon, 11 Jul 2022 22:42:02 +0100 Subject: [PATCH 3/6] Try using latest sphinx so that we don't have to pin a commmit. --- setup.cfg | 2 +- tox.ini | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/setup.cfg b/setup.cfg index eda454b0a97..a22386aeec1 100644 --- a/setup.cfg +++ b/setup.cfg @@ -59,7 +59,7 @@ dev_release = pydoctor ~= 21.9.0; python_version >= "3.6" sphinx_rtd_theme ~= 1.0 readthedocs-sphinx-ext ~= 2.1 - sphinx >= 4.1.2, <6 + sphinx >= 5.0, <6 ; All the extra tools used to help with the development process. dev = diff --git a/tox.ini b/tox.ini index 02c0f54159b..7e7d9e067a7 100644 --- a/tox.ini +++ b/tox.ini @@ -133,10 +133,6 @@ usedevelop = True extras = dev_release -deps = - ; bugfix for https://github.com/sphinx-doc/sphinx/pull/9513/ on py310rc1 - sphinx @ https://github.com/sphinx-doc/sphinx/archive/514fca7a407f03fae4c788178555a74256936655.tar.gz - setenv = # Set this to `True` to run similar to Read The Docs. READTHEDOCS=False From 2e84d945c6992efad048124aa346f19156a4fd18 Mon Sep 17 00:00:00 2001 From: Adi Roiban Date: Mon, 11 Jul 2022 22:43:22 +0100 Subject: [PATCH 4/6] Remove sphinx build tool as we now use tox and Read The Docs. --- bin/admin/build-docs | 13 -- src/twisted/python/_release.py | 82 ------------ src/twisted/python/test/test_release.py | 160 +----------------------- 3 files changed, 1 insertion(+), 254 deletions(-) delete mode 100755 bin/admin/build-docs diff --git a/bin/admin/build-docs b/bin/admin/build-docs deleted file mode 100755 index 2ee2ba99973..00000000000 --- a/bin/admin/build-docs +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) Twisted Matrix Laboratories. -# See LICENSE for details. - -# This script is not meant to be distributed to users of Twisted. -# It is only for use in making upstream Twisted releases. - -import sys - -from twisted.python._release import SphinxBuilder - -SphinxBuilder().main(sys.argv[1:]) diff --git a/src/twisted/python/_release.py b/src/twisted/python/_release.py index 58796f4ade0..f54187b3f27 100644 --- a/src/twisted/python/_release.py +++ b/src/twisted/python/_release.py @@ -328,88 +328,6 @@ def build(self, projectName, projectURL, sourceURL, packagePath, outputPath): main(args) -class SphinxBuilder: - """ - Generate HTML documentation using Sphinx. - - Generates and runs a shell command that looks something like:: - - sphinx-build -b html -d [BUILDDIR]/doctrees - [DOCDIR]/source - [BUILDDIR]/html - - where DOCDIR is a directory containing another directory called "source" - which contains the Sphinx source files, and BUILDDIR is the directory in - which the Sphinx output will be created. - """ - - def main(self, args): - """ - Build the main documentation. - - @type args: list of str - @param args: The command line arguments to process. This must contain - one string argument: the path to the root of a Twisted checkout. - Additional arguments will be ignored for compatibility with legacy - build infrastructure. - """ - output = self.build(FilePath(args[0]).child("docs")) - if output: - sys.stdout.write(f"Unclean build:\n{output}\n") - raise sys.exit(1) - - def build(self, docDir, buildDir=None, version=""): - """ - Build the documentation in C{docDir} with Sphinx. - - @param docDir: The directory of the documentation. This is a directory - which contains another directory called "source" which contains the - Sphinx "conf.py" file and sphinx source documents. - @type docDir: L{twisted.python.filepath.FilePath} - - @param buildDir: The directory to build the documentation in. By - default this will be a child directory of {docDir} named "build". - @type buildDir: L{twisted.python.filepath.FilePath} - - @param version: The version of Twisted to set in the docs. - @type version: C{str} - - @return: the output produced by running the command - @rtype: L{str} - """ - if buildDir is None: - buildDir = docDir.parent().child("doc") - - doctreeDir = buildDir.child("doctrees") - - output = runCommand( - [ - "sphinx-build", - "-q", - "-b", - "html", - "-d", - doctreeDir.path, - docDir.path, - buildDir.path, - ] - ).decode("utf-8") - - # Delete the doctrees, as we don't want them after the docs are built - doctreeDir.remove() - - for path in docDir.walk(): - if path.basename() == "man": - segments = path.segmentsFrom(docDir) - dest = buildDir - while segments: - dest = dest.child(segments.pop(0)) - if not dest.parent().isdir(): - dest.parent().makedirs() - path.copyTo(dest) - return output - - def filePathDelta(origin, destination): """ Return a list of strings that represent C{destination} as a path relative diff --git a/src/twisted/python/test/test_release.py b/src/twisted/python/test/test_release.py index 83934bdcc22..440240a4ef5 100644 --- a/src/twisted/python/test/test_release.py +++ b/src/twisted/python/test/test_release.py @@ -16,9 +16,7 @@ import shutil import sys import tempfile -import textwrap -from io import BytesIO, StringIO -from subprocess import CalledProcessError +from io import BytesIO from unittest import skipIf from incremental import Version @@ -32,7 +30,6 @@ IVCSCommand, NotWorkingDirectory, Project, - SphinxBuilder, filePathDelta, findTwistedProjects, getRepositoryCommand, @@ -40,7 +37,6 @@ runCommand, ) from twisted.python.filepath import FilePath -from twisted.python.procutils import which from twisted.python.reflect import requireModule from twisted.trial.unittest import FailTest, SkipTest, TestCase @@ -644,160 +640,6 @@ def test_filePathDeltaSimilarEndElements(self): ) -@skipIf(not which("sphinx-build"), "Sphinx not available.") -class SphinxBuilderTests(TestCase): - """ - Tests for L{SphinxBuilder}. - - @note: This test case depends on twisted.web, which violates the standard - Twisted practice of not having anything in twisted.python depend on - other Twisted packages and opens up the possibility of creating - circular dependencies. Do not use this as an example of how to - structure your dependencies. - - @ivar builder: A plain L{SphinxBuilder}. - - @ivar sphinxDir: A L{FilePath} representing a directory to be used for - containing a Sphinx project. - - @ivar sourceDir: A L{FilePath} representing a directory to be used for - containing the source files for a Sphinx project. - """ - - confContent = """\ - source_suffix = '.rst' - master_doc = 'index' - """ - confContent = textwrap.dedent(confContent) - - indexContent = """\ - ============== - This is a Test - ============== - - This is only a test - ------------------- - - In case you hadn't figured it out yet, this is a test. - """ - indexContent = textwrap.dedent(indexContent) - - def setUp(self): - """ - Set up a few instance variables that will be useful. - """ - self.builder = SphinxBuilder() - - # set up a place for a fake sphinx project - self.twistedRootDir = FilePath(self.mktemp()) - self.sphinxDir = self.twistedRootDir.child("docs") - self.sphinxDir.makedirs() - self.sourceDir = self.sphinxDir - - def createFakeSphinxProject(self): - """ - Create a fake Sphinx project for test purposes. - - Creates a fake Sphinx project with the absolute minimum of source - files. This includes a single source file ('index.rst') and the - smallest 'conf.py' file possible in order to find that source file. - """ - self.sourceDir.child("conf.py").setContent(self.confContent.encode()) - self.sourceDir.child("index.rst").setContent(self.indexContent.encode()) - - def verifyFileExists(self, fileDir, fileName): - """ - Helper which verifies that C{fileName} exists in C{fileDir} and it has - some content. - - @param fileDir: A path to a directory. - @type fileDir: L{FilePath} - - @param fileName: The last path segment of a file which may exist within - C{fileDir}. - @type fileName: L{str} - - @raise FailTest: If C{fileDir.child(fileName)}: - - 1. Does not exist. - - 2. Is empty. - - 3. In the case where it's a path to a C{.html} file, the - content looks like an HTML file. - - @return: L{None} - """ - # check that file exists - fpath = fileDir.child(fileName) - self.assertTrue(fpath.exists()) - - # check that the output files have some content - fcontents = fpath.getContent() - self.assertTrue(len(fcontents) > 0) - - # check that the html files are at least html-ish - # this is not a terribly rigorous check - if fpath.path.endswith(".html"): - self.assertIn(b" Date: Tue, 12 Jul 2022 10:10:25 +0100 Subject: [PATCH 5/6] Add back dev index page. --- docs/core/index.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/core/index.rst b/docs/core/index.rst index 06ffde996b6..b6efe0bfe7f 100644 --- a/docs/core/index.rst +++ b/docs/core/index.rst @@ -12,11 +12,13 @@ Twisted Core howto/index examples/index specifications/index + development/index - :doc:`Developer guides ` : documentation on using Twisted Core to develop your own applications - :doc:`Examples ` : short code examples using Twisted Core - :doc:`Specifications ` : specification documents for elements of Twisted Core +- :doc:`Development of Twisted ` : for people who want to work on Twisted itself An `API reference `_ is available on the twistedmatrix web site. From 162bf1e0b872b9f8860b8ee320d3e211093add43 Mon Sep 17 00:00:00 2001 From: Adi Roiban Date: Sun, 28 Aug 2022 12:19:19 +0100 Subject: [PATCH 6/6] Remove more api links and rtd customisation that is no longer needed. --- docs/conf.py | 30 +++++------------------------- 1 file changed, 5 insertions(+), 25 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 91f42edf052..8e7853e7936 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -18,6 +18,8 @@ from datetime import date from pprint import pprint +import sphinx_rtd_theme + # 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. @@ -94,18 +96,9 @@ # -- Options for HTML output ---------------------------------------------- -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. - -# See Read The Docs environment variables -# https://docs.readthedocs.io/en/stable/builds.html#build-environment -on_rtd = os.environ.get("READTHEDOCS", None) == "True" - -if not on_rtd: - import sphinx_rtd_theme - - html_theme = "sphinx_rtd_theme" - html_theme_path = [sphinx_rtd_theme.get_html_theme_path()] +# Only the RTD theme is used. Both for local development and for the public site. +html_theme = "sphinx_rtd_theme" +html_theme_path = [sphinx_rtd_theme.get_html_theme_path()] # 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, @@ -192,19 +185,6 @@ pprint(dict(os.environ)) print("======") -# For dev purposes we always point to latest read the docs to some something. -# In production, this is deployed via RTD and we have a specific version. -api_base_url = "/en/latest/api/" -if on_rtd: - # For a PR the link is like: - # https://twisted--1422.org.readthedocs.build/en/1422/ - # For a release: - # https://docs.twisted.org/en/twisted-20.3.0/ - # https://docs.twisted.org/en/latest/ - api_base_url = "/{}/{}/api/".format( - os.environ["READTHEDOCS_LANGUAGE"], - os.environ["READTHEDOCS_VERSION"], - ) # Try to find URL fragment for the GitHub source page based on current # branch or tag.