class Viperaptor::ModuleTemplate

Represents a single Viperaptor module template

Attributes

code_files[R]
custom_parameters[R]
dependencies[R]
template_name[R]
template_path[R]
test_files[R]

Public Class Methods

new(name, options = nil) click to toggle source
# File lib/viperaptor/code_generation/module_template.rb, line 80
def initialize(name, options = nil)
  spec_path = TemplateHelper.obtain_spec(name)

  unless options
    spec = YAML.load_file(spec_path)
  else
    spec_source = IO.read(spec_path)
    spec_template = Liquid::Template.parse(spec_source)
    spec_content = spec_template.render(options)
    spec = YAML.load(spec_content)
  end

  viperaptor = spec[TEMPLATE_VIPERAPTOR_KEY]
  if !viperaptor.nil? && Gem::Version.new(Viperaptor::VERSION) < Gem::Version.new(viperaptor)
    puts("ERROR: Your viperaptor version is '#{Viperaptor::VERSION}' template requires '#{viperaptor}'. Please update it.".red)
    exit(1)
  end

  custom_parameters = load_custom_parameters_from_spec(spec)

  if !custom_parameters.empty? && !options.nil?
    spec_source = IO.read(spec_path)
    spec_template = Liquid::Template.parse(spec_source)

    if options["custom_parameters"].nil?
      options["custom_parameters"] = {}
    end

    new_options = options["custom_parameters"].merge(custom_parameters)

    new_options.each_key do |k|
      options["custom_parameters"][k] = new_options[k]
    end

    spec_content = spec_template.render(options)
    spec = YAML.load(spec_content)
  end

  @custom_parameters = options["custom_parameters"]
  @code_files = spec[TEMPLATE_CODE_FILES_KEY]
  @test_files = spec[TEMPLATE_TEST_FILES_KEY]
  @template_name = spec[TEMPLATE_NAME_KEY]
  @template_path = TemplateHelper.obtain_path(name)
  @dependencies = spec[TEMPLATE_DEPENDENCIES_KEY]
end

Public Instance Methods

load_custom_parameters_from_spec(spec) click to toggle source
# File lib/viperaptor/code_generation/module_template.rb, line 10
def load_custom_parameters_from_spec(spec)
  custom_parameters = spec[TEMPLATE_CUSTOM_PARAMETERS_KEY]
  result = {}
  unless custom_parameters.nil?
    custom_parameters.sort_by { |a| (a["order"] || 0) }.each do |desc|
      skip = false

      if !desc["only_if"].nil? && desc["only_if"].is_a?(Hash)
        desc["only_if"].each do |key, value|
          if value.is_a?(Array)
            if result[key].nil?
              puts("ERROR: Required custom_parameter '#{key}' not defined".red)
              exit(1)
            end

            if !value.include?(result[key])
              skip = true
              break
            end
          end
        end
      end

      if !skip
        if !desc["only_if"].nil? && desc["only_if_not"].is_a?(Hash)
          desc["only_if"].each do |key, value|
            if value.is_a?(Array)
              if result[key].nil?
                break
              end

              if value.include?(result[key])
                skip = true
                break
              end
            end
          end
        end
      end

      if !skip
        if desc["options"].instance_of?(Array)
          prompt = TTY::Prompt.new
          choices = desc["options"]
          value = prompt.select("#{desc["description"]}?", choices, per_page: choices.count)

          case value
          when "yes"
            value = "true"
          when "no"
            value = "false"
          else
            #
          end

          result[desc["name"]] = value
        elsif desc["options"].nil?
          prompt = TTY::Prompt.new
          value = prompt.ask("#{desc["description"]}?")
          result[desc["name"]] = value
        else
          puts("ERROR: Invalid variable 'options' of template custom parameter '#{desc["name"]}'".red)
          exit(1)
        end
      end
    end
  end
  return result
end