Align API loading with other formula loading
This commit is contained in:
parent
944d7eebf0
commit
827acd3dc6
@ -28,26 +28,34 @@ module Formulary
|
|||||||
!@factory_cache.nil?
|
!@factory_cache.nil?
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.formula_class_defined?(path)
|
def self.formula_class_defined_from_path?(path)
|
||||||
cache.key?(path)
|
cache.key?(:path) && cache[:path].key?(path)
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.formula_class_get(path)
|
def self.formula_class_defined_from_api?(name)
|
||||||
cache.fetch(path)
|
cache.key?(:api) && cache[:api].key?(name)
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.formula_class_get_from_path(path)
|
||||||
|
cache[:path].fetch(path)
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.formula_class_get_from_api(name)
|
||||||
|
cache[:api].fetch(name)
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.clear_cache
|
def self.clear_cache
|
||||||
cache.each do |key, klass|
|
cache.each do |type, cached_objects|
|
||||||
next if key == :formulary_factory
|
next if type == :formulary_factory
|
||||||
|
|
||||||
namespace = klass.name.deconstantize
|
cached_objects.values.each do |klass|
|
||||||
next if namespace.deconstantize != name
|
namespace = klass.name.deconstantize
|
||||||
|
next if namespace.deconstantize != name
|
||||||
|
|
||||||
remove_const(namespace.demodulize)
|
remove_const(namespace.demodulize)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
remove_const("FormulaNamespaceAPI")
|
|
||||||
|
|
||||||
super
|
super
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -112,7 +120,97 @@ module Formulary
|
|||||||
contents = path.open("r") { |f| ensure_utf8_encoding(f).read }
|
contents = path.open("r") { |f| ensure_utf8_encoding(f).read }
|
||||||
namespace = "FormulaNamespace#{Digest::MD5.hexdigest(path.to_s)}"
|
namespace = "FormulaNamespace#{Digest::MD5.hexdigest(path.to_s)}"
|
||||||
klass = load_formula(name, path, contents, namespace, flags: flags, ignore_errors: ignore_errors)
|
klass = load_formula(name, path, contents, namespace, flags: flags, ignore_errors: ignore_errors)
|
||||||
cache[path] = klass
|
cache[:path] ||= {}
|
||||||
|
cache[:path][path] = klass
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.load_formula_from_api(name, flags:, ignore_errors:)
|
||||||
|
namespace = "FormulaNamespaceAPI#{Digest::MD5.hexdigest(name)}"
|
||||||
|
|
||||||
|
mod = Module.new
|
||||||
|
remove_const(namespace) if const_defined?(namespace)
|
||||||
|
const_set(namespace, mod)
|
||||||
|
|
||||||
|
mod.const_set(:BUILD_FLAGS, flags)
|
||||||
|
|
||||||
|
class_s = Formulary.class_s(name)
|
||||||
|
json_formula = Homebrew::API::Formula.all_formulae[name]
|
||||||
|
|
||||||
|
klass = Class.new(::Formula) do
|
||||||
|
desc json_formula["desc"]
|
||||||
|
homepage json_formula["homepage"]
|
||||||
|
license json_formula["license"]
|
||||||
|
revision json_formula["revision"]
|
||||||
|
version_scheme json_formula["version_scheme"]
|
||||||
|
|
||||||
|
if (urls_stable = json_formula["urls"]["stable"]).present?
|
||||||
|
stable do
|
||||||
|
url urls_stable["url"]
|
||||||
|
version json_formula["versions"]["stable"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if (bottles_stable = json_formula["bottle"]["stable"]).present?
|
||||||
|
bottle do
|
||||||
|
root_url bottles_stable["root_url"]
|
||||||
|
rebuild bottles_stable["rebuild"]
|
||||||
|
bottles_stable["files"].each do |tag, bottle_spec|
|
||||||
|
cellar = bottle_spec["cellar"]
|
||||||
|
cellar = cellar[1..].to_sym if cellar.start_with?(":")
|
||||||
|
sha256 cellar: cellar, tag.to_sym => bottle_spec["sha256"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if (keg_only_reason = json_formula["keg_only_reason"]).present?
|
||||||
|
reason = keg_only_reason["reason"]
|
||||||
|
reason = reason[1..].to_sym if reason.start_with?(":")
|
||||||
|
keg_only reason, keg_only_reason["explanation"]
|
||||||
|
end
|
||||||
|
|
||||||
|
if (deprecation_date = json_formula["deprecation_date"]).present?
|
||||||
|
deprecate! date: deprecation_date, because: json_formula["deprecation_reason"]
|
||||||
|
end
|
||||||
|
|
||||||
|
if (disable_date = json_formula["disable_date"]).present?
|
||||||
|
disable! date: disable_date, because: json_formula["disable_reason"]
|
||||||
|
end
|
||||||
|
|
||||||
|
json_formula["build_dependencies"].each do |dep|
|
||||||
|
depends_on dep => :build
|
||||||
|
end
|
||||||
|
|
||||||
|
json_formula["dependencies"].each do |dep|
|
||||||
|
depends_on dep
|
||||||
|
end
|
||||||
|
|
||||||
|
json_formula["recommended_dependencies"].each do |dep|
|
||||||
|
depends_on dep => :recommended
|
||||||
|
end
|
||||||
|
|
||||||
|
json_formula["optional_dependencies"].each do |dep|
|
||||||
|
depends_on dep => :optional
|
||||||
|
end
|
||||||
|
|
||||||
|
json_formula["uses_from_macos"].each do |dep|
|
||||||
|
dep = dep.deep_transform_values(&:to_sym) if dep.is_a?(Hash)
|
||||||
|
uses_from_macos dep
|
||||||
|
end
|
||||||
|
|
||||||
|
def install
|
||||||
|
raise "Cannot build from source from abstract formula."
|
||||||
|
end
|
||||||
|
|
||||||
|
@caveats_string = json_formula["caveats"]
|
||||||
|
def caveats
|
||||||
|
@caveats_string
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
mod.const_set(class_s, klass)
|
||||||
|
|
||||||
|
cache[:api] ||= {}
|
||||||
|
cache[:api][name] = klass
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.resolve(name, spec: nil, force_bottle: false, flags: [])
|
def self.resolve(name, spec: nil, force_bottle: false, flags: [])
|
||||||
@ -186,8 +284,8 @@ module Formulary
|
|||||||
end
|
end
|
||||||
|
|
||||||
def klass(flags:, ignore_errors:)
|
def klass(flags:, ignore_errors:)
|
||||||
load_file(flags: flags, ignore_errors: ignore_errors) unless Formulary.formula_class_defined?(path)
|
load_file(flags: flags, ignore_errors: ignore_errors) unless Formulary.formula_class_defined_from_path?(path)
|
||||||
Formulary.formula_class_get(path)
|
Formulary.formula_class_get_from_path(path)
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
@ -403,93 +501,17 @@ module Formulary
|
|||||||
end
|
end
|
||||||
|
|
||||||
def klass(flags:, ignore_errors:)
|
def klass(flags:, ignore_errors:)
|
||||||
namespace = "FormulaNamespaceAPI"
|
load_from_api(flags: flags, ignore_errors: ignore_errors) unless Formulary.formula_class_defined_from_api?(name)
|
||||||
mod = if Formulary.const_defined?(namespace)
|
Formulary.formula_class_get_from_api(name)
|
||||||
Formulary.const_get(namespace)
|
end
|
||||||
else
|
|
||||||
Formulary.const_set(namespace, Module.new)
|
|
||||||
end
|
|
||||||
|
|
||||||
mod.send(:remove_const, :BUILD_FLAGS) if mod.const_defined?(:BUILD_FLAGS)
|
private
|
||||||
mod.const_set(:BUILD_FLAGS, flags)
|
|
||||||
|
|
||||||
class_s = Formulary.class_s(name)
|
def load_from_api(flags:, ignore_errors:)
|
||||||
if mod.const_defined?(class_s)
|
$stderr.puts "#{$PROGRAM_NAME} (#{self.class.name}): loading #{name} from API" if debug?
|
||||||
mod.const_get(class_s)
|
# raise FormulaUnavailableError, name unless path.file?
|
||||||
else
|
|
||||||
json_formula = Homebrew::API::Formula.all_formulae[name]
|
|
||||||
klass = Class.new(::Formula) do
|
|
||||||
desc json_formula["desc"]
|
|
||||||
homepage json_formula["homepage"]
|
|
||||||
license json_formula["license"]
|
|
||||||
revision json_formula["revision"]
|
|
||||||
version_scheme json_formula["version_scheme"]
|
|
||||||
|
|
||||||
if (urls_stable = json_formula["urls"]["stable"]).present?
|
Formulary.load_formula_from_api(name, flags: flags, ignore_errors: ignore_errors)
|
||||||
stable do
|
|
||||||
url urls_stable["url"]
|
|
||||||
version json_formula["versions"]["stable"]
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if (bottles_stable = json_formula["bottle"]["stable"]).present?
|
|
||||||
bottle do
|
|
||||||
root_url bottles_stable["root_url"]
|
|
||||||
rebuild bottles_stable["rebuild"]
|
|
||||||
bottles_stable["files"].each do |tag, bottle_spec|
|
|
||||||
cellar = bottle_spec["cellar"]
|
|
||||||
cellar = cellar[1..].to_sym if cellar.start_with?(":")
|
|
||||||
sha256 cellar: cellar, tag.to_sym => bottle_spec["sha256"]
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if (keg_only_reason = json_formula["keg_only_reason"]).present?
|
|
||||||
reason = keg_only_reason["reason"]
|
|
||||||
reason = reason[1..].to_sym if reason.start_with?(":")
|
|
||||||
keg_only reason, keg_only_reason["explanation"]
|
|
||||||
end
|
|
||||||
|
|
||||||
if (deprecation_date = json_formula["deprecation_date"]).present?
|
|
||||||
deprecate! date: deprecation_date, because: json_formula["deprecation_reason"]
|
|
||||||
end
|
|
||||||
|
|
||||||
if (disable_date = json_formula["disable_date"]).present?
|
|
||||||
disable! date: disable_date, because: json_formula["disable_reason"]
|
|
||||||
end
|
|
||||||
|
|
||||||
json_formula["build_dependencies"].each do |dep|
|
|
||||||
depends_on dep => :build
|
|
||||||
end
|
|
||||||
|
|
||||||
json_formula["dependencies"].each do |dep|
|
|
||||||
depends_on dep
|
|
||||||
end
|
|
||||||
|
|
||||||
json_formula["recommended_dependencies"].each do |dep|
|
|
||||||
depends_on dep => :recommended
|
|
||||||
end
|
|
||||||
|
|
||||||
json_formula["optional_dependencies"].each do |dep|
|
|
||||||
depends_on dep => :optional
|
|
||||||
end
|
|
||||||
|
|
||||||
json_formula["uses_from_macos"].each do |dep|
|
|
||||||
dep = dep.deep_transform_values(&:to_sym) if dep.is_a?(Hash)
|
|
||||||
uses_from_macos dep
|
|
||||||
end
|
|
||||||
|
|
||||||
def install
|
|
||||||
raise "Cannot build from source from abstract formula."
|
|
||||||
end
|
|
||||||
|
|
||||||
@caveats_string = json_formula["caveats"]
|
|
||||||
def caveats
|
|
||||||
@caveats_string
|
|
||||||
end
|
|
||||||
end
|
|
||||||
mod.const_set(class_s, klass)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user