diff --git a/Library/Homebrew/cask/dsl/depends_on.rb b/Library/Homebrew/cask/dsl/depends_on.rb index b8f701ab11..e8beba968d 100644 --- a/Library/Homebrew/cask/dsl/depends_on.rb +++ b/Library/Homebrew/cask/dsl/depends_on.rb @@ -63,8 +63,8 @@ module Cask else MacOSRequirement.new([args.first], comparator: "==") end - rescue MacOSVersionError - raise "invalid 'depends_on macos' value: #{args.first.inspect}" + rescue MacOSVersionError => e + raise "invalid 'depends_on macos' value: #{e}" end end diff --git a/Library/Homebrew/os/mac/sdk.rb b/Library/Homebrew/os/mac/sdk.rb index 54bed4fabb..ff30e3eaa2 100644 --- a/Library/Homebrew/os/mac/sdk.rb +++ b/Library/Homebrew/os/mac/sdk.rb @@ -11,7 +11,7 @@ module OS attr_reader :version, :path, :source def initialize(version, path, source) - @version = OS::Mac::Version.new version + @version = version @path = Pathname.new(path) @source = source end @@ -33,7 +33,7 @@ module OS def latest_sdk return if sdk_paths.empty? - v, path = sdk_paths.max { |a, b| OS::Mac::Version.new(a[0]) <=> OS::Mac::Version.new(b[0]) } + v, path = sdk_paths.max(&:first) SDK.new v, path, source end @@ -77,7 +77,7 @@ module OS Dir[File.join(sdk_prefix, "MacOSX*.sdk")].each do |sdk_path| version = sdk_path[/MacOSX(\d+\.\d+)u?\.sdk$/, 1] - paths[version] = sdk_path unless version.nil? + paths[OS::Mac::Version.new(version)] = sdk_path unless version.nil? end paths diff --git a/Library/Homebrew/os/mac/version.rb b/Library/Homebrew/os/mac/version.rb index 1c47f9ee88..3aadfb95d7 100644 --- a/Library/Homebrew/os/mac/version.rb +++ b/Library/Homebrew/os/mac/version.rb @@ -24,15 +24,18 @@ module OS new(str) end - def initialize(*args) - super + def initialize(value) + super(value) + + raise MacOSVersionError, value unless value.match?(/\A1\d+(?:\.\d+){0,2}\Z/) + @comparison_cache = {} end def <=>(other) @comparison_cache.fetch(other) do v = SYMBOLS.fetch(other) { other.to_s } - @comparison_cache[other] = super(Version.new(v)) + @comparison_cache[other] = super(::Version.new(v)) end end diff --git a/Library/Homebrew/test/os/mac/software_spec_spec.rb b/Library/Homebrew/test/os/mac/software_spec_spec.rb index 1d6501ed91..af94ef6f52 100644 --- a/Library/Homebrew/test/os/mac/software_spec_spec.rb +++ b/Library/Homebrew/test/os/mac/software_spec_spec.rb @@ -7,10 +7,8 @@ describe SoftwareSpec do describe "#uses_from_macos" do before do - sierra_os_version = OS::Mac::Version.from_symbol(:sierra) - allow(OS).to receive(:mac?).and_return(true) - allow(OS::Mac).to receive(:version).and_return(OS::Mac::Version.new(sierra_os_version)) + 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 diff --git a/Library/Homebrew/test/os/mac/version_spec.rb b/Library/Homebrew/test/os/mac/version_spec.rb index 40c51974cb..3f332ed5aa 100644 --- a/Library/Homebrew/test/os/mac/version_spec.rb +++ b/Library/Homebrew/test/os/mac/version_spec.rb @@ -4,41 +4,49 @@ require "version" require "os/mac/version" describe OS::Mac::Version do - subject { described_class.new("10.14") } + subject(:version) { described_class.new("10.14") } specify "comparison with Symbol" do - expect(subject).to be > :high_sierra - expect(subject).to be == :mojave - expect(subject).to be === :mojave # rubocop:disable Style/CaseEquality - expect(subject).to be < :catalina + expect(version).to be > :high_sierra + expect(version).to be == :mojave + expect(version).to be === :mojave # rubocop:disable Style/CaseEquality + expect(version).to be < :catalina end specify "comparison with Fixnum" do - expect(subject).to be > 10 - expect(subject).to be < 11 + expect(version).to be > 10 + expect(version).to be < 11 end specify "comparison with Float" do - expect(subject).to be > 10.13 - expect(subject).to be < 10.15 + expect(version).to be > 10.13 + expect(version).to be < 10.15 end specify "comparison with String" do - expect(subject).to be > "10.3" - expect(subject).to be == "10.14" - expect(subject).to be === "10.14" # rubocop:disable Style/CaseEquality - expect(subject).to be < "10.15" + expect(version).to be > "10.3" + expect(version).to be == "10.14" + expect(version).to be === "10.14" # rubocop:disable Style/CaseEquality + expect(version).to be < "10.15" end specify "comparison with Version" do - expect(subject).to be > Version.create("10.3") - expect(subject).to be == Version.create("10.14") - expect(subject).to be === Version.create("10.14") # rubocop:disable Style/CaseEquality - expect(subject).to be < Version.create("10.15") + expect(version).to be > Version.create("10.3") + expect(version).to be == Version.create("10.14") + expect(version).to be === Version.create("10.14") # rubocop:disable Style/CaseEquality + expect(version).to be < Version.create("10.15") + end + + describe "#new" do + it "raises an error if the version is not a valid macOS version" do + expect { + described_class.new("1.2") + }.to raise_error(MacOSVersionError, 'unknown or unsupported macOS version: "1.2"') + end end specify "#from_symbol" do - expect(described_class.from_symbol(:mojave)).to eq(subject) + expect(described_class.from_symbol(:mojave)).to eq(version) expect { described_class.from_symbol(:foo) } .to raise_error(MacOSVersionError, "unknown or unsupported macOS version: :foo") end