Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

livecheck: allow nil return from strategy blocks #11779

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
4 changes: 3 additions & 1 deletion Library/Homebrew/livecheck/strategy/apache.rb
Expand Up @@ -52,7 +52,9 @@ def self.match?(url)
url: String,
regex: T.nilable(Regexp),
cask: T.nilable(Cask::Cask),
block: T.nilable(T.proc.params(arg0: String).returns(T.any(T::Array[String], String))),
block: T.nilable(
T.proc.params(arg0: String, arg1: Regexp).returns(T.any(String, T::Array[String], NilClass)),
),
).returns(T::Hash[Symbol, T.untyped])
}
def self.find_versions(url, regex, cask: nil, &block)
Expand Down
4 changes: 3 additions & 1 deletion Library/Homebrew/livecheck/strategy/bitbucket.rb
Expand Up @@ -59,7 +59,9 @@ def self.match?(url)
url: String,
regex: T.nilable(Regexp),
cask: T.nilable(Cask::Cask),
block: T.nilable(T.proc.params(arg0: String).returns(T.any(T::Array[String], String))),
block: T.nilable(
T.proc.params(arg0: String, arg1: Regexp).returns(T.any(String, T::Array[String], NilClass)),
),
).returns(T::Hash[Symbol, T.untyped])
}
def self.find_versions(url, regex, cask: nil, &block)
Expand Down
4 changes: 3 additions & 1 deletion Library/Homebrew/livecheck/strategy/cpan.rb
Expand Up @@ -50,7 +50,9 @@ def self.match?(url)
url: String,
regex: T.nilable(Regexp),
cask: T.nilable(Cask::Cask),
block: T.nilable(T.proc.params(arg0: String).returns(T.any(T::Array[String], String))),
block: T.nilable(
T.proc.params(arg0: String, arg1: Regexp).returns(T.any(String, T::Array[String], NilClass)),
),
).returns(T::Hash[Symbol, T.untyped])
}
def self.find_versions(url, regex, cask: nil, &block)
Expand Down
19 changes: 12 additions & 7 deletions Library/Homebrew/livecheck/strategy/electron_builder.rb
Expand Up @@ -37,19 +37,24 @@ def self.match?(url)
sig {
params(
content: String,
block: T.nilable(T.proc.params(arg0: Hash).returns(String)),
block: T.nilable(T.proc.params(arg0: T::Hash[String, T.untyped]).returns(T.nilable(String))),
).returns(T.nilable(String))
}
def self.version_from_content(content, &block)
require "yaml"

return unless (yaml = YAML.safe_load(content))
yaml = YAML.safe_load(content)
return if yaml.blank?

if block
value = block.call(yaml)
return value if value.is_a?(String)

raise TypeError, "Return value of `strategy :electron_builder` block must be a string."
case (value = block.call(yaml))
when String
return value
when nil
return
else
raise TypeError, "Return value of `strategy :electron_builder` block must be a string."
end
end

yaml["version"]
Expand All @@ -65,7 +70,7 @@ def self.version_from_content(content, &block)
url: String,
regex: T.nilable(Regexp),
cask: T.nilable(Cask::Cask),
block: T.nilable(T.proc.params(arg0: Hash).returns(String)),
block: T.nilable(T.proc.params(arg0: T::Hash[String, T.untyped]).returns(T.nilable(String))),
).returns(T::Hash[Symbol, T.untyped])
}
def self.find_versions(url, regex, cask: nil, &block)
Expand Down
13 changes: 7 additions & 6 deletions Library/Homebrew/livecheck/strategy/extract_plist.rb
Expand Up @@ -56,7 +56,7 @@ def self.match?(url)
url: String,
regex: T.nilable(Regexp),
cask: Cask::Cask,
block: T.nilable(T.proc.params(arg0: T::Hash[String, Item]).returns(String)),
block: T.nilable(T.proc.params(arg0: T::Hash[String, Item]).returns(T.nilable(String))),
).returns(T::Hash[Symbol, T.untyped])
}
def self.find_versions(url, regex, cask:, &block)
Expand All @@ -69,13 +69,14 @@ def self.find_versions(url, regex, cask:, &block)
versions = unversioned_cask_checker.all_versions.transform_values { |v| Item.new(bundle_version: v) }

if block
match = block.call(versions)

unless T.unsafe(match).is_a?(String)
case (value = block.call(versions))
when String
match_data[:matches][value] = Version.new(value)
when nil
return match_data
else
raise TypeError, "Return value of `strategy :extract_plist` block must be a string."
end

match_data[:matches][match] = Version.new(match) if match
elsif versions.any?
versions.each_value do |item|
version = item.bundle_version.nice_version
Expand Down
9 changes: 6 additions & 3 deletions Library/Homebrew/livecheck/strategy/git.rb
Expand Up @@ -81,8 +81,9 @@ def self.match?(url)
url: String,
regex: T.nilable(Regexp),
cask: T.nilable(Cask::Cask),
block: T.nilable(T.proc.params(arg0: T::Array[String])
.returns(T.any(T::Array[String], String))),
block: T.nilable(
T.proc.params(arg0: T::Array[String]).returns(T.any(String, T::Array[String], NilClass)),
),
).returns(T::Hash[Symbol, T.untyped])
}
def self.find_versions(url, regex, cask: nil, &block)
Expand All @@ -102,9 +103,11 @@ def self.find_versions(url, regex, cask: nil, &block)
when String
match_data[:matches][value] = Version.new(value)
when Array
value.each do |tag|
value.compact.uniq.each do |tag|
match_data[:matches][tag] = Version.new(tag)
end
when nil
return match_data
else
raise TypeError, "Return value of `strategy :git` block must be a string or array of strings."
end
Expand Down
4 changes: 3 additions & 1 deletion Library/Homebrew/livecheck/strategy/github_latest.rb
Expand Up @@ -67,7 +67,9 @@ def self.match?(url)
url: String,
regex: T.nilable(Regexp),
cask: T.nilable(Cask::Cask),
block: T.nilable(T.proc.params(arg0: String).returns(T.any(T::Array[String], String))),
block: T.nilable(
T.proc.params(arg0: String, arg1: Regexp).returns(T.any(String, T::Array[String], NilClass)),
),
).returns(T::Hash[Symbol, T.untyped])
}
def self.find_versions(url, regex, cask: nil, &block)
Expand Down
4 changes: 3 additions & 1 deletion Library/Homebrew/livecheck/strategy/gnome.rb
Expand Up @@ -55,7 +55,9 @@ def self.match?(url)
url: String,
regex: T.nilable(Regexp),
cask: T.nilable(Cask::Cask),
block: T.nilable(T.proc.params(arg0: String).returns(T.any(T::Array[String], String))),
block: T.nilable(
T.proc.params(arg0: String, arg1: Regexp).returns(T.any(String, T::Array[String], NilClass)),
),
).returns(T::Hash[Symbol, T.untyped])
}
def self.find_versions(url, regex, cask: nil, &block)
Expand Down
4 changes: 3 additions & 1 deletion Library/Homebrew/livecheck/strategy/gnu.rb
Expand Up @@ -59,7 +59,9 @@ def self.match?(url)
url: String,
regex: T.nilable(Regexp),
cask: T.nilable(Cask::Cask),
block: T.nilable(T.proc.params(arg0: String).returns(T.any(T::Array[String], String))),
block: T.nilable(
T.proc.params(arg0: String, arg1: Regexp).returns(T.any(String, T::Array[String], NilClass)),
),
).returns(T::Hash[Symbol, T.untyped])
}
def self.find_versions(url, regex, cask: nil, &block)
Expand Down
4 changes: 3 additions & 1 deletion Library/Homebrew/livecheck/strategy/hackage.rb
Expand Up @@ -52,7 +52,9 @@ def self.match?(url)
url: String,
regex: T.nilable(Regexp),
cask: T.nilable(Cask::Cask),
block: T.nilable(T.proc.params(arg0: String).returns(T.any(T::Array[String], String))),
block: T.nilable(
T.proc.params(arg0: String, arg1: Regexp).returns(T.any(String, T::Array[String], NilClass)),
),
).returns(T::Hash[Symbol, T.untyped])
}
def self.find_versions(url, regex, cask: nil, &block)
Expand Down
41 changes: 23 additions & 18 deletions Library/Homebrew/livecheck/strategy/header_match.rb
Expand Up @@ -24,6 +24,9 @@ class HeaderMatch
# The `Regexp` used to determine if the strategy applies to the URL.
URL_MATCH_REGEX = %r{^https?://}i.freeze

# The header fields to check when a `strategy` block isn't provided.
DEFAULT_HEADERS_TO_CHECK = ["content-disposition", "location"].freeze

# Whether the strategy can be applied to the provided URL.
# The strategy will technically match any HTTP URL but is
# only usable with a `livecheck` block containing a regex
Expand All @@ -40,8 +43,7 @@ def self.match?(url)
url: String,
regex: T.nilable(Regexp),
cask: T.nilable(Cask::Cask),
block: T.nilable(T.proc.params(arg0: T::Hash[String, String])
.returns(T.any(T::Array[String], String))),
block: T.nilable(T.proc.params(arg0: T::Hash[String, String]).returns(T.nilable(String))),
).returns(T::Hash[Symbol, T.untyped])
}
def self.find_versions(url, regex, cask: nil, &block)
Expand All @@ -52,31 +54,34 @@ def self.find_versions(url, regex, cask: nil, &block)
# Merge the headers from all responses into one hash
merged_headers = headers.reduce(&:merge)

if block
match = yield merged_headers, regex
version = if block
case (value = block.call(merged_headers, regex))
when String
value
when nil
return match_data
else
raise TypeError, "Return value of `strategy :header_match` block must be a string."
end
else
match = nil
value = nil
DEFAULT_HEADERS_TO_CHECK.each do |header_name|
header_value = merged_headers[header_name]
next if header_value.blank?

if (filename = merged_headers["content-disposition"])
if regex
match ||= filename[regex, 1]
value = header_value[regex, 1]
else
v = Version.parse(filename, detected_from_url: true)
match ||= v.to_s unless v.null?
v = Version.parse(header_value, detected_from_url: true)
value = v.to_s unless v.null?
end
break if value.present?
end

if (location = merged_headers["location"])
if regex
match ||= location[regex, 1]
else
v = Version.parse(location, detected_from_url: true)
match ||= v.to_s unless v.null?
end
end
value
end

match_data[:matches][match] = Version.new(match) if match
match_data[:matches][version] = Version.new(version) if version

match_data
end
Expand Down
4 changes: 3 additions & 1 deletion Library/Homebrew/livecheck/strategy/launchpad.rb
Expand Up @@ -50,7 +50,9 @@ def self.match?(url)
url: String,
regex: T.nilable(Regexp),
cask: T.nilable(Cask::Cask),
block: T.nilable(T.proc.params(arg0: String).returns(T.any(T::Array[String], String))),
block: T.nilable(
T.proc.params(arg0: String, arg1: Regexp).returns(T.any(String, T::Array[String], NilClass)),
),
).returns(T::Hash[Symbol, T.untyped])
}
def self.find_versions(url, regex, cask: nil, &block)
Expand Down
4 changes: 3 additions & 1 deletion Library/Homebrew/livecheck/strategy/npm.rb
Expand Up @@ -46,7 +46,9 @@ def self.match?(url)
url: String,
regex: T.nilable(Regexp),
cask: T.nilable(Cask::Cask),
block: T.nilable(T.proc.params(arg0: String).returns(T.any(T::Array[String], String))),
block: T.nilable(
T.proc.params(arg0: String, arg1: Regexp).returns(T.any(String, T::Array[String], NilClass)),
),
).returns(T::Hash[Symbol, T.untyped])
}
def self.find_versions(url, regex, cask: nil, &block)
Expand Down
23 changes: 18 additions & 5 deletions Library/Homebrew/livecheck/strategy/page_match.rb
Expand Up @@ -45,13 +45,24 @@ def self.match?(url)
# @param regex [Regexp] a regex used for matching versions in the
# content
# @return [Array]
sig {
params(
content: String,
regex: Regexp,
block: T.nilable(
T.proc.params(arg0: String, arg1: Regexp).returns(T.any(String, T::Array[String], NilClass)),
),
).returns(T::Array[String])
}
def self.page_matches(content, regex, &block)
if block
case (value = block.call(content, regex))
when String
return [value]
when Array
return value
return value.compact.uniq
when nil
return []
else
raise TypeError, "Return value of `strategy :page_match` block must be a string or array of strings."
end
Expand All @@ -61,10 +72,10 @@ def self.page_matches(content, regex, &block)
case match
when String
match
else
when Array
match.first
end
end.uniq
end.compact.uniq
end

# Checks the content at the URL for new versions, using the provided
Expand All @@ -78,10 +89,12 @@ def self.page_matches(content, regex, &block)
sig {
params(
url: String,
regex: T.nilable(Regexp),
regex: Regexp,
cask: T.nilable(Cask::Cask),
provided_content: T.nilable(String),
block: T.nilable(T.proc.params(arg0: String).returns(T.any(T::Array[String], String))),
block: T.nilable(
T.proc.params(arg0: String, arg1: Regexp).returns(T.any(String, T::Array[String], NilClass)),
),
).returns(T::Hash[Symbol, T.untyped])
}
def self.find_versions(url, regex, cask: nil, provided_content: nil, &block)
Expand Down
4 changes: 3 additions & 1 deletion Library/Homebrew/livecheck/strategy/pypi.rb
Expand Up @@ -56,7 +56,9 @@ def self.match?(url)
url: String,
regex: T.nilable(Regexp),
cask: T.nilable(Cask::Cask),
block: T.nilable(T.proc.params(arg0: String).returns(T.any(T::Array[String], String))),
block: T.nilable(
T.proc.params(arg0: String, arg1: Regexp).returns(T.any(String, T::Array[String], NilClass)),
),
).returns(T::Hash[Symbol, T.untyped])
}
def self.find_versions(url, regex, cask: nil, &block)
Expand Down
4 changes: 3 additions & 1 deletion Library/Homebrew/livecheck/strategy/sourceforge.rb
Expand Up @@ -62,7 +62,9 @@ def self.match?(url)
url: String,
regex: T.nilable(Regexp),
cask: T.nilable(Cask::Cask),
block: T.nilable(T.proc.params(arg0: String).returns(T.any(T::Array[String], String))),
block: T.nilable(
T.proc.params(arg0: String, arg1: Regexp).returns(T.any(String, T::Array[String], NilClass)),
),
).returns(T::Hash[Symbol, T.untyped])
}
def self.find_versions(url, regex, cask: nil, &block)
Expand Down
17 changes: 9 additions & 8 deletions Library/Homebrew/livecheck/strategy/sparkle.rb
Expand Up @@ -144,7 +144,7 @@ def self.item_from_content(content)
url: String,
regex: T.nilable(Regexp),
cask: T.nilable(Cask::Cask),
block: T.nilable(T.proc.params(arg0: Item).returns(String)),
block: T.nilable(T.proc.params(arg0: Item).returns(T.nilable(String))),
).returns(T::Hash[Symbol, T.untyped])
}
def self.find_versions(url, regex, cask: nil, &block)
Expand All @@ -156,19 +156,20 @@ def self.find_versions(url, regex, cask: nil, &block)
content = match_data.delete(:content)

if (item = item_from_content(content))
match = if block
value = block.call(item)

unless T.unsafe(value).is_a?(String)
version = if block
case (value = block.call(item))
when String
value
when nil
return match_data
else
raise TypeError, "Return value of `strategy :sparkle` block must be a string."
end

value
else
item.bundle_version&.nice_version
end

match_data[:matches][match] = Version.new(match) if match
match_data[:matches][version] = Version.new(version) if version
end

match_data
Expand Down
4 changes: 3 additions & 1 deletion Library/Homebrew/livecheck/strategy/xorg.rb
Expand Up @@ -85,7 +85,9 @@ def self.match?(url)
url: String,
regex: T.nilable(Regexp),
cask: T.nilable(Cask::Cask),
block: T.nilable(T.proc.params(arg0: String).returns(T.any(T::Array[String], String))),
block: T.nilable(
T.proc.params(arg0: String, arg1: Regexp).returns(T.any(String, T::Array[String], NilClass)),
),
).returns(T::Hash[Symbol, T.untyped])
}
def self.find_versions(url, regex, cask: nil, &block)
Expand Down