From 86c702abcd2a0b7655a8cca3098979073596dd87 Mon Sep 17 00:00:00 2001
From: Sam Ford <1584702+samford@users.noreply.github.com>
Date: Sat, 28 Oct 2023 14:04:40 -0400
Subject: [PATCH] Sparkle: Surface more Item values
Historically, the `Sparkle` strategy's `Item` struct has only
included basic values from the appcast that are commonly useful.
Over time we've selectively added/surfaced more values as we've
encountered outliers that require use of different values in a
`strategy` block.
We now need to use `minimumSystemValue`, so this expands the `Item`
struct to include any appcast value that we could conceivably want
to use in the future. This will hopefully save us from having to make
more modifications to the struct (and related tests) before we can
use a previously-unused value in a `strategy` block.
---
.../Homebrew/livecheck/strategy/sparkle.rb | 32 +++--
.../test/livecheck/strategy/sparkle_spec.rb | 135 +++++++++++-------
2 files changed, 105 insertions(+), 62 deletions(-)
diff --git a/Library/Homebrew/livecheck/strategy/sparkle.rb b/Library/Homebrew/livecheck/strategy/sparkle.rb
index bffe664d2a..9f52b8b88b 100644
--- a/Library/Homebrew/livecheck/strategy/sparkle.rb
+++ b/Library/Homebrew/livecheck/strategy/sparkle.rb
@@ -35,13 +35,21 @@ module Homebrew
# @api public
:title,
# @api public
+ :link,
+ # @api public
:channel,
- # @api private
+ # @api public
+ :release_notes_link,
+ # @api public
:pub_date,
# @api public
+ :os,
+ # @api public
:url,
# @api private
:bundle_version,
+ # @api public
+ :minimum_system_version,
keyword_init: true,
) do
extend Forwardable
@@ -84,12 +92,14 @@ module Homebrew
os = enclosure["os"]
end
- channel = item.elements["channel"]&.text
- url ||= item.elements["link"]&.text
+ title = item.elements["title"]&.text&.strip
+ link = item.elements["link"]&.text&.strip
+ url ||= link
+ channel = item.elements["channel"]&.text&.strip
+ release_notes_link = item.elements["releaseNotesLink"]&.text&.strip
short_version ||= item.elements["shortVersionString"]&.text&.strip
version ||= item.elements["version"]&.text&.strip
- title = item.elements["title"]&.text&.strip
pub_date = item.elements["pubDate"]&.text&.strip&.presence&.then do |date_string|
Time.parse(date_string)
rescue ArgumentError
@@ -117,11 +127,15 @@ module Homebrew
end
data = {
- title: title,
- channel: channel,
- pub_date: pub_date,
- url: url,
- bundle_version: bundle_version,
+ title: title,
+ link: link,
+ channel: channel,
+ release_notes_link: release_notes_link,
+ pub_date: pub_date,
+ os: os,
+ url: url,
+ bundle_version: bundle_version,
+ minimum_system_version: minimum_system_version,
}.compact
next if data.empty?
diff --git a/Library/Homebrew/test/livecheck/strategy/sparkle_spec.rb b/Library/Homebrew/test/livecheck/strategy/sparkle_spec.rb
index 29701a0d17..7eaaff5288 100644
--- a/Library/Homebrew/test/livecheck/strategy/sparkle_spec.rb
+++ b/Library/Homebrew/test/livecheck/strategy/sparkle_spec.rb
@@ -29,32 +29,42 @@ describe Homebrew::Livecheck::Strategy::Sparkle do
let(:item_hashes) do
{
v123: {
- title: "Version 1.2.3",
- pub_date: "Fri, 01 Jan 2021 01:23:45 +0000",
- url: "https://www.example.com/example/example-1.2.3.tar.gz",
- short_version: "1.2.3",
- version: "123",
+ title: "Version 1.2.3",
+ release_notes_link: "https://www.example.com/example/1.2.3.html",
+ pub_date: "Fri, 01 Jan 2021 01:23:45 +0000",
+ url: "https://www.example.com/example/example-1.2.3.tar.gz",
+ short_version: "1.2.3",
+ version: "123",
+ minimum_system_version: "10.10",
},
v122: {
- title: "Version 1.2.2",
- pub_date: "Not a parseable date string",
- url: "https://www.example.com/example/example-1.2.2.tar.gz",
- short_version: "1.2.2",
- version: "122",
+ title: "Version 1.2.2",
+ release_notes_link: "https://www.example.com/example/1.2.2.html",
+ pub_date: "Not a parseable date string",
+ link: "https://www.example.com/example/example-1.2.2.tar.gz",
+ short_version: "1.2.2",
+ version: "122",
+ minimum_system_version: "10.10",
},
v121: {
- title: "Version 1.2.1",
- pub_date: "Thu, 31 Dec 2020 01:23:45 +0000",
- url: "https://www.example.com/example/example-1.2.1.tar.gz",
- short_version: "1.2.1",
- version: "121",
+ title: "Version 1.2.1",
+ release_notes_link: "https://www.example.com/example/1.2.1.html",
+ pub_date: "Thu, 31 Dec 2020 01:23:45 +0000",
+ os: "osx",
+ url: "https://www.example.com/example/example-1.2.1.tar.gz",
+ short_version: "1.2.1",
+ version: "121",
+ minimum_system_version: "10.10",
},
v120: {
- title: "Version 1.2.0",
- pub_date: "Wed, 30 Dec 2020 01:23:45 +0000",
- url: "https://www.example.com/example/example-1.2.0.tar.gz",
- short_version: "1.2.0",
- version: "120",
+ title: "Version 1.2.0",
+ release_notes_link: "https://www.example.com/example/1.2.0.html",
+ pub_date: "Wed, 30 Dec 2020 01:23:45 +0000",
+ os: "macos",
+ url: "https://www.example.com/example/example-1.2.0.tar.gz",
+ short_version: "1.2.0",
+ version: "120",
+ minimum_system_version: "10.10",
},
}
end
@@ -63,8 +73,8 @@ describe Homebrew::Livecheck::Strategy::Sparkle do
v123_item = <<~EOS
-
#{item_hashes[:v123][:title]}
- 10.10
- https://www.example.com/example/#{item_hashes[:v123][:short_version]}.html
+ #{item_hashes[:v123][:minimum_system_version]}
+ #{item_hashes[:v123][:release_notes_link]}
#{item_hashes[:v123][:pub_date]}
@@ -73,32 +83,32 @@ describe Homebrew::Livecheck::Strategy::Sparkle do
v122_item = <<~EOS
-
#{item_hashes[:v122][:title]}
- 10.10
- https://www.example.com/example/#{item_hashes[:v122][:short_version]}.html
+ #{item_hashes[:v122][:link]}
+ #{item_hashes[:v122][:minimum_system_version]}
+ #{item_hashes[:v122][:release_notes_link]}
#{item_hashes[:v122][:pub_date]}
#{item_hashes[:v122][:version]}
#{item_hashes[:v122][:short_version]}
- #{item_hashes[:v122][:url]}
EOS
v121_item_with_osx_os = <<~EOS
-
#{item_hashes[:v121][:title]}
- 10.10
- https://www.example.com/example/#{item_hashes[:v121][:short_version]}.html
+ #{item_hashes[:v121][:minimum_system_version]}
+ #{item_hashes[:v121][:release_notes_link]}
#{item_hashes[:v121][:pub_date]}
-
+
EOS
v120_item_with_macos_os = <<~EOS
-
#{item_hashes[:v120][:title]}
- 10.10
- https://www.example.com/example/#{item_hashes[:v120][:short_version]}.html
+ #{item_hashes[:v120][:minimum_system_version]}
+ #{item_hashes[:v120][:release_notes_link]}
#{item_hashes[:v120][:pub_date]}
-
+
EOS
@@ -131,8 +141,8 @@ describe Homebrew::Livecheck::Strategy::Sparkle do
no_versions_item = create_appcast_xml <<~EOS
-
Version
- 10.10
- https://www.example.com/example/#{item_hashes[:v123][:short_version]}.html
+ #{item_hashes[:v123][:minimum_system_version]}
+ #{item_hashes[:v123][:release_notes_link]}
#{item_hashes[:v123][:pub_date]}
@@ -157,34 +167,53 @@ describe Homebrew::Livecheck::Strategy::Sparkle do
let(:items) do
{
v123: Homebrew::Livecheck::Strategy::Sparkle::Item.new(
- title: item_hashes[:v123][:title],
- pub_date: Time.parse(item_hashes[:v123][:pub_date]),
- url: item_hashes[:v123][:url],
- bundle_version: Homebrew::BundleVersion.new(item_hashes[:v123][:short_version],
- item_hashes[:v123][:version]),
+ title: item_hashes[:v123][:title],
+ release_notes_link: item_hashes[:v123][:release_notes_link],
+ pub_date: Time.parse(item_hashes[:v123][:pub_date]),
+ url: item_hashes[:v123][:url],
+ bundle_version: Homebrew::BundleVersion.new(
+ item_hashes[:v123][:short_version],
+ item_hashes[:v123][:version],
+ ),
+ minimum_system_version: item_hashes[:v123][:minimum_system_version],
),
v122: Homebrew::Livecheck::Strategy::Sparkle::Item.new(
- title: item_hashes[:v122][:title],
+ title: item_hashes[:v122][:title],
+ link: item_hashes[:v122][:link],
+ release_notes_link: item_hashes[:v122][:release_notes_link],
# `#items_from_content` falls back to a default `pub_date` when
# one isn't provided or can't be successfully parsed.
- pub_date: Time.new(0),
- url: item_hashes[:v122][:url],
- bundle_version: Homebrew::BundleVersion.new(item_hashes[:v122][:short_version],
- item_hashes[:v122][:version]),
+ pub_date: Time.new(0),
+ url: item_hashes[:v122][:link],
+ bundle_version: Homebrew::BundleVersion.new(
+ item_hashes[:v122][:short_version],
+ item_hashes[:v122][:version],
+ ),
+ minimum_system_version: item_hashes[:v122][:minimum_system_version],
),
v121: Homebrew::Livecheck::Strategy::Sparkle::Item.new(
- title: item_hashes[:v121][:title],
- pub_date: Time.parse(item_hashes[:v121][:pub_date]),
- url: item_hashes[:v121][:url],
- bundle_version: Homebrew::BundleVersion.new(item_hashes[:v121][:short_version],
- item_hashes[:v121][:version]),
+ title: item_hashes[:v121][:title],
+ release_notes_link: item_hashes[:v121][:release_notes_link],
+ pub_date: Time.parse(item_hashes[:v121][:pub_date]),
+ os: item_hashes[:v121][:os],
+ url: item_hashes[:v121][:url],
+ bundle_version: Homebrew::BundleVersion.new(
+ item_hashes[:v121][:short_version],
+ item_hashes[:v121][:version],
+ ),
+ minimum_system_version: item_hashes[:v121][:minimum_system_version],
),
v120: Homebrew::Livecheck::Strategy::Sparkle::Item.new(
- title: item_hashes[:v120][:title],
- pub_date: Time.parse(item_hashes[:v120][:pub_date]),
- url: item_hashes[:v120][:url],
- bundle_version: Homebrew::BundleVersion.new(item_hashes[:v120][:short_version],
- item_hashes[:v120][:version]),
+ title: item_hashes[:v120][:title],
+ release_notes_link: item_hashes[:v120][:release_notes_link],
+ pub_date: Time.parse(item_hashes[:v120][:pub_date]),
+ os: item_hashes[:v120][:os],
+ url: item_hashes[:v120][:url],
+ bundle_version: Homebrew::BundleVersion.new(
+ item_hashes[:v120][:short_version],
+ item_hashes[:v120][:version],
+ ),
+ minimum_system_version: item_hashes[:v120][:minimum_system_version],
),
}
end