[docs]classVersionGitHubActionsOutput:OUTPUT_ENV_VAR="GITHUB_OUTPUT"def__init__(self,gh_client:Github,mode:PersistenceMode=PersistenceMode.PERMANENT,released:bool|None=None,version:Version|None=None,commit_sha:str|None=None,release_notes:str|None=None,prev_version:Version|None=None,)->None:self._gh_client=gh_clientself._mode=modeself._released=releasedself._version=versionself._commit_sha=commit_shaself._release_notes=release_notesself._prev_version=prev_version@propertydefreleased(self)->bool|None:returnself._released@released.setterdefreleased(self,value:bool)->None:ifnotisinstance(value,bool):raiseTypeError("output 'released' is boolean")self._released=value@propertydefversion(self)->Version|None:returnself._versionifself._versionisnotNoneelseNone@version.setterdefversion(self,value:Version)->None:ifnotisinstance(value,Version):raiseTypeError("output 'released' should be a Version")self._version=value@propertydeftag(self)->str|None:returnself.version.as_tag()ifself.versionisnotNoneelseNone@propertydefis_prerelease(self)->bool|None:returnself.version.is_prereleaseifself.versionisnotNoneelseNone@propertydefcommit_sha(self)->str|None:returnself._commit_shaifself._commit_shaelseNone@commit_sha.setterdefcommit_sha(self,value:str)->None:ifnotisinstance(value,str):raiseTypeError("output 'commit_sha' should be a string")ifnotregexp(r"^[0-9a-f]{40}$").match(value):raiseValueError("output 'commit_sha' should be a valid 40-hex-character SHA")self._commit_sha=value@propertydefrelease_notes(self)->str|None:returnself._release_notesifself._release_noteselseNone@release_notes.setterdefrelease_notes(self,value:str)->None:ifnotisinstance(value,str):raiseTypeError("output 'release_notes' should be a string")self._release_notes=value@propertydefprev_version(self)->Version|None:ifnotself.released:returnself.versionreturnself._prev_versionifself._prev_versionelseNone@prev_version.setterdefprev_version(self,value:Version)->None:ifnotisinstance(value,Version):raiseTypeError("output 'prev_version' should be a Version")self._prev_version=value
[docs]defto_output_text(self)->str:missing:set[str]=set()ifself.versionisNone:missing.add("version")ifself.releasedisNone:missing.add("released")ifself.released:ifself.release_notesisNone:missing.add("release_notes")ifself._modeisPersistenceMode.PERMANENTandself.commit_shaisNone:missing.add("commit_sha")ifmissing:raiseValueError(f"some required outputs were not set: {', '.join(missing)}")output_values:dict[str,Any]={"released":str(self.released).lower(),"version":str(self.version),"tag":self.tag,"is_prerelease":str(self.is_prerelease).lower(),"link":self._gh_client.create_release_url(self.tag)ifself.tagelse"","previous_version":str(self.prev_version)ifself.prev_versionelse"","commit_sha":self.commit_shaifself.commit_shaelse"",}multiline_output_values:dict[str,str]={"release_notes":self.release_notesifself.release_noteselse"",}output_lines=[*[f"{key}={value!s}{os.linesep}"forkey,valueinoutput_values.items()],*[f"{key}<<EOF{os.linesep}{value}EOF{os.linesep}"ifvalueelsef"{key}={os.linesep}"forkey,valueinmultiline_output_values.items()],]returnstr.join("",output_lines)
[docs]defwrite_if_possible(self,filename:str|None=None)->None:output_file=filenameoros.getenv(self.OUTPUT_ENV_VAR)ifnotoutput_file:logger.info("not writing GitHub Actions output, as no file specified")returnwithopen(output_file,"ab")asf:f.write(self.to_output_text().encode("utf-8"))