feat: add dedicated dependency generator artefact

This commit is contained in:
David Bailey 2023-04-14 16:01:56 +02:00
parent 2e05c5fc17
commit f1033f460e

View file

@ -121,11 +121,54 @@ module Comfpile
end
end
included_artefacts.each { |a| include_artefact :parsed, a, wait_if_exists: false }
required_artefacts.each { |a| require_artefact :parsed, a, wait_if_exists: false }
referenced_artefacts.each { |a| reference_artefact :parsed, a, wait_if_exists: false, required: true }
class DependencyAnalysisArtefact < Artefact
attr_reader :dependencies
log "Generated dependencies. Included #{included_artefacts.size}, required #{required_artefacts.size} and referenced #{referenced_artefacts.size}."
def initialize(*args, traverse: nil, **opts)
super(*args, **opts)
parent_artefact :parsed, @target
@dependencies = []
@dependency_processed_artefacts = {}
@dependency_waiting_on = [ @parent_artefact ]
@traverse = traverse || ['include', 'require', 'reference']
add_step do
recursive_dependency_wait_step
end
end
def recursive_dependency_wait_step
dependency_unfurl = @dependency_waiting_on
@dependency_waiting_on = []
loop do
break if dependency_unfurl.empty?
artefact = dependency_unfurl.pop
next if @dependency_processed_artefacts[artefact.target]
@dependencies << artefact
@dependency_processed_artefacts[artefact.target] = true
artefact.parsed_dependencies.each do |key, dep_list|
next unless @traverse.nil? or @traverse.include? key
dep_list.each do |dep_artefact|
if wait_on dep_artefact
@dependency_waiting_on << dep_artefact
else
dependency_unfurl << dep_artefact
end
end
end
end
retry_step! unless @dependency_waiting_on.empty?
end
end
@ -159,12 +202,20 @@ module Comfpile
search_regexes: @search_regexes)
end
def generate_dependency_analysis_artefact(stage, target, **opts)
match = @input_file_regex.match target
return nil if match.nil?
DependencyAnalysisArtefact.new(@core, self, stage, target, **opts)
end
def craft(stage, target)
case stage
when :parsed
generate_parser_artefact(stage, target)
when :dependency_list
nil
when /^dependency_analysis(?:_(.+))?$/
traverse = $1&.split('_')
generate_dependency_analysis_artefact(stage, target, traverse: traverse)
else
nil
end