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 =

The default regex used to identify versions when a regex isn’t provided.

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

The default strategy block used to extract version information when a strategy block isn’t provided.

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
URL_MATCH_REGEX =

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}

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:



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

def self.find_versions(url:, regex: nil, provided_content: nil, homebrew_curl: false, **_unused, &block)
  match_data = { matches: {}, regex: regex, url: 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: 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}

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:



57
58
59
60
61
62
63
64
# File 'livecheck/strategy/crate.rb', line 57

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

Whether the strategy can be applied to the provided URL.

Parameters:

  • url (String)

    the URL to match against

Returns:

  • (Boolean)


47
48
49
# File 'livecheck/strategy/crate.rb', line 47

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