1- from collections import defaultdict
21import os
3- from pathlib import Path
42import shutil
53import subprocess
64import tempfile
5+ from collections import defaultdict
6+ from pathlib import Path
7+
78from .tags import get_tag_infos
89
910
1011def build (repo_name , projects , releases_after = None ):
11- ''' Build documentation for projects.
12+ """ Build documentation for projects.
1213
1314 Build the given projects in _build/repo_name.
1415 Create versioned documentations for tags after ``releases_after``,
1516 if given.
16- '''
17+ """
1718 tagged_versions = []
1819 if releases_after :
1920 tagged_versions = [
20- tag for tag in get_tag_infos (releases_after )
21- if tag .project in projects
21+ tag for tag in get_tag_infos (releases_after ) if tag .project in projects
2222 ]
2323 # List of versions we have for each project
2424 versions_4_project = defaultdict (list )
@@ -28,54 +28,45 @@ def build(repo_name, projects, releases_after=None):
2828 for project in projects :
2929 if project in versions_4_project :
3030 last_vers [project ] = versions_4_project [project ][0 ]
31- versions_4_project [project ][:0 ] = [' dev' , ' stable' ]
31+ versions_4_project [project ][:0 ] = [" dev" , " stable" ]
3232 else :
3333 # No releases yet, just dev
34- last_vers [project ] = ' dev'
35- versions_4_project [project ].append (' dev' )
34+ last_vers [project ] = " dev"
35+ versions_4_project [project ].append (" dev" )
3636 # Build current dev version for each project
3737 for project in projects :
3838 src_dir = project
3939 builder = ProjectBuilder (
40- repo_name , src_dir , project , versions_4_project [project ], ' dev'
40+ repo_name , src_dir , project , versions_4_project [project ], " dev"
4141 )
4242 with builder :
4343 builder .build ()
4444 # Create redirect page from project to stable release or dev
45- index = Path (f'_build/{ repo_name } /{ project } /index.html' )
46- target = 'stable' if last_vers [project ] != 'dev' else 'dev'
47- index .write_text (
48- f'<meta http-equiv="refresh" content="0; URL={ target } /">\n '
49- )
45+ index = Path (f"_build/{ repo_name } /{ project } /index.html" )
46+ target = "stable" if last_vers [project ] != "dev" else "dev"
47+ index .write_text (f'<meta http-equiv="refresh" content="0; URL={ target } /">\n ' )
5048 worktree = None
5149 for tag in tagged_versions :
5250 if worktree is None :
5351 worktree = tempfile .mkdtemp ()
54- subprocess .run ([
55- 'git' ,
56- 'worktree' , 'add' ,
57- '--detach' ,
58- worktree
59- ])
60- subprocess .run ([
61- 'git' ,
62- 'checkout' ,
63- f'{ tag .project } @{ tag .version } '
64- ], cwd = worktree )
52+ subprocess .run (["git" , "worktree" , "add" , "--detach" , worktree ])
53+ subprocess .run (
54+ ["git" , "checkout" , f"{ tag .project } @{ tag .version } " ], cwd = worktree
55+ )
6556 with ProjectBuilder (
6657 repo_name ,
6758 os .path .join (worktree , tag .project ),
6859 tag .project ,
6960 versions_4_project [tag .project ],
70- tag .version
61+ tag .version ,
7162 ) as builder :
7263 builder .build ()
7364 if worktree is not None :
7465 shutil .rmtree (worktree )
7566 for project in projects :
76- if last_vers [project ] == ' dev' :
67+ if last_vers [project ] == " dev" :
7768 continue
78- stable = Path (f' _build/{ repo_name } /{ project } /stable' )
69+ stable = Path (f" _build/{ repo_name } /{ project } /stable" )
7970 if stable .is_symlink ():
8071 stable .unlink ()
8172 if stable .exists ():
@@ -84,8 +75,7 @@ def build(repo_name, projects, releases_after=None):
8475
8576
8677class DocBuilder :
87- '''Builder for the top-level documentation.
88- '''
78+ """Builder for the top-level documentation."""
8979
9080 def __init__ (self , repo_name , src_dir ):
9181 self .repo_name = repo_name
@@ -103,22 +93,31 @@ def build(self):
10393 subprocess .check_call (cmd , env = env )
10494
10595 def command (self ):
106- return self .cmd_prefix + self .cmd_opts + [
107- f'{ self .src_dir } /docs' ,
108- self .dest_dir ,
109- ]
96+ return (
97+ self .cmd_prefix
98+ + self .cmd_opts
99+ + [
100+ f"{ self .src_dir } /docs" ,
101+ self .dest_dir ,
102+ ]
103+ )
110104
111105 def environ (self ):
112106 return os .environ .copy ()
113107
114108 @property
115109 def cmd_prefix (self ):
116110 return [
117- 'sphinx-build' ,
118- '-c' , 'docs' ,
119- '-a' , '-E' , '-W' ,
120- '-A' , 'root_url=/' + self .repo_name ,
121- '-d' , self .doc_tree ,
111+ "sphinx-build" ,
112+ "-c" ,
113+ "docs" ,
114+ "-a" ,
115+ "-E" ,
116+ "-W" ,
117+ "-A" ,
118+ "root_url=/" + self .repo_name ,
119+ "-d" ,
120+ self .doc_tree ,
122121 ]
123122
124123 @property
@@ -127,16 +126,16 @@ def cmd_opts(self):
127126
128127 @property
129128 def dest_dir (self ):
130- return f' _build/{ self .repo_name } '
129+ return f" _build/{ self .repo_name } "
131130
132131 @property
133132 def doc_tree (self ):
134- return ' _build/doctrees'
133+ return " _build/doctrees"
135134
136135
137136class ProjectBuilder (DocBuilder ):
138- ''' Builder for individual projects, with project name and version.
139- '''
137+ """ Builder for individual projects, with project name and version."""
138+
140139 def __init__ (self , repo_name , src_dir , project_name , versions , version ):
141140 super ().__init__ (repo_name , src_dir )
142141 self .project_name = project_name
@@ -146,9 +145,9 @@ def __init__(self, repo_name, src_dir, project_name, versions, version):
146145 def __exit__ (self , exc_type , exc_val , exc_tb ):
147146 # Remove static theme files from project static, they're
148147 # used from the top-level _static.
149- for staticfile in Path (self .dest_dir ).glob (' _static/*' ):
148+ for staticfile in Path (self .dest_dir ).glob (" _static/*" ):
150149 # The options are project-specific.
151- if staticfile .name != ' documentation_options.js' :
150+ if staticfile .name != " documentation_options.js" :
152151 staticfile .unlink ()
153152 return False
154153
@@ -158,36 +157,38 @@ def build(self):
158157
159158 def environ (self ):
160159 env = super ().environ ()
161- env [' PYTHONPATH' ] = self .src_dir
160+ env [" PYTHONPATH" ] = self .src_dir
162161 return env
163162
164163 @property
165164 def cmd_opts (self ):
166165 opts = [
167- '-D' , 'project=' + self .project_name ,
166+ "-D" ,
167+ "project=" + self .project_name ,
168168 ]
169- if self .version != ' dev' :
169+ if self .version != " dev" :
170170 opts += [
171- '-D' , f'release={ self .version } ' ,
171+ "-D" ,
172+ f"release={ self .version } " ,
172173 ]
173174 return opts
174175
175176 @property
176177 def dest_dir (self ):
177- return f' _build/{ self .repo_name } /{ self .project_name } /{ self .version } '
178+ return f" _build/{ self .repo_name } /{ self .project_name } /{ self .version } "
178179
179180 def create_versions_doc (self ):
180- target_path = Path (self .src_dir ) / ' docs' / ' _templates'
181+ target_path = Path (self .src_dir ) / " docs" / " _templates"
181182 target_path .mkdir (exist_ok = True )
182- target_path = target_path / ' versions.html'
183- links = ' ' .join (
183+ target_path = target_path / " versions.html"
184+ links = " " .join (
184185 f'<a href="/{ self .repo_name } /{ self .project_name } /{ v } ">{ v } </a>'
185186 for v in self .versions
186187 )
187- content = f''' <h3>Versions</h3>
188+ content = f""" <h3>Versions</h3>
188189<p id="versions">
189190 <span class="version">{ self .version } </span>
190191 <span class="links">{ links } </span>
191192</p>
192- '''
193+ """
193194 target_path .write_text (content )
0 commit comments