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
def message
msg = "libfuse is required to install this formula.\n"
msg = "libfuse is required for this software.\n"
if libfuse_formula_exists?
<<~EOS
#{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"
end
end
def message
"FUSE for macOS is required for this software. #{super}"
end
end

View File

@ -17,6 +17,6 @@ class X11Requirement < Requirement
end
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

View File

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

View File

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

View File

@ -9,6 +9,8 @@ require "requirement"
class ArchRequirement < Requirement
fatal true
attr_reader :arch
def initialize(tags)
@arch = tags.shift
super(tags)
@ -16,13 +18,17 @@ class ArchRequirement < Requirement
satisfy(build_env: false) do
case @arch
when :x86_64 then Hardware::CPU.is_64_bit?
when :intel, :ppc then Hardware::CPU.type == @arch
when :x86_64 then Hardware::CPU.intel? && Hardware::CPU.is_64_bit?
when :arm, :intel, :ppc then Hardware::CPU.type == @arch
end
end
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
def display_s

View File

@ -39,13 +39,13 @@ class JavaRequirement < Requirement
def message
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
end
def inspect
"#<#{self.class.name}: #{tags.inspect} version=#{@version.inspect}>"
"#<#{self.class.name}: version=#{@version.inspect} #{tags.inspect}>"
end
def display_s
@ -55,9 +55,9 @@ class JavaRequirement < Requirement
else
">="
end
"#{name} #{op} #{version_without_plus}"
"#{name.capitalize} #{op} #{version_without_plus}"
else
name
name.capitalize
end
end

View File

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

View File

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

View File

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

View File

@ -39,7 +39,7 @@ class X11Requirement < Requirement
end
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}"
end
@ -48,10 +48,6 @@ class X11Requirement < Requirement
0
end
def inspect
"#<#{self.class.name}: #{tags.inspect}>"
end
end
require "extend/os/requirements/x11_requirement"

View File

@ -46,7 +46,13 @@ class XcodeRequirement < Requirement
end
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

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
# frozen_string_literal: true
require "cli/args"
require "requirements/java_requirement"
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
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
it "parses '9' tag correctly" do
req = described_class.new(["9"])
expect(req.display_s).to eq("java = 9")
expect(req.display_s).to eq("Java = 9")
end
it "parses '9+' tag correctly" do
req = described_class.new(["9+"])
expect(req.display_s).to eq("java >= 9")
expect(req.display_s).to eq("Java >= 9")
end
it "parses '11' tag correctly" do
req = described_class.new(["11"])
expect(req.display_s).to eq("java = 11")
expect(req.display_s).to eq("Java = 11")
end
it "parses bogus tag correctly" do
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

View File

@ -44,7 +44,7 @@ describe OsxfuseRequirement do
describe "#message" 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
it "prompts for installation of 'osxFuse' on macOS", :needs_macos do

View File

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