esp32-s2_dfu/tests/vendor/ceedling/plugins/module_generator/lib/module_generator.rb

144 lines
4.5 KiB
Ruby

require 'plugin'
require 'constants'
require 'erb'
require 'fileutils'
class ModuleGenerator < Plugin
attr_reader :config
def setup
#---- New module templates
@test_template = (<<-EOS).left_margin
#include "unity.h"
<%if defined?(MODULE_GENERATOR_TEST_INCLUDES) && (MODULE_GENERATOR_TEST_INCLUDES.class == Array) && !MODULE_GENERATOR_TEST_INCLUDES.empty?%>
<%MODULE_GENERATOR_TEST_INCLUDES.each do |header_file|%>
#include "<%=header_file%>"
<%end%>
<%end%>
#include "<%=@context[:headername]%>"
void setUp(void)
{
}
void tearDown(void)
{
}
void test_<%=name%>_needs_to_be_implemented(void)
{
<%="\t"%>TEST_IGNORE_MESSAGE("Implement me!");
}
EOS
@source_template = (<<-EOS).left_margin
<%if defined?(MODULE_GENERATOR_SOURCE_INCLUDES) && (MODULE_GENERATOR_SOURCE_INCLUDES.class == Array) && !MODULE_GENERATOR_SOURCE_INCLUDES.empty?%>
<%MODULE_GENERATOR_SOURCE_INCLUDES.each do |header_file|%>
#include "<%=header_file%>"
<%end%>
<%end%>
#include "<%=@context[:headername]%>"
EOS
@header_template = (<<-EOS).left_margin
#ifndef <%=@context[:name]%>_H
#define <%=@context[:name]%>_H
<%if defined?(MODULE_GENERATOR_HEADER_INCLUDES) && (MODULE_GENERATOR_HEADER_INCLUDES.class == Array) && !MODULE_GENERATOR_HEADER_INCLUDES.empty?%>
<%MODULE_GENERATOR_HEADER_INCLUDES.each do |header_file|%>
#include "<%=header_file%>"
<%end%>
<%end%>
#endif // <%=@context[:name]%>_H
EOS
end
def create(path, optz={})
extract_context(path, optz)
if !optz.nil? && (optz[:destroy] == true)
@ceedling[:streaminator].stdout_puts "Destroying '#{path}'..."
@files.each do |file|
if File.exist?(file[:path])
@ceedling[:streaminator].stdout_puts "File #{file[:path]} deleted"
else
@ceedling[:streaminator].stdout_puts "File #{file[:path]} does not exist!"
end
end
exit
end
@ceedling[:streaminator].stdout_puts "Generating '#{path}'..."
[File.dirname(@files[0][:path]), File.dirname(@files[1][:path])].each do |dir|
makedirs(dir, {:verbose => true})
end
# define_name = headername.gsub(/\.h$/, '_H').upcase
@files[0][:template] = @test_template
@files[1][:template] = @source_template
@files[2][:template] = @header_template
@files.each do |file|
if File.exist?(file[:path])
@ceedling[:streaminator].stdout_puts "File #{file[:path]} already exists!"
else
File.open(file[:path], 'w') do |new_file|
new_file << ERB.new(file[:template], 0, "<>").result(binding)
end
@ceedling[:streaminator].stdout_puts "File #{file[:path]} created"
end
end
end
private
def extract_context(path, optz={})
if (!defined?(MODULE_GENERATOR_PROJECT_ROOT) ||
!defined?(MODULE_GENERATOR_SOURCE_ROOT) ||
!defined?(MODULE_GENERATOR_TEST_ROOT))
raise "You must have ':module_generator:project_root:', ':module_generator:source_root:' and ':module_generator:test_root:' defined in your Ceedling configuration file"
end
@context = {}
@context[:paths] = {
:base => @ceedling[:file_wrapper].get_expanded_path(MODULE_GENERATOR_PROJECT_ROOT).gsub('\\', '/').sub(/^\//, '').sub(/\/$/, ''),
:src => MODULE_GENERATOR_SOURCE_ROOT.gsub('\\', '/').sub(/^\//, '').sub(/\/$/, ''),
:test => MODULE_GENERATOR_TEST_ROOT.gsub('\\', '/').sub(/^\//, '').sub(/\/$/, '')
}
location = File.dirname(path.gsub('\\', '/'))
location.sub!(/^\/?#{@context[:paths][:base]}\/?/i, '')
location.sub!(/^\/?#{@context[:paths][:src]}\/?/i, '')
location.sub!(/^\/?#{@context[:paths][:test]}\/?/i, '')
@context[:location] = location
@context[:name] = File.basename(path).sub(/\.[ch]$/, '')
# p @context[:name]
@context[:testname] = "test_#{@context[:name]}.c"
@context[:sourcename] = "#{@context[:name]}.c"
@context[:headername] = "#{@context[:name]}.h"
# p @context
@files = [
{:path => File.join(MODULE_GENERATOR_PROJECT_ROOT, @context[:paths][:test], location, @context[:testname])},
{:path => File.join(MODULE_GENERATOR_PROJECT_ROOT, @context[:paths][:src], location, @context[:sourcename])},
{:path => File.join(MODULE_GENERATOR_PROJECT_ROOT, @context[:paths][:src], location, @context[:headername])}
]
# p @files
end
end