Add Sparkle
livecheck strategy.
This commit is contained in:
parent
b293acc89b
commit
c24af82a25
@ -112,4 +112,5 @@ require_relative "strategy/page_match"
|
|||||||
require_relative "strategy/pypi"
|
require_relative "strategy/pypi"
|
||||||
require_relative "strategy/follow_redirection"
|
require_relative "strategy/follow_redirection"
|
||||||
require_relative "strategy/sourceforge"
|
require_relative "strategy/sourceforge"
|
||||||
|
require_relative "strategy/sparkle"
|
||||||
require_relative "strategy/xorg"
|
require_relative "strategy/xorg"
|
||||||
|
56
Library/Homebrew/livecheck/strategy/sparkle.rb
Normal file
56
Library/Homebrew/livecheck/strategy/sparkle.rb
Normal 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
|
Loading…
x
Reference in New Issue
Block a user