Add Sparkle livecheck strategy.

This commit is contained in:
Markus Reiter 2020-12-12 21:59:04 +01:00 committed by Sam Ford
parent b293acc89b
commit c24af82a25
No known key found for this signature in database
GPG Key ID: 95209E46C7FFDEFE
2 changed files with 57 additions and 0 deletions

View File

@ -112,4 +112,5 @@ require_relative "strategy/page_match"
require_relative "strategy/pypi"
require_relative "strategy/follow_redirection"
require_relative "strategy/sourceforge"
require_relative "strategy/sparkle"
require_relative "strategy/xorg"

View File

@ -0,0 +1,56 @@
# typed: false
# frozen_string_literal: true
require_relative "page_match"
module Homebrew
module Livecheck
module Strategy
# The {Sparkle} strategy fetches content at a URL and parses
# its contents as a Sparkle appcast in XML format.
#
# @api private
class Sparkle
extend T::Sig
NICE_NAME = "Sparkle"
PRIORITY = 1
# Whether the strategy can be applied to the provided URL.
sig { params(url: String).returns(T::Boolean) }
def self.match?(url)
url.match?(%r{^https?://}) &&
["application/xml", "text/xml"].include?(Strategy.page_headers(url)["content-type"]) &&
Strategy.page_contents(url).include?("http://www.andymatuschak.org/xml-namespaces/sparkle")
end
# Checks the content at the URL for new versions.
sig { params(url: String, regex: T.nilable(Regexp)).returns(T::Hash[Symbol, T.untyped]) }
def self.find_versions(url, regex)
raise ArgumentError, "The #{NICE_NAME} strategy does not support regular expressions." if regex
require "nokogiri"
match_data = { matches: {}, regex: regex, url: url }
contents = Strategy.page_contents(url)
xml = Nokogiri.parse(contents)
xml.remove_namespaces!
match = xml.xpath("//rss//channel//item//enclosure")
.map { |enclosure| [*enclosure["shortVersionString"], *enclosure["version"]].uniq }
.reject(&:empty?)
.uniq
.max_by { |versions| versions.map { |v| Version.new(v) } }
&.join(",")
match_data[:matches][match] = Version.new(match) if match
match_data
end
end
end
end
end