1+ from os import getenv
12from re import compile
23from typing import Self
34
4- from semver import VersionInfo
5+ from requests import get
6+ from semver .version import Version
57
68from .errors import ActionNotParsableError
79
810
911class Action :
1012 PATTERN = compile (r"(?P<owner>[\w_-]+)/(?P<repo>[\w_-]+)@(?P<commit>[\S]+)" )
13+ TOKEN = getenv ("CI_STARTER_GH_API_TOKEN" )
1114
12- def __init__ (self , owner : str , repo : str , commit : str , version : VersionInfo | None = None ) -> None :
15+ def __init__ (self , owner : str , repo : str , commit : str , version : Version | None = None ) -> None :
1316 self .owner : str = owner
1417 self .repo : str = repo
1518 self .commit : str = commit
16- self .version : VersionInfo = version
19+ self .version : Version = version
1720
18- def to_text (self ):
19- text = f"{ self .owner } /{ self .repo } @{ self .commit } "
20- return text
21+ @property
22+ def name (self ) -> str :
23+ return f"{ self .owner } /{ self .repo } "
24+
25+ def to_text (self ) -> str :
26+ return f"{ self .name } @{ self .commit } "
2127
2228 @classmethod
23- def from_text (cls , text : str , version : VersionInfo | None = None ) -> Self :
29+ def from_text (cls , text : str , version : Version | None = None ) -> Self :
2430 match = cls .PATTERN .search (text )
2531 if not match :
2632 raise ActionNotParsableError (text )
@@ -29,9 +35,46 @@ def from_text(cls, text: str, version: VersionInfo | None = None) -> Self:
2935
3036 return action
3137
38+ def update (self ) -> None :
39+ response = get (self .url , headers = self .header )
40+ if not response .ok :
41+ response .raise_for_status ()
42+
43+ data = response .json ()
44+ current_release = data [0 ]
45+
46+ current_version = current_release ["name" ].removeprefix ("v" )
47+ current_commit = current_release ["commit" ]["sha" ]
48+
49+ self .version = Version .parse (current_version )
50+ self .commit = current_commit
51+
52+ def update_from_other (self , other : Self ) -> None :
53+ if not self .name == other .name :
54+ raise ValueError (
55+ f"can update only from an { self .__class__ .__name__ } "
56+ f"of name '{ self .name } ', not '{ other .name } '"
57+ )
58+ self .commit = other .commit
59+ self .version = other .version
60+
61+ @property
62+ def url (self ) -> str :
63+ return f"https://api.github.com/repos/{ self .owner } /{ self .repo } /tags"
64+
65+ @property
66+ def header (self ) -> dict [str , str ]:
67+ result = {
68+ "User-Agent" : __package__ ,
69+ "Accept" : "application.vnd.github+json" ,
70+ }
71+ if self .TOKEN :
72+ result .update (Authorization = f"token { self .TOKEN } " )
73+ return result
74+
3275 def __repr__ (self ) -> str :
3376 string = (
34- f"{ self .__class__ .__name__ } (user ={ self .user } , repo={ self .repo } , "
77+ f"{ self .__class__ .__name__ } (owner ={ self .owner } , repo={ self .repo } , "
3578 f"commit={ self .commit } , version={ self .version } )"
3679 )
3780 return string
0 commit comments