| 
									
										
										
										
											2024-12-05 14:01:37 +00:00
										 |  |  | # typed: strict | 
					
						
							| 
									
										
										
										
											2019-04-19 15:38:03 +09:00
										 |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-02 20:22:12 -04:00
										 |  |  | require "version" | 
					
						
							| 
									
										
										
										
											2014-03-05 20:12:51 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-17 20:08:45 +02:00
										 |  |  | # Combination of a version and a revision. | 
					
						
							| 
									
										
										
										
											2015-04-02 20:22:12 -04:00
										 |  |  | class PkgVersion | 
					
						
							|  |  |  |   include Comparable | 
					
						
							| 
									
										
										
										
											2020-08-11 13:01:54 -07:00
										 |  |  |   extend Forwardable | 
					
						
							| 
									
										
										
										
											2014-03-05 20:12:51 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-18 22:18:42 +00:00
										 |  |  |   REGEX = /\A(.+?)(?:_(\d+))?\z/ | 
					
						
							| 
									
										
										
										
											2020-08-17 20:08:45 +02:00
										 |  |  |   private_constant :REGEX | 
					
						
							| 
									
										
										
										
											2014-03-05 20:12:51 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-05 14:01:37 +00:00
										 |  |  |   sig { returns(Version) } | 
					
						
							|  |  |  |   attr_reader :version | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   sig { returns(Integer) } | 
					
						
							|  |  |  |   attr_reader :revision | 
					
						
							| 
									
										
										
										
											2016-07-13 10:11:59 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-17 20:08:45 +02:00
										 |  |  |   delegate [:major, :minor, :patch, :major_minor, :major_minor_patch] => :version | 
					
						
							| 
									
										
										
										
											2020-08-11 13:01:54 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-05 14:01:37 +00:00
										 |  |  |   sig { params(path: String).returns(PkgVersion) } | 
					
						
							| 
									
										
										
										
											2014-03-05 20:12:51 -06:00
										 |  |  |   def self.parse(path) | 
					
						
							| 
									
										
										
										
											2020-08-17 20:08:45 +02:00
										 |  |  |     _, version, revision = *path.match(REGEX) | 
					
						
							| 
									
										
										
										
											2024-12-05 14:01:37 +00:00
										 |  |  |     version = Version.new(version.to_s) | 
					
						
							| 
									
										
										
										
											2015-04-02 20:22:12 -04:00
										 |  |  |     new(version, revision.to_i) | 
					
						
							| 
									
										
										
										
											2014-03-05 20:12:51 -06:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-05 14:01:37 +00:00
										 |  |  |   sig { params(version: Version, revision: Integer).void } | 
					
						
							| 
									
										
										
										
											2014-03-05 20:12:51 -06:00
										 |  |  |   def initialize(version, revision) | 
					
						
							| 
									
										
										
										
											2024-12-05 14:01:37 +00:00
										 |  |  |     @version = T.let(version, Version) | 
					
						
							|  |  |  |     @revision = T.let(revision, Integer) | 
					
						
							| 
									
										
										
										
											2015-04-02 20:22:12 -04:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2014-03-05 20:12:51 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-05 14:01:37 +00:00
										 |  |  |   sig { returns(T::Boolean) } | 
					
						
							| 
									
										
										
										
											2015-04-02 20:22:12 -04:00
										 |  |  |   def head? | 
					
						
							|  |  |  |     version.head? | 
					
						
							| 
									
										
										
										
											2014-03-05 20:12:51 -06:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-26 14:04:55 +02:00
										 |  |  |   sig { returns(String) } | 
					
						
							|  |  |  |   def to_str | 
					
						
							| 
									
										
										
										
											2017-09-24 20:12:58 +01:00
										 |  |  |     if revision.positive? | 
					
						
							| 
									
										
										
										
											2014-03-05 20:12:51 -06:00
										 |  |  |       "#{version}_#{revision}" | 
					
						
							|  |  |  |     else | 
					
						
							| 
									
										
										
										
											2015-04-02 20:22:12 -04:00
										 |  |  |       version.to_s | 
					
						
							| 
									
										
										
										
											2014-03-05 20:12:51 -06:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2024-04-26 14:04:55 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |   sig { returns(String) } | 
					
						
							|  |  |  |   def to_s = to_str | 
					
						
							| 
									
										
										
										
											2014-03-05 20:12:51 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-05 14:01:37 +00:00
										 |  |  |   sig { params(other: PkgVersion).returns(T.nilable(Integer)) } | 
					
						
							| 
									
										
										
										
											2014-03-05 20:12:51 -06:00
										 |  |  |   def <=>(other) | 
					
						
							| 
									
										
										
										
											2020-03-04 11:28:28 +00:00
										 |  |  |     version_comparison = (version <=> other.version) | 
					
						
							|  |  |  |     return if version_comparison.nil? | 
					
						
							| 
									
										
										
										
											2020-03-03 10:43:54 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-04 11:28:28 +00:00
										 |  |  |     version_comparison.nonzero? || revision <=> other.revision | 
					
						
							| 
									
										
										
										
											2014-03-05 20:12:51 -06:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2016-09-23 18:13:48 +02:00
										 |  |  |   alias eql? == | 
					
						
							| 
									
										
										
										
											2015-04-02 20:22:12 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-05 14:01:37 +00:00
										 |  |  |   sig { returns(Integer) } | 
					
						
							| 
									
										
										
										
											2015-04-02 20:22:12 -04:00
										 |  |  |   def hash | 
					
						
							| 
									
										
										
										
											2022-04-23 01:48:15 +01:00
										 |  |  |     [version, revision].hash | 
					
						
							| 
									
										
										
										
											2015-04-02 20:22:12 -04:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2014-03-05 20:12:51 -06:00
										 |  |  | end |