unpack_strategy: Convert to Sorbet typed: strict

This commit is contained in:
Issy Long 2024-07-05 17:49:32 +01:00
parent ed4b6d4246
commit cd1869437d
No known key found for this signature in database

View File

@ -1,4 +1,4 @@
# typed: true # typed: strict
# frozen_string_literal: true # frozen_string_literal: true
require "system_command" require "system_command"
@ -7,10 +7,47 @@ require "system_command"
module UnpackStrategy module UnpackStrategy
extend T::Helpers extend T::Helpers
AnyStrategy = T.type_alias do # rubocop:disable Style/MutableConstant
T.any(
T.class_of(UnpackStrategy::Tar),
T.class_of(UnpackStrategy::Pax),
T.class_of(UnpackStrategy::Gzip),
T.class_of(UnpackStrategy::Dmg),
T.class_of(UnpackStrategy::Lzma),
T.class_of(UnpackStrategy::Xz),
T.class_of(UnpackStrategy::Zstd),
T.class_of(UnpackStrategy::Lzip),
T.class_of(UnpackStrategy::Air),
T.class_of(UnpackStrategy::Jar),
T.class_of(UnpackStrategy::LuaRock),
T.class_of(UnpackStrategy::MicrosoftOfficeXml),
T.class_of(UnpackStrategy::Zip),
T.class_of(UnpackStrategy::Pkg),
T.class_of(UnpackStrategy::Xar),
T.class_of(UnpackStrategy::Ttf),
T.class_of(UnpackStrategy::Otf),
T.class_of(UnpackStrategy::Git),
T.class_of(UnpackStrategy::Mercurial),
T.class_of(UnpackStrategy::Subversion),
T.class_of(UnpackStrategy::Cvs),
T.class_of(UnpackStrategy::SelfExtractingExecutable),
T.class_of(UnpackStrategy::Cab),
T.class_of(UnpackStrategy::Executable),
T.class_of(UnpackStrategy::Bzip2),
T.class_of(UnpackStrategy::Fossil),
T.class_of(UnpackStrategy::Bazaar),
T.class_of(UnpackStrategy::P7Zip),
T.class_of(UnpackStrategy::Sit),
T.class_of(UnpackStrategy::Rar),
T.class_of(UnpackStrategy::Lha),
)
end
include SystemCommand::Mixin include SystemCommand::Mixin
sig { returns(T.nilable(T::Array[AnyStrategy])) }
def self.strategies def self.strategies
@strategies ||= [ @strategies ||= T.let([
Tar, # Needs to be before Bzip2/Gzip/Xz/Lzma/Zstd. Tar, # Needs to be before Bzip2/Gzip/Xz/Lzma/Zstd.
Pax, Pax,
Gzip, Gzip,
@ -43,10 +80,11 @@ module UnpackStrategy
Sit, Sit,
Rar, Rar,
Lha, Lha,
].freeze ].freeze, T.nilable(T::Array[AnyStrategy]))
end end
private_class_method :strategies private_class_method :strategies
sig { params(type: Symbol).returns(T.nilable(T.any(T.class_of(UnpackStrategy::Uncompressed), AnyStrategy))) }
def self.from_type(type) def self.from_type(type)
type = { type = {
naked: :uncompressed, naked: :uncompressed,
@ -61,23 +99,29 @@ module UnpackStrategy
end end
end end
sig { params(extension: String).returns(T.nilable(AnyStrategy)) }
def self.from_extension(extension) def self.from_extension(extension)
strategies.sort_by { |s| s.extensions.map(&:length).max || 0 } strategies&.sort_by { |s| s.extensions.map(&:length).max || 0 }
.reverse &.reverse
.find { |s| s.extensions.any? { |ext| extension.end_with?(ext) } } &.find { |s| s.extensions.any? { |ext| extension.end_with?(ext) } }
end end
sig { params(path: Pathname).returns(T.nilable(AnyStrategy)) }
def self.from_magic(path) def self.from_magic(path)
strategies.find { |s| s.can_extract?(path) } strategies&.find { |s| s.can_extract?(path) }
end end
sig {
params(path: Pathname, prioritize_extension: T::Boolean, type: T.nilable(Symbol), ref_type: T.nilable(String),
ref: T.nilable(String), merge_xattrs: T.nilable(T::Boolean)).returns(T.untyped)
}
def self.detect(path, prioritize_extension: false, type: nil, ref_type: nil, ref: nil, merge_xattrs: nil) def self.detect(path, prioritize_extension: false, type: nil, ref_type: nil, ref: nil, merge_xattrs: nil)
strategy = from_type(type) if type strategy = from_type(type) if type
if prioritize_extension && path.extname.present? if prioritize_extension && path.extname.present?
strategy ||= from_extension(path.extname) strategy ||= from_extension(path.extname)
strategy ||= strategies.select { |s| s < Directory || s == Fossil } strategy ||= strategies&.select { |s| s < Directory || s == Fossil }
.find { |s| s.can_extract?(path) } &.find { |s| s.can_extract?(path) }
else else
strategy ||= from_magic(path) strategy ||= from_magic(path)
strategy ||= from_extension(path.extname) strategy ||= from_extension(path.extname)
@ -88,24 +132,32 @@ module UnpackStrategy
strategy.new(path, ref_type:, ref:, merge_xattrs:) strategy.new(path, ref_type:, ref:, merge_xattrs:)
end end
attr_reader :path, :merge_xattrs sig { returns(Pathname) }
attr_reader :path
sig { returns(T.nilable(T::Boolean)) }
attr_reader :merge_xattrs
sig {
params(path: T.any(String, Pathname), ref_type: T.nilable(String), ref: T.nilable(String),
merge_xattrs: T.nilable(T::Boolean)).void
}
def initialize(path, ref_type: nil, ref: nil, merge_xattrs: nil) def initialize(path, ref_type: nil, ref: nil, merge_xattrs: nil)
@path = Pathname(path).expand_path @path = T.let(Pathname(path).expand_path, Pathname)
@ref_type = ref_type @ref_type = ref_type
@ref = ref @ref = ref
@merge_xattrs = merge_xattrs @merge_xattrs = merge_xattrs
end end
abstract! abstract!
sig { abstract.params(unpack_dir: Pathname, basename: Pathname, verbose: T::Boolean).returns(T.untyped) } sig { abstract.params(unpack_dir: Pathname, basename: Pathname, verbose: T::Boolean).void }
def extract_to_dir(unpack_dir, basename:, verbose:); end def extract_to_dir(unpack_dir, basename:, verbose:); end
private :extract_to_dir private :extract_to_dir
sig { sig {
params( params(
to: T.nilable(Pathname), basename: T.nilable(T.any(String, Pathname)), verbose: T::Boolean, to: T.nilable(Pathname), basename: T.nilable(T.any(String, Pathname)), verbose: T::Boolean,
).returns(T.untyped) ).void
} }
def extract(to: nil, basename: nil, verbose: false) def extract(to: nil, basename: nil, verbose: false)
basename ||= path.basename basename ||= path.basename
@ -131,7 +183,10 @@ module UnpackStrategy
children = tmp_unpack_dir.children children = tmp_unpack_dir.children
if children.size == 1 && !children.fetch(0).directory? if children.size == 1 && !children.fetch(0).directory?
s = UnpackStrategy.detect(children.first, prioritize_extension:) first_child = children.first
next if first_child.nil?
s = UnpackStrategy.detect(first_child, prioritize_extension:)
s.extract_nestedly(to:, verbose:, prioritize_extension:) s.extract_nestedly(to:, verbose:, prioritize_extension:)
@ -149,6 +204,7 @@ module UnpackStrategy
end end
end end
sig { returns(T::Array[String]) }
def dependencies def dependencies
[] []
end end