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

#issue_reporting_message, #odebug, #odeprecated, #odie, #odisabled, #ofail, #oh1, #oh1_title, #ohai, #ohai_title, #onoe, #opoo, #opoo_outside_github_actions, #opoo_without_github_actions_annotation, #pretty_cannot_install, #pretty_deprecated, #pretty_disabled, #pretty_duration, #pretty_install_status, #pretty_installed, #pretty_uninstalled, #pretty_unmarked, #pretty_upgradable, #pretty_warning

Constructor Details

#initialize(package_string, is_url: false, python_name: "python", resource: nil) ⇒ 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")
  • resource (Resource, nil) (defaults to: nil)


26
27
28
29
30
31
32
33
# File 'utils/pypi.rb', line 26

def initialize(package_string, is_url: false, python_name: "python", resource: nil)
  @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
  @resource = resource
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:



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

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:



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

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) (defaults to: false)

Returns:



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
109
110
111
112
113
114
# File 'utils/pypi.rb', line 72

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

#requirementString, Resource

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.

The source resource or package requirement to inspect with pip.

Returns:



131
132
133
134
135
# File 'utils/pypi.rb', line 131

def requirement
  return to_s if valid_pypi_package?

  @resource || @package_string
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)


138
139
140
141
# File 'utils/pypi.rb', line 138

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)


61
62
63
# File 'utils/pypi.rb', line 61

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:



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

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)


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

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