2019-04-19 15:38:03 +09:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2017-02-16 02:47:44 +01:00
|
|
|
require "formula"
|
|
|
|
require "formula_installer"
|
|
|
|
require "utils/bottles"
|
|
|
|
|
|
|
|
describe Formulary do
|
|
|
|
let(:formula_name) { "testball_bottle" }
|
|
|
|
let(:formula_path) { CoreTap.new.formula_dir/"#{formula_name}.rb" }
|
|
|
|
let(:formula_content) do
|
2018-07-11 15:17:40 +02:00
|
|
|
<<~RUBY
|
2018-04-13 14:55:28 +02:00
|
|
|
class #{described_class.class_s(formula_name)} < Formula
|
2017-02-16 02:47:44 +01:00
|
|
|
url "file://#{TEST_FIXTURE_DIR}/tarballs/testball-0.1.tbz"
|
|
|
|
sha256 TESTBALL_SHA256
|
|
|
|
|
|
|
|
bottle do
|
|
|
|
root_url "file://#{bottle_dir}"
|
2023-04-18 00:22:13 +01:00
|
|
|
sha256 cellar: :any_skip_relocation, #{Utils::Bottles.tag}: "d7b9f4e8bf83608b71fe958a99f19f2e5e68bb2582965d32e41759c24f1aef97"
|
2017-02-16 02:47:44 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
def install
|
|
|
|
prefix.install "bin"
|
|
|
|
prefix.install "libexec"
|
|
|
|
end
|
|
|
|
end
|
2018-07-11 15:17:40 +02:00
|
|
|
RUBY
|
2017-02-16 02:47:44 +01:00
|
|
|
end
|
|
|
|
let(:bottle_dir) { Pathname.new("#{TEST_FIXTURE_DIR}/bottles") }
|
|
|
|
let(:bottle) { bottle_dir/"testball_bottle-0.1.#{Utils::Bottles.tag}.bottle.tar.gz" }
|
|
|
|
|
|
|
|
describe "::class_s" do
|
|
|
|
it "replaces '+' with 'x'" do
|
2018-04-13 14:55:28 +02:00
|
|
|
expect(described_class.class_s("foo++")).to eq("Fooxx")
|
2017-02-16 02:47:44 +01:00
|
|
|
end
|
|
|
|
|
2018-04-13 16:40:08 +02:00
|
|
|
it "converts a string with dots to PascalCase" do
|
2018-04-13 14:55:28 +02:00
|
|
|
expect(described_class.class_s("shell.fm")).to eq("ShellFm")
|
2018-04-13 16:40:08 +02:00
|
|
|
end
|
|
|
|
|
|
|
|
it "converts a string with hyphens to PascalCase" do
|
2018-04-13 14:55:28 +02:00
|
|
|
expect(described_class.class_s("pkg-config")).to eq("PkgConfig")
|
2018-04-13 16:40:08 +02:00
|
|
|
end
|
|
|
|
|
|
|
|
it "converts a string with a single letter separated by a hyphen to PascalCase" do
|
|
|
|
expect(described_class.class_s("s-lang")).to eq("SLang")
|
|
|
|
end
|
|
|
|
|
|
|
|
it "converts a string with underscores to PascalCase" do
|
2018-04-13 14:55:28 +02:00
|
|
|
expect(described_class.class_s("foo_bar")).to eq("FooBar")
|
2017-02-16 02:47:44 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
it "replaces '@' with 'AT'" do
|
2018-04-13 14:55:28 +02:00
|
|
|
expect(described_class.class_s("openssl@1.1")).to eq("OpensslAT11")
|
2017-02-16 02:47:44 +01:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe "::factory" do
|
2018-03-25 13:30:37 +01:00
|
|
|
before do
|
2021-05-03 13:24:32 +01:00
|
|
|
formula_path.dirname.mkpath
|
2017-02-16 02:47:44 +01:00
|
|
|
formula_path.write formula_content
|
|
|
|
end
|
|
|
|
|
|
|
|
it "returns a Formula" do
|
2022-09-13 09:43:09 +01:00
|
|
|
expect(described_class.factory(formula_name)).to be_a(Formula)
|
2017-02-16 02:47:44 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
it "returns a Formula when given a fully qualified name" do
|
2022-09-13 09:43:09 +01:00
|
|
|
expect(described_class.factory("homebrew/core/#{formula_name}")).to be_a(Formula)
|
2017-02-16 02:47:44 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
it "raises an error if the Formula cannot be found" do
|
2023-03-08 23:14:46 +00:00
|
|
|
expect do
|
2018-04-13 14:55:28 +02:00
|
|
|
described_class.factory("not_existed_formula")
|
2023-03-08 23:14:46 +00:00
|
|
|
end.to raise_error(FormulaUnavailableError)
|
2017-02-16 02:47:44 +01:00
|
|
|
end
|
|
|
|
|
2018-06-01 21:36:28 +01:00
|
|
|
it "raises an error if ref is nil" do
|
2023-03-08 23:14:46 +00:00
|
|
|
expect do
|
2018-06-01 21:36:28 +01:00
|
|
|
described_class.factory(nil)
|
2023-03-08 23:14:46 +00:00
|
|
|
end.to raise_error(ArgumentError)
|
2018-06-01 21:36:28 +01:00
|
|
|
end
|
|
|
|
|
2023-02-24 10:57:41 +00:00
|
|
|
context "with sharded Formula directory" do
|
|
|
|
before { CoreTap.instance.clear_cache }
|
|
|
|
|
|
|
|
let(:formula_name) { "testball_sharded" }
|
|
|
|
let(:formula_path) { CoreTap.new.formula_dir/formula_name[0]/"#{formula_name}.rb" }
|
|
|
|
|
|
|
|
it "returns a Formula" do
|
|
|
|
expect(described_class.factory(formula_name)).to be_a(Formula)
|
|
|
|
end
|
|
|
|
|
|
|
|
it "returns a Formula when given a fully qualified name" do
|
|
|
|
expect(described_class.factory("homebrew/core/#{formula_name}")).to be_a(Formula)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2018-04-13 16:40:08 +02:00
|
|
|
context "when the Formula has the wrong class" do
|
2017-02-16 02:47:44 +01:00
|
|
|
let(:formula_name) { "giraffe" }
|
|
|
|
let(:formula_content) do
|
2018-07-11 15:17:40 +02:00
|
|
|
<<~RUBY
|
2018-04-13 14:55:28 +02:00
|
|
|
class Wrong#{described_class.class_s(formula_name)} < Formula
|
2017-02-16 02:47:44 +01:00
|
|
|
end
|
2018-07-11 15:17:40 +02:00
|
|
|
RUBY
|
2017-02-16 02:47:44 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
it "raises an error" do
|
2023-03-08 23:14:46 +00:00
|
|
|
expect do
|
2018-04-13 14:55:28 +02:00
|
|
|
described_class.factory(formula_name)
|
2023-03-08 23:14:46 +00:00
|
|
|
end.to raise_error(FormulaClassUnavailableError)
|
2017-02-16 02:47:44 +01:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
it "returns a Formula when given a path" do
|
2022-09-13 09:43:09 +01:00
|
|
|
expect(described_class.factory(formula_path)).to be_a(Formula)
|
2017-02-16 02:47:44 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
it "returns a Formula when given a URL" do
|
2018-04-13 14:55:28 +02:00
|
|
|
formula = described_class.factory("file://#{formula_path}")
|
2022-09-13 09:43:09 +01:00
|
|
|
expect(formula).to be_a(Formula)
|
2017-02-16 02:47:44 +01:00
|
|
|
end
|
|
|
|
|
2018-04-13 16:40:08 +02:00
|
|
|
context "when given a bottle" do
|
|
|
|
subject(:formula) { described_class.factory(bottle) }
|
|
|
|
|
|
|
|
it "returns a Formula" do
|
2022-09-13 09:43:09 +01:00
|
|
|
expect(formula).to be_a(Formula)
|
2018-04-13 16:40:08 +02:00
|
|
|
end
|
|
|
|
|
|
|
|
it "calling #local_bottle_path on the returned Formula returns the bottle path" do
|
|
|
|
expect(formula.local_bottle_path).to eq(bottle.realpath)
|
|
|
|
end
|
2017-02-16 02:47:44 +01:00
|
|
|
end
|
|
|
|
|
2018-04-13 16:40:08 +02:00
|
|
|
context "when given an alias" do
|
|
|
|
subject(:formula) { described_class.factory("foo") }
|
|
|
|
|
|
|
|
let(:alias_dir) { CoreTap.instance.alias_dir.tap(&:mkpath) }
|
|
|
|
let(:alias_path) { alias_dir/"foo" }
|
|
|
|
|
|
|
|
before do
|
|
|
|
alias_dir.mkpath
|
|
|
|
FileUtils.ln_s formula_path, alias_path
|
|
|
|
end
|
|
|
|
|
|
|
|
it "returns a Formula" do
|
2022-09-13 09:43:09 +01:00
|
|
|
expect(formula).to be_a(Formula)
|
2018-04-13 16:40:08 +02:00
|
|
|
end
|
|
|
|
|
|
|
|
it "calling #alias_path on the returned Formula returns the alias path" do
|
|
|
|
expect(formula.alias_path).to eq(alias_path.to_s)
|
|
|
|
end
|
2017-02-16 02:47:44 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
context "with installed Formula" do
|
2018-06-22 16:56:37 -07:00
|
|
|
before do
|
2018-09-20 09:07:56 +01:00
|
|
|
allow(described_class).to receive(:loader_for).and_call_original
|
2022-11-09 14:45:43 +00:00
|
|
|
|
|
|
|
# don't try to load/fetch gcc/glibc
|
|
|
|
allow(DevelopmentTools).to receive(:needs_libc_formula?).and_return(false)
|
|
|
|
allow(DevelopmentTools).to receive(:needs_compiler_formula?).and_return(false)
|
2018-06-22 16:56:37 -07:00
|
|
|
end
|
|
|
|
|
|
|
|
let(:installed_formula) { described_class.factory(formula_path) }
|
|
|
|
let(:installer) { FormulaInstaller.new(installed_formula) }
|
2017-02-16 02:47:44 +01:00
|
|
|
|
|
|
|
it "returns a Formula when given a rack" do
|
2020-03-04 17:48:17 -05:00
|
|
|
installer.fetch
|
2017-07-29 19:55:05 +02:00
|
|
|
installer.install
|
2017-02-16 02:47:44 +01:00
|
|
|
|
2018-06-22 16:56:37 -07:00
|
|
|
f = described_class.from_rack(installed_formula.rack)
|
2022-09-13 09:43:09 +01:00
|
|
|
expect(f).to be_a(Formula)
|
2017-02-16 02:47:44 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
it "returns a Formula when given a Keg" do
|
2020-03-04 17:48:17 -05:00
|
|
|
installer.fetch
|
2017-07-29 19:55:05 +02:00
|
|
|
installer.install
|
2017-02-16 02:47:44 +01:00
|
|
|
|
2018-06-22 16:56:37 -07:00
|
|
|
keg = Keg.new(installed_formula.prefix)
|
2018-04-13 14:55:28 +02:00
|
|
|
f = described_class.from_keg(keg)
|
2022-09-13 09:43:09 +01:00
|
|
|
expect(f).to be_a(Formula)
|
2017-02-16 02:47:44 +01:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2018-04-13 16:40:08 +02:00
|
|
|
context "when loading from Tap" do
|
2017-02-16 02:47:44 +01:00
|
|
|
let(:tap) { Tap.new("homebrew", "foo") }
|
2018-04-13 16:40:08 +02:00
|
|
|
let(:another_tap) { Tap.new("homebrew", "bar") }
|
2023-02-24 10:57:41 +00:00
|
|
|
let(:formula_path) { tap.path/"Formula/#{formula_name}.rb" }
|
2017-02-16 02:47:44 +01:00
|
|
|
|
|
|
|
it "returns a Formula when given a name" do
|
2022-09-13 09:43:09 +01:00
|
|
|
expect(described_class.factory(formula_name)).to be_a(Formula)
|
2017-02-16 02:47:44 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
it "returns a Formula from an Alias path" do
|
|
|
|
alias_dir = tap.path/"Aliases"
|
|
|
|
alias_dir.mkpath
|
|
|
|
FileUtils.ln_s formula_path, alias_dir/"bar"
|
2022-09-13 09:43:09 +01:00
|
|
|
expect(described_class.factory("bar")).to be_a(Formula)
|
2017-02-16 02:47:44 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
it "raises an error when the Formula cannot be found" do
|
2023-03-08 23:14:46 +00:00
|
|
|
expect do
|
2018-04-13 14:55:28 +02:00
|
|
|
described_class.factory("#{tap}/not_existed_formula")
|
2023-03-08 23:14:46 +00:00
|
|
|
end.to raise_error(TapFormulaUnavailableError)
|
2017-02-16 02:47:44 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
it "returns a Formula when given a fully qualified name" do
|
2022-09-13 09:43:09 +01:00
|
|
|
expect(described_class.factory("#{tap}/#{formula_name}")).to be_a(Formula)
|
2017-02-16 02:47:44 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
it "raises an error if a Formula is in multiple Taps" do
|
2023-02-24 10:57:41 +00:00
|
|
|
(another_tap.path/"Formula").mkpath
|
|
|
|
(another_tap.path/"Formula/#{formula_name}.rb").write formula_content
|
2018-04-13 16:40:08 +02:00
|
|
|
|
2023-03-08 23:14:46 +00:00
|
|
|
expect do
|
2018-04-13 16:40:08 +02:00
|
|
|
described_class.factory(formula_name)
|
2023-03-08 23:14:46 +00:00
|
|
|
end.to raise_error(TapFormulaAmbiguityError)
|
2017-02-16 02:47:44 +01:00
|
|
|
end
|
|
|
|
end
|
2022-06-15 18:09:51 -04:00
|
|
|
|
|
|
|
context "when loading from the API" do
|
2022-06-16 13:58:17 -04:00
|
|
|
def formula_json_contents(extra_items = {})
|
|
|
|
{
|
|
|
|
formula_name => {
|
|
|
|
"desc" => "testball",
|
|
|
|
"homepage" => "https://example.com",
|
|
|
|
"license" => "MIT",
|
|
|
|
"revision" => 0,
|
|
|
|
"version_scheme" => 0,
|
|
|
|
"versions" => { "stable" => "0.1" },
|
|
|
|
"urls" => {
|
|
|
|
"stable" => {
|
|
|
|
"url" => "file://#{TEST_FIXTURE_DIR}/tarballs/testball-0.1.tbz",
|
|
|
|
"tag" => nil,
|
|
|
|
"revision" => nil,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
"bottle" => {
|
|
|
|
"stable" => {
|
|
|
|
"rebuild" => 0,
|
|
|
|
"root_url" => "file://#{bottle_dir}",
|
|
|
|
"files" => {
|
|
|
|
Utils::Bottles.tag.to_s => {
|
|
|
|
"cellar" => ":any",
|
|
|
|
"url" => "file://#{bottle_dir}/#{formula_name}",
|
2023-04-18 00:22:13 +01:00
|
|
|
"sha256" => "d7b9f4e8bf83608b71fe958a99f19f2e5e68bb2582965d32e41759c24f1aef97",
|
2022-06-16 13:58:17 -04:00
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
"keg_only_reason" => {
|
|
|
|
"reason" => ":provided_by_macos",
|
|
|
|
"explanation" => "",
|
|
|
|
},
|
2022-06-16 14:27:39 -04:00
|
|
|
"build_dependencies" => ["build_dep"],
|
|
|
|
"dependencies" => ["dep"],
|
2022-09-21 02:42:14 -04:00
|
|
|
"test_dependencies" => ["test_dep"],
|
2022-06-16 14:27:39 -04:00
|
|
|
"recommended_dependencies" => ["recommended_dep"],
|
|
|
|
"optional_dependencies" => ["optional_dep"],
|
|
|
|
"uses_from_macos" => ["uses_from_macos_dep"],
|
2023-02-14 02:03:58 +00:00
|
|
|
"requirements" => [
|
|
|
|
{
|
|
|
|
"name" => "xcode",
|
|
|
|
"cask" => nil,
|
|
|
|
"download" => nil,
|
|
|
|
"version" => "1.0",
|
|
|
|
"contexts" => ["build"],
|
|
|
|
},
|
|
|
|
],
|
2023-02-20 16:08:38 +00:00
|
|
|
"conflicts_with" => ["conflicting_formula"],
|
|
|
|
"conflicts_with_reasons" => ["it does"],
|
|
|
|
"link_overwrite" => ["bin/abc"],
|
2023-04-22 10:06:52 -07:00
|
|
|
"caveats" => "example caveat string\n/$HOME\n$HOMEBREW_PREFIX",
|
2023-03-18 15:18:29 -07:00
|
|
|
"service" => {
|
|
|
|
"run" => ["$HOMEBREW_PREFIX/opt/formula_name/bin/beanstalkd", "test"],
|
2023-03-21 21:55:47 -07:00
|
|
|
"run_type" => "immediate",
|
|
|
|
"working_dir" => "/$HOME",
|
2023-03-18 15:18:29 -07:00
|
|
|
},
|
2022-06-16 13:58:17 -04:00
|
|
|
}.merge(extra_items),
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
|
|
|
let(:deprecate_json) do
|
|
|
|
{
|
|
|
|
"deprecation_date" => "2022-06-15",
|
|
|
|
"deprecation_reason" => "repo_archived",
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
|
|
|
let(:disable_json) do
|
|
|
|
{
|
|
|
|
"disable_date" => "2022-06-15",
|
2022-06-16 16:14:39 -04:00
|
|
|
"disable_reason" => "requires something else",
|
2022-06-16 13:58:17 -04:00
|
|
|
}
|
|
|
|
end
|
|
|
|
|
2022-07-24 22:59:42 +02:00
|
|
|
let(:variations_json) do
|
|
|
|
{
|
|
|
|
"variations" => {
|
|
|
|
Utils::Bottles.tag.to_s => {
|
|
|
|
"dependencies" => ["dep", "variations_dep"],
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
2023-02-14 04:07:36 +00:00
|
|
|
let(:older_macos_variations_json) do
|
|
|
|
{
|
|
|
|
"variations" => {
|
|
|
|
Utils::Bottles.tag.to_s => {
|
|
|
|
"dependencies" => ["uses_from_macos_dep"],
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
2022-07-25 08:49:19 +02:00
|
|
|
let(:linux_variations_json) do
|
|
|
|
{
|
|
|
|
"variations" => {
|
|
|
|
"x86_64_linux" => {
|
|
|
|
"dependencies" => ["dep", "uses_from_macos_dep"],
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
2022-06-15 18:09:51 -04:00
|
|
|
before do
|
|
|
|
allow(described_class).to receive(:loader_for).and_return(described_class::FormulaAPILoader.new(formula_name))
|
2022-11-09 14:45:43 +00:00
|
|
|
|
|
|
|
# don't try to load/fetch gcc/glibc
|
|
|
|
allow(DevelopmentTools).to receive(:needs_libc_formula?).and_return(false)
|
|
|
|
allow(DevelopmentTools).to receive(:needs_compiler_formula?).and_return(false)
|
2022-06-15 18:09:51 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it "returns a Formula when given a name" do
|
2022-06-16 13:58:17 -04:00
|
|
|
allow(Homebrew::API::Formula).to receive(:all_formulae).and_return formula_json_contents
|
|
|
|
|
|
|
|
formula = described_class.factory(formula_name)
|
2022-09-13 09:43:09 +01:00
|
|
|
expect(formula).to be_a(Formula)
|
2023-02-14 02:03:58 +00:00
|
|
|
|
2022-06-16 13:58:17 -04:00
|
|
|
expect(formula.keg_only_reason.reason).to eq :provided_by_macos
|
2022-06-16 14:52:21 -04:00
|
|
|
if OS.mac?
|
|
|
|
expect(formula.deps.count).to eq 5
|
2023-02-14 02:03:58 +00:00
|
|
|
else
|
2022-09-21 02:42:14 -04:00
|
|
|
expect(formula.deps.count).to eq 6
|
2022-06-16 14:52:21 -04:00
|
|
|
end
|
2022-06-16 15:27:19 -04:00
|
|
|
expect(formula.uses_from_macos_elements).to eq ["uses_from_macos_dep"]
|
2023-02-14 02:03:58 +00:00
|
|
|
|
|
|
|
expect(formula.requirements.count).to eq 1
|
|
|
|
req = formula.requirements.first
|
|
|
|
expect(req).to be_an_instance_of XcodeRequirement
|
|
|
|
expect(req.version).to eq "1.0"
|
|
|
|
expect(req.tags).to eq [:build]
|
|
|
|
|
2023-02-20 16:08:38 +00:00
|
|
|
expect(formula.conflicts.map(&:name)).to include "conflicting_formula"
|
|
|
|
expect(formula.conflicts.map(&:reason)).to include "it does"
|
|
|
|
expect(formula.class.link_overwrite_paths).to include "bin/abc"
|
|
|
|
|
2023-04-22 10:06:52 -07:00
|
|
|
expect(formula.caveats).to eq "example caveat string\n#{Dir.home}\n#{HOMEBREW_PREFIX}"
|
2023-02-14 02:03:58 +00:00
|
|
|
|
2023-03-18 15:18:29 -07:00
|
|
|
expect(formula).to be_a_service
|
|
|
|
expect(formula.service.command).to eq(["#{HOMEBREW_PREFIX}/opt/formula_name/bin/beanstalkd", "test"])
|
|
|
|
expect(formula.service.run_type).to eq(:immediate)
|
|
|
|
expect(formula.service.working_dir).to eq(Dir.home)
|
|
|
|
|
2023-03-08 23:14:46 +00:00
|
|
|
expect do
|
2022-06-16 13:58:17 -04:00
|
|
|
formula.install
|
2023-03-08 23:14:46 +00:00
|
|
|
end.to raise_error("Cannot build from source from abstract formula.")
|
2022-06-16 13:58:17 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it "returns a deprecated Formula when given a name" do
|
|
|
|
allow(Homebrew::API::Formula).to receive(:all_formulae).and_return formula_json_contents(deprecate_json)
|
|
|
|
|
|
|
|
formula = described_class.factory(formula_name)
|
2022-09-13 09:43:09 +01:00
|
|
|
expect(formula).to be_a(Formula)
|
2022-06-16 13:58:17 -04:00
|
|
|
expect(formula.deprecated?).to be true
|
2023-03-08 23:14:46 +00:00
|
|
|
expect do
|
2022-06-16 13:58:17 -04:00
|
|
|
formula.install
|
2023-03-08 23:14:46 +00:00
|
|
|
end.to raise_error("Cannot build from source from abstract formula.")
|
2022-06-16 13:58:17 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it "returns a disabled Formula when given a name" do
|
|
|
|
allow(Homebrew::API::Formula).to receive(:all_formulae).and_return formula_json_contents(disable_json)
|
|
|
|
|
2022-06-15 18:09:51 -04:00
|
|
|
formula = described_class.factory(formula_name)
|
2022-09-13 09:43:09 +01:00
|
|
|
expect(formula).to be_a(Formula)
|
2022-06-16 13:58:17 -04:00
|
|
|
expect(formula.disabled?).to be true
|
2023-03-08 23:14:46 +00:00
|
|
|
expect do
|
2022-06-15 18:09:51 -04:00
|
|
|
formula.install
|
2023-03-08 23:14:46 +00:00
|
|
|
end.to raise_error("Cannot build from source from abstract formula.")
|
2022-06-15 18:09:51 -04:00
|
|
|
end
|
2022-07-24 22:59:42 +02:00
|
|
|
|
|
|
|
it "returns a Formula with variations when given a name", :needs_macos do
|
|
|
|
allow(Homebrew::API::Formula).to receive(:all_formulae).and_return formula_json_contents(variations_json)
|
|
|
|
|
2022-07-25 08:49:19 +02:00
|
|
|
formula = described_class.factory(formula_name)
|
2022-09-13 09:43:09 +01:00
|
|
|
expect(formula).to be_a(Formula)
|
2022-09-21 02:42:14 -04:00
|
|
|
expect(formula.deps.count).to eq 6
|
2022-07-25 08:49:19 +02:00
|
|
|
expect(formula.deps.map(&:name).include?("variations_dep")).to be true
|
2023-02-14 04:07:36 +00:00
|
|
|
expect(formula.deps.map(&:name).include?("uses_from_macos_dep")).to be false
|
2022-07-25 08:49:19 +02:00
|
|
|
end
|
|
|
|
|
|
|
|
it "returns a Formula without duplicated deps and uses_from_macos with variations on Linux", :needs_linux do
|
2022-07-25 08:56:10 +02:00
|
|
|
allow(Homebrew::API::Formula)
|
|
|
|
.to receive(:all_formulae).and_return formula_json_contents(linux_variations_json)
|
2022-07-25 08:49:19 +02:00
|
|
|
|
2022-07-24 22:59:42 +02:00
|
|
|
formula = described_class.factory(formula_name)
|
2022-09-13 09:43:09 +01:00
|
|
|
expect(formula).to be_a(Formula)
|
2022-09-21 02:42:14 -04:00
|
|
|
expect(formula.deps.count).to eq 6
|
2022-07-25 19:22:15 +02:00
|
|
|
expect(formula.deps.map(&:name).include?("uses_from_macos_dep")).to be true
|
2023-02-14 04:07:36 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
it "returns a Formula with the correct uses_from_macos dep on older macOS", :needs_macos do
|
|
|
|
allow(Homebrew::API::Formula)
|
|
|
|
.to receive(:all_formulae).and_return formula_json_contents(older_macos_variations_json)
|
|
|
|
|
|
|
|
formula = described_class.factory(formula_name)
|
|
|
|
expect(formula).to be_a(Formula)
|
|
|
|
expect(formula.deps.count).to eq 5
|
|
|
|
expect(formula.deps.map(&:name).include?("uses_from_macos_dep")).to be true
|
2022-07-24 22:59:42 +02:00
|
|
|
end
|
2022-06-15 18:09:51 -04:00
|
|
|
end
|
2017-02-16 02:47:44 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
specify "::from_contents" do
|
2022-09-13 09:43:09 +01:00
|
|
|
expect(described_class.from_contents(formula_name, formula_path, formula_content)).to be_a(Formula)
|
2017-02-16 02:47:44 +01:00
|
|
|
end
|
|
|
|
|
2018-04-13 16:40:08 +02:00
|
|
|
describe "::to_rack" do
|
|
|
|
alias_matcher :exist, :be_exist
|
|
|
|
|
|
|
|
let(:rack_path) { HOMEBREW_CELLAR/formula_name }
|
|
|
|
|
|
|
|
context "when the Rack does not exist" do
|
|
|
|
it "returns the Rack" do
|
|
|
|
expect(described_class.to_rack(formula_name)).to eq(rack_path)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context "when the Rack exists" do
|
|
|
|
before do
|
|
|
|
rack_path.mkpath
|
|
|
|
end
|
2017-02-16 02:47:44 +01:00
|
|
|
|
2018-04-13 16:40:08 +02:00
|
|
|
it "returns the Rack" do
|
|
|
|
expect(described_class.to_rack(formula_name)).to eq(rack_path)
|
|
|
|
end
|
|
|
|
end
|
2017-02-16 02:47:44 +01:00
|
|
|
|
2018-04-13 16:40:08 +02:00
|
|
|
it "raises an error if the Formula is not available" do
|
2023-03-08 23:14:46 +00:00
|
|
|
expect do
|
2018-04-13 16:40:08 +02:00
|
|
|
described_class.to_rack("a/b/#{formula_name}")
|
2023-03-08 23:14:46 +00:00
|
|
|
end.to raise_error(TapFormulaUnavailableError)
|
2018-04-13 16:40:08 +02:00
|
|
|
end
|
2017-02-16 02:47:44 +01:00
|
|
|
end
|
|
|
|
|
2017-02-22 00:37:42 +01:00
|
|
|
describe "::core_path" do
|
|
|
|
it "returns the path to a Formula in the core tap" do
|
|
|
|
name = "foo-bar"
|
2018-04-13 14:55:28 +02:00
|
|
|
expect(described_class.core_path(name))
|
2017-02-22 00:37:42 +01:00
|
|
|
.to eq(Pathname.new("#{HOMEBREW_LIBRARY}/Taps/homebrew/homebrew-core/Formula/#{name}.rb"))
|
|
|
|
end
|
|
|
|
end
|
2022-06-16 16:14:39 -04:00
|
|
|
|
2022-06-16 16:45:38 -04:00
|
|
|
describe "::convert_to_string_or_symbol" do
|
|
|
|
it "returns the original string if it doesn't start with a colon" do
|
|
|
|
expect(described_class.convert_to_string_or_symbol("foo")).to eq "foo"
|
|
|
|
end
|
|
|
|
|
|
|
|
it "returns a symbol if the original string starts with a colon" do
|
|
|
|
expect(described_class.convert_to_string_or_symbol(":foo")).to eq :foo
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2022-06-16 16:14:39 -04:00
|
|
|
describe "::convert_to_deprecate_disable_reason_string_or_symbol" do
|
|
|
|
it "returns the original string if it isn't a preset reason" do
|
|
|
|
expect(described_class.convert_to_deprecate_disable_reason_string_or_symbol("foo")).to eq "foo"
|
|
|
|
end
|
|
|
|
|
|
|
|
it "returns a symbol if the original string is a preset reason" do
|
|
|
|
expect(described_class.convert_to_deprecate_disable_reason_string_or_symbol("does_not_build"))
|
|
|
|
.to eq :does_not_build
|
|
|
|
end
|
|
|
|
end
|
2017-02-16 02:47:44 +01:00
|
|
|
end
|