2121 EARLIEST_RELEASE ,
2222 LINUX_AMD64 ,
2323)
24- from .infrastructure .http_client import create_http_session
2524from .models import Platform , SolcVersion
2625
2726
2827class AbstractSolcRepository (ABC ):
2928 """Abstract base class for Solidity compiler repositories."""
3029
31- def __init__ (self ) -> None :
32- self .session = create_http_session ()
30+ def __init__ (self , session : requests .Session ) -> None :
31+ self .session = session
32+ self ._versions_cache : Optional [Dict [str , str ]] = None
3333
3434 @property
3535 @abstractmethod
@@ -45,10 +45,17 @@ def list_url(self) -> str:
4545
4646 def get_available_versions (self ) -> Dict [str , str ]:
4747 """Get available versions as a dict of version -> artifact_filename."""
48+ # Return cached data if available
49+ if self ._versions_cache is not None :
50+ return self ._versions_cache
51+
52+ # Fetch from network and cache
4853 response = self .session .get (self .list_url )
4954 response .raise_for_status ()
5055 all_releases = response .json ()["releases" ]
51- return self ._filter_versions (all_releases )
56+ filtered_versions = self ._filter_versions (all_releases )
57+ self ._versions_cache = filtered_versions
58+ return filtered_versions
5259
5360 def _filter_versions (self , releases : Dict [str , str ]) -> Dict [str , str ]:
5461 """Filter versions based on repository-specific criteria.
@@ -94,12 +101,13 @@ def supports_version(self, version: SolcVersion, platform: Platform) -> bool:
94101class SoliditylangRepository (AbstractSolcRepository ):
95102 """Repository for binaries.soliditylang.org - the main Solidity releases."""
96103
97- def __init__ (self , platform : Platform ) -> None :
98- super ().__init__ ()
104+ def __init__ (self , platform : Platform , session : requests . Session ) -> None :
105+ super ().__init__ (session )
99106 self .platform = platform
100107 platform_key = platform .get_soliditylang_key ()
101108 self ._base_url = f"https://binaries.soliditylang.org/{ platform_key } /"
102109 self ._list_url = f"https://binaries.soliditylang.org/{ platform_key } /list.json"
110+ self ._latest_cache : Optional [SolcVersion ] = None
103111
104112 @property
105113 def base_url (self ) -> str :
@@ -115,17 +123,24 @@ def supports_version(self, version: SolcVersion, platform: Platform) -> bool:
115123
116124 def get_latest_version (self ) -> SolcVersion :
117125 """Get the latest available version."""
126+ # Return cached data if available
127+ if self ._latest_cache is not None :
128+ return self ._latest_cache
129+
130+ # Fetch from network and cache
118131 response = self .session .get (self .list_url )
119132 response .raise_for_status ()
120133 latest_str = response .json ()["latestRelease" ]
121- return SolcVersion .parse (latest_str )
134+ latest_version = SolcVersion .parse (latest_str )
135+ self ._latest_cache = latest_version
136+ return latest_version
122137
123138
124139class CryticRepository (AbstractSolcRepository ):
125140 """Repository for crytic/solc - provides additional Linux versions."""
126141
127- def __init__ (self ) -> None :
128- super ().__init__ ()
142+ def __init__ (self , session : requests . Session ) -> None :
143+ super ().__init__ (session )
129144
130145 @property
131146 def base_url (self ) -> str :
@@ -153,8 +168,8 @@ def supports_version(self, version: SolcVersion, platform: Platform) -> bool:
153168class AlloyRepository (AbstractSolcRepository ):
154169 """Repository for alloy-rs/solc-builds - provides native ARM64 Darwin binaries."""
155170
156- def __init__ (self ) -> None :
157- super ().__init__ ()
171+ def __init__ (self , session : requests . Session ) -> None :
172+ super ().__init__ (session )
158173
159174 @property
160175 def base_url (self ) -> str :
@@ -190,19 +205,19 @@ def supports_version(self, version: SolcVersion, platform: Platform) -> bool:
190205class CompositeRepository :
191206 """Composite repository that manages multiple underlying repositories."""
192207
193- def __init__ (self , platform : Platform ):
208+ def __init__ (self , platform : Platform , session : requests . Session ):
194209 self .platform = platform
195210 self .repositories : List [AbstractSolcRepository ] = []
196211
197212 # Always include the main soliditylang repository
198- self .repositories .append (SoliditylangRepository (platform ))
213+ self .repositories .append (SoliditylangRepository (platform , session ))
199214
200215 # Add platform-specific repositories
201216 if platform .get_soliditylang_key () == LINUX_AMD64 :
202- self .repositories .append (CryticRepository ())
217+ self .repositories .append (CryticRepository (session ))
203218
204219 if platform .os_type == "darwin" and platform .architecture == "arm64" :
205- self .repositories .append (AlloyRepository ())
220+ self .repositories .append (AlloyRepository (session ))
206221
207222 def get_available_versions (self ) -> Dict [str , str ]:
208223 """Get all available versions from all repositories."""
0 commit comments