From 9c7a18bdcb76630ba6649a90cbee020181eb382c Mon Sep 17 00:00:00 2001 From: Jack Nagel Date: Tue, 17 Sep 2013 21:25:40 -0500 Subject: [PATCH] Make spec-scoped resources override top-level resources --- Library/Homebrew/formula.rb | 4 ++- Library/Homebrew/software_spec.rb | 6 ++++- Library/Homebrew/test/test_software_spec.rb | 29 +++++++++++++++++++++ 3 files changed, 37 insertions(+), 2 deletions(-) diff --git a/Library/Homebrew/formula.rb b/Library/Homebrew/formula.rb index d0d2338804..6b14aba250 100644 --- a/Library/Homebrew/formula.rb +++ b/Library/Homebrew/formula.rb @@ -711,7 +711,9 @@ class Formula # Define a named resource using a SoftwareSpec style block def resource name, &block - specs.each { |spec| spec.resource(name, &block) } + specs.each do |spec| + spec.resource(name, &block) unless spec.resource?(name) + end end def dependencies diff --git a/Library/Homebrew/software_spec.rb b/Library/Homebrew/software_spec.rb index eedbf47b4a..7b4004ecbb 100644 --- a/Library/Homebrew/software_spec.rb +++ b/Library/Homebrew/software_spec.rb @@ -23,9 +23,13 @@ class SoftwareSpec resources.each_value { |r| r.owner = owner } end + def resource? name + resources.has_key?(name) + end + def resource name, &block if block_given? - raise DuplicateResourceError.new(name) if resources.has_key?(name) + raise DuplicateResourceError.new(name) if resource?(name) resources[name] = Resource.new(name, &block) else resources.fetch(name) { raise ResourceMissingError.new(owner, name) } diff --git a/Library/Homebrew/test/test_software_spec.rb b/Library/Homebrew/test/test_software_spec.rb index 7d67d90d3a..febd33b398 100644 --- a/Library/Homebrew/test/test_software_spec.rb +++ b/Library/Homebrew/test/test_software_spec.rb @@ -2,6 +2,35 @@ require 'testing_env' require 'software_spec' require 'bottles' +class SoftwareSpecTests < Test::Unit::TestCase + def setup + @spec = SoftwareSpec.new + end + + def test_resource + @spec.resource('foo') { url 'foo-1.0' } + assert @spec.resource?('foo') + end + + def test_raises_when_duplicate_resources_are_defined + @spec.resource('foo') { url 'foo-1.0' } + assert_raises(DuplicateResourceError) do + @spec.resource('foo') { url 'foo-1.0' } + end + end + + def test_raises_when_accessing_missing_resources + assert_raises(ResourceMissingError) { @spec.resource('foo') } + end + + def test_resource_owner + owner = Object.new + @spec.resource('foo') { url 'foo-1.0' } + @spec.owner = owner + @spec.resources.each_value { |r| assert_equal owner, r.owner } + end +end + class HeadSoftwareSpecTests < Test::Unit::TestCase include VersionAssertions