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

Inherits:
Object
  • Object
show all
Extended by:
T::Sig
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 is also used within other strategies, to handle the process of identifying version text in content.

Constant Summary collapse

NICE_NAME =
"Page match"
PRIORITY =

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

0
URL_MATCH_REGEX =

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

%r{^https?://}i.freeze

Class Method Summary collapse

Class Method Details

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

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)

    a regex used for matching versions in content

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

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

  • block (T.proc.params(arg0: String).returns(T.any(T::Array[String], String)), nil)

Returns:



87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
# File 'livecheck/strategy/page_match.rb', line 87

def self.find_versions(url, regex, cask: nil, provided_content: nil, &block)
  match_data = { matches: {}, regex: regex, url: url }

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

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

  match_data
end

.match?(url) ⇒ Boolean

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

Parameters:

Returns:

  • (Boolean)


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

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

.page_matches(content, regex, &block) ⇒ Array

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)

    a regex used for matching versions in the content

Returns:

  • (Array)


48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'livecheck/strategy/page_match.rb', line 48

def self.page_matches(content, regex, &block)
  if block
    case (value = block.call(content, regex))
    when String
      return [value]
    when Array
      return value
    else
      raise TypeError, "Return value of `strategy :page_match` block must be a string or array of strings."
    end
  end

  content.scan(regex).map do |match|
    case match
    when String
      match
    else
      match.first
    end
  end.uniq
end