Class: PyPI::Package Private

Inherits:
Object show all
Includes:
Utils::Output::Mixin
Defined in:
utils/pypi.rb

Overview

This class is part of a private API. This class may only be used in the Homebrew/brew repository. Third parties should avoid using this class if possible, as it may be removed or changed without warning.

Represents a Python package. This package can be a PyPI package (either by name/version or PyPI distribution URL), or it can be a non-PyPI URL.

Instance Method Summary collapse

Methods included from Utils::Output::Mixin

#odebug, #odeprecated, #odie, #odisabled, #ofail, #oh1, #oh1_title, #ohai, #ohai_title, #onoe, #opoo, #opoo_outside_github_actions, #pretty_duration, #pretty_installed, #pretty_outdated, #pretty_uninstalled

Constructor Details

#initialize(package_string, is_url: false, python_name: "python") ⇒ void

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.

Parameters:

  • package_string (String)
  • is_url (Boolean) (defaults to: false)
  • python_name (String) (defaults to: "python")


21
22
23
24
25
26
27
# File 'utils/pypi.rb', line 21

def initialize(package_string, is_url: false, python_name: "python")
  @pypi_info = T.let(nil, T.nilable(T::Array[String]))
  @package_string = package_string
  @is_url = is_url
  @is_pypi_url = T.let(package_string.start_with?(PYTHONHOSTED_URL_PREFIX), T::Boolean)
  @python_name = python_name
end

Instance Method Details

#extrasArray<String>?

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.

Returns:



36
37
38
39
# File 'utils/pypi.rb', line 36

def extras
   if @extras.blank?
  @extras
end

#nameString?

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.

Returns:



30
31
32
33
# File 'utils/pypi.rb', line 30

def name
   if @name.blank?
  @name
end

#pypi_info(new_version: nil, ignore_errors: false) ⇒ Array<String>?

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.

Get name, URL, SHA-256 checksum and latest version for a given package. This only works for packages from PyPI or from a PyPI URL; packages derived from non-PyPI URLs will produce nil here.

Parameters:

  • new_version (String, Version, nil) (defaults to: nil)
  • ignore_errors (Boolean, nil) (defaults to: false)

Returns:



66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# File 'utils/pypi.rb', line 66

def pypi_info(new_version: nil, ignore_errors: false)
  return unless valid_pypi_package?
  return @pypi_info if @pypi_info.present? && new_version.blank?

  new_version ||= version
   = if new_version.present?
    "https://pypi.org/pypi/#{name}/#{new_version}/json"
  else
    "https://pypi.org/pypi/#{name}/json"
  end
  result = Utils::Curl.curl_output(, "--location", "--fail")

  return unless result.status.success?

  begin
    json = JSON.parse(result.stdout)
  rescue JSON::ParserError
    return
  end

  dist = json["urls"].find do |url|
    url["packagetype"] == "sdist"
  end

  # If there isn't an sdist, we use the first pure Python3 or universal wheel
  if dist.nil?
    dist = json["urls"].find do |url|
      url["filename"].match?("[.-]py3[^-]*-none-any.whl$")
    end
  end

  if dist.nil?
    return ["", "", "", "", "no suitable source distribution on PyPI"] if ignore_errors

    onoe "#{name} exists on PyPI but lacks a suitable source distribution"
    return
  end

  @pypi_info = [
    PyPI.normalize_python_package(json["info"]["name"]), dist["url"],
    dist["digests"]["sha256"], json["info"]["version"]
  ]
end

#same_package?(other) ⇒ 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.

Parameters:

Returns:

  • (Boolean)


125
126
127
128
# File 'utils/pypi.rb', line 125

def same_package?(other)
  # These names are pre-normalized, so we can compare them directly.
  name == other.name
end

#valid_pypi_package?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.

Returns:

  • (Boolean)


55
56
57
# File 'utils/pypi.rb', line 55

def valid_pypi_package?
  @is_pypi_url || !@is_url
end

#versionString?

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.

Returns:



42
43
44
45
# File 'utils/pypi.rb', line 42

def version
   if @version.blank?
  @version
end

#version=(new_version) ⇒ void

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.

This method returns an undefined value.

Parameters:

Raises:

  • (ArgumentError)


48
49
50
51
52
# File 'utils/pypi.rb', line 48

def version=(new_version)
  raise ArgumentError, "can't update version for non-PyPI packages" unless valid_pypi_package?

  @version = T.let(new_version, T.nilable(String))
end