Class: Homebrew::Livecheck::Strategy::Crate

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

Overview

The Crate strategy identifies versions of a Rust crate by checking the information from the versions API endpoint.

Crate URLs have the following format: https://static.crates.io/crates/example/example-1.2.3.crate

The default regex identifies versions like 1.2.3/v1.2.3 from the version num field. This is a common version format but a different regex can be provided in a livecheck block to override the default if a package uses a different format (e.g. 1.2.3d, 1.2.3-4, etc.).

Constant Summary collapse

DEFAULT_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 default regex used to identify versions when a regex isn't provided.

/^v?(\d+(?:\.\d+)+)$/i
DEFAULT_BLOCK =

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 default strategy block used to extract version information when a strategy block isn't provided.

T.let(proc do |json, regex|
  json["versions"]&.map do |version|
    next if version["yanked"]
    next unless (match = version["num"]&.match(regex))

    match[1]
  end
end.freeze, T.proc.params(
  arg0: T::Hash[String, T.untyped],
  arg1: Regexp,
).returns(T.any(String, T::Array[String])))
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?://static\.crates\.io/crates
  /(?<package>[^/]+) # The name of the package
  /.+\.crate # The crate filename
}ix

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.

Generates a URL and checks the content at the URL for new versions using Json.versions_from_content.

Parameters:

  • url (String)

    the URL of the content to check

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

    a regex for matching versions in content

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

    content to check instead of fetching

  • homebrew_curl (Boolean) (defaults to: false)

    whether to use brewed curl with the URL

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

Returns:



88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# File 'livecheck/strategy/crate.rb', line 88

def self.find_versions(url:, regex: nil, provided_content: nil, homebrew_curl: false, **_unused, &block)
  match_data = { matches: {}, regex:, url: }
  match_data[:cached] = true if provided_content.is_a?(String)

  generated = generate_input_values(url)
  return match_data if generated.blank?

  match_data[:url] = generated[:url]

  content = if provided_content
    provided_content
  else
    match_data.merge!(Strategy.page_content(match_data[:url], homebrew_curl:))
    match_data[:content]
  end
  return match_data unless content

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

  match_data
end

.generate_input_values(url) ⇒ 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.

Extracts information from a provided URL and uses it to generate various input values used by the strategy to check for new versions.

Parameters:

  • url (String)

    the URL used to generate values

Returns:



60
61
62
63
64
65
66
67
# File 'livecheck/strategy/crate.rb', line 60

def self.generate_input_values(url)
  values = {}
  return values unless (match = url.match(URL_MATCH_REGEX))

  values[:url] = "https://crates.io/api/v1/crates/#{match[:package]}/versions"

  values
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.

Parameters:

  • url (String)

    the URL to match against

Returns:

  • (Boolean)


50
51
52
# File 'livecheck/strategy/crate.rb', line 50

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