| 
									
										
										
										
											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 | 
					
						
							| 
									
										
										
										
											2017-10-15 02:28:32 +02:00
										 |  |  |     <<~EOS | 
					
						
							| 
									
										
										
										
											2017-02-16 02:47:44 +01:00
										 |  |  |       class #{subject.class_s(formula_name)} < Formula | 
					
						
							|  |  |  |         url "file://#{TEST_FIXTURE_DIR}/tarballs/testball-0.1.tbz" | 
					
						
							|  |  |  |         sha256 TESTBALL_SHA256 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         bottle do | 
					
						
							|  |  |  |           cellar :any_skip_relocation | 
					
						
							|  |  |  |           root_url "file://#{bottle_dir}" | 
					
						
							| 
									
										
										
										
											2017-09-25 11:28:45 -07:00
										 |  |  |           sha256 "d48bbbe583dcfbfa608579724fc6f0328b3cd316935c6ea22f134610aaf2952f" => :#{Utils::Bottles.tag} | 
					
						
							| 
									
										
										
										
											2017-02-16 02:47:44 +01:00
										 |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def install | 
					
						
							|  |  |  |           prefix.install "bin" | 
					
						
							|  |  |  |           prefix.install "libexec" | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     EOS | 
					
						
							|  |  |  |   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 | 
					
						
							|  |  |  |       expect(subject.class_s("foo++")).to eq("Fooxx") | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it "converts a string to PascalCase" do | 
					
						
							|  |  |  |       expect(subject.class_s("shell.fm")).to eq("ShellFm") | 
					
						
							|  |  |  |       expect(subject.class_s("s-lang")).to eq("SLang") | 
					
						
							|  |  |  |       expect(subject.class_s("pkg-config")).to eq("PkgConfig") | 
					
						
							|  |  |  |       expect(subject.class_s("foo_bar")).to eq("FooBar") | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it "replaces '@' with 'AT'" do | 
					
						
							|  |  |  |       expect(subject.class_s("openssl@1.1")).to eq("OpensslAT11") | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe "::factory" do | 
					
						
							|  |  |  |     before(:each) do | 
					
						
							|  |  |  |       formula_path.write formula_content | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it "returns a Formula" do | 
					
						
							|  |  |  |       expect(subject.factory(formula_name)).to be_kind_of(Formula) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it "returns a Formula when given a fully qualified name" do | 
					
						
							|  |  |  |       expect(subject.factory("homebrew/core/#{formula_name}")).to be_kind_of(Formula) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it "raises an error if the Formula cannot be found" do | 
					
						
							|  |  |  |       expect { | 
					
						
							|  |  |  |         subject.factory("not_existed_formula") | 
					
						
							|  |  |  |       }.to raise_error(FormulaUnavailableError) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     context "if the Formula has the wrong class" do | 
					
						
							|  |  |  |       let(:formula_name) { "giraffe" } | 
					
						
							|  |  |  |       let(:formula_content) do | 
					
						
							| 
									
										
										
										
											2017-10-15 02:28:32 +02:00
										 |  |  |         <<~EOS | 
					
						
							| 
									
										
										
										
											2017-02-16 02:47:44 +01:00
										 |  |  |           class Wrong#{subject.class_s(formula_name)} < Formula | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         EOS | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it "raises an error" do | 
					
						
							|  |  |  |         expect { | 
					
						
							|  |  |  |           subject.factory(formula_name) | 
					
						
							|  |  |  |         }.to raise_error(FormulaClassUnavailableError) | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it "returns a Formula when given a path" do | 
					
						
							|  |  |  |       expect(subject.factory(formula_path)).to be_kind_of(Formula) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it "returns a Formula when given a URL" do | 
					
						
							| 
									
										
										
										
											2017-07-29 19:55:05 +02:00
										 |  |  |       formula = subject.factory("file://#{formula_path}") | 
					
						
							| 
									
										
										
										
											2017-02-16 02:47:44 +01:00
										 |  |  |       expect(formula).to be_kind_of(Formula) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it "returns a Formula when given a bottle" do | 
					
						
							|  |  |  |       formula = subject.factory(bottle) | 
					
						
							|  |  |  |       expect(formula).to be_kind_of(Formula) | 
					
						
							|  |  |  |       expect(formula.local_bottle_path).to eq(bottle.realpath) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it "returns a Formula when given an alias" do | 
					
						
							|  |  |  |       alias_dir = CoreTap.instance.alias_dir | 
					
						
							|  |  |  |       alias_dir.mkpath | 
					
						
							|  |  |  |       alias_path = alias_dir/"foo" | 
					
						
							|  |  |  |       FileUtils.ln_s formula_path, alias_path | 
					
						
							|  |  |  |       result = subject.factory("foo") | 
					
						
							|  |  |  |       expect(result).to be_kind_of(Formula) | 
					
						
							|  |  |  |       expect(result.alias_path).to eq(alias_path.to_s) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     context "with installed Formula" do | 
					
						
							|  |  |  |       let(:formula) { subject.factory(formula_path) } | 
					
						
							|  |  |  |       let(:installer) { FormulaInstaller.new(formula) } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it "returns a Formula when given a rack" do | 
					
						
							| 
									
										
										
										
											2017-07-29 19:55:05 +02:00
										 |  |  |         installer.install | 
					
						
							| 
									
										
										
										
											2017-02-16 02:47:44 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         f = subject.from_rack(formula.rack) | 
					
						
							|  |  |  |         expect(f).to be_kind_of(Formula) | 
					
						
							|  |  |  |         expect(f.build).to be_kind_of(Tab) | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it "returns a Formula when given a Keg" do | 
					
						
							| 
									
										
										
										
											2017-07-29 19:55:05 +02:00
										 |  |  |         installer.install | 
					
						
							| 
									
										
										
										
											2017-02-16 02:47:44 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         keg = Keg.new(formula.prefix) | 
					
						
							|  |  |  |         f = subject.from_keg(keg) | 
					
						
							|  |  |  |         expect(f).to be_kind_of(Formula) | 
					
						
							|  |  |  |         expect(f.build).to be_kind_of(Tab) | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     context "from Tap" do | 
					
						
							|  |  |  |       let(:tap) { Tap.new("homebrew", "foo") } | 
					
						
							|  |  |  |       let(:formula_path) { tap.path/"#{formula_name}.rb" } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it "returns a Formula when given a name" do | 
					
						
							|  |  |  |         expect(subject.factory(formula_name)).to be_kind_of(Formula) | 
					
						
							|  |  |  |       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" | 
					
						
							|  |  |  |         expect(subject.factory("bar")).to be_kind_of(Formula) | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it "raises an error when the Formula cannot be found" do | 
					
						
							|  |  |  |         expect { | 
					
						
							|  |  |  |           subject.factory("#{tap}/not_existed_formula") | 
					
						
							|  |  |  |         }.to raise_error(TapFormulaUnavailableError) | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it "returns a Formula when given a fully qualified name" do | 
					
						
							|  |  |  |         expect(subject.factory("#{tap}/#{formula_name}")).to be_kind_of(Formula) | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it "raises an error if a Formula is in multiple Taps" do | 
					
						
							|  |  |  |         begin | 
					
						
							|  |  |  |           another_tap = Tap.new("homebrew", "bar") | 
					
						
							|  |  |  |           (another_tap.path/"#{formula_name}.rb").write formula_content | 
					
						
							|  |  |  |           expect { | 
					
						
							|  |  |  |             subject.factory(formula_name) | 
					
						
							|  |  |  |           }.to raise_error(TapFormulaAmbiguityError) | 
					
						
							|  |  |  |         ensure | 
					
						
							|  |  |  |           another_tap.path.rmtree | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   specify "::from_contents" do | 
					
						
							|  |  |  |     expect(subject.from_contents(formula_name, formula_path, formula_content)).to be_kind_of(Formula) | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   specify "::to_rack" do | 
					
						
							|  |  |  |     expect(subject.to_rack(formula_name)).to eq(HOMEBREW_CELLAR/formula_name) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     (HOMEBREW_CELLAR/formula_name).mkpath | 
					
						
							|  |  |  |     expect(subject.to_rack(formula_name)).to eq(HOMEBREW_CELLAR/formula_name) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     expect { | 
					
						
							|  |  |  |       subject.to_rack("a/b/#{formula_name}") | 
					
						
							|  |  |  |     }.to raise_error(TapFormulaUnavailableError) | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe "::find_with_priority" do | 
					
						
							|  |  |  |     let(:core_path) { CoreTap.new.formula_dir/"#{formula_name}.rb" } | 
					
						
							|  |  |  |     let(:tap) { Tap.new("homebrew", "foo") } | 
					
						
							|  |  |  |     let(:tap_path) { tap.path/"#{formula_name}.rb" } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     before(:each) do | 
					
						
							|  |  |  |       core_path.write formula_content | 
					
						
							|  |  |  |       tap_path.write formula_content | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it "prioritizes core Formulae" do | 
					
						
							|  |  |  |       formula = subject.find_with_priority(formula_name) | 
					
						
							|  |  |  |       expect(formula).to be_kind_of(Formula) | 
					
						
							|  |  |  |       expect(formula.path).to eq(core_path) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it "prioritizes Formulae from pinned Taps" do | 
					
						
							|  |  |  |       begin | 
					
						
							|  |  |  |         tap.pin | 
					
						
							| 
									
										
										
										
											2017-07-29 19:55:05 +02:00
										 |  |  |         formula = subject.find_with_priority(formula_name) | 
					
						
							| 
									
										
										
										
											2017-02-16 02:47:44 +01:00
										 |  |  |         expect(formula).to be_kind_of(Formula) | 
					
						
							|  |  |  |         expect(formula.path).to eq(tap_path.realpath) | 
					
						
							|  |  |  |       ensure | 
					
						
							|  |  |  |         tap.pinned_symlink_path.parent.parent.rmtree | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   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" | 
					
						
							|  |  |  |       expect(subject.core_path(name)) | 
					
						
							|  |  |  |         .to eq(Pathname.new("#{HOMEBREW_LIBRARY}/Taps/homebrew/homebrew-core/Formula/#{name}.rb")) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2017-02-16 02:47:44 +01:00
										 |  |  | end |