| 
									
										
										
										
											2024-06-02 15:14:25 +01:00
										 |  |  | # typed: strict | 
					
						
							| 
									
										
										
										
											2021-01-20 14:54:02 -08:00
										 |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Version | 
					
						
							|  |  |  |   class Parser | 
					
						
							|  |  |  |     extend T::Helpers | 
					
						
							|  |  |  |     abstract! | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     sig { abstract.params(spec: Pathname).returns(T.nilable(String)) } | 
					
						
							|  |  |  |     def parse(spec); end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   class RegexParser < Parser | 
					
						
							|  |  |  |     extend T::Helpers | 
					
						
							|  |  |  |     abstract! | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     sig { params(regex: Regexp, block: T.nilable(T.proc.params(arg0: String).returns(String))).void } | 
					
						
							|  |  |  |     def initialize(regex, &block) | 
					
						
							|  |  |  |       super() | 
					
						
							|  |  |  |       @regex = regex | 
					
						
							|  |  |  |       @block = block | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     sig { override.params(spec: Pathname).returns(T.nilable(String)) } | 
					
						
							|  |  |  |     def parse(spec) | 
					
						
							| 
									
										
										
										
											2021-01-22 11:26:46 -08:00
										 |  |  |       match = @regex.match(self.class.process_spec(spec)) | 
					
						
							| 
									
										
										
										
											2021-01-20 14:54:02 -08:00
										 |  |  |       return if match.blank? | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       version = match.captures.first | 
					
						
							|  |  |  |       return if version.blank? | 
					
						
							|  |  |  |       return @block.call(version) if @block.present? | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       version | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     sig { abstract.params(spec: Pathname).returns(String) } | 
					
						
							| 
									
										
										
										
											2021-01-22 11:26:46 -08:00
										 |  |  |     def self.process_spec(spec); end | 
					
						
							| 
									
										
										
										
											2021-01-20 14:54:02 -08:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   class UrlParser < RegexParser | 
					
						
							|  |  |  |     sig { override.params(spec: Pathname).returns(String) } | 
					
						
							| 
									
										
										
										
											2021-01-22 11:26:46 -08:00
										 |  |  |     def self.process_spec(spec) | 
					
						
							| 
									
										
										
										
											2021-01-20 14:54:02 -08:00
										 |  |  |       spec.to_s | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   class StemParser < RegexParser | 
					
						
							| 
									
										
										
										
											2024-01-18 22:18:42 +00:00
										 |  |  |     SOURCEFORGE_DOWNLOAD_REGEX = %r{(?:sourceforge\.net|sf\.net)/.*/download$} | 
					
						
							|  |  |  |     NO_FILE_EXTENSION_REGEX = /\.[^a-zA-Z]+$/ | 
					
						
							| 
									
										
										
										
											2021-01-20 14:54:02 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     sig { override.params(spec: Pathname).returns(String) } | 
					
						
							| 
									
										
										
										
											2021-01-22 11:26:46 -08:00
										 |  |  |     def self.process_spec(spec) | 
					
						
							| 
									
										
										
										
											2021-01-20 14:54:02 -08:00
										 |  |  |       return spec.basename.to_s if spec.directory? | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       spec_s = spec.to_s | 
					
						
							|  |  |  |       return spec.dirname.stem if spec_s.match?(SOURCEFORGE_DOWNLOAD_REGEX) | 
					
						
							|  |  |  |       return spec.basename.to_s if spec_s.match?(NO_FILE_EXTENSION_REGEX) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       spec.stem | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end |