| 
									
										
										
										
											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" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-18 15:11:11 -08:00
										 |  |  | RSpec.describe Formulary do | 
					
						
							| 
									
										
										
										
											2017-02-16 02:47:44 +01:00
										 |  |  |   let(:formula_name) { "testball_bottle" } | 
					
						
							| 
									
										
										
										
											2024-03-06 15:10:14 +01:00
										 |  |  |   let(:formula_path) { CoreTap.instance.new_formula_path(formula_name) } | 
					
						
							| 
									
										
										
										
											2017-02-16 02:47:44 +01:00
										 |  |  |   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-07-24 07:01:57 -07:00
										 |  |  |       end.to raise_error(TypeError) | 
					
						
							| 
									
										
										
										
											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" } | 
					
						
							| 
									
										
										
										
											2023-08-04 16:21:31 +01:00
										 |  |  |       let(:formula_path) do | 
					
						
							| 
									
										
										
										
											2024-03-06 15:10:14 +01:00
										 |  |  |         core_tap = CoreTap.instance | 
					
						
							| 
									
										
										
										
											2023-08-04 16:21:31 +01:00
										 |  |  |         (core_tap.formula_dir/formula_name[0]).mkpath | 
					
						
							|  |  |  |         core_tap.new_formula_path(formula_name) | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2023-02-24 10:57:41 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |       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) | 
					
						
							| 
									
										
										
										
											2024-02-16 21:27:02 +01:00
										 |  |  |         end.to raise_error(TapFormulaClassUnavailableError) | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-19 22:18:02 -07:00
										 |  |  |     it "returns a Formula when given a URL", :needs_utils_curl, :no_api 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") } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-16 21:27:02 +01:00
										 |  |  |       let(:alias_dir) { CoreTap.instance.alias_dir } | 
					
						
							| 
									
										
										
										
											2018-04-13 16:40:08 +02:00
										 |  |  |       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 | 
					
						
							| 
									
										
										
										
											2024-02-16 21:27:02 +01:00
										 |  |  |         expect(formula.alias_path).to eq(alias_path) | 
					
						
							| 
									
										
										
										
											2018-04-13 16:40:08 +02:00
										 |  |  |       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 | 
					
						
							| 
									
										
										
										
											2022-11-09 14:45:43 +00:00
										 |  |  |         # don't try to load/fetch gcc/glibc | 
					
						
							| 
									
										
										
										
											2023-12-14 02:52:30 +00:00
										 |  |  |         allow(DevelopmentTools).to receive_messages(needs_libc_formula?: false, needs_compiler_formula?: 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 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-13 13:40:44 -05:00
										 |  |  |     context "when migrating from a Tap" do | 
					
						
							| 
									
										
										
										
											2024-03-06 15:10:14 +01:00
										 |  |  |       let(:tap) { Tap.fetch("homebrew", "foo") } | 
					
						
							|  |  |  |       let(:another_tap) { Tap.fetch("homebrew", "bar") } | 
					
						
							| 
									
										
										
										
											2023-11-13 13:40:44 -05:00
										 |  |  |       let(:tap_migrations_path) { tap.path/"tap_migrations.json" } | 
					
						
							|  |  |  |       let(:another_tap_formula_path) { another_tap.path/"Formula/#{formula_name}.rb" } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       before do | 
					
						
							|  |  |  |         tap.path.mkpath | 
					
						
							|  |  |  |         another_tap_formula_path.dirname.mkpath | 
					
						
							|  |  |  |         another_tap_formula_path.write formula_content | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       after do | 
					
						
							|  |  |  |         FileUtils.rm_rf tap.path | 
					
						
							|  |  |  |         FileUtils.rm_rf another_tap.path | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it "returns a Formula that has gone through a tap migration into homebrew/core" do | 
					
						
							|  |  |  |         tap_migrations_path.write <<~EOS | 
					
						
							|  |  |  |           { | 
					
						
							|  |  |  |             "#{formula_name}": "homebrew/core" | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         EOS | 
					
						
							|  |  |  |         formula = described_class.factory("#{tap}/#{formula_name}") | 
					
						
							|  |  |  |         expect(formula).to be_a(Formula) | 
					
						
							| 
									
										
										
										
											2023-11-13 14:00:22 -05:00
										 |  |  |         expect(formula.tap).to eq(CoreTap.instance) | 
					
						
							| 
									
										
										
										
											2023-11-13 13:40:44 -05:00
										 |  |  |         expect(formula.path).to eq(formula_path) | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it "returns a Formula that has gone through a tap migration into another tap" do | 
					
						
							|  |  |  |         tap_migrations_path.write <<~EOS | 
					
						
							|  |  |  |           { | 
					
						
							|  |  |  |             "#{formula_name}": "#{another_tap}" | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         EOS | 
					
						
							|  |  |  |         formula = described_class.factory("#{tap}/#{formula_name}") | 
					
						
							|  |  |  |         expect(formula).to be_a(Formula) | 
					
						
							| 
									
										
										
										
											2023-11-13 14:00:22 -05:00
										 |  |  |         expect(formula.tap).to eq(another_tap) | 
					
						
							| 
									
										
										
										
											2023-11-13 13:40:44 -05:00
										 |  |  |         expect(formula.path).to eq(another_tap_formula_path) | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-13 16:40:08 +02:00
										 |  |  |     context "when loading from Tap" do | 
					
						
							| 
									
										
										
										
											2024-03-06 15:10:14 +01:00
										 |  |  |       let(:tap) { Tap.fetch("homebrew", "foo") } | 
					
						
							|  |  |  |       let(:another_tap) { Tap.fetch("homebrew", "bar") } | 
					
						
							| 
									
										
										
										
											2023-02-24 10:57:41 +00:00
										 |  |  |       let(:formula_path) { tap.path/"Formula/#{formula_name}.rb" } | 
					
						
							| 
									
										
										
										
											2024-02-16 21:27:02 +01:00
										 |  |  |       let(:alias_name) { "bar" } | 
					
						
							|  |  |  |       let(:alias_dir) { tap.alias_dir } | 
					
						
							|  |  |  |       let(:alias_path) { alias_dir/alias_name } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       before do | 
					
						
							|  |  |  |         alias_dir.mkpath | 
					
						
							|  |  |  |         FileUtils.ln_s formula_path, alias_path | 
					
						
							|  |  |  |         tap.clear_cache | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							| 
									
										
										
										
											2024-02-16 21:27:02 +01:00
										 |  |  |         expect(described_class.factory(alias_name)).to be_a(Formula) | 
					
						
							| 
									
										
										
										
											2017-02-16 02:47:44 +01:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-11 13:09:53 -08:00
										 |  |  |       it "returns a Formula from a fully qualified Alias path" do | 
					
						
							| 
									
										
										
										
											2024-02-16 21:27:02 +01:00
										 |  |  |         expect(described_class.factory("#{tap.name}/#{alias_name}")).to be_a(Formula) | 
					
						
							| 
									
										
										
										
											2024-02-11 13:09:53 -08:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-16 02:47:44 +01:00
										 |  |  |       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"                  => { | 
					
						
							| 
									
										
										
										
											2023-05-13 12:35:50 -07:00
										 |  |  |               "name"        => { macos: "custom.launchd.name", linux: "custom.systemd.name" }, | 
					
						
							| 
									
										
										
										
											2023-03-18 15:18:29 -07:00
										 |  |  |               "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
										 |  |  |             }, | 
					
						
							| 
									
										
										
										
											2024-02-17 13:00:50 -08:00
										 |  |  |             "ruby_source_path"         => "Formula/#{formula_name}.rb", | 
					
						
							| 
									
										
										
										
											2024-02-28 21:06:10 -08:00
										 |  |  |             "ruby_source_checksum"     => { "sha256" => "ABCDEFGHIJKLMNOPQRSTUVWXYZ" }, | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							| 
									
										
										
										
											2024-02-17 13:00:50 -08:00
										 |  |  |         ENV.delete("HOMEBREW_NO_INSTALL_FROM_API") | 
					
						
							| 
									
										
										
										
											2022-11-09 14:45:43 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-16 13:17:54 -07:00
										 |  |  |         # avoid unnecessary network calls | 
					
						
							|  |  |  |         allow(Homebrew::API::Formula).to receive_messages(all_aliases: {}, all_renames: {}) | 
					
						
							|  |  |  |         allow(CoreTap.instance).to receive(:tap_migrations).and_return({}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-09 14:45:43 +00:00
										 |  |  |         # don't try to load/fetch gcc/glibc | 
					
						
							| 
									
										
										
										
											2023-12-14 02:52:30 +00:00
										 |  |  |         allow(DevelopmentTools).to receive_messages(needs_libc_formula?: false, needs_compiler_formula?: 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 | 
					
						
							| 
									
										
										
										
											2023-06-19 06:03:31 +01:00
										 |  |  |         expect(formula.declared_deps.count).to eq 6
 | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							| 
									
										
										
										
											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-05-13 12:35:50 -07:00
										 |  |  |         expect(formula.plist_name).to eq("custom.launchd.name") | 
					
						
							|  |  |  |         expect(formula.service_name).to eq("custom.systemd.name") | 
					
						
							| 
									
										
										
										
											2023-03-18 15:18:29 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-28 21:06:10 -08:00
										 |  |  |         expect(formula.ruby_source_checksum.hexdigest).to eq("abcdefghijklmnopqrstuvwxyz") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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) | 
					
						
							| 
									
										
										
										
											2023-06-19 06:03:31 +01:00
										 |  |  |         expect(formula.declared_deps.count).to eq 7
 | 
					
						
							| 
									
										
										
										
											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) | 
					
						
							| 
									
										
										
										
											2023-06-19 06:03:31 +01:00
										 |  |  |         expect(formula.declared_deps.count).to eq 6
 | 
					
						
							| 
									
										
										
										
											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) | 
					
						
							| 
									
										
										
										
											2023-06-19 06:03:31 +01:00
										 |  |  |         expect(formula.declared_deps.count).to eq 6
 | 
					
						
							| 
									
										
										
										
											2023-02-14 04:07:36 +00:00
										 |  |  |         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 | 
					
						
							| 
									
										
										
										
											2024-02-13 21:23:37 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |   describe "::loader_for" do | 
					
						
							| 
									
										
										
										
											2024-03-01 03:13:56 +01:00
										 |  |  |     context "when given a relative path with two slashes" do | 
					
						
							|  |  |  |       it "returns a `FromPathLoader`" do | 
					
						
							|  |  |  |         mktmpdir.cd do | 
					
						
							|  |  |  |           FileUtils.mkdir "Formula" | 
					
						
							|  |  |  |           FileUtils.touch "Formula/gcc.rb" | 
					
						
							|  |  |  |           expect(described_class.loader_for("./Formula/gcc.rb")).to be_a Formulary::FromPathLoader | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     context "when given a tapped name" do | 
					
						
							|  |  |  |       it "returns a `FromTapLoader`" do | 
					
						
							|  |  |  |         expect(described_class.loader_for("homebrew/core/gcc")).to be_a Formulary::FromTapLoader | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-13 21:23:37 +01:00
										 |  |  |     context "when not using the API" do | 
					
						
							|  |  |  |       before do | 
					
						
							|  |  |  |         ENV["HOMEBREW_NO_INSTALL_FROM_API"] = "1" | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-06 23:06:36 +01:00
										 |  |  |       context "when a formula is migrated" do | 
					
						
							| 
									
										
										
										
											2024-02-16 10:42:46 +01:00
										 |  |  |         let(:token) { "foo" } | 
					
						
							| 
									
										
										
										
											2024-03-06 23:06:36 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         let(:core_tap) { CoreTap.instance } | 
					
						
							|  |  |  |         let(:core_cask_tap) { CoreCaskTap.instance } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-13 21:23:37 +01:00
										 |  |  |         let(:tap_migrations) do | 
					
						
							|  |  |  |           { | 
					
						
							| 
									
										
										
										
											2024-03-06 23:06:36 +01:00
										 |  |  |             token => new_tap.name, | 
					
						
							| 
									
										
										
										
											2024-02-13 21:23:37 +01:00
										 |  |  |           } | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         before do | 
					
						
							|  |  |  |           old_tap.path.mkpath | 
					
						
							| 
									
										
										
										
											2024-03-06 23:06:36 +01:00
										 |  |  |           new_tap.path.mkpath | 
					
						
							| 
									
										
										
										
											2024-02-13 21:23:37 +01:00
										 |  |  |           (old_tap.path/"tap_migrations.json").write tap_migrations.to_json | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-06 23:06:36 +01:00
										 |  |  |         context "to a cask in the default tap" do | 
					
						
							|  |  |  |           let(:old_tap) { core_tap } | 
					
						
							|  |  |  |           let(:new_tap) { core_cask_tap } | 
					
						
							| 
									
										
										
										
											2024-02-13 21:23:37 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-06 23:06:36 +01:00
										 |  |  |           let(:cask_file) { new_tap.cask_dir/"#{token}.rb" } | 
					
						
							| 
									
										
										
										
											2024-02-13 21:23:37 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-06 23:06:36 +01:00
										 |  |  |           before do | 
					
						
							|  |  |  |             new_tap.cask_dir.mkpath | 
					
						
							|  |  |  |             FileUtils.touch cask_file | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           it "warn only once" do | 
					
						
							|  |  |  |             expect do | 
					
						
							|  |  |  |               described_class.loader_for(token) | 
					
						
							|  |  |  |             end.to output( | 
					
						
							|  |  |  |               a_string_including("Warning: Formula #{token} was renamed to #{new_tap}/#{token}.").once, | 
					
						
							|  |  |  |             ).to_stderr | 
					
						
							|  |  |  |           end | 
					
						
							| 
									
										
										
										
											2024-02-13 21:23:37 +01:00
										 |  |  |         end | 
					
						
							| 
									
										
										
										
											2024-02-16 10:22:10 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-06 23:06:36 +01:00
										 |  |  |         context "to the default tap" do | 
					
						
							|  |  |  |           let(:old_tap) { core_cask_tap } | 
					
						
							|  |  |  |           let(:new_tap) { core_tap } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           let(:formula_file) { new_tap.formula_dir/"#{token}.rb" } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           before do | 
					
						
							|  |  |  |             new_tap.formula_dir.mkpath | 
					
						
							|  |  |  |             FileUtils.touch formula_file | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           it "does not warn when loading the short token" do | 
					
						
							|  |  |  |             expect do | 
					
						
							|  |  |  |               described_class.loader_for(token) | 
					
						
							|  |  |  |             end.not_to output.to_stderr | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           it "does not warn when loading the full token in the default tap" do | 
					
						
							|  |  |  |             expect do | 
					
						
							|  |  |  |               described_class.loader_for("#{new_tap}/#{token}") | 
					
						
							|  |  |  |             end.not_to output.to_stderr | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           it "warns when loading the full token in the old tap" do | 
					
						
							|  |  |  |             expect do | 
					
						
							|  |  |  |               described_class.loader_for("#{old_tap}/#{token}") | 
					
						
							|  |  |  |             end.to output( | 
					
						
							|  |  |  |               a_string_including("Formula #{old_tap}/#{token} was renamed to #{token}.").once, | 
					
						
							|  |  |  |             ).to_stderr | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           # FIXME | 
					
						
							|  |  |  |           # context "when there is an infinite tap migration loop" do | 
					
						
							|  |  |  |           #   before do | 
					
						
							|  |  |  |           #     (new_tap.path/"tap_migrations.json").write({ | 
					
						
							|  |  |  |           #       token => old_tap.name, | 
					
						
							|  |  |  |           #     }.to_json) | 
					
						
							|  |  |  |           #   end | 
					
						
							|  |  |  |           # | 
					
						
							|  |  |  |           #   it "stops recursing" do | 
					
						
							|  |  |  |           #     expect do | 
					
						
							|  |  |  |           #       described_class.loader_for("#{new_tap}/#{token}") | 
					
						
							|  |  |  |           #     end.not_to output.to_stderr | 
					
						
							|  |  |  |           #   end | 
					
						
							|  |  |  |           # end | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2024-02-13 21:23:37 +01:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2017-02-16 02:47:44 +01:00
										 |  |  | end |