Allow env DSL to take a block

In addition to

  env :userpaths
  env :std

requirements can now do

  env do
    append 'PATH', '/some/path/to/bin'
    # and more
  end
This commit is contained in:
Jack Nagel 2013-01-19 20:45:57 -06:00
parent d06824c357
commit c53af42117
5 changed files with 65 additions and 26 deletions

View File

@ -17,4 +17,29 @@ class BuildEnvironment
def userpaths? def userpaths?
@settings.include? :userpaths @settings.include? :userpaths
end end
def modify_build_environment
p = @settings.find { |s| Proc === s }
ENV.instance_eval(&p) unless p.nil?
end
def _dump(*)
@settings.dup.reject { |s| Proc === s }.join(":")
end
def self._load(s)
new(*s.split(":").map(&:to_sym))
end
end
module BuildEnvironmentDSL
def env(*settings, &block)
@env ||= BuildEnvironment.new
if block_given?
@env << block
else
settings.each { |s| @env << s }
end
@env
end
end end

View File

@ -170,6 +170,7 @@ end
# By default, Requirements are non-fatal. # By default, Requirements are non-fatal.
class Requirement class Requirement
include Dependable include Dependable
extend BuildEnvironmentDSL
attr_reader :tags attr_reader :tags
@ -186,9 +187,11 @@ class Requirement
# The message to show when the requirement is not met. # The message to show when the requirement is not met.
def message; ""; end def message; ""; end
# Requirements can modify the current build environment by overriding this. # Overriding modify_build_environment is deprecated, pass a block to
# See X11Dependency # the env DSL method instead.
def modify_build_environment; nil end def modify_build_environment
env.modify_build_environment
end
def env def env
@env ||= self.class.env @env ||= self.class.env
@ -206,12 +209,6 @@ class Requirement
def fatal(val=nil) def fatal(val=nil)
val.nil? ? @fatal : @fatal = val val.nil? ? @fatal : @fatal = val
end end
def env(*settings)
@env ||= BuildEnvironment.new
settings.each { |s| @env << s }
@env
end
end end
end end

View File

@ -11,6 +11,7 @@ require 'extend/set'
class Formula class Formula
include FileUtils include FileUtils
extend BuildEnvironmentDSL
attr_reader :name, :path, :homepage, :downloader attr_reader :name, :path, :homepage, :downloader
attr_reader :stable, :bottle, :devel, :head, :active_spec attr_reader :stable, :bottle, :devel, :head, :active_spec
@ -727,12 +728,6 @@ private
@stable.mirror(val) @stable.mirror(val)
end end
def env *settings
@env ||= BuildEnvironment.new
settings.each { |s| @env << s }
@env
end
def dependencies def dependencies
@dependencies ||= DependencyCollector.new @dependencies ||= DependencyCollector.new
end end

View File

@ -19,4 +19,37 @@ class BuildEnvironmentTests < Test::Unit::TestCase
@env << :userpaths @env << :userpaths
assert @env.userpaths? assert @env.userpaths?
end end
def test_modify_build_environment
@env << Proc.new { 1 }
assert_equal 1, @env.modify_build_environment
end
def test_marshal
@env << :userpaths
@env << Proc.new { 1 }
dump = Marshal.dump(@env)
assert Marshal.load(dump).userpaths?
end
end
class BuildEnvironmentDSLTests < Test::Unit::TestCase
def make_instance(&block)
Class.new do
extend BuildEnvironmentDSL
def env; self.class.env end
class_eval(&block)
end.new
end
def test_env_single_argument
obj = make_instance { env :userpaths }
assert obj.env.userpaths?
end
def test_env_multiple_arguments
obj = make_instance { env :userpaths, :std }
assert obj.env.userpaths?
assert obj.env.std?
end
end end

View File

@ -26,17 +26,6 @@ class RequirementTests < Test::Unit::TestCase
assert_equal [:build, "bar"], dep.tags assert_equal [:build, "bar"], dep.tags
end end
def test_dsl_env_single_argument
req = Class.new(Requirement) { env :userpaths }.new
assert req.env.userpaths?
end
def test_dsl_env_multiple_arguments
req = Class.new(Requirement) { env :userpaths, :std }.new
assert req.env.userpaths?
assert req.env.std?
end
def test_dsl_fatal def test_dsl_fatal
req = Class.new(Requirement) { fatal true }.new req = Class.new(Requirement) { fatal true }.new
assert req.fatal? assert req.fatal?