Make spec-scoped resources override top-level resources

This commit is contained in:
Jack Nagel 2013-09-17 21:25:40 -05:00
parent b40b46e3f6
commit 9c7a18bdcb
3 changed files with 37 additions and 2 deletions

View File

@ -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

View File

@ -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) }

View File

@ -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