Class: Homebrew::Livecheck::Strategy::Pypi

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

Overview

The Pypi strategy identifies the newest version of a PyPI package by checking the JSON API endpoint for the project and using the info.version field from the response.

PyPI URLs have a standard format: https://files.pythonhosted.org/packages/<hex>/<hex>/<long_hex>/example-1.2.3.tar.gz

Upstream documentation for the PyPI JSON API can be found at: https://docs.pypi.org/api/json/#get-a-project

Constant Summary collapse

NICE_NAME =
"PyPI"
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|
  version = json.dig("info", "version")
  next if version.blank?

  regex ? version[regex, 1] : version
end.freeze, T.proc.params(
  json:  T::Hash[String, T.untyped],
  regex: T.nilable(Regexp),
).returns(T.nilable(String)))
FILENAME_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 extract the package name and suffix (e.g. file extension) from the URL basename.

/
  (?<package_name>.+)- # The package name followed by a hyphen
  .*? # The version string
  (?<suffix>\.tar\.[a-z0-9]+|\.[a-z0-9]+)$ # Filename extension
/ix
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?://files\.pythonhosted\.org
  /packages
  (?:/[^/]+)+ # The hexadecimal paths before the filename
  /#{FILENAME_REGEX.source.strip} # The filename
}ix

Class Method Summary collapse

Class Method Details

.find_versions(url:, regex: nil, provided_content: nil, **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 PyPI JSON API URL for the project and identifies new versions using Json.find_versions with a block.

Parameters:

  • url (String)

    the URL of the content to check

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

    a regex used for matching versions in content

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

    content to check instead of fetching

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

Returns:



92
93
94
95
96
97
98
99
100
101
102
103
104
105
# File 'livecheck/strategy/pypi.rb', line 92

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

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

  Json.find_versions(
    url:              generated[:url],
    regex:,
    provided_content:,
    **unused,
    &block || DEFAULT_BLOCK
  )
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 the package name from the provided URL and uses it to generate the PyPI JSON API URL for the project.

Parameters:

  • url (String)

    the URL used to generate values

Returns:



64
65
66
67
68
69
70
71
72
73
# File 'livecheck/strategy/pypi.rb', line 64

def self.generate_input_values(url)
  values = {}

  match = File.basename(url).match(FILENAME_REGEX)
  return values if match.blank?

  values[:url] = "https://pypi.org/pypi/#{T.must(match[:package_name]).gsub(/%20|_/, "-")}/json"

  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)


54
55
56
# File 'livecheck/strategy/pypi.rb', line 54

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