Merge pull request #9021 from EricFromCanada/requirements-display

Update display of requirements
This commit is contained in:
Mike McQuaid 2020-11-02 11:58:01 +00:00 committed by GitHub
commit d6d38e35d4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
16 changed files with 184 additions and 170 deletions

View File

@ -21,7 +21,7 @@ class OsxfuseRequirement < Requirement
end end
def message def message
msg = "libfuse is required to install this formula.\n" msg = "libfuse is required for this software.\n"
if libfuse_formula_exists? if libfuse_formula_exists?
<<~EOS <<~EOS
#{msg}Run `brew install libfuse` to install it. #{msg}Run `brew install libfuse` to install it.

View File

@ -21,4 +21,8 @@ class OsxfuseRequirement < Requirement
ENV.append_path "HOMEBREW_INCLUDE_PATHS", "/usr/local/include/osxfuse" ENV.append_path "HOMEBREW_INCLUDE_PATHS", "/usr/local/include/osxfuse"
end end
end end
def message
"FUSE for macOS is required for this software. #{super}"
end
end end

View File

@ -17,6 +17,6 @@ class X11Requirement < Requirement
end end
def message def message
"XQuartz #{min_version} (or newer) is required to install this formula. #{super}" "XQuartz #{min_version} (or newer) is required for this software. #{super}"
end end
end end

View File

@ -1772,7 +1772,7 @@ class Formula
"name" => req.name, "name" => req.name,
"cask" => req.cask, "cask" => req.cask,
"download" => req.download, "download" => req.download,
"version" => req.try(:version), "version" => req.try(:version) || req.try(:arch),
"contexts" => req.tags, "contexts" => req.tags,
} }
end end

View File

@ -48,7 +48,7 @@ class Requirement
if download if download
s += <<~EOS s += <<~EOS
You can download from: You can download from:
#{download} #{Formatter.url(download)}
EOS EOS
end end
s s
@ -122,11 +122,11 @@ class Requirement
end end
def inspect def inspect
"#<#{self.class.name}: #{name.inspect} #{tags.inspect}>" "#<#{self.class.name}: #{tags.inspect}>"
end end
def display_s def display_s
name name.capitalize
end end
def mktemp(&block) def mktemp(&block)

View File

@ -9,6 +9,8 @@ require "requirement"
class ArchRequirement < Requirement class ArchRequirement < Requirement
fatal true fatal true
attr_reader :arch
def initialize(tags) def initialize(tags)
@arch = tags.shift @arch = tags.shift
super(tags) super(tags)
@ -16,13 +18,17 @@ class ArchRequirement < Requirement
satisfy(build_env: false) do satisfy(build_env: false) do
case @arch case @arch
when :x86_64 then Hardware::CPU.is_64_bit? when :x86_64 then Hardware::CPU.intel? && Hardware::CPU.is_64_bit?
when :intel, :ppc then Hardware::CPU.type == @arch when :arm, :intel, :ppc then Hardware::CPU.type == @arch
end end
end end
def message def message
"This formula requires an #{@arch} architecture." "The #{@arch} architecture is required for this software."
end
def inspect
"#<#{self.class.name}: arch=#{@arch.to_s.inspect} #{tags.inspect}>"
end end
def display_s def display_s

View File

@ -39,13 +39,13 @@ class JavaRequirement < Requirement
def message def message
version_string = " #{@version}" if @version version_string = " #{@version}" if @version
s = "Java#{version_string} is required to install this formula.\n" s = "Java#{version_string} is required for this software.\n"
s += suggestion s += suggestion
s s
end end
def inspect def inspect
"#<#{self.class.name}: #{tags.inspect} version=#{@version.inspect}>" "#<#{self.class.name}: version=#{@version.inspect} #{tags.inspect}>"
end end
def display_s def display_s
@ -55,9 +55,9 @@ class JavaRequirement < Requirement
else else
">=" ">="
end end
"#{name} #{op} #{version_without_plus}" "#{name.capitalize} #{op} #{version_without_plus}"
else else
name name.capitalize
end end
end end

View File

@ -10,6 +10,6 @@ class LinuxRequirement < Requirement
satisfy(build_env: false) { OS.linux? } satisfy(build_env: false) { OS.linux? }
def message def message
"Linux is required." "Linux is required for this software."
end end
end end

View File

@ -41,11 +41,11 @@ class MacOSRequirement < Requirement
end end
def message(type: :formula) def message(type: :formula)
return "macOS is required." unless version_specified? return "macOS is required for this software." unless version_specified?
case @comparator case @comparator
when ">=" when ">="
"macOS #{@version.pretty_name} or newer is required." "macOS #{@version.pretty_name} or newer is required for this software."
when "<=" when "<="
case type case type
when :formula when :formula
@ -59,19 +59,19 @@ class MacOSRequirement < Requirement
else else
if @version.respond_to?(:to_ary) if @version.respond_to?(:to_ary)
*versions, last = @version.map(&:pretty_name) *versions, last = @version.map(&:pretty_name)
return "macOS #{versions.join(", ")} or #{last} is required." return "macOS #{versions.join(", ")} or #{last} is required for this software."
end end
"macOS #{@version.pretty_name} is required." "macOS #{@version.pretty_name} is required for this software."
end end
end end
def inspect def inspect
"#<#{self.class.name}: #{tags.inspect} version#{@comparator}#{@version}>" "#<#{self.class.name}: version#{@comparator}#{@version.to_s.inspect} #{tags.inspect}>"
end end
def display_s def display_s
return "macOS is required" unless version_specified? return "macOS" unless version_specified?
"macOS #{@comparator} #{@version}" "macOS #{@comparator} #{@version}"
end end

View File

@ -7,8 +7,14 @@ require "requirement"
# #
# @api private # @api private
class OsxfuseRequirement < Requirement class OsxfuseRequirement < Requirement
extend T::Sig
cask "osxfuse" cask "osxfuse"
fatal true fatal true
sig { returns(String) }
def display_s
"FUSE"
end
end end
require "extend/os/requirements/osxfuse_requirement" require "extend/os/requirements/osxfuse_requirement"

View File

@ -39,7 +39,7 @@ class X11Requirement < Requirement
end end
def message def message
"X11 is required to install this formula, either Xorg #{min_version} or " \ "X11 is required for this software, either Xorg #{min_version} or " \
"xdpyinfo #{min_xdpyinfo_version}, or newer. #{super}" "xdpyinfo #{min_xdpyinfo_version}, or newer. #{super}"
end end
@ -48,10 +48,6 @@ class X11Requirement < Requirement
0 0
end end
def inspect
"#<#{self.class.name}: #{tags.inspect}>"
end
end end
require "extend/os/requirements/x11_requirement" require "extend/os/requirements/x11_requirement"

View File

@ -46,7 +46,13 @@ class XcodeRequirement < Requirement
end end
def inspect def inspect
"#<#{self.class.name}: #{tags.inspect} version=#{@version.inspect}>" "#<#{self.class.name}: version>=#{@version.inspect} #{tags.inspect}>"
end
def display_s
return name.capitalize unless @version
"#{name.capitalize} >= #{@version}"
end end
end end

View File

@ -1,131 +0,0 @@
# typed: false
# frozen_string_literal: true
require "cli/args"
require "requirements/java_requirement"
describe JavaRequirement do
subject { described_class.new([]) }
before do
ENV["JAVA_HOME"] = nil
end
describe "#message" do
its(:message) { is_expected.to match(/Java is required to install this formula./) }
end
describe "#inspect" do
subject { described_class.new(%w[1.7+]) }
its(:inspect) { is_expected.to eq('#<JavaRequirement: [] version="1.7+">') }
end
describe "#display_s" do
context "without specific version" do
its(:display_s) { is_expected.to eq("java") }
end
context "with version 1.8" do
subject { described_class.new(%w[1.8]) }
its(:display_s) { is_expected.to eq("java = 1.8") }
end
context "with version 1.8+" do
subject { described_class.new(%w[1.8+]) }
its(:display_s) { is_expected.to eq("java >= 1.8") }
end
end
describe "#satisfied?" do
subject { described_class.new(%w[1.8]) }
it "returns false if no `java` executable can be found" do
allow(File).to receive(:executable?).and_return(false)
expect(subject).not_to be_satisfied
end
it "returns true if #preferred_java returns a path" do
allow(subject).to receive(:preferred_java).and_return(Pathname.new("/usr/bin/java"))
expect(subject).to be_satisfied
end
context "when #possible_javas contains paths" do
let(:path) { mktmpdir }
let(:java) { path/"java" }
def setup_java_with_version(version)
IO.write java, <<~SH
#!/bin/sh
echo 'java version "#{version}"' 1>&2
SH
FileUtils.chmod "+x", java
end
before do
allow(subject).to receive(:possible_javas).and_return([java])
end
context "and 1.7 is required" do
subject { described_class.new(%w[1.7]) }
it "returns false if all are lower" do
setup_java_with_version "1.6.0_5"
expect(subject).not_to be_satisfied
end
it "returns true if one is equal" do
setup_java_with_version "1.7.0_5"
expect(subject).to be_satisfied
end
it "returns false if all are higher" do
setup_java_with_version "1.8.0_5"
expect(subject).not_to be_satisfied
end
end
context "and 1.7+ is required" do
subject { described_class.new(%w[1.7+]) }
it "returns false if all are lower" do
setup_java_with_version "1.6.0_5"
expect(subject).not_to be_satisfied
end
it "returns true if one is equal" do
setup_java_with_version "1.7.0_5"
expect(subject).to be_satisfied
end
it "returns true if one is higher" do
setup_java_with_version "1.8.0_5"
expect(subject).to be_satisfied
end
end
end
end
describe "#suggestion" do
context "without specific version" do
its(:suggestion) { is_expected.to match(/brew cask install adoptopenjdk/) }
its(:cask) { is_expected.to eq("adoptopenjdk") }
end
context "with version 1.8" do
subject { described_class.new(%w[1.8]) }
its(:suggestion) { is_expected.to match(%r{brew cask install homebrew/cask-versions/adoptopenjdk8}) }
its(:cask) { is_expected.to eq("homebrew/cask-versions/adoptopenjdk8") }
end
context "with version 1.8+" do
subject { described_class.new(%w[1.8+]) }
its(:suggestion) { is_expected.to match(/brew cask install adoptopenjdk/) }
its(:cask) { is_expected.to eq("adoptopenjdk") }
end
end
end

View File

@ -1,33 +1,158 @@
# typed: false # typed: false
# frozen_string_literal: true # frozen_string_literal: true
require "cli/args"
require "requirements/java_requirement" require "requirements/java_requirement"
describe JavaRequirement do describe JavaRequirement do
describe "initialize" do subject { described_class.new([]) }
before do
ENV["JAVA_HOME"] = nil
end
describe "#initialize" do
it "parses '1.8' tag correctly" do it "parses '1.8' tag correctly" do
req = described_class.new(["1.8"]) req = described_class.new(["1.8"])
expect(req.display_s).to eq("java = 1.8") expect(req.display_s).to eq("Java = 1.8")
end end
it "parses '9' tag correctly" do it "parses '9' tag correctly" do
req = described_class.new(["9"]) req = described_class.new(["9"])
expect(req.display_s).to eq("java = 9") expect(req.display_s).to eq("Java = 9")
end end
it "parses '9+' tag correctly" do it "parses '9+' tag correctly" do
req = described_class.new(["9+"]) req = described_class.new(["9+"])
expect(req.display_s).to eq("java >= 9") expect(req.display_s).to eq("Java >= 9")
end end
it "parses '11' tag correctly" do it "parses '11' tag correctly" do
req = described_class.new(["11"]) req = described_class.new(["11"])
expect(req.display_s).to eq("java = 11") expect(req.display_s).to eq("Java = 11")
end end
it "parses bogus tag correctly" do it "parses bogus tag correctly" do
req = described_class.new(["bogus1.8"]) req = described_class.new(["bogus1.8"])
expect(req.display_s).to eq("java") expect(req.display_s).to eq("Java")
end
end
describe "#message" do
its(:message) { is_expected.to match(/Java is required for this software./) }
end
describe "#inspect" do
subject { described_class.new(%w[1.7+]) }
its(:inspect) { is_expected.to eq('#<JavaRequirement: version="1.7+" []>') }
end
describe "#display_s" do
context "without specific version" do
its(:display_s) { is_expected.to eq("Java") }
end
context "with version 1.8" do
subject { described_class.new(%w[1.8]) }
its(:display_s) { is_expected.to eq("Java = 1.8") }
end
context "with version 1.8+" do
subject { described_class.new(%w[1.8+]) }
its(:display_s) { is_expected.to eq("Java >= 1.8") }
end
end
describe "#satisfied?" do
subject(:requirement) { described_class.new(%w[1.8]) }
it "returns false if no `java` executable can be found" do
allow(File).to receive(:executable?).and_return(false)
expect(requirement).not_to be_satisfied
end
it "returns true if #preferred_java returns a path" do
allow(requirement).to receive(:preferred_java).and_return(Pathname.new("/usr/bin/java"))
expect(requirement).to be_satisfied
end
context "when #possible_javas contains paths" do
let(:path) { mktmpdir }
let(:java) { path/"java" }
def setup_java_with_version(version)
IO.write java, <<~SH
#!/bin/sh
echo 'java version "#{version}"' 1>&2
SH
FileUtils.chmod "+x", java
end
before do
allow(requirement).to receive(:possible_javas).and_return([java])
end
context "and 1.7 is required" do
subject(:requirement) { described_class.new(%w[1.7]) }
it "returns false if all are lower" do
setup_java_with_version "1.6.0_5"
expect(requirement).not_to be_satisfied
end
it "returns true if one is equal" do
setup_java_with_version "1.7.0_5"
expect(requirement).to be_satisfied
end
it "returns false if all are higher" do
setup_java_with_version "1.8.0_5"
expect(requirement).not_to be_satisfied
end
end
context "and 1.7+ is required" do
subject(:requirement) { described_class.new(%w[1.7+]) }
it "returns false if all are lower" do
setup_java_with_version "1.6.0_5"
expect(requirement).not_to be_satisfied
end
it "returns true if one is equal" do
setup_java_with_version "1.7.0_5"
expect(requirement).to be_satisfied
end
it "returns true if one is higher" do
setup_java_with_version "1.8.0_5"
expect(requirement).to be_satisfied
end
end
end
end
describe "#suggestion" do
context "without specific version" do
its(:suggestion) { is_expected.to match(/brew cask install adoptopenjdk/) }
its(:cask) { is_expected.to eq("adoptopenjdk") }
end
context "with version 1.8" do
subject { described_class.new(%w[1.8]) }
its(:suggestion) { is_expected.to match(%r{brew cask install homebrew/cask-versions/adoptopenjdk8}) }
its(:cask) { is_expected.to eq("homebrew/cask-versions/adoptopenjdk8") }
end
context "with version 1.8+" do
subject { described_class.new(%w[1.8+]) }
its(:suggestion) { is_expected.to match(/brew cask install adoptopenjdk/) }
its(:cask) { is_expected.to eq("adoptopenjdk") }
end end
end end
end end

View File

@ -44,7 +44,7 @@ describe OsxfuseRequirement do
describe "#message" do describe "#message" do
it "prompts for installation of 'libfuse' on Linux", :needs_linux do it "prompts for installation of 'libfuse' on Linux", :needs_linux do
expect(requirement.message).to match("libfuse is required to install this formula") expect(requirement.message).to match("libfuse is required for this software")
end end
it "prompts for installation of 'osxFuse' on macOS", :needs_macos do it "prompts for installation of 'osxFuse' on macOS", :needs_macos do

View File

@ -5,26 +5,28 @@ require "cli/args"
require "requirements/x11_requirement" require "requirements/x11_requirement"
describe X11Requirement do describe X11Requirement do
subject(:requirement) { described_class.new([]) }
let(:default_name) { "x11" } let(:default_name) { "x11" }
describe "#name" do describe "#name" do
it "defaults to x11" do it "defaults to x11" do
expect(subject.name).to eq(default_name) expect(requirement.name).to eq(default_name)
end end
end end
describe "#eql?" do describe "#eql?" do
it "returns true if the requirements are equal" do it "returns true if the requirements are equal" do
other = described_class.new other = described_class.new
expect(subject).to eql(other) expect(requirement).to eql(other)
end end
end end
describe "#modify_build_environment" do describe "#modify_build_environment" do
it "calls ENV#x11" do it "calls ENV#x11" do
allow(subject).to receive(:satisfied?).and_return(true) allow(requirement).to receive(:satisfied?).and_return(true)
expect(ENV).to receive(:x11) expect(ENV).to receive(:x11)
subject.modify_build_environment requirement.modify_build_environment
end end
end end
@ -32,12 +34,12 @@ describe X11Requirement do
it "returns true if X11 is installed" do it "returns true if X11 is installed" do
expect(MacOS::XQuartz).to receive(:version).and_return("2.7.5") expect(MacOS::XQuartz).to receive(:version).and_return("2.7.5")
expect(MacOS::XQuartz).to receive(:installed?).and_return(true) expect(MacOS::XQuartz).to receive(:installed?).and_return(true)
expect(subject).to be_satisfied expect(requirement).to be_satisfied
end end
it "returns false if X11 is not installed" do it "returns false if X11 is not installed" do
expect(MacOS::XQuartz).to receive(:installed?).and_return(false) expect(MacOS::XQuartz).to receive(:installed?).and_return(false)
expect(subject).not_to be_satisfied expect(requirement).not_to be_satisfied
end end
end end
end end