From 085827f6051d081fc87afb5af1c7667b0ef55867 Mon Sep 17 00:00:00 2001 From: Sam Ford <1584702+samford@users.noreply.github.com> Date: Fri, 19 Nov 2021 22:42:15 -0500 Subject: [PATCH] Handle variable strategy block arguments There are times where a regex isn't needed in a `strategy` block and these changes explicitly handle that situation. This allows the Symbol Proc format used in some `Sparkle` `livecheck` blocks (e.g., `strategy :sparkle, &:version`) to continue working instead of failing with a "wrong number of arguments (given 1, expected 0)" error. This error would occur because a Symbol Proc only only expects one argument (e.g., an `Item`, not an `Item` and a regex/nil). There's an argument to be made for avoiding the Symbol Proc format for `strategy` blocks but I haven't found a way of selectively disabling the Style/SymbolProc cop only for a `strategy` DSL method call. That is to say, if we don't use the Symbol Proc format, `brew style` will give a "Pass &:version as an argument to strategy instead of a block." offense. Besides that, this also replaces the `block` type signatures in livecheck strategies with `T.untyped`. Sorbet doesn't know how to handle a `Proc` with a variable number of arguments and can't be taught how (i.e., `T.any` with a `Proc` signature for each variation doesn't work). The aforementioned changes cause Sorbet to complain about there being both too many and too few arguments, so the only way to win is not to play the game. Hopefully we can restore the `block` type signatures in the future (if upstream resolves this years-old issue) but `T.untyped` seems to be our only option for now. --- Library/Homebrew/livecheck/strategy/apache.rb | 4 +--- .../Homebrew/livecheck/strategy/bitbucket.rb | 4 +--- Library/Homebrew/livecheck/strategy/cpan.rb | 4 +--- .../livecheck/strategy/electron_builder.rb | 19 ++++++----------- .../livecheck/strategy/extract_plist.rb | 19 ++++++----------- Library/Homebrew/livecheck/strategy/git.rb | 21 +++++++++++-------- .../livecheck/strategy/github_latest.rb | 4 +--- Library/Homebrew/livecheck/strategy/gnome.rb | 4 +--- Library/Homebrew/livecheck/strategy/gnu.rb | 4 +--- .../Homebrew/livecheck/strategy/hackage.rb | 4 +--- .../livecheck/strategy/header_match.rb | 16 ++++++-------- .../Homebrew/livecheck/strategy/launchpad.rb | 4 +--- Library/Homebrew/livecheck/strategy/npm.rb | 4 +--- .../Homebrew/livecheck/strategy/page_match.rb | 14 ++++++------- Library/Homebrew/livecheck/strategy/pypi.rb | 4 +--- .../livecheck/strategy/sourceforge.rb | 4 +--- .../Homebrew/livecheck/strategy/sparkle.rb | 13 ++++++------ Library/Homebrew/livecheck/strategy/xorg.rb | 4 +--- 18 files changed, 55 insertions(+), 95 deletions(-) diff --git a/Library/Homebrew/livecheck/strategy/apache.rb b/Library/Homebrew/livecheck/strategy/apache.rb index ac45fff106..fd77fda4ca 100644 --- a/Library/Homebrew/livecheck/strategy/apache.rb +++ b/Library/Homebrew/livecheck/strategy/apache.rb @@ -93,9 +93,7 @@ module Homebrew url: String, regex: T.nilable(Regexp), unused: T.nilable(T::Hash[Symbol, T.untyped]), - block: T.nilable( - T.proc.params(arg0: String, arg1: Regexp).returns(T.any(String, T::Array[String], NilClass)), - ), + block: T.untyped, ).returns(T::Hash[Symbol, T.untyped]) } def self.find_versions(url:, regex: nil, **unused, &block) diff --git a/Library/Homebrew/livecheck/strategy/bitbucket.rb b/Library/Homebrew/livecheck/strategy/bitbucket.rb index f2679f421f..0d4fef5a55 100644 --- a/Library/Homebrew/livecheck/strategy/bitbucket.rb +++ b/Library/Homebrew/livecheck/strategy/bitbucket.rb @@ -96,9 +96,7 @@ module Homebrew url: String, regex: T.nilable(Regexp), unused: T.nilable(T::Hash[Symbol, T.untyped]), - block: T.nilable( - T.proc.params(arg0: String, arg1: Regexp).returns(T.any(String, T::Array[String], NilClass)), - ), + block: T.untyped, ).returns(T::Hash[Symbol, T.untyped]) } def self.find_versions(url:, regex: nil, **unused, &block) diff --git a/Library/Homebrew/livecheck/strategy/cpan.rb b/Library/Homebrew/livecheck/strategy/cpan.rb index 2478f9d0d0..84e58e8353 100644 --- a/Library/Homebrew/livecheck/strategy/cpan.rb +++ b/Library/Homebrew/livecheck/strategy/cpan.rb @@ -80,9 +80,7 @@ module Homebrew url: String, regex: T.nilable(Regexp), unused: T.nilable(T::Hash[Symbol, T.untyped]), - block: T.nilable( - T.proc.params(arg0: String, arg1: Regexp).returns(T.any(String, T::Array[String], NilClass)), - ), + block: T.untyped, ).returns(T::Hash[Symbol, T.untyped]) } def self.find_versions(url:, regex: nil, **unused, &block) diff --git a/Library/Homebrew/livecheck/strategy/electron_builder.rb b/Library/Homebrew/livecheck/strategy/electron_builder.rb index df5d01a818..f33f692052 100644 --- a/Library/Homebrew/livecheck/strategy/electron_builder.rb +++ b/Library/Homebrew/livecheck/strategy/electron_builder.rb @@ -40,12 +40,7 @@ module Homebrew params( content: String, regex: T.nilable(Regexp), - block: T.nilable( - T.proc.params( - arg0: T::Hash[String, T.untyped], - arg1: T.nilable(Regexp), - ).returns(T.any(String, T::Array[String], NilClass)), - ), + block: T.untyped, ).returns(T::Array[String]) } def self.versions_from_content(content, regex = nil, &block) @@ -54,7 +49,10 @@ module Homebrew yaml = YAML.safe_load(content) return [] if yaml.blank? - return Strategy.handle_block_return(yield(yaml, regex)) if block + if block + block_return_value = regex.present? ? yield(yaml, regex) : yield(yaml) + return Strategy.handle_block_return(block_return_value) + end version = yaml["version"] version.present? ? [version] : [] @@ -69,12 +67,7 @@ module Homebrew url: String, regex: T.nilable(Regexp), _unused: T.nilable(T::Hash[Symbol, T.untyped]), - block: T.nilable( - T.proc.params( - arg0: T::Hash[String, T.untyped], - arg1: T.nilable(Regexp), - ).returns(T.any(String, T::Array[String], NilClass)), - ), + block: T.untyped, ).returns(T::Hash[Symbol, T.untyped]) } def self.find_versions(url:, regex: nil, **_unused, &block) diff --git a/Library/Homebrew/livecheck/strategy/extract_plist.rb b/Library/Homebrew/livecheck/strategy/extract_plist.rb index 547a4f98dd..580d634727 100644 --- a/Library/Homebrew/livecheck/strategy/extract_plist.rb +++ b/Library/Homebrew/livecheck/strategy/extract_plist.rb @@ -63,16 +63,14 @@ module Homebrew params( items: T::Hash[String, Item], regex: T.nilable(Regexp), - block: T.nilable( - T.proc.params( - arg0: T::Hash[String, Item], - arg1: T.nilable(Regexp), - ).returns(T.any(String, T::Array[String], NilClass)), - ), + block: T.untyped, ).returns(T::Array[String]) } def self.versions_from_items(items, regex = nil, &block) - return Strategy.handle_block_return(yield(items, regex)) if block + if block + block_return_value = regex.present? ? yield(items, regex) : yield(items) + return Strategy.handle_block_return(block_return_value) + end items.map do |_key, item| item.bundle_version.nice_version @@ -89,12 +87,7 @@ module Homebrew cask: Cask::Cask, regex: T.nilable(Regexp), _unused: T.nilable(T::Hash[Symbol, T.untyped]), - block: T.nilable( - T.proc.params( - arg0: T::Hash[String, Item], - arg1: T.nilable(Regexp), - ).returns(T.any(String, T::Array[String], NilClass)), - ), + block: T.untyped, ).returns(T::Hash[Symbol, T.untyped]) } def self.find_versions(cask:, regex: nil, **_unused, &block) diff --git a/Library/Homebrew/livecheck/strategy/git.rb b/Library/Homebrew/livecheck/strategy/git.rb index 402701d72c..5929460c56 100644 --- a/Library/Homebrew/livecheck/strategy/git.rb +++ b/Library/Homebrew/livecheck/strategy/git.rb @@ -86,14 +86,20 @@ module Homebrew params( tags: T::Array[String], regex: T.nilable(Regexp), - block: T.nilable( - T.proc.params(arg0: T::Array[String], arg1: T.nilable(Regexp)) - .returns(T.any(String, T::Array[String], NilClass)), - ), + block: T.untyped, ).returns(T::Array[String]) } def self.versions_from_tags(tags, regex = nil, &block) - return Strategy.handle_block_return(yield(tags, regex || DEFAULT_REGEX)) if block + if block + block_return_value = if regex.present? + yield(tags, regex) + elsif block.arity == 2 + yield(tags, DEFAULT_REGEX) + else + yield(tags) + end + return Strategy.handle_block_return(block_return_value) + end tags_only_debian = tags.all? { |tag| tag.start_with?("debian/") } @@ -125,10 +131,7 @@ module Homebrew url: String, regex: T.nilable(Regexp), _unused: T.nilable(T::Hash[Symbol, T.untyped]), - block: T.nilable( - T.proc.params(arg0: T::Array[String], arg1: T.nilable(Regexp)) - .returns(T.any(String, T::Array[String], NilClass)), - ), + block: T.untyped, ).returns(T::Hash[Symbol, T.untyped]) } def self.find_versions(url:, regex: nil, **_unused, &block) diff --git a/Library/Homebrew/livecheck/strategy/github_latest.rb b/Library/Homebrew/livecheck/strategy/github_latest.rb index 9b2fdff359..f9d8482cda 100644 --- a/Library/Homebrew/livecheck/strategy/github_latest.rb +++ b/Library/Homebrew/livecheck/strategy/github_latest.rb @@ -92,9 +92,7 @@ module Homebrew url: String, regex: T.nilable(Regexp), unused: T.nilable(T::Hash[Symbol, T.untyped]), - block: T.nilable( - T.proc.params(arg0: String, arg1: Regexp).returns(T.any(String, T::Array[String], NilClass)), - ), + block: T.untyped, ).returns(T::Hash[Symbol, T.untyped]) } def self.find_versions(url:, regex: nil, **unused, &block) diff --git a/Library/Homebrew/livecheck/strategy/gnome.rb b/Library/Homebrew/livecheck/strategy/gnome.rb index 88700eb968..49baed77c6 100644 --- a/Library/Homebrew/livecheck/strategy/gnome.rb +++ b/Library/Homebrew/livecheck/strategy/gnome.rb @@ -82,9 +82,7 @@ module Homebrew url: String, regex: T.nilable(Regexp), unused: T.nilable(T::Hash[Symbol, T.untyped]), - block: T.nilable( - T.proc.params(arg0: String, arg1: Regexp).returns(T.any(String, T::Array[String], NilClass)), - ), + block: T.untyped, ).returns(T::Hash[Symbol, T.untyped]) } def self.find_versions(url:, regex: nil, **unused, &block) diff --git a/Library/Homebrew/livecheck/strategy/gnu.rb b/Library/Homebrew/livecheck/strategy/gnu.rb index f0200b7ac5..0077974717 100644 --- a/Library/Homebrew/livecheck/strategy/gnu.rb +++ b/Library/Homebrew/livecheck/strategy/gnu.rb @@ -92,9 +92,7 @@ module Homebrew url: String, regex: T.nilable(Regexp), unused: T.nilable(T::Hash[Symbol, T.untyped]), - block: T.nilable( - T.proc.params(arg0: String, arg1: Regexp).returns(T.any(String, T::Array[String], NilClass)), - ), + block: T.untyped, ).returns(T::Hash[Symbol, T.untyped]) } def self.find_versions(url:, regex: nil, **unused, &block) diff --git a/Library/Homebrew/livecheck/strategy/hackage.rb b/Library/Homebrew/livecheck/strategy/hackage.rb index 42587c82d4..e303e2ea7c 100644 --- a/Library/Homebrew/livecheck/strategy/hackage.rb +++ b/Library/Homebrew/livecheck/strategy/hackage.rb @@ -78,9 +78,7 @@ module Homebrew url: String, regex: T.nilable(Regexp), unused: T.nilable(T::Hash[Symbol, T.untyped]), - block: T.nilable( - T.proc.params(arg0: String, arg1: Regexp).returns(T.any(String, T::Array[String], NilClass)), - ), + block: T.untyped, ).returns(T::Hash[Symbol, T.untyped]) } def self.find_versions(url:, regex: nil, **unused, &block) diff --git a/Library/Homebrew/livecheck/strategy/header_match.rb b/Library/Homebrew/livecheck/strategy/header_match.rb index 6d397f8402..9bd68b991e 100644 --- a/Library/Homebrew/livecheck/strategy/header_match.rb +++ b/Library/Homebrew/livecheck/strategy/header_match.rb @@ -44,16 +44,14 @@ module Homebrew params( headers: T::Hash[String, String], regex: T.nilable(Regexp), - block: T.nilable( - T.proc.params( - arg0: T::Hash[String, String], - arg1: T.nilable(Regexp), - ).returns(T.any(String, T::Array[String], NilClass)), - ), + block: T.untyped, ).returns(T::Array[String]) } def self.versions_from_headers(headers, regex = nil, &block) - return Strategy.handle_block_return(yield(headers, regex)) if block + if block + block_return_value = regex.present? ? yield(headers, regex) : yield(headers) + return Strategy.handle_block_return(block_return_value) + end DEFAULT_HEADERS_TO_CHECK.map do |header_name| header_value = headers[header_name] @@ -79,9 +77,7 @@ module Homebrew url: String, regex: T.nilable(Regexp), _unused: T.nilable(T::Hash[Symbol, T.untyped]), - block: T.nilable( - T.proc.params(arg0: T::Hash[String, String], arg1: T.nilable(Regexp)).returns(T.nilable(String)), - ), + block: T.untyped, ).returns(T::Hash[Symbol, T.untyped]) } def self.find_versions(url:, regex: nil, **_unused, &block) diff --git a/Library/Homebrew/livecheck/strategy/launchpad.rb b/Library/Homebrew/livecheck/strategy/launchpad.rb index b03125c357..3f1c278e81 100644 --- a/Library/Homebrew/livecheck/strategy/launchpad.rb +++ b/Library/Homebrew/livecheck/strategy/launchpad.rb @@ -75,9 +75,7 @@ module Homebrew url: String, regex: T.nilable(Regexp), unused: T.nilable(T::Hash[Symbol, T.untyped]), - block: T.nilable( - T.proc.params(arg0: String, arg1: Regexp).returns(T.any(String, T::Array[String], NilClass)), - ), + block: T.untyped, ).returns(T::Hash[Symbol, T.untyped]) } def self.find_versions(url:, regex: nil, **unused, &block) diff --git a/Library/Homebrew/livecheck/strategy/npm.rb b/Library/Homebrew/livecheck/strategy/npm.rb index 7c84cc71b2..8fedeb84e4 100644 --- a/Library/Homebrew/livecheck/strategy/npm.rb +++ b/Library/Homebrew/livecheck/strategy/npm.rb @@ -73,9 +73,7 @@ module Homebrew url: String, regex: T.nilable(Regexp), unused: T.nilable(T::Hash[Symbol, T.untyped]), - block: T.nilable( - T.proc.params(arg0: String, arg1: Regexp).returns(T.any(String, T::Array[String], NilClass)), - ), + block: T.untyped, ).returns(T::Hash[Symbol, T.untyped]) } def self.find_versions(url:, regex: nil, **unused, &block) diff --git a/Library/Homebrew/livecheck/strategy/page_match.rb b/Library/Homebrew/livecheck/strategy/page_match.rb index 6b588b9be9..d4f57d6b0a 100644 --- a/Library/Homebrew/livecheck/strategy/page_match.rb +++ b/Library/Homebrew/livecheck/strategy/page_match.rb @@ -51,13 +51,15 @@ module Homebrew params( content: String, regex: T.nilable(Regexp), - block: T.nilable( - T.proc.params(arg0: String, arg1: T.nilable(Regexp)).returns(T.any(String, T::Array[String], NilClass)), - ), + block: T.untyped, ).returns(T::Array[String]) } def self.versions_from_content(content, regex, &block) - return Strategy.handle_block_return(yield(content, regex)) if block + if block + block_return_value = regex.present? ? yield(content, regex) : yield(content) + return Strategy.handle_block_return(block_return_value) + end + return [] if regex.blank? content.scan(regex).map do |match| @@ -84,9 +86,7 @@ module Homebrew regex: T.nilable(Regexp), provided_content: T.nilable(String), _unused: T.nilable(T::Hash[Symbol, T.untyped]), - block: T.nilable( - T.proc.params(arg0: String, arg1: T.nilable(Regexp)).returns(T.any(String, T::Array[String], NilClass)), - ), + block: T.untyped, ).returns(T::Hash[Symbol, T.untyped]) } def self.find_versions(url:, regex: nil, provided_content: nil, **_unused, &block) diff --git a/Library/Homebrew/livecheck/strategy/pypi.rb b/Library/Homebrew/livecheck/strategy/pypi.rb index 9a69ac555d..256e4f713b 100644 --- a/Library/Homebrew/livecheck/strategy/pypi.rb +++ b/Library/Homebrew/livecheck/strategy/pypi.rb @@ -87,9 +87,7 @@ module Homebrew url: String, regex: T.nilable(Regexp), unused: T.nilable(T::Hash[Symbol, T.untyped]), - block: T.nilable( - T.proc.params(arg0: String, arg1: Regexp).returns(T.any(String, T::Array[String], NilClass)), - ), + block: T.untyped, ).returns(T::Hash[Symbol, T.untyped]) } def self.find_versions(url:, regex: nil, **unused, &block) diff --git a/Library/Homebrew/livecheck/strategy/sourceforge.rb b/Library/Homebrew/livecheck/strategy/sourceforge.rb index 9c5b290c98..a0050b7486 100644 --- a/Library/Homebrew/livecheck/strategy/sourceforge.rb +++ b/Library/Homebrew/livecheck/strategy/sourceforge.rb @@ -92,9 +92,7 @@ module Homebrew url: String, regex: T.nilable(Regexp), unused: T.nilable(T::Hash[Symbol, T.untyped]), - block: T.nilable( - T.proc.params(arg0: String, arg1: Regexp).returns(T.any(String, T::Array[String], NilClass)), - ), + block: T.untyped, ).returns(T::Hash[Symbol, T.untyped]) } def self.find_versions(url:, regex: nil, **unused, &block) diff --git a/Library/Homebrew/livecheck/strategy/sparkle.rb b/Library/Homebrew/livecheck/strategy/sparkle.rb index f0ef5f33e3..b5cc80aea0 100644 --- a/Library/Homebrew/livecheck/strategy/sparkle.rb +++ b/Library/Homebrew/livecheck/strategy/sparkle.rb @@ -151,16 +151,17 @@ module Homebrew params( content: String, regex: T.nilable(Regexp), - block: T.nilable( - T.proc.params(arg0: Item, arg1: T.nilable(Regexp)).returns(T.any(String, T::Array[String], NilClass)), - ), + block: T.untyped, ).returns(T::Array[String]) } def self.versions_from_content(content, regex = nil, &block) item = item_from_content(content) return [] if item.blank? - return Strategy.handle_block_return(yield(item, regex)) if block + if block + block_return_value = regex.present? ? yield(item, regex) : yield(item) + return Strategy.handle_block_return(block_return_value) + end version = item.bundle_version&.nice_version version.present? ? [version] : [] @@ -172,9 +173,7 @@ module Homebrew url: String, regex: T.nilable(Regexp), _unused: T.nilable(T::Hash[Symbol, T.untyped]), - block: T.nilable( - T.proc.params(arg0: Item, arg1: T.nilable(Regexp)).returns(T.any(String, T::Array[String], NilClass)), - ), + block: T.untyped, ).returns(T::Hash[Symbol, T.untyped]) } def self.find_versions(url:, regex: nil, **_unused, &block) diff --git a/Library/Homebrew/livecheck/strategy/xorg.rb b/Library/Homebrew/livecheck/strategy/xorg.rb index 722739e54b..25e1ae0510 100644 --- a/Library/Homebrew/livecheck/strategy/xorg.rb +++ b/Library/Homebrew/livecheck/strategy/xorg.rb @@ -114,9 +114,7 @@ module Homebrew url: String, regex: T.nilable(Regexp), unused: T.nilable(T::Hash[Symbol, T.untyped]), - block: T.nilable( - T.proc.params(arg0: String, arg1: Regexp).returns(T.any(String, T::Array[String], NilClass)), - ), + block: T.untyped, ).returns(T::Hash[Symbol, T.untyped]) } def self.find_versions(url:, regex: nil, **unused, &block)