1- from pathlib import Path
2-
3- import shutil
4- import contextlib
51import argparse
2+ import contextlib
3+ import io
64import json
75import logging
86import os
97import pathlib
8+ import shutil
109import sys
1110import time
1211import traceback
1312import typing
14- import io
15- import sphinx .application
13+ from pathlib import Path
1614
15+ import sphinx .application
1716from sphinx .cmd .build import main
1817
19-
2018WorkRequest = object
2119WorkResponse = object
2220
23- logger = logging .getLogger ('sphinxdocs-build' )
21+ logger = logging .getLogger ("sphinxdocs_build" )
2422
2523_WORKER_SPHINX_EXT_MODULE_NAME = "bazel_worker_sphinx_ext"
2624
25+
2726class Worker :
2827
29- def __init__ (self , instream : "typing.TextIO" , outstream : "typing.TextIO" , exec_root : str ):
28+ def __init__ (
29+ self , instream : "typing.TextIO" , outstream : "typing.TextIO" , exec_root : str
30+ ):
3031 # NOTE: Sphinx performs its own logging re-configuration, so any
3132 # logging config we do isn't respected by Sphinx. Controlling where
3233 # stdout and stderr goes are the main mechanisms. Recall that
@@ -109,10 +110,7 @@ def _prepare_sphinx(self, request):
109110 incoming_digests = {}
110111 current_digests = self ._digests .setdefault (srcdir , {})
111112 changed_paths = []
112- request_info = {
113- "exec_root" : self ._exec_root ,
114- "inputs" : request ["inputs" ]
115- }
113+ request_info = {"exec_root" : self ._exec_root , "inputs" : request ["inputs" ]}
116114 for entry in request ["inputs" ]:
117115 path = entry ["path" ]
118116 digest = entry ["digest" ]
@@ -174,11 +172,12 @@ def _process_request(self, request: "WorkRequest") -> "WorkResponse | None":
174172
175173 if exit_code :
176174 raise Exception (
177- "Sphinx main() returned failure: " +
178- f" exit code: { exit_code } \n " +
179- "========== STDOUT START ==========\n " +
180- stdout .getvalue ().rstrip ("\n " ) + "\n " +
181- "========== STDOUT END ==========\n "
175+ "Sphinx main() returned failure: "
176+ + f" exit code: { exit_code } \n "
177+ + "========== STDOUT START ==========\n "
178+ + stdout .getvalue ().rstrip ("\n " )
179+ + "\n "
180+ + "========== STDOUT END ==========\n "
182181 )
183182
184183 # Copying is unfortunately necessary because Bazel doesn't know to
@@ -193,32 +192,31 @@ def _process_request(self, request: "WorkRequest") -> "WorkResponse | None":
193192 return response
194193
195194
196-
197- # todo: make this parallel-safe
198195class BazelWorkerExtension :
196+ """A Sphinx extension implemented as a class acting like a module."""
197+
199198 def __init__ (self ):
199+ # Make it look like a Module object
200200 self .__name__ = _WORKER_SPHINX_EXT_MODULE_NAME
201201 # set[str] of src-dir relative path names
202202 self .changed_paths = set ()
203203
204204 def setup (self , app ):
205- app .connect ('env-get-outdated' , self ._handle_env_get_outdated )
206- return {
207- "parallel_read_safe" : True ,
208- "parallel_write_safe" : True
209- }
205+ app .connect ("env-get-outdated" , self ._handle_env_get_outdated )
206+ return {"parallel_read_safe" : True , "parallel_write_safe" : True }
210207
211208 def _handle_env_get_outdated (self , app , env , added , changed , removed ):
212209 changed = {
213210 # NOTE: path2doc returns None if it's not a doc path
214- env .path2doc (p ) for p in self .changed_paths
211+ env .path2doc (p )
212+ for p in self .changed_paths
215213 }
216214 logger .info ("changed docs: %s" , changed )
217215 return changed
218216
219217
220218if __name__ == "__main__" :
221- if ' --persistent_worker' in sys .argv :
219+ if " --persistent_worker" in sys .argv :
222220 with Worker (sys .stdin , sys .stdout , os .getcwd ()) as worker :
223221 sys .exit (worker .run ())
224222 else :
0 commit comments