Skip to content

Commit c430807

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

File tree

2 files changed

+42
-22
lines changed

2 files changed

+42
-22
lines changed

solc_select/repositories.py

Lines changed: 40 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
from abc import ABC, abstractmethod
99
from functools import lru_cache
10-
from typing import Dict, List, Optional, Tuple
10+
from typing import Any, Dict, List, Optional, Tuple
1111

1212
import requests
1313
from packaging.version import Version
@@ -44,15 +44,15 @@ def list_url(self) -> str:
4444
pass
4545

4646
@lru_cache(maxsize=5) # noqa: B019
47-
def _fetch_list_json(self) -> Dict:
47+
def _fetch_list_json(self) -> Dict[str, Any]:
4848
"""Fetch and cache the list.json data from the repository.
4949
5050
Returns:
5151
The parsed JSON data from the list.json endpoint
5252
"""
5353
response = self.session.get(self.list_url)
5454
response.raise_for_status()
55-
return response.json()
55+
return response.json() # type: ignore[no-any-return]
5656

5757
@property
5858
@lru_cache(maxsize=5) # noqa: B019
@@ -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)