Class: Homebrew::Livecheck::Strategy::Yaml

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

Overview

The Yaml strategy fetches content at a URL, parses it as YAML, and provides the parsed data to a strategy block. If a regex is present in the livecheck block, it should be passed as the second argument to the strategy block.

This is a generic strategy that doesn’t contain any logic for finding versions, as the structure of YAML data varies. Instead, a strategy block must be used to extract version information from the YAML data.

This strategy is not applied automatically and it is necessary to use strategy :yaml in a livecheck block (in conjunction with a strategy block) to use it.

This strategy’s Yaml.find_versions method can be used in other strategies that work with YAML content, so it should only be necessary to write the version-finding logic that works with the parsed YAML data.

Constant Summary collapse

NICE_NAME =
"YAML"
PRIORITY =

A priority of zero causes livecheck to skip the strategy. We do this for Homebrew::Livecheck::Strategy::Yaml so we can selectively apply it only when a strategy block 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

Class Method Summary collapse

Class Method Details

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

Checks the YAML content at the URL for versions, using the provided strategy block to extract version information.

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:

Raises:

  • (ArgumentError)


109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
# File 'livecheck/strategy/yaml.rb', line 109

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

  match_data = { matches: {}, regex:, url: }
  return match_data if url.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

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

Parameters:

  • url (String)

    the URL to match against

Returns:

  • (Boolean)


43
44
45
# File 'livecheck/strategy/yaml.rb', line 43

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

.parse_yaml(content) ⇒ T.untyped

Parses YAML text and returns the parsed data.

Parameters:

  • content (String)

    the YAML text to parse

Returns:

  • (T.untyped)


50
51
52
53
54
55
56
57
58
# File 'livecheck/strategy/yaml.rb', line 50

def self.parse_yaml(content)
  require "yaml"

  begin
    YAML.safe_load(content, permitted_classes: [Date, Time])
  rescue Psych::SyntaxError
    raise "Content could not be parsed as YAML."
  end
end

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

Parses YAML text and identifies versions using a strategy block. If a regex is provided, it will be passed as the second argument to the strategy block (after the parsed YAML data).

Parameters:

  • content (String)

    the YAML text to parse and check

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

    a regex used for matching versions in the content

  • block (Proc, nil)

Returns:



74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# File 'livecheck/strategy/yaml.rb', line 74

def self.versions_from_content(content, regex = nil, &block)
  return [] if content.blank? || block.blank?

  yaml = parse_yaml(content)
  return [] if yaml.blank?

  block_return_value = if regex.present?
    yield(yaml, regex)
  elsif block.arity == 2
    raise "Two arguments found in `strategy` block but no regex provided."
  else
    yield(yaml)
  end
  Strategy.handle_block_return(block_return_value)
end