Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit0f2598a

Browse files
authored
Add theBuildMetadata class (#299)
1 parent599b4ff commit0f2598a

File tree

1 file changed

+106
-50
lines changed

1 file changed

+106
-50
lines changed

‎build_docs.py‎

Lines changed: 106 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -294,21 +294,82 @@ class Language:
294294
deftag(self)->str:
295295
returnself.iso639_tag.replace("_","-").lower()
296296

297-
@property
298-
defis_translation(self)->bool:
299-
returnself.tag!="en"
300-
301-
@property
302-
deflocale_repo_url(self)->str:
303-
returnf"https://github.com/python/python-docs-{self.tag}.git"
304-
305297
@property
306298
defswitcher_label(self)->str:
307299
ifself.translated_name:
308300
returnf"{self.name} |{self.translated_name}"
309301
returnself.name
310302

311303

304+
@dataclasses.dataclass(frozen=True,kw_only=True,slots=True)
305+
classBuildMetadata:
306+
_version:Version
307+
_language:Language
308+
309+
@property
310+
defsphinxopts(self)->Sequence[str]:
311+
returnself._language.sphinxopts
312+
313+
@property
314+
defiso639_tag(self)->str:
315+
returnself._language.iso639_tag
316+
317+
@property
318+
defhtml_only(self)->bool:
319+
returnself._language.html_only
320+
321+
@property
322+
defurl(self):
323+
"""The URL of this version in production."""
324+
ifself.is_translation:
325+
returnf"https://docs.python.org/{self.version}/{self.language}/"
326+
returnf"https://docs.python.org/{self.version}/"
327+
328+
@property
329+
defbranch_or_tag(self)->str:
330+
returnself._version.branch_or_tag
331+
332+
@property
333+
defstatus(self)->str:
334+
returnself._version.status
335+
336+
@property
337+
defis_eol(self)->bool:
338+
returnself._version.status=="EOL"
339+
340+
@property
341+
defdependencies(self)->list[str]:
342+
returnself._version.requirements
343+
344+
@property
345+
defversion(self):
346+
returnself._version.name
347+
348+
@property
349+
defversion_tuple(self):
350+
returnself._version.as_tuple()
351+
352+
@property
353+
deflanguage(self):
354+
returnself._language.tag
355+
356+
@property
357+
defis_translation(self):
358+
returnself.language!="en"
359+
360+
@property
361+
defslug(self)->str:
362+
returnf"{self.language}/{self.version}"
363+
364+
@property
365+
defvenv_name(self)->str:
366+
returnf"venv-{self.version}"
367+
368+
@property
369+
deflocale_repo_url(self)->str:
370+
returnf"https://github.com/python/python-docs-{self.language}.git"
371+
372+
312373
defrun(
313374
cmd:Sequence[str|Path],cwd:Path|None=None
314375
)->subprocess.CompletedProcess:
@@ -534,8 +595,7 @@ def version_info() -> None:
534595
classDocBuilder:
535596
"""Builder for a CPython version and a language."""
536597

537-
version:Version
538-
language:Language
598+
build_meta:BuildMetadata
539599
cpython_repo:Repository
540600
docs_by_version_content:bytes
541601
switchers_content:bytes
@@ -553,7 +613,7 @@ def html_only(self) -> bool:
553613
return (
554614
self.select_outputin {"only-html","only-html-en"}
555615
orself.quick
556-
orself.language.html_only
616+
orself.build_meta.html_only
557617
)
558618

559619
@property
@@ -567,11 +627,11 @@ def run(self, http: urllib3.PoolManager, force_build: bool) -> bool | None:
567627
start_timestamp=dt.datetime.now(tz=dt.UTC).replace(microsecond=0)
568628
logging.info("Running.")
569629
try:
570-
ifself.language.html_onlyandnotself.includes_html:
630+
ifself.build_meta.html_onlyandnotself.includes_html:
571631
logging.info("Skipping non-HTML build (language is HTML-only).")
572632
returnNone# skipped
573-
self.cpython_repo.switch(self.version.branch_or_tag)
574-
ifself.language.is_translation:
633+
self.cpython_repo.switch(self.build_meta.branch_or_tag)
634+
ifself.build_meta.is_translation:
575635
self.clone_translation()
576636
iftrigger_reason:=self.should_rebuild(force_build):
577637
self.build_venv()
@@ -593,7 +653,7 @@ def run(self, http: urllib3.PoolManager, force_build: bool) -> bool | None:
593653

594654
@property
595655
deflocale_dir(self)->Path:
596-
returnself.build_root/self.version.name/"locale"
656+
returnself.build_root/self.build_meta.version/"locale"
597657

598658
@property
599659
defcheckout(self)->Path:
@@ -608,8 +668,8 @@ def clone_translation(self) -> None:
608668
deftranslation_repo(self)->Repository:
609669
"""See PEP 545 for translations repository naming convention."""
610670

611-
locale_clone_dir=self.locale_dir/self.language.iso639_tag/"LC_MESSAGES"
612-
returnRepository(self.language.locale_repo_url,locale_clone_dir)
671+
locale_clone_dir=self.locale_dir/self.build_meta.iso639_tag/"LC_MESSAGES"
672+
returnRepository(self.build_meta.locale_repo_url,locale_clone_dir)
613673

614674
@property
615675
deftranslation_branch(self)->str:
@@ -623,25 +683,25 @@ def translation_branch(self) -> str:
623683
"""
624684
remote_branches=self.translation_repo.run("branch","-r").stdout
625685
branches=re.findall(r"/([0-9]+\.[0-9]+)$",remote_branches,re.M)
626-
returnlocate_nearest_version(branches,self.version.name)
686+
returnlocate_nearest_version(branches,self.build_meta.version)
627687

628688
defbuild(self)->None:
629689
"""Build this version/language doc."""
630690
logging.info("Build start.")
631691
start_time=perf_counter()
632-
sphinxopts=list(self.language.sphinxopts)
633-
ifself.language.is_translation:
692+
sphinxopts=list(self.build_meta.sphinxopts)
693+
ifself.build_meta.is_translation:
634694
sphinxopts.extend((
635695
f"-D locale_dirs={self.locale_dir}",
636-
f"-D language={self.language.iso639_tag}",
696+
f"-D language={self.build_meta.iso639_tag}",
637697
"-D gettext_compact=0",
638698
"-D translation_progress_classes=1",
639699
))
640700

641-
ifself.version.status=="EOL":
701+
ifself.build_meta.is_eol:
642702
sphinxopts.append("-D html_context.outdated=1")
643703

644-
ifself.version.statusin ("in development","pre-release"):
704+
ifself.build_meta.statusin ("in development","pre-release"):
645705
maketarget="autobuild-dev"
646706
else:
647707
maketarget="autobuild-stable"
@@ -653,17 +713,15 @@ def build(self) -> None:
653713
blurb=self.venv/"bin"/"blurb"
654714

655715
ifself.includes_html:
656-
site_url=self.version.url
657-
ifself.language.is_translation:
658-
site_url+=f"{self.language.tag}/"
716+
site_url=self.build_meta.url
659717
# Define a tag to enable opengraph socialcards previews
660718
# (used in Doc/conf.py and requires matplotlib)
661719
sphinxopts+= (
662720
"-t create-social-cards",
663721
f"-D ogp_site_url={site_url}",
664722
)
665723

666-
ifself.version.as_tuple()< (3,8):
724+
ifself.build_meta.version_tuple< (3,8):
667725
# Disable CPython switchers, we handle them now:
668726
text= (self.checkout/"Doc"/"Makefile").read_text(encoding="utf-8")
669727
text=text.replace(" -A switchers=1","")
@@ -696,12 +754,12 @@ def build_venv(self) -> None:
696754
So we can reuse them from builds to builds, while they contain
697755
different Sphinx versions.
698756
"""
699-
requirements=list(self.version.requirements)
757+
requirements=list(self.build_meta.dependencies)
700758
ifself.includes_html:
701759
# opengraph previews
702760
requirements.append("matplotlib>=3")
703761

704-
venv_path=self.build_root/f"venv-{self.version.name}"
762+
venv_path=self.build_root/self.build_meta.venv_name
705763
venv.create(venv_path,symlinks=os.name!="nt",with_pip=True)
706764
run(
707765
(
@@ -726,7 +784,7 @@ def setup_indexsidebar(self) -> None:
726784
dbv_path=tmpl_dst/"_docs_by_version.html"
727785

728786
shutil.copy(tmpl_src/"indexsidebar.html",tmpl_dst/"indexsidebar.html")
729-
ifself.version.status!="EOL":
787+
ifnotself.build_meta.is_eol:
730788
dbv_path.write_bytes(self.docs_by_version_content)
731789
else:
732790
shutil.copy(tmpl_src/"_docs_by_version.html",dbv_path)
@@ -736,14 +794,14 @@ def copy_build_to_webroot(self, http: urllib3.PoolManager) -> None:
736794
logging.info("Publishing start.")
737795
start_time=perf_counter()
738796
self.www_root.mkdir(parents=True,exist_ok=True)
739-
ifnotself.language.is_translation:
740-
target=self.www_root/self.version.name
797+
ifnotself.build_meta.is_translation:
798+
target=self.www_root/self.build_meta.version
741799
else:
742-
language_dir=self.www_root/self.language.tag
800+
language_dir=self.www_root/self.build_meta.language
743801
language_dir.mkdir(parents=True,exist_ok=True)
744802
chgrp(language_dir,group=self.group,recursive=True)
745803
language_dir.chmod(0o775)
746-
target=language_dir/self.version.name
804+
target=language_dir/self.build_meta.version
747805

748806
target.mkdir(parents=True,exist_ok=True)
749807
try:
@@ -792,8 +850,7 @@ def copy_build_to_webroot(self, http: urllib3.PoolManager) -> None:
792850

793851
logging.info("%s files changed",changed)
794852
ifchangedandnotself.skip_cache_invalidation:
795-
surrogate_key=f"{self.language.tag}/{self.version.name}"
796-
purge_surrogate_key(http,surrogate_key)
853+
purge_surrogate_key(http,self.build_meta.slug)
797854
logging.info(
798855
"Publishing done (%s).",format_seconds(perf_counter()-start_time)
799856
)
@@ -804,7 +861,7 @@ def should_rebuild(self, force: bool) -> str | Literal[False]:
804861
logging.info("Should rebuild: no previous state found.")
805862
return"no previous state"
806863
cpython_sha=self.cpython_repo.run("rev-parse","HEAD").stdout.strip()
807-
ifself.language.is_translation:
864+
ifself.build_meta.is_translation:
808865
translation_sha=self.translation_repo.run(
809866
"rev-parse","HEAD"
810867
).stdout.strip()
@@ -839,7 +896,7 @@ def load_state(self) -> dict:
839896
state_file=self.build_root/"state.toml"
840897
try:
841898
returntomlkit.loads(state_file.read_text(encoding="UTF-8"))[
842-
f"/{self.language.tag}/{self.version.name}/"
899+
f"/{self.build_meta.slug}/"
843900
]
844901
except (KeyError,FileNotFoundError):
845902
return {}
@@ -860,14 +917,14 @@ def save_state(
860917
exceptFileNotFoundError:
861918
states=tomlkit.document()
862919

863-
key=f"/{self.language.tag}/{self.version.name}/"
920+
key=f"/{self.build_meta.slug}/"
864921
state= {
865922
"last_build_start":build_start,
866923
"last_build_duration":round(build_duration,0),
867924
"triggered_by":trigger,
868925
"cpython_sha":self.cpython_repo.run("rev-parse","HEAD").stdout.strip(),
869926
}
870-
ifself.language.is_translation:
927+
ifself.build_meta.is_translation:
871928
state["translation_sha"]=self.translation_repo.run(
872929
"rev-parse","HEAD"
873930
).stdout.strip()
@@ -1123,7 +1180,7 @@ def build_docs(args: argparse.Namespace) -> int:
11231180
# pairs from the end of the list, effectively reversing it.
11241181
# This runs languages in config.toml order and versions newest first.
11251182
todo= [
1126-
(version,language)
1183+
BuildMetadata(_version=version,_language=language)
11271184
forversioninversions.filter(args.branches)
11281185
forlanguageinreversed(languages.filter(args.languages))
11291186
]
@@ -1142,28 +1199,27 @@ def build_docs(args: argparse.Namespace) -> int:
11421199
args.build_root/_checkout_name(args.select_output),
11431200
)
11441201
whiletodo:
1145-
version,language=todo.pop()
1202+
build_props=todo.pop()
11461203
logging.root.handlers[0].setFormatter(
11471204
logging.Formatter(
1148-
f"%(asctime)s %(levelname)s{language.tag}/{version.name}: %(message)s"
1205+
f"%(asctime)s %(levelname)s{build_props.slug}: %(message)s"
11491206
)
11501207
)
11511208
ifsentry_sdk:
11521209
scope=sentry_sdk.get_isolation_scope()
1153-
scope.set_tag("version",version.name)
1154-
scope.set_tag("language",language.tag)
1210+
scope.set_tag("version",build_props.version)
1211+
scope.set_tag("language",build_props.language)
11551212
cpython_repo.update()
11561213
builder=DocBuilder(
1157-
version,
1158-
language,
1214+
build_props,
11591215
cpython_repo,
11601216
docs_by_version_content,
11611217
switchers_content,
11621218
**vars(args),
11631219
)
11641220
built_successfully=builder.run(http,force_build=force_build)
11651221
ifbuilt_successfully:
1166-
build_succeeded.add((version.name,language.tag))
1222+
build_succeeded.add(build_props.slug)
11671223
elifbuilt_successfullyisnotNone:
11681224
any_build_failed=True
11691225

@@ -1286,7 +1342,7 @@ def make_symlinks(
12861342
group:str,
12871343
versions:Versions,
12881344
languages:Languages,
1289-
successful_builds:Set[tuple[str,str]],
1345+
successful_builds:Set[str],
12901346
skip_cache_invalidation:bool,
12911347
http:urllib3.PoolManager,
12921348
)->None:
@@ -1306,7 +1362,7 @@ def make_symlinks(
13061362
("dev",versions.current_dev.name),
13071363
):
13081364
forlanguageinlanguages:
1309-
if(symlink_target,language.tag)insuccessful_builds:
1365+
iff"{language.tag}/{symlink_target}"insuccessful_builds:
13101366
symlink(
13111367
www_root,
13121368
language.tag,

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp