| 
									
										
										
										
											2020-10-10 14:16:11 +02:00
										 |  |  | # typed: true | 
					
						
							| 
									
										
										
										
											2019-04-19 15:38:03 +09:00
										 |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-24 23:51:48 +02:00
										 |  |  | # Class corresponding to the `url` stanza. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # @api private | 
					
						
							| 
									
										
										
										
											2018-07-30 19:48:20 +02:00
										 |  |  | class URL | 
					
						
							| 
									
										
										
										
											2020-09-20 06:03:36 +02:00
										 |  |  |   extend T::Sig | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-20 06:03:36 +02:00
										 |  |  |   attr_reader :uri, :specs, | 
					
						
							| 
									
										
										
										
											2020-09-08 22:12:26 +08:00
										 |  |  |               :verified, :using, | 
					
						
							| 
									
										
										
										
											2020-09-20 06:03:36 +02:00
										 |  |  |               :tag, :branch, :revisions, :revision, | 
					
						
							| 
									
										
										
										
											2020-10-27 16:47:07 -04:00
										 |  |  |               :trust_cert, :cookies, :referer, :header, :user_agent, | 
					
						
							| 
									
										
										
										
											2020-09-20 06:03:36 +02:00
										 |  |  |               :data | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-30 19:48:20 +02:00
										 |  |  |   extend Forwardable | 
					
						
							|  |  |  |   def_delegators :uri, :path, :scheme, :to_s | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-17 22:45:55 -08:00
										 |  |  |   sig { | 
					
						
							| 
									
										
										
										
											2020-09-20 06:03:36 +02:00
										 |  |  |     params( | 
					
						
							| 
									
										
										
										
											2020-12-07 18:46:35 +01:00
										 |  |  |       uri:             T.any(URI::Generic, String), | 
					
						
							|  |  |  |       verified:        T.nilable(String), | 
					
						
							|  |  |  |       using:           T.nilable(Symbol), | 
					
						
							|  |  |  |       tag:             T.nilable(String), | 
					
						
							|  |  |  |       branch:          T.nilable(String), | 
					
						
							|  |  |  |       revisions:       T.nilable(T::Array[String]), | 
					
						
							|  |  |  |       revision:        T.nilable(String), | 
					
						
							|  |  |  |       trust_cert:      T.nilable(T::Boolean), | 
					
						
							|  |  |  |       cookies:         T.nilable(T::Hash[String, String]), | 
					
						
							|  |  |  |       referer:         T.nilable(T.any(URI::Generic, String)), | 
					
						
							|  |  |  |       header:          T.nilable(String), | 
					
						
							|  |  |  |       user_agent:      T.nilable(T.any(Symbol, String)), | 
					
						
							|  |  |  |       data:            T.nilable(T::Hash[String, String]), | 
					
						
							| 
									
										
										
										
											2020-12-12 06:01:26 +01:00
										 |  |  |       from_block:      T::Boolean, | 
					
						
							| 
									
										
										
										
											2020-12-07 18:46:35 +01:00
										 |  |  |       caller_location: Thread::Backtrace::Location, | 
					
						
							| 
									
										
										
										
											2020-09-20 06:03:36 +02:00
										 |  |  |     ).returns(T.untyped) | 
					
						
							| 
									
										
										
										
											2021-01-17 22:45:55 -08:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2020-09-20 06:03:36 +02:00
										 |  |  |   def initialize( | 
					
						
							|  |  |  |     uri, | 
					
						
							| 
									
										
										
										
											2020-09-08 22:12:26 +08:00
										 |  |  |     verified: nil, | 
					
						
							| 
									
										
										
										
											2020-09-20 06:03:36 +02:00
										 |  |  |     using: nil, | 
					
						
							|  |  |  |     tag: nil, | 
					
						
							|  |  |  |     branch: nil, | 
					
						
							|  |  |  |     revisions: nil, | 
					
						
							|  |  |  |     revision: nil, | 
					
						
							|  |  |  |     trust_cert: nil, | 
					
						
							|  |  |  |     cookies: nil, | 
					
						
							|  |  |  |     referer: nil, | 
					
						
							| 
									
										
										
										
											2020-10-27 16:47:07 -04:00
										 |  |  |     header: nil, | 
					
						
							| 
									
										
										
										
											2020-09-20 06:03:36 +02:00
										 |  |  |     user_agent: nil, | 
					
						
							| 
									
										
										
										
											2020-12-07 18:46:35 +01:00
										 |  |  |     data: nil, | 
					
						
							| 
									
										
										
										
											2020-12-12 06:01:26 +01:00
										 |  |  |     from_block: false, | 
					
						
							| 
									
										
										
										
											2020-12-07 18:46:35 +01:00
										 |  |  |     caller_location: T.must(caller_locations).fetch(0) | 
					
						
							| 
									
										
										
										
											2020-09-20 06:03:36 +02:00
										 |  |  |   ) | 
					
						
							| 
									
										
										
										
											2020-12-07 18:46:35 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-20 06:03:36 +02:00
										 |  |  |     @uri = URI(uri) | 
					
						
							| 
									
										
										
										
											2018-09-17 02:45:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-20 06:03:36 +02:00
										 |  |  |     specs = {} | 
					
						
							| 
									
										
										
										
											2020-09-08 22:12:26 +08:00
										 |  |  |     specs[:verified]   = @verified   = verified | 
					
						
							| 
									
										
										
										
											2020-09-20 06:03:36 +02:00
										 |  |  |     specs[:using]      = @using      = using | 
					
						
							|  |  |  |     specs[:tag]        = @tag        = tag | 
					
						
							|  |  |  |     specs[:branch]     = @branch     = branch | 
					
						
							|  |  |  |     specs[:revisions]  = @revisions  = revisions | 
					
						
							|  |  |  |     specs[:revision]   = @revision   = revision | 
					
						
							|  |  |  |     specs[:trust_cert] = @trust_cert = trust_cert | 
					
						
							|  |  |  |     specs[:cookies]    = @cookies    = cookies | 
					
						
							|  |  |  |     specs[:referer]    = @referer    = referer | 
					
						
							| 
									
										
										
										
											2020-10-27 16:47:07 -04:00
										 |  |  |     specs[:header]     = @header     = header | 
					
						
							| 
									
										
										
										
											2020-09-20 06:03:36 +02:00
										 |  |  |     specs[:user_agent] = @user_agent = user_agent || :default | 
					
						
							|  |  |  |     specs[:data]       = @data       = data | 
					
						
							| 
									
										
										
										
											2018-08-04 10:13:42 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-20 06:03:36 +02:00
										 |  |  |     @specs = specs.compact | 
					
						
							| 
									
										
										
										
											2020-12-07 18:46:35 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-12 06:01:26 +01:00
										 |  |  |     @from_block = from_block | 
					
						
							| 
									
										
										
										
											2020-12-07 18:46:35 +01:00
										 |  |  |     @caller_location = caller_location | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   sig { returns(T.nilable(String)) } | 
					
						
							|  |  |  |   def raw_interpolated_url | 
					
						
							|  |  |  |     return @raw_interpolated_url if defined?(@raw_interpolated_url) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @raw_interpolated_url = | 
					
						
							|  |  |  |       Pathname(@caller_location.absolute_path) | 
					
						
							|  |  |  |       .each_line.drop(@caller_location.lineno - 1) | 
					
						
							|  |  |  |       .first&.yield_self { |line| line[/url\s+"([^"]+)"/, 1] } | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  |   private :raw_interpolated_url | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   sig { params(ignore_major_version: T::Boolean).returns(T::Boolean) } | 
					
						
							|  |  |  |   def unversioned?(ignore_major_version: false) | 
					
						
							|  |  |  |     interpolated_url = raw_interpolated_url | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return false unless interpolated_url | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     interpolated_url = interpolated_url.gsub(/\#{\s*version\s*\.major\s*}/, "") if ignore_major_version | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     interpolated_url.exclude?('#{') | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2020-12-12 06:01:26 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |   sig { returns(T::Boolean) } | 
					
						
							|  |  |  |   def from_block? | 
					
						
							|  |  |  |     @from_block | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  | end |