1
- from collections import defaultdict
2
1
import os
3
- from pathlib import Path
4
2
import shutil
5
3
import subprocess
6
4
import tempfile
5
+ from collections import defaultdict
6
+ from pathlib import Path
7
+
7
8
from .tags import get_tag_infos
8
9
9
10
10
11
def build (repo_name , projects , releases_after = None ):
11
- ''' Build documentation for projects.
12
+ """ Build documentation for projects.
12
13
13
14
Build the given projects in _build/repo_name.
14
15
Create versioned documentations for tags after ``releases_after``,
15
16
if given.
16
- '''
17
+ """
17
18
tagged_versions = []
18
19
if releases_after :
19
20
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
22
22
]
23
23
# List of versions we have for each project
24
24
versions_4_project = defaultdict (list )
@@ -28,54 +28,45 @@ def build(repo_name, projects, releases_after=None):
28
28
for project in projects :
29
29
if project in versions_4_project :
30
30
last_vers [project ] = versions_4_project [project ][0 ]
31
- versions_4_project [project ][:0 ] = [' dev' , ' stable' ]
31
+ versions_4_project [project ][:0 ] = [" dev" , " stable" ]
32
32
else :
33
33
# 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" )
36
36
# Build current dev version for each project
37
37
for project in projects :
38
38
src_dir = project
39
39
builder = ProjectBuilder (
40
- repo_name , src_dir , project , versions_4_project [project ], ' dev'
40
+ repo_name , src_dir , project , versions_4_project [project ], " dev"
41
41
)
42
42
with builder :
43
43
builder .build ()
44
44
# 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 ' )
50
48
worktree = None
51
49
for tag in tagged_versions :
52
50
if worktree is None :
53
51
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
+ )
65
56
with ProjectBuilder (
66
57
repo_name ,
67
58
os .path .join (worktree , tag .project ),
68
59
tag .project ,
69
60
versions_4_project [tag .project ],
70
- tag .version
61
+ tag .version ,
71
62
) as builder :
72
63
builder .build ()
73
64
if worktree is not None :
74
65
shutil .rmtree (worktree )
75
66
for project in projects :
76
- if last_vers [project ] == ' dev' :
67
+ if last_vers [project ] == " dev" :
77
68
continue
78
- stable = Path (f' _build/{ repo_name } /{ project } /stable' )
69
+ stable = Path (f" _build/{ repo_name } /{ project } /stable" )
79
70
if stable .is_symlink ():
80
71
stable .unlink ()
81
72
if stable .exists ():
@@ -84,8 +75,7 @@ def build(repo_name, projects, releases_after=None):
84
75
85
76
86
77
class DocBuilder :
87
- '''Builder for the top-level documentation.
88
- '''
78
+ """Builder for the top-level documentation."""
89
79
90
80
def __init__ (self , repo_name , src_dir ):
91
81
self .repo_name = repo_name
@@ -103,22 +93,31 @@ def build(self):
103
93
subprocess .check_call (cmd , env = env )
104
94
105
95
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
+ )
110
104
111
105
def environ (self ):
112
106
return os .environ .copy ()
113
107
114
108
@property
115
109
def cmd_prefix (self ):
116
110
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 ,
122
121
]
123
122
124
123
@property
@@ -127,16 +126,16 @@ def cmd_opts(self):
127
126
128
127
@property
129
128
def dest_dir (self ):
130
- return f' _build/{ self .repo_name } '
129
+ return f" _build/{ self .repo_name } "
131
130
132
131
@property
133
132
def doc_tree (self ):
134
- return ' _build/doctrees'
133
+ return " _build/doctrees"
135
134
136
135
137
136
class ProjectBuilder (DocBuilder ):
138
- ''' Builder for individual projects, with project name and version.
139
- '''
137
+ """ Builder for individual projects, with project name and version."""
138
+
140
139
def __init__ (self , repo_name , src_dir , project_name , versions , version ):
141
140
super ().__init__ (repo_name , src_dir )
142
141
self .project_name = project_name
@@ -146,9 +145,9 @@ def __init__(self, repo_name, src_dir, project_name, versions, version):
146
145
def __exit__ (self , exc_type , exc_val , exc_tb ):
147
146
# Remove static theme files from project static, they're
148
147
# 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/*" ):
150
149
# The options are project-specific.
151
- if staticfile .name != ' documentation_options.js' :
150
+ if staticfile .name != " documentation_options.js" :
152
151
staticfile .unlink ()
153
152
return False
154
153
@@ -158,36 +157,38 @@ def build(self):
158
157
159
158
def environ (self ):
160
159
env = super ().environ ()
161
- env [' PYTHONPATH' ] = self .src_dir
160
+ env [" PYTHONPATH" ] = self .src_dir
162
161
return env
163
162
164
163
@property
165
164
def cmd_opts (self ):
166
165
opts = [
167
- '-D' , 'project=' + self .project_name ,
166
+ "-D" ,
167
+ "project=" + self .project_name ,
168
168
]
169
- if self .version != ' dev' :
169
+ if self .version != " dev" :
170
170
opts += [
171
- '-D' , f'release={ self .version } ' ,
171
+ "-D" ,
172
+ f"release={ self .version } " ,
172
173
]
173
174
return opts
174
175
175
176
@property
176
177
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 } "
178
179
179
180
def create_versions_doc (self ):
180
- target_path = Path (self .src_dir ) / ' docs' / ' _templates'
181
+ target_path = Path (self .src_dir ) / " docs" / " _templates"
181
182
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 (
184
185
f'<a href="/{ self .repo_name } /{ self .project_name } /{ v } ">{ v } </a>'
185
186
for v in self .versions
186
187
)
187
- content = f''' <h3>Versions</h3>
188
+ content = f""" <h3>Versions</h3>
188
189
<p id="versions">
189
190
<span class="version">{ self .version } </span>
190
191
<span class="links">{ links } </span>
191
192
</p>
192
- '''
193
+ """
193
194
target_path .write_text (content )
0 commit comments