diff --git a/Library/Homebrew/extend/os/linux/requirements/osxfuse_requirement.rb b/Library/Homebrew/extend/os/linux/requirements/osxfuse_requirement.rb index 1a2ed81272..1f4d2ce132 100644 --- a/Library/Homebrew/extend/os/linux/requirements/osxfuse_requirement.rb +++ b/Library/Homebrew/extend/os/linux/requirements/osxfuse_requirement.rb @@ -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. diff --git a/Library/Homebrew/extend/os/mac/requirements/osxfuse_requirement.rb b/Library/Homebrew/extend/os/mac/requirements/osxfuse_requirement.rb index bdf2d9e933..3ae4716a47 100644 --- a/Library/Homebrew/extend/os/mac/requirements/osxfuse_requirement.rb +++ b/Library/Homebrew/extend/os/mac/requirements/osxfuse_requirement.rb @@ -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 diff --git a/Library/Homebrew/extend/os/mac/requirements/x11_requirement.rb b/Library/Homebrew/extend/os/mac/requirements/x11_requirement.rb index 647c485b73..8b64a4ce00 100644 --- a/Library/Homebrew/extend/os/mac/requirements/x11_requirement.rb +++ b/Library/Homebrew/extend/os/mac/requirements/x11_requirement.rb @@ -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 diff --git a/Library/Homebrew/formula.rb b/Library/Homebrew/formula.rb index 6812b905f4..4ef03f4a81 100644 --- a/Library/Homebrew/formula.rb +++ b/Library/Homebrew/formula.rb @@ -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 diff --git a/Library/Homebrew/requirement.rb b/Library/Homebrew/requirement.rb index a6d8545cb0..1f10e4aee7 100644 --- a/Library/Homebrew/requirement.rb +++ b/Library/Homebrew/requirement.rb @@ -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) diff --git a/Library/Homebrew/requirements/arch_requirement.rb b/Library/Homebrew/requirements/arch_requirement.rb index d4499ee065..e05e71645e 100644 --- a/Library/Homebrew/requirements/arch_requirement.rb +++ b/Library/Homebrew/requirements/arch_requirement.rb @@ -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 diff --git a/Library/Homebrew/requirements/java_requirement.rb b/Library/Homebrew/requirements/java_requirement.rb index a519a2cdbb..3edab63aa8 100644 --- a/Library/Homebrew/requirements/java_requirement.rb +++ b/Library/Homebrew/requirements/java_requirement.rb @@ -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 diff --git a/Library/Homebrew/requirements/linux_requirement.rb b/Library/Homebrew/requirements/linux_requirement.rb index a744caeab6..1a0e496282 100644 --- a/Library/Homebrew/requirements/linux_requirement.rb +++ b/Library/Homebrew/requirements/linux_requirement.rb @@ -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 diff --git a/Library/Homebrew/requirements/macos_requirement.rb b/Library/Homebrew/requirements/macos_requirement.rb index b9d4fbc556..c00750b9a2 100644 --- a/Library/Homebrew/requirements/macos_requirement.rb +++ b/Library/Homebrew/requirements/macos_requirement.rb @@ -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 diff --git a/Library/Homebrew/requirements/osxfuse_requirement.rb b/Library/Homebrew/requirements/osxfuse_requirement.rb index 9a4a0f527f..6dbc3917e1 100644 --- a/Library/Homebrew/requirements/osxfuse_requirement.rb +++ b/Library/Homebrew/requirements/osxfuse_requirement.rb @@ -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" diff --git a/Library/Homebrew/requirements/x11_requirement.rb b/Library/Homebrew/requirements/x11_requirement.rb index 4fe5c98538..4418f2f8ef 100644 --- a/Library/Homebrew/requirements/x11_requirement.rb +++ b/Library/Homebrew/requirements/x11_requirement.rb @@ -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" diff --git a/Library/Homebrew/requirements/xcode_requirement.rb b/Library/Homebrew/requirements/xcode_requirement.rb index c58b72259f..b3e6973cfd 100644 --- a/Library/Homebrew/requirements/xcode_requirement.rb +++ b/Library/Homebrew/requirements/xcode_requirement.rb @@ -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 diff --git a/Library/Homebrew/test/java_requirement_spec.rb b/Library/Homebrew/test/java_requirement_spec.rb deleted file mode 100644 index 42a065faf2..0000000000 --- a/Library/Homebrew/test/java_requirement_spec.rb +++ /dev/null @@ -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('#') } - 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 diff --git a/Library/Homebrew/test/requirements/java_requirement_spec.rb b/Library/Homebrew/test/requirements/java_requirement_spec.rb index 59e4dcc645..1b231d1fdd 100644 --- a/Library/Homebrew/test/requirements/java_requirement_spec.rb +++ b/Library/Homebrew/test/requirements/java_requirement_spec.rb @@ -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('#') } + 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 diff --git a/Library/Homebrew/test/requirements/osxfuse_requirement_spec.rb b/Library/Homebrew/test/requirements/osxfuse_requirement_spec.rb index 4b9632a389..faa1b6e7f4 100644 --- a/Library/Homebrew/test/requirements/osxfuse_requirement_spec.rb +++ b/Library/Homebrew/test/requirements/osxfuse_requirement_spec.rb @@ -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 diff --git a/Library/Homebrew/test/x11_requirement_spec.rb b/Library/Homebrew/test/requirements/x11_requirement_spec.rb similarity index 71% rename from Library/Homebrew/test/x11_requirement_spec.rb rename to Library/Homebrew/test/requirements/x11_requirement_spec.rb index 4076f1a553..3191b90643 100644 --- a/Library/Homebrew/test/x11_requirement_spec.rb +++ b/Library/Homebrew/test/requirements/x11_requirement_spec.rb @@ -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