feat: ✨ properly implement parser engine module
This commit is contained in:
parent
677289647c
commit
379a016621
1 changed files with 44 additions and 66 deletions
|
@ -1,7 +1,8 @@
|
||||||
|
|
||||||
require_relative '../artefact.rb'
|
require_relative '../artefact.rb'
|
||||||
|
require_relative '../artefact_engine.rb'
|
||||||
|
|
||||||
module Compfile
|
module Comfpile
|
||||||
class ParserArtefact < Comfpile::Artefact
|
class ParserArtefact < Comfpile::Artefact
|
||||||
def initialize(*args, **opts)
|
def initialize(*args, **opts)
|
||||||
super(*args)
|
super(*args)
|
||||||
|
@ -34,11 +35,10 @@ module Compfile
|
||||||
|
|
||||||
output
|
output
|
||||||
else
|
else
|
||||||
@parsed_parameters[key] || []
|
@parsed_parameters[keys] || []
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
#
|
|
||||||
# Try to find a relative or absolute source file
|
# Try to find a relative or absolute source file
|
||||||
# artefact.
|
# artefact.
|
||||||
# Used to resolve the include, require and reference
|
# Used to resolve the include, require and reference
|
||||||
|
@ -60,18 +60,16 @@ module Compfile
|
||||||
if(name.is_a? Array)
|
if(name.is_a? Array)
|
||||||
name.map do |n|
|
name.map do |n|
|
||||||
resolve_sourcefile(n, optional: optional)
|
resolve_sourcefile(n, optional: optional)
|
||||||
end
|
end.compact
|
||||||
|
|
||||||
name.compact
|
|
||||||
else
|
else
|
||||||
own_dir = File.dirname(@target)
|
own_dir = File.dirname(@target)
|
||||||
relative_file = File.join(own_dir, name)
|
relative_file = File.join(own_dir, name).gsub(/^\.\//, '')
|
||||||
|
|
||||||
if not craft_artefact(:sourcefile, relative_file).nil?
|
if not craft_artefact(:sourcefile, relative_file).nil?
|
||||||
relative_file
|
relative_file
|
||||||
elsif not craft_artefact(:sourcefile, name).nil?
|
elsif not craft_artefact(:sourcefile, name).nil?
|
||||||
name
|
name
|
||||||
elsif optional
|
elsif not optional
|
||||||
relative_file
|
relative_file
|
||||||
else
|
else
|
||||||
nil
|
nil
|
||||||
|
@ -82,94 +80,73 @@ module Compfile
|
||||||
def sourcefile_parse_step
|
def sourcefile_parse_step
|
||||||
log "Parsing file #{@target}..."
|
log "Parsing file #{@target}..."
|
||||||
|
|
||||||
|
param_count = 0
|
||||||
|
|
||||||
File.readlines(@parent_artefact[:file]).each do |line|
|
File.readlines(@parent_artefact[:file]).each do |line|
|
||||||
@search_regexes.each do |r|
|
@search_regexes.each do |r|
|
||||||
match = r.match line
|
next if r[:regex].nil?
|
||||||
next if match.nil?
|
|
||||||
|
|
||||||
key = match[:key]
|
match = r[:regex].match line
|
||||||
value = match[:value]
|
next if match.nil?
|
||||||
|
match = match.named_captures
|
||||||
|
|
||||||
|
key = match['key'] || r[:key]
|
||||||
|
value = match['value'] || r[:value]
|
||||||
|
|
||||||
next if key.nil?
|
next if key.nil?
|
||||||
|
|
||||||
log "Found k/v pair: '#{key}' '#{value}'", :debug
|
log "Found k/v pair: '#{key}' '#{value}'", :debug
|
||||||
|
param_count += 1
|
||||||
|
|
||||||
@parsed_parameters[key] ||= []
|
@parsed_parameters[key] ||= []
|
||||||
@parsed_parameters[key] << value
|
@parsed_parameters[key] << value
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
log "Parsing completed, found #{@parsed_parameters.keys.size} parameters!"
|
log "Parsing completed, found #{param_count} parameters!"
|
||||||
end
|
end
|
||||||
|
|
||||||
def sourcefile_dependency_step
|
def sourcefile_dependency_step
|
||||||
included_artefacts = resolve_sourcefile find_parsed_parameters 'include'
|
included_artefacts = resolve_sourcefile find_parsed_parameters('include'), optional: true
|
||||||
required_artefacts = resolve_sourcefile find_parsed_parameters 'require'
|
required_artefacts = resolve_sourcefile find_parsed_parameters('require')
|
||||||
referenced_artefacts = resolve_sourcefile find_parsed_parameters 'reference'
|
referenced_artefacts = resolve_sourcefile find_parsed_parameters('reference')
|
||||||
|
|
||||||
included_artefacts.each { |a| include_artefact :parsed, a }
|
included_artefacts.each { |a| include_artefact :parsed, a, wait_if_exists: false }
|
||||||
required_artefacts.each { |a| require_artefact :parsed, a }
|
required_artefacts.each { |a| require_artefact :parsed, a, wait_if_exists: false }
|
||||||
referenced_artefacts.each { |a| reference_artefact :parsed, a }
|
referenced_artefacts.each { |a| reference_artefact :parsed, a, wait_if_exists: false, required: true }
|
||||||
|
|
||||||
log "Generated dependencies. Included #{included_artefacts.size}, required #{required_artefact.size} and referenced #{referenced_artefacts.size}."
|
log "Generated dependencies. Included #{included_artefacts.size}, required #{required_artefacts.size} and referenced #{referenced_artefacts.size}."
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
class ParserEngine < ArtefactEngine
|
class ParserEngine < ArtefactEngine
|
||||||
|
#
|
||||||
|
# Initialize a new ParserEngine
|
||||||
|
#
|
||||||
|
# This engine has the task of generating single-file parser artefacts,
|
||||||
|
# which check for comfpile parameters that will be extracted from the sourcefile.
|
||||||
|
# Each file will recursively craft other files it requires and add them, either as
|
||||||
|
# fully included, required, or referenced file.
|
||||||
|
#
|
||||||
|
# @param [<Type>] core <description>
|
||||||
|
# @param [<Type>] **options <description>
|
||||||
|
#
|
||||||
def initialize(core, **options)
|
def initialize(core, **options)
|
||||||
super(core, **options)
|
super(core, **options)
|
||||||
|
|
||||||
@input_file_regex = options[:allowed_files]
|
@input_file_regex = options[:file_regex]
|
||||||
|
@search_regexes = options[:search_regexes]
|
||||||
|
|
||||||
@require_regex = options[:require_reg]
|
raise ArgumentError, "Missing input file regex!" unless @input_file_regex.is_a? Regexp
|
||||||
@include_regex = options[:include_reg]
|
raise ArgumentError, "Missing regex parsing array!" unless @search_regexes.is_a? Array
|
||||||
end
|
end
|
||||||
|
|
||||||
def generate_parser_artefact(stage, target)
|
def generate_parser_artefact(stage, target)
|
||||||
match = @input_file_regex.match target
|
match = @input_file_regex.match target
|
||||||
return nil if match.nil?
|
return nil if match.nil?
|
||||||
|
|
||||||
a = Artefact.new(@core, self, stage, target)
|
ParserArtefact.new(@core, self, stage, target,
|
||||||
|
search_regexes: @search_regexes)
|
||||||
a.parent_artefact(:sourcefile, target)
|
|
||||||
|
|
||||||
a.add_step do
|
|
||||||
|
|
||||||
@parameters[:included_files] = []
|
|
||||||
@parameters[:required_files] = []
|
|
||||||
|
|
||||||
File.readlines(@parent_artefact[:file]) do |l|
|
|
||||||
case l
|
|
||||||
when @require_regex
|
|
||||||
filename = $~[:file]
|
|
||||||
|
|
||||||
own_dir = File.dirname(@target)
|
|
||||||
relative_file = File.join(own_dir, filename)
|
|
||||||
|
|
||||||
unless craft_artefact(:sourcefile, relative_file).nil?
|
|
||||||
@parameters[:required_files] << require_artefact(:parsed, relative_file)
|
|
||||||
else
|
|
||||||
@parameters[:required_files] << require_artefact(:parsed, filename)
|
|
||||||
end
|
|
||||||
|
|
||||||
when @include_regex
|
|
||||||
filename = $~[:file]
|
|
||||||
|
|
||||||
own_dir = File.dirname(@target)
|
|
||||||
relative_file = File.join(own_dir, filename)
|
|
||||||
|
|
||||||
unless craft_artefact(:sourcefile, relative_file).nil?
|
|
||||||
@parameters[:included_files] << craft_artefact(:parsed, relative_file)
|
|
||||||
else
|
|
||||||
@parameters[:included_files] << craft_artefact(:parsed, filename)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def generate_dependency_artefact(stage, target)
|
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def craft(stage, target)
|
def craft(stage, target)
|
||||||
|
@ -177,9 +154,10 @@ module Compfile
|
||||||
when :parsed
|
when :parsed
|
||||||
generate_parser_artefact(stage, target)
|
generate_parser_artefact(stage, target)
|
||||||
when :dependency_list
|
when :dependency_list
|
||||||
|
nil
|
||||||
else
|
else
|
||||||
nil
|
nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
end
|
Loading…
Add table
Add a link
Reference in a new issue