Skip to content

Commit 591db2f

Browse files
committed
Clean up repository implementation
1 parent 04f1110 commit 591db2f

File tree

2 files changed

+39
-19
lines changed

2 files changed

+39
-19
lines changed

solc_select/repositories.py

Lines changed: 37 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -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

solc_select/services/version_manager.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ def get_available_versions(self) -> List[SolcVersion]:
2929
Returns:
3030
List of available versions sorted by version number
3131
"""
32-
releases = self.repository.get_available_versions()
32+
releases = self.repository.available_versions
3333
versions = []
3434

3535
for version_str in releases:
@@ -54,7 +54,7 @@ def get_latest_version(self) -> SolcVersion:
5454
Raises:
5555
ValueError: If no versions are available
5656
"""
57-
return self.repository.get_latest_version()
57+
return self.repository.latest_version
5858

5959
def validate_version(self, version_str: str) -> SolcVersion:
6060
"""Validate and parse a version string.

0 commit comments

Comments
 (0)