Isolate formula class namespaces
Closes Homebrew/homebrew#40151. Closes Homebrew/homebrew#40203.
This commit is contained in:
parent
bd5083f970
commit
45a71898e8
@ -32,8 +32,6 @@ class FormulaVersions
|
||||
path = Pathname.pwd.join("#{name}.rb")
|
||||
path.write file_contents_at_revision(rev)
|
||||
|
||||
old_const = Formulary.unload_formula(name)
|
||||
|
||||
begin
|
||||
nostdout { yield Formulary.factory(path.to_s) }
|
||||
rescue *IGNORED_EXCEPTIONS => e
|
||||
@ -42,8 +40,6 @@ class FormulaVersions
|
||||
ohai "#{e} in #{name} at revision #{rev}", e.backtrace if ARGV.debug?
|
||||
rescue FormulaUnavailableError
|
||||
# Suppress this error
|
||||
ensure
|
||||
Formulary.restore_formula(name, old_const)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@ -2,47 +2,30 @@
|
||||
# It is not meant to be used directy from formulae.
|
||||
|
||||
class Formulary
|
||||
module Formulae
|
||||
class << self
|
||||
if instance_method(:const_defined?).arity == -1
|
||||
def formula_const_defined?(name)
|
||||
const_defined?(name, false)
|
||||
end
|
||||
FORMULAE = {}
|
||||
|
||||
def formula_const_get(name)
|
||||
const_get(name, false)
|
||||
end
|
||||
else
|
||||
def formula_const_defined?(name)
|
||||
const_defined?(name)
|
||||
end
|
||||
def self.formula_class_defined?(path)
|
||||
FORMULAE.key?(path)
|
||||
end
|
||||
|
||||
def formula_const_get(name)
|
||||
const_get(name)
|
||||
end
|
||||
end
|
||||
def self.formula_class_get(path)
|
||||
FORMULAE.fetch(path)
|
||||
end
|
||||
|
||||
def remove_formula_const(name)
|
||||
remove_const(name)
|
||||
end
|
||||
def self.load_formula(name, path)
|
||||
mod = Module.new
|
||||
mod.module_eval(path.read, path)
|
||||
class_name = class_s(name)
|
||||
|
||||
def formula_const_set(name, value)
|
||||
const_set(name, value)
|
||||
end
|
||||
begin
|
||||
klass = mod.const_get(class_name)
|
||||
rescue NameError => e
|
||||
raise FormulaUnavailableError, name, e.backtrace
|
||||
else
|
||||
FORMULAE[path] = klass
|
||||
end
|
||||
end
|
||||
|
||||
def self.unload_formula formula_name
|
||||
Formulae.remove_formula_const(class_s(formula_name))
|
||||
end
|
||||
|
||||
def self.restore_formula formula_name, value
|
||||
old_verbose, $VERBOSE = $VERBOSE, nil
|
||||
Formulae.formula_const_set(class_s(formula_name), value)
|
||||
ensure
|
||||
$VERBOSE = old_verbose
|
||||
end
|
||||
|
||||
def self.class_s name
|
||||
class_name = name.capitalize
|
||||
class_name.gsub!(/[-_.\s]([a-zA-Z0-9])/) { $1.upcase }
|
||||
@ -57,13 +40,10 @@ class Formulary
|
||||
attr_reader :name
|
||||
# The formula's ruby file's path or filename
|
||||
attr_reader :path
|
||||
# The ruby constant name of the formula's class
|
||||
attr_reader :class_name
|
||||
|
||||
def initialize(name, path)
|
||||
@name = name
|
||||
@path = path.resolved_path
|
||||
@class_name = Formulary.class_s(name)
|
||||
end
|
||||
|
||||
# Gets the formula instance.
|
||||
@ -72,16 +52,8 @@ class Formulary
|
||||
end
|
||||
|
||||
def klass
|
||||
begin
|
||||
have_klass = Formulae.formula_const_defined?(class_name)
|
||||
rescue NameError => e
|
||||
raise unless e.name.to_s == class_name
|
||||
raise FormulaUnavailableError, name, e.backtrace
|
||||
end
|
||||
|
||||
load_file unless have_klass
|
||||
|
||||
Formulae.formula_const_get(class_name)
|
||||
load_file unless Formulary.formula_class_defined?(path)
|
||||
Formulary.formula_class_get(path)
|
||||
end
|
||||
|
||||
private
|
||||
@ -89,7 +61,7 @@ class Formulary
|
||||
def load_file
|
||||
STDERR.puts "#{$0} (#{self.class.name}): loading #{path}" if ARGV.debug?
|
||||
raise FormulaUnavailableError.new(name) unless path.file?
|
||||
Formulae.module_eval(path.read, path)
|
||||
Formulary.load_formula(name, path)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user