Douglas Eichelberger 24cf6076e8 brew style --fix
2023-04-24 20:42:39 -07:00

67 lines
1.6 KiB
Ruby

# typed: true
# frozen_string_literal: true
class Version
# @api private
class Parser
extend T::Helpers
abstract!
sig { abstract.params(spec: Pathname).returns(T.nilable(String)) }
def parse(spec); end
end
# @api private
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)
match = @regex.match(self.class.process_spec(spec))
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) }
def self.process_spec(spec); end
end
# @api private
class UrlParser < RegexParser
sig { override.params(spec: Pathname).returns(String) }
def self.process_spec(spec)
spec.to_s
end
end
# @api private
class StemParser < RegexParser
SOURCEFORGE_DOWNLOAD_REGEX = %r{(?:sourceforge\.net|sf\.net)/.*/download$}.freeze
NO_FILE_EXTENSION_REGEX = /\.[^a-zA-Z]+$/.freeze
sig { override.params(spec: Pathname).returns(String) }
def self.process_spec(spec)
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