Class: MacOSRequirement Private

Inherits:
Requirement show all
Extended by:
Utils::Output::Mixin
Defined in:
requirements/macos_requirement.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.

A requirement on macOS.

Constant Summary collapse

Cache =

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.

type_template { { fixed: T::Hash[String, T.untyped] } }
DISABLED_MACOS_VERSIONS =

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.

Keep these around as empty arrays so we can keep the deprecation/disabling code the same. Treat these like odeprecated/odisabled in terms of deprecation/disabling.

[
  :mojave,
  :high_sierra,
  :sierra,
  :el_capitan,
].freeze
DEPRECATED_MACOS_VERSIONS =

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.

T.let([].freeze, T::Array[Symbol])

Constants included from Dependable

Dependable::KEEP_BUT_PRUNE_RECURSIVE_DEPS, Dependable::PRUNE, Dependable::RESERVED_TAGS, Dependable::SKIP

Instance Attribute Summary collapse

Attributes inherited from Requirement

#cask, #download, #name, #tags

Class Method 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 inherited from Requirement

cask, download, #env, env, #env_proc, expand, fatal, #fatal?, inherited, #mktemp, #modify_build_environment, #option_names, prune?, #satisfied?, #satisfied_result_parent, satisfy, #tap, #which

Methods included from BuildEnvironment::DSL

#env, #inherited

Methods included from Cachable

#cache, #clear_cache

Methods included from Dependable

#build?, #implicit?, #no_linkage?, #option_names, #option_tags, #optional?, #options, #prune_from_option?, #prune_if_build_and_not_dependent?, #recommended?, #required?, #tags, #test?

Constructor Details

#initialize(tags = [], comparator: ">=") ⇒ 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:

  • tags (T.untyped) (defaults to: [])
  • comparator (String) (defaults to: ">=")


60
61
62
63
64
65
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
# File 'requirements/macos_requirement.rb', line 60

def initialize(tags = [], comparator: ">=")
  @version = T.let(begin
    if comparator == "==" && tags.first.respond_to?(:map)
      tags.first.map { |s| MacOSVersion.from_symbol(s) }
    else
      MacOSVersion.from_symbol(tags.first) unless tags.empty?
    end
  rescue MacOSVersion::Error => e
    if DISABLED_MACOS_VERSIONS.include?(e.version)
      # This odisabled should stick around indefinitely.
      odisabled "`depends_on macos: :#{e.version}`"
    elsif DEPRECATED_MACOS_VERSIONS.include?(e.version)
      # This odeprecated should stick around indefinitely.
      odeprecated "`depends_on macos: :#{e.version}`"
    else
      raise
    end

    # Array of versions: remove the bad ones and try again.
    if tags.first.respond_to?(:reject)
      tags = [tags.first.reject { |s| s == e.version }, tags[1..]]
      retry
    end

    # Otherwise fallback to the oldest allowed if comparator is >=.
    MacOSVersion.new(HOMEBREW_MACOS_OLDEST_ALLOWED) if comparator == ">="
  end, T.nilable(T.any(MacOSVersion, T::Array[MacOSVersion])))

  @comparator = comparator
  super(tags.drop(1))
end

Instance Attribute Details

#comparatorString (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:



16
17
18
# File 'requirements/macos_requirement.rb', line 16

def comparator
  @comparator
end

#versionMacOSVersion, ... (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:



19
20
21
# File 'requirements/macos_requirement.rb', line 19

def version
  @version
end

Class Method Details

.parse(args, comparator:) ⇒ MacOSRequirement

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:



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'requirements/macos_requirement.rb', line 32

def self.parse(args, comparator:)
  first_arg = args.first
  first_arg_s = first_arg&.to_s

  if first_arg == :any
    new
  elsif args.count > 1
    new([args], comparator: "==")
  elsif first_arg.is_a?(Symbol) && MacOSVersion::SYMBOLS.key?(first_arg)
    new([first_arg], comparator:)
  elsif (md = /^\s*(?<comparator><|>|[=<>]=)\s*:(?<version>\S+)\s*$/.match(first_arg_s))
    replacement = if md[:comparator] == "<="
      "`depends_on maximum_macos: :#{md[:version]}`"
    elsif md[:comparator] == ">="
      "`depends_on macos: :#{md[:version]}`"
    end
    odeprecated "string comparison format for `depends_on macos:`", replacement
    new([T.must(md[:version]).to_sym], comparator: T.must(md[:comparator]))
  elsif (md = /^\s*(?<comparator><|>|[=<>]=)\s*(?<version>\S+)\s*$/.match(first_arg_s))
    odeprecated "string comparison format for `depends_on macos:`"
    new([md[:version]], comparator: T.must(md[:comparator]))
  else
    odeprecated "strict symbol format for `depends_on macos:`"
    new([first_arg], comparator: "==")
  end
end

Instance Method Details

#allows?(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)


123
124
125
126
127
128
129
130
131
132
133
134
135
# File 'requirements/macos_requirement.rb', line 123

def allows?(other)
  return true unless version_specified?

  version = @version
  case @comparator
  when ">=" then other >= T.cast(version, MacOSVersion)
  when "<=" then other <= T.cast(version, MacOSVersion)
  else
    return T.unsafe(version).include?(other) if version.respond_to?(:to_ary) || version.is_a?(Array)

    version == other
  end
end

#display_sString

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:



186
187
188
189
190
191
192
193
194
195
196
# File 'requirements/macos_requirement.rb', line 186

def display_s
  if version_specified?
    if @version.respond_to?(:to_ary) || @version.is_a?(Array)
      "macOS #{@comparator} #{T.unsafe(@version).join(" / ")} (or Linux)"
    else
      "macOS #{@comparator} #{@version} (or Linux)"
    end
  else
    "macOS"
  end
end

#maximum_versionMacOSVersion?

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:



115
116
117
118
119
120
# File 'requirements/macos_requirement.rb', line 115

def maximum_version
  return MacOSVersion.new(HOMEBREW_MACOS_NEWEST_UNSUPPORTED) if @comparator == ">=" || !version_specified?
  return T.unsafe(@version).max if @version.respond_to?(:to_ary) || @version.is_a?(Array)

  @version
end

#message(type: :formula) ⇒ 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.

Parameters:

  • type (Symbol) (defaults to: :formula)

Returns:



138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
# File 'requirements/macos_requirement.rb', line 138

def message(type: :formula)
  subject = (type == :cask) ? "This cask" : "This formula"

  return "#{subject} requires macOS." unless version_specified?

  version = @version
  case @comparator
  when ">="
    "#{subject} does not run on macOS versions older than #{T.cast(version, MacOSVersion).pretty_name}."
  when "<="
    case type
    when :formula
      <<~EOS
        #{subject} either does not compile or function as expected on macOS
        versions newer than #{T.cast(version, MacOSVersion).pretty_name} due to an upstream incompatibility.
      EOS
    when :cask
      "#{subject} does not run on macOS versions newer than #{T.cast(version, MacOSVersion).pretty_name}."
    else
      ""
    end
  else
    if version.respond_to?(:to_ary) || version.is_a?(Array)
      *versions, last = T.unsafe(version).map(&:pretty_name)
      return "#{subject} does not run on macOS versions other than #{versions.join(", ")} and #{last}."
    end

    "#{subject} does not run on macOS versions other than #{T.cast(version, MacOSVersion).pretty_name}."
  end
end

#minimum_versionMacOSVersion?

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:



107
108
109
110
111
112
# File 'requirements/macos_requirement.rb', line 107

def minimum_version
  return MacOSVersion.new(HOMEBREW_MACOS_OLDEST_ALLOWED) if @comparator == "<=" || !version_specified?
  return T.unsafe(@version).min if @version.respond_to?(:to_ary) || @version.is_a?(Array)

  @version
end

#to_hHash{String => 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.

Returns:



199
200
201
202
203
204
205
206
# File 'requirements/macos_requirement.rb', line 199

def to_h
  return {} unless version_specified?

  comp = @comparator.to_s
  return { comp => @version.map(&:to_s) } if @version.is_a?(Array)

  { comp => [@version.to_s] }
end

#to_json(options) ⇒ 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.

Parameters:

  • options (T.untyped)

Returns:



209
210
211
# File 'requirements/macos_requirement.rb', line 209

def to_json(options)
  to_h.to_json(options)
end

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


93
94
95
# File 'requirements/macos_requirement.rb', line 93

def version_specified?
  @version.present?
end