diff --git a/Library/Homebrew/extend/os/mac/software_spec.rb b/Library/Homebrew/extend/os/mac/software_spec.rb deleted file mode 100644 index 1be80083e2..0000000000 --- a/Library/Homebrew/extend/os/mac/software_spec.rb +++ /dev/null @@ -1,27 +0,0 @@ -# typed: true -# frozen_string_literal: true - -# The Library/Homebrew/extend/os/software_spec.rb conditional logic will need to be more nuanced -# if this file ever includes more than `uses_from_macos`. -class SoftwareSpec - undef uses_from_macos - - def uses_from_macos(deps, bounds = {}) - if deps.is_a?(Hash) - bounds = deps.dup - deps = [bounds.shift].to_h - end - - @uses_from_macos_elements << deps - - bounds = bounds.transform_values { |v| MacOS::Version.from_symbol(v) } - - # Linux simulating macOS. Assume oldest macOS version. - return if Homebrew::EnvConfig.simulate_macos_on_linux? && !bounds.key?(:since) - - # macOS new enough for dependency to not be required. - return if MacOS.version >= bounds[:since] - - depends_on deps - end -end diff --git a/Library/Homebrew/extend/os/software_spec.rb b/Library/Homebrew/extend/os/software_spec.rb index 32f46468f7..1e6f8f529c 100644 --- a/Library/Homebrew/extend/os/software_spec.rb +++ b/Library/Homebrew/extend/os/software_spec.rb @@ -1,9 +1,4 @@ # typed: strict # frozen_string_literal: true -# This logic will need to be more nuanced if this file includes more than `uses_from_macos`. -if OS.mac? || Homebrew::EnvConfig.simulate_macos_on_linux? - require "extend/os/mac/software_spec" -elsif OS.linux? - require "extend/os/linux/software_spec" -end +require "extend/os/linux/software_spec" if OS.linux? diff --git a/Library/Homebrew/software_spec.rb b/Library/Homebrew/software_spec.rb index c27f124aa6..14825ce168 100644 --- a/Library/Homebrew/software_spec.rb +++ b/Library/Homebrew/software_spec.rb @@ -162,12 +162,25 @@ class SoftwareSpec add_dep_option(dep) if dep end - def uses_from_macos(spec, _bounds = {}) - spec = [spec.dup.shift].to_h if spec.is_a?(Hash) + def uses_from_macos(deps, bounds = {}) + if deps.is_a?(Hash) + bounds = deps.dup + deps = [bounds.shift].to_h + end - @uses_from_macos_elements << spec + @uses_from_macos_elements << deps - depends_on(spec) + # Linux simulating macOS. Assume oldest macOS version. + return if Homebrew::EnvConfig.simulate_macos_on_linux? && !bounds.key?(:since) + + # macOS new enough for dependency to not be required. + if Homebrew::SimulateSystem.treat_as_macos? + current_os = MacOS::Version.from_symbol(Homebrew::SimulateSystem.current_os) + since_os = MacOS::Version.from_symbol(bounds[:since]) if bounds.key?(:since) + return if current_os >= since_os + end + + depends_on deps end def uses_from_macos_names diff --git a/Library/Homebrew/test/os/mac/software_spec_spec.rb b/Library/Homebrew/test/os/mac/software_spec_spec.rb deleted file mode 100644 index c6a72db735..0000000000 --- a/Library/Homebrew/test/os/mac/software_spec_spec.rb +++ /dev/null @@ -1,51 +0,0 @@ -# typed: false -# frozen_string_literal: true - -require "software_spec" - -describe SoftwareSpec do - subject(:spec) { described_class.new } - - describe "#uses_from_macos" do - before do - allow(OS).to receive(:mac?).and_return(true) - allow(OS::Mac).to receive(:version).and_return(OS::Mac::Version.from_symbol(:sierra)) - end - - it "adds a macOS dependency if the OS version meets requirements" do - spec.uses_from_macos("foo", since: :el_capitan) - - expect(spec.deps).to be_empty - expect(spec.uses_from_macos_elements.first).to eq("foo") - end - - it "doesn't add a macOS dependency if the OS version doesn't meet requirements" do - spec.uses_from_macos("foo", since: :high_sierra) - - expect(spec.deps.first.name).to eq("foo") - expect(spec.uses_from_macos_elements).to eq(["foo"]) - end - - it "works with tags" do - spec.uses_from_macos("foo" => :build, :since => :high_sierra) - - dep = spec.deps.first - - expect(dep.name).to eq("foo") - expect(dep.tags).to include(:build) - end - - it "doesn't add a dependency if no OS version is specified" do - spec.uses_from_macos("foo") - spec.uses_from_macos("bar" => :build) - - expect(spec.deps).to be_empty - end - - it "raises an error if passing invalid OS versions" do - expect { - spec.uses_from_macos("foo", since: :bar) - }.to raise_error(MacOSVersionError, "unknown or unsupported macOS version: :bar") - end - end -end diff --git a/Library/Homebrew/test/software_spec_spec.rb b/Library/Homebrew/test/software_spec_spec.rb index 284cf2211a..a737088803 100644 --- a/Library/Homebrew/test/software_spec_spec.rb +++ b/Library/Homebrew/test/software_spec_spec.rb @@ -135,27 +135,72 @@ describe SoftwareSpec do end end - describe "#uses_from_macos" do - it "allows specifying dependencies", :needs_linux do - spec.uses_from_macos("foo") + describe "#uses_from_macos", :needs_linux do + context "when running on Linux", :needs_linux do + it "allows specifying dependencies" do + spec.uses_from_macos("foo") - expect(spec.deps.first.name).to eq("foo") + expect(spec.deps.first.name).to eq("foo") + end + + it "works with tags" do + spec.uses_from_macos("foo" => :build) + + expect(spec.deps.first.name).to eq("foo") + expect(spec.deps.first.tags).to include(:build) + end + + it "ignores OS version specifications" do + spec.uses_from_macos("foo", since: :mojave) + spec.uses_from_macos("bar" => :build, :since => :mojave) + + expect(spec.deps.first.name).to eq("foo") + expect(spec.deps.last.name).to eq("bar") + expect(spec.deps.last.tags).to include(:build) + end end - it "works with tags", :needs_linux do - spec.uses_from_macos("foo" => :build) + context "when running on macOS", :needs_macos do + before do + allow(OS).to receive(:mac?).and_return(true) + allow(OS::Mac).to receive(:version).and_return(OS::Mac::Version.from_symbol(:sierra)) + end - expect(spec.deps.first.name).to eq("foo") - expect(spec.deps.first.tags).to include(:build) - end + it "adds a macOS dependency if the OS version meets requirements" do + spec.uses_from_macos("foo", since: :el_capitan) - it "ignores OS version specifications", :needs_linux do - spec.uses_from_macos("foo", since: :mojave) - spec.uses_from_macos("bar" => :build, :since => :mojave) + expect(spec.deps).to be_empty + expect(spec.uses_from_macos_elements.first).to eq("foo") + end - expect(spec.deps.first.name).to eq("foo") - expect(spec.deps.last.name).to eq("bar") - expect(spec.deps.last.tags).to include(:build) + it "doesn't add a macOS dependency if the OS version doesn't meet requirements" do + spec.uses_from_macos("foo", since: :high_sierra) + + expect(spec.deps.first.name).to eq("foo") + expect(spec.uses_from_macos_elements).to eq(["foo"]) + end + + it "works with tags" do + spec.uses_from_macos("foo" => :build, :since => :high_sierra) + + dep = spec.deps.first + + expect(dep.name).to eq("foo") + expect(dep.tags).to include(:build) + end + + it "doesn't add a dependency if no OS version is specified" do + spec.uses_from_macos("foo") + spec.uses_from_macos("bar" => :build) + + expect(spec.deps).to be_empty + end + + it "raises an error if passing invalid OS versions" do + expect { + spec.uses_from_macos("foo", since: :bar) + }.to raise_error(MacOSVersionError, "unknown or unsupported macOS version: :bar") + end end end