@@ -62,6 +62,21 @@ def available_versions(self) -> Dict[str, str]:
6262 all_releases = list_data ["releases" ]
6363 return self ._filter_versions (all_releases )
6464
65+ @property
66+ @lru_cache (maxsize = 5 ) # noqa: B019
67+ def latest_version (self ) -> SolcVersion :
68+ """Get the latest available version.
69+
70+ Default implementation parses from available versions.
71+ Subclasses can override this for more efficient implementations.
72+ """
73+ versions = self .available_versions
74+ if not versions :
75+ raise ValueError ("No versions available" )
76+
77+ version_objs = [SolcVersion .parse (v ) for v in versions ]
78+ return max (version_objs )
79+
6580 def _filter_versions (self , releases : Dict [str , str ]) -> Dict [str , str ]:
6681 """Filter versions based on repository-specific criteria.
6782
@@ -216,7 +231,9 @@ def __init__(self, platform: Platform, session: requests.Session):
216231 if platform .os_type == "darwin" and platform .architecture == "arm64" :
217232 self .repositories .append (AlloyRepository (session ))
218233
219- def get_available_versions (self ) -> Dict [str , str ]:
234+ @property
235+ @lru_cache (maxsize = 5 ) # noqa: B019
236+ def available_versions (self ) -> Dict [str , str ]:
220237 """Get all available versions from all repositories."""
221238 all_versions = {}
222239
@@ -230,27 +247,30 @@ def get_available_versions(self) -> Dict[str, str]:
230247
231248 return all_versions
232249
250+ @property
251+ @lru_cache (maxsize = 5 ) # noqa: B019
252+ def latest_version (self ) -> SolcVersion :
253+ """Get the latest version across all repositories."""
254+ latest_versions = []
255+
256+ for repo in self .repositories :
257+ try :
258+ latest_versions .append (repo .latest_version )
259+ except (ValueError , requests .RequestException ):
260+ # Continue if one repository fails
261+ continue
262+
263+ if not latest_versions :
264+ raise ValueError ("No versions available from any repository" )
265+
266+ return max (latest_versions )
267+
233268 def get_repository_for_version (self , version : SolcVersion ) -> AbstractSolcRepository :
234269 """Get the appropriate repository for a specific version."""
235- # Check for platform-specific repositories (including Crytic special cases)
270+ # Check for platform-specific repositories
236271 for repo in reversed (self .repositories ): # Check specialized repos first
237272 if repo .supports_version (version , self .platform ):
238273 return repo
239274
240275 # Fallback to main soliditylang repository
241276 return self .repositories [0 ]
242-
243- def get_latest_version (self ) -> SolcVersion :
244- """Get the latest version from the main repository."""
245- main_repo = self .repositories [0 ]
246- if isinstance (main_repo , SoliditylangRepository ):
247- return main_repo .latest_version
248-
249- # Fallback: parse from available versions
250- versions = self .get_available_versions ()
251- if not versions :
252- raise ValueError ("No versions available" )
253-
254- version_objs = [SolcVersion .parse (v ) for v in versions ]
255- latest = max (version_objs )
256- return latest
0 commit comments