Module: Downloadable Abstract

Overview

This module is abstract.

Subclasses must implement the abstract methods below.

Instance Attribute Summary collapse

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_deprecated, #pretty_disabled, #pretty_duration, #pretty_install_status, #pretty_installed, #pretty_uninstalled, #pretty_unmarked, #pretty_upgradable, #pretty_warning

Methods included from Context

current, current=, #debug?, #deferred_environment_expansion?, #quiet?, #verbose?, #with_context

Instance Attribute Details

#checksumChecksum? (readonly)

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:



21
22
23
# File 'downloadable.rb', line 21

def checksum
  @checksum
end

#mirrorsArray<String> (readonly)

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:



24
25
26
# File 'downloadable.rb', line 24

def mirrors
  @mirrors
end

#phaseSymbol

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:



27
28
29
# File 'downloadable.rb', line 27

def phase
  @phase
end

#urlString, ... (readonly)

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:



18
19
20
# File 'downloadable.rb', line 18

def url
  @url
end

Instance Method Details

#cached_downloadPathname

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:



96
97
98
# File 'downloadable.rb', line 96

def cached_download
  downloader.cached_location
end

#clear_cachevoid

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.



101
102
103
# File 'downloadable.rb', line 101

def clear_cache
  downloader.clear_cache
end

#download_queue_messageString

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:



75
76
77
# File 'downloadable.rb', line 75

def download_queue_message
  "#{download_queue_type} #{download_queue_name}"
end

#download_queue_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:



69
# File 'downloadable.rb', line 69

def download_queue_name = download_name

#download_queue_typeString

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 is abstract.

Returns:



72
# File 'downloadable.rb', line 72

def download_queue_type; end

#download_strategyT::Class[AbstractDownloadStrategy]

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:



126
127
128
# File 'downloadable.rb', line 126

def download_strategy
  @download_strategy ||= T.must(determine_url).download_strategy
end

#downloaded!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.



32
# File 'downloadable.rb', line 32

def downloaded! = (@phase = :downloaded)

#downloaded?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)


80
81
82
# File 'downloadable.rb', line 80

def downloaded?
  cached_download.exist?
end

#downloaded_and_valid?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)


85
86
87
88
89
90
91
92
93
# File 'downloadable.rb', line 85

def downloaded_and_valid?
  return false unless cached_download.file?
  return false if checksum.blank?

  with_context(quiet: true) { verify_download_integrity(cached_download) }
  true
rescue ChecksumMismatchError
  false
end

#downloaderAbstractDownloadStrategy

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.



131
132
133
134
135
136
137
138
139
140
141
142
143
# File 'downloadable.rb', line 131

def downloader
  @downloader ||= begin
    primary_url, *mirrors = determine_url_mirrors
    raise ArgumentError, "attempted to use a `Downloadable` without a URL!" if primary_url.blank?

    download_strategy.new(primary_url, download_name, version,
                          mirrors:, cache:, **T.must(@url).specs).tap do |downloader|
      if AbstractDownloadStrategy.expand_deferred_environment_for?(downloader)
        downloader.send(:allow_deferred_environment_expansion!)
      end
    end
  end
end

#downloading!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.



30
# File 'downloadable.rb', line 30

def downloading! = (@phase = :downloading)

#extracting!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.



38
# File 'downloadable.rb', line 38

def extracting! = (@phase = :extracting)

#fetch(verify_download_integrity: true, timeout: nil, quiet: false) ⇒ Pathname

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:

  • verify_download_integrity (Boolean) (defaults to: true)
  • timeout (Integer, Float, nil) (defaults to: nil)
  • quiet (Boolean) (defaults to: false)

Returns:



152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
# File 'downloadable.rb', line 152

def fetch(verify_download_integrity: true, timeout: nil, quiet: false)
  downloading!

  cache.mkpath

  begin
    downloader.quiet! if quiet
    downloader.fetch(timeout:)
  rescue ErrorDuringExecution, CurlDownloadStrategyError => e
    raise DownloadError.new(self, e)
  end

  downloaded!

  download = cached_download
  verify_download_integrity(download) if verify_download_integrity
  download
end

#fetched_sizeInteger?

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.

Total bytes downloaded if available.

Returns:



107
108
109
# File 'downloadable.rb', line 107

def fetched_size
  downloader.fetched_size
end

#freezeT.self_type

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:

  • (T.self_type)


61
62
63
64
65
66
# File 'downloadable.rb', line 61

def freeze
  @checksum.freeze
  @mirrors.freeze
  @version.freeze
  super
end

#initializevoid

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.



41
42
43
44
45
46
47
48
49
50
# File 'downloadable.rb', line 41

def initialize
  @url = T.let(nil, T.nilable(URL))
  @checksum = T.let(nil, T.nilable(Checksum))
  @mirrors = T.let([], T::Array[String])
  @version = T.let(nil, T.nilable(Version))
  @download_strategy = T.let(nil, T.nilable(T::Class[AbstractDownloadStrategy]))
  @downloader = T.let(nil, T.nilable(AbstractDownloadStrategy))
  @download_name = T.let(nil, T.nilable(String))
  @phase = T.let(:preparing, Symbol)
end

#initialize_dup(other) ⇒ 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:



53
54
55
56
57
58
# File 'downloadable.rb', line 53

def initialize_dup(other)
  super
  @checksum = @checksum.dup
  @mirrors = @mirrors.dup
  @version = @version.dup
end

#stage_from_download_queue(_download, pour:) ⇒ 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:



177
# File 'downloadable.rb', line 177

def stage_from_download_queue(_download, pour:); end

#stage_from_download_queue?(_download, pour:) ⇒ 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)


172
173
174
# File 'downloadable.rb', line 172

def stage_from_download_queue?(_download, pour:)
  false
end

#total_sizeInteger?

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.

Total download size if available.

Returns:



113
114
115
# File 'downloadable.rb', line 113

def total_size
  @total_size ||= T.let(downloader.total_size, T.nilable(Integer))
end

#verified!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.



36
# File 'downloadable.rb', line 36

def verified! = (@phase = :verified)

#verify_download_integrity(filename) ⇒ 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:



180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
# File 'downloadable.rb', line 180

def verify_download_integrity(filename)
  verifying!

  if filename.file?
    ohai "Verifying checksum for '#{filename.basename}'" if verbose?
    filename.verify_checksum(checksum)
    verified!
  end
rescue ChecksumMissingError
  return if silence_checksum_missing_error?

  opoo <<~EOS
    Cannot verify integrity of '#{filename.basename}'.
    No checksum was provided.
    For your reference, the checksum is:
      sha256 "#{filename.sha256}"
  EOS
end

#verifying!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.



34
# File 'downloadable.rb', line 34

def verifying! = (@phase = :verifying)

#versionVersion?

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:



118
119
120
121
122
123
# File 'downloadable.rb', line 118

def version
  return @version if @version && !@version.null?

  version = determine_url&.version
  version unless version&.null?
end