Class: Homebrew::Livecheck::Strategy::PageMatch

Inherits:
Object
  • Object
show all
Defined in:
livecheck/strategy/page_match.rb

Overview

The PageMatch strategy fetches content at a URL and scans it for matching text using the provided regex.

This strategy can be used in a livecheck block when no specific strategies apply to a given URL. Though PageMatch will technically match any HTTP URL, the strategy also requires a regex to function.

The PageMatch.find_versions method can be used within other strategies, to handle the process of identifying version text in content.

Constant Summary collapse

NICE_NAME =
"Page match"
PRIORITY =

This constant is part of a private API. This constant may only be used in the Homebrew/brew repository. Third parties should avoid using this constant if possible, as it may be removed or changed without warning.

A priority of zero causes livecheck to skip the strategy. We do this for Homebrew::Livecheck::Strategy::PageMatch so we can selectively apply it only when a regex is provided in a livecheck block.

0
URL_MATCH_REGEX =

This constant is part of a private API. This constant may only be used in the Homebrew/brew repository. Third parties should avoid using this constant if possible, as it may be removed or changed without warning.

The Regexp used to determine if the strategy applies to the URL.

%r{^https?://}i

Class Method Summary collapse

Class Method Details

.find_versions(url:, regex: nil, provided_content: nil, homebrew_curl: false, **_unused, &block) ⇒ Hash{Symbol => T.untyped}

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Checks the content at the URL for new versions, using the provided regex for matching.

Parameters:

  • url (String)

    the URL of the content to check

  • regex (Regexp, nil) (defaults to: nil)

    a regex used for matching versions

  • provided_content (String, nil) (defaults to: nil)

    page content to use in place of fetching via Strategy#page_content

  • homebrew_curl (Boolean) (defaults to: false)

    whether to use brewed curl with the URL

  • _unused (T.untyped)
  • block (Proc, nil)

Returns:



92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
# File 'livecheck/strategy/page_match.rb', line 92

def self.find_versions(url:, regex: nil, provided_content: nil, homebrew_curl: false, **_unused, &block)
  if regex.blank? && block.blank?
    raise ArgumentError, "#{Utils.demodulize(T.must(name))} requires a regex or `strategy` block"
  end

  match_data = { matches: {}, regex:, url: }
  return match_data if url.blank? || (regex.blank? && block.blank?)

  content = if provided_content.is_a?(String)
    match_data[:cached] = true
    provided_content
  else
    match_data.merge!(Strategy.page_content(url, homebrew_curl:))
    match_data[:content]
  end
  return match_data if content.blank?

  versions_from_content(content, regex, &block).each do |match_text|
    match_data[:matches][match_text] = Version.new(match_text)
  end

  match_data
end

.match?(url) ⇒ Boolean

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Whether the strategy can be applied to the provided URL. Homebrew::Livecheck::Strategy::PageMatch will technically match any HTTP URL but is only usable with a livecheck block containing a regex.

Parameters:

  • url (String)

    the URL to match against

Returns:

  • (Boolean)


36
37
38
# File 'livecheck/strategy/page_match.rb', line 36

def self.match?(url)
  URL_MATCH_REGEX.match?(url)
end

.versions_from_content(content, regex, &block) ⇒ Array<String>

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Uses the regex to match text in the content or, if a block is provided, passes the page content to the block to handle matching. With either approach, an array of unique matches is returned.

Parameters:

  • content (String)

    the page content to check

  • regex (Regexp, nil)

    a regex used for matching versions in the content

  • block (Proc, nil)

Returns:



55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'livecheck/strategy/page_match.rb', line 55

def self.versions_from_content(content, regex, &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).filter_map do |match|
    case match
    when String
      match
    when Array
      match.first
    end
  end.uniq
end