| 
									
										
										
										
											2025-03-12 11:39:01 -07:00
										 |  |  | # typed: strict | 
					
						
							| 
									
										
										
										
											2023-04-18 00:22:13 +01:00
										 |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | require "version" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class URL | 
					
						
							| 
									
										
										
										
											2025-03-12 11:39:01 -07:00
										 |  |  |   sig { returns(T::Hash[Symbol, T.untyped]) } | 
					
						
							|  |  |  |   attr_reader :specs | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   sig { returns(T.any(NilClass, Symbol, T::Class[AbstractDownloadStrategy])) } | 
					
						
							|  |  |  |   attr_reader :using | 
					
						
							| 
									
										
										
										
											2023-04-18 00:22:13 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |   sig { params(url: String, specs: T::Hash[Symbol, T.untyped]).void } | 
					
						
							|  |  |  |   def initialize(url, specs = {}) | 
					
						
							| 
									
										
										
										
											2025-03-12 11:39:01 -07:00
										 |  |  |     @url = T.let(url.freeze, String) | 
					
						
							|  |  |  |     @specs = T.let(specs.dup, T::Hash[Symbol, T.untyped]) | 
					
						
							|  |  |  |     @using = T.let(@specs.delete(:using), T.any(NilClass, Symbol, T::Class[AbstractDownloadStrategy])) | 
					
						
							| 
									
										
										
										
											2023-04-18 00:22:13 +01:00
										 |  |  |     @specs.freeze | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   sig { returns(String) } | 
					
						
							|  |  |  |   def to_s | 
					
						
							|  |  |  |     @url | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-03-12 11:39:01 -07:00
										 |  |  |   sig { returns(T::Class[AbstractDownloadStrategy]) } | 
					
						
							| 
									
										
										
										
											2023-04-18 00:22:13 +01:00
										 |  |  |   def download_strategy | 
					
						
							| 
									
										
										
										
											2025-03-12 11:39:01 -07:00
										 |  |  |     @download_strategy ||= | 
					
						
							|  |  |  |       T.let(DownloadStrategyDetector.detect(@url, @using), T.nilable(T::Class[AbstractDownloadStrategy])) | 
					
						
							| 
									
										
										
										
											2023-04-18 00:22:13 +01:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   sig { returns(Version) } | 
					
						
							|  |  |  |   def version | 
					
						
							| 
									
										
										
										
											2025-03-12 11:39:01 -07:00
										 |  |  |     @version ||= T.let(Version.detect(@url, **@specs), T.nilable(Version)) | 
					
						
							| 
									
										
										
										
											2023-04-18 00:22:13 +01:00
										 |  |  |   end | 
					
						
							|  |  |  | end |