diff options
| author | Jack Nagel | 2013-01-26 20:05:39 -0600 |
|---|---|---|
| committer | Jack Nagel | 2013-01-26 20:30:05 -0600 |
| commit | adf90691f146fdf3abef3dda6171d38f7fb2cdf7 (patch) | |
| tree | 7743e337d88cba4084b56b589217f132f99f4207 /Library/Homebrew/requirement.rb | |
| parent | f62762b3abc198a927ede15df146f2b40cb86b59 (diff) | |
| download | brew-adf90691f146fdf3abef3dda6171d38f7fb2cdf7.tar.bz2 | |
Split dependency classes into separate files
Diffstat (limited to 'Library/Homebrew/requirement.rb')
| -rw-r--r-- | Library/Homebrew/requirement.rb | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/Library/Homebrew/requirement.rb b/Library/Homebrew/requirement.rb new file mode 100644 index 000000000..074d6ce07 --- /dev/null +++ b/Library/Homebrew/requirement.rb @@ -0,0 +1,109 @@ +require 'dependable' +require 'build_environment' + +# A base class for non-formula requirements needed by formulae. +# A "fatal" requirement is one that will fail the build if it is not present. +# By default, Requirements are non-fatal. +class Requirement + include Dependable + extend BuildEnvironmentDSL + + attr_reader :tags + + def initialize(*tags) + @tags = tags.flatten.compact + @tags << :build if self.class.build + end + + # The message to show when the requirement is not met. + def message; "" end + + # Overriding #satisfied? is deprepcated. + # Pass a block or boolean to the satisfied DSL method instead. + def satisfied? + result = self.class.satisfy.yielder do |proc| + instance_eval(&proc) + end + + infer_env_modification(result) + !!result + end + + # Overriding #fatal? is deprecated. + # Pass a boolean to the fatal DSL method instead. + def fatal? + self.class.fatal || false + end + + # Overriding #modify_build_environment is deprecated. + # Pass a block to the the env DSL method instead. + def modify_build_environment + satisfied? and env.modify_build_environment(self) + end + + def env + @env ||= self.class.env + end + + def eql?(other) + other.is_a?(self.class) && hash == other.hash + end + + def hash + message.hash + end + + private + + def infer_env_modification(o) + case o + when Pathname + self.class.env do + unless ENV["PATH"].split(":").include?(o.parent.to_s) + append("PATH", o.parent, ":") + end + end + end + end + + class << self + def fatal(val=nil) + val.nil? ? @fatal : @fatal = val + end + + def build(val=nil) + val.nil? ? @build : @build = val + end + + def satisfy(options={}, &block) + @satisfied ||= Requirement::Satisfier.new(options, &block) + end + end + + class Satisfier + def initialize(options={}, &block) + case options + when Hash + @options = { :build_env => true } + @options.merge!(options) + else + @satisfied = options + end + @proc = block + end + + def yielder + if instance_variable_defined?(:@satisfied) + @satisfied + elsif @options[:build_env] + require 'superenv' + ENV.with_build_environment do + ENV.userpaths! + yield @proc + end + else + yield @proc + end + end + end +end |
