aboutsummaryrefslogtreecommitdiffstats
path: root/Library/Homebrew/requirement.rb
diff options
context:
space:
mode:
authorJack Nagel2013-01-26 20:05:39 -0600
committerJack Nagel2013-01-26 20:30:05 -0600
commitadf90691f146fdf3abef3dda6171d38f7fb2cdf7 (patch)
tree7743e337d88cba4084b56b589217f132f99f4207 /Library/Homebrew/requirement.rb
parentf62762b3abc198a927ede15df146f2b40cb86b59 (diff)
downloadbrew-adf90691f146fdf3abef3dda6171d38f7fb2cdf7.tar.bz2
Split dependency classes into separate files
Diffstat (limited to 'Library/Homebrew/requirement.rb')
-rw-r--r--Library/Homebrew/requirement.rb109
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