feat: ✨ add dedicated dependency generator artefact
This commit is contained in:
parent
2e05c5fc17
commit
f1033f460e
1 changed files with 57 additions and 6 deletions
|
@ -121,11 +121,54 @@ module Comfpile
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
included_artefacts.each { |a| include_artefact :parsed, a, wait_if_exists: false }
|
class DependencyAnalysisArtefact < Artefact
|
||||||
required_artefacts.each { |a| require_artefact :parsed, a, wait_if_exists: false }
|
attr_reader :dependencies
|
||||||
referenced_artefacts.each { |a| reference_artefact :parsed, a, wait_if_exists: false, required: true }
|
|
||||||
|
|
||||||
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
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -159,12 +202,20 @@ module Comfpile
|
||||||
search_regexes: @search_regexes)
|
search_regexes: @search_regexes)
|
||||||
end
|
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)
|
def craft(stage, target)
|
||||||
case stage
|
case stage
|
||||||
when :parsed
|
when :parsed
|
||||||
generate_parser_artefact(stage, target)
|
generate_parser_artefact(stage, target)
|
||||||
when :dependency_list
|
when /^dependency_analysis(?:_(.+))?$/
|
||||||
nil
|
traverse = $1&.split('_')
|
||||||
|
generate_dependency_analysis_artefact(stage, target, traverse: traverse)
|
||||||
else
|
else
|
||||||
nil
|
nil
|
||||||
end
|
end
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue