class CapicuaGen::TemplateFeature

Es un tipo de característica especial que se basa en generación de código a travez de plantillas

Attributes

template_directories[RW]
template_targets[RW]

Relacion de las Template con los objetivos

templates[RW]

Plantillas (archivos *.erb)

Public Class Methods

new(atributes= {}) click to toggle source

Inicializo el objeto

Calls superclass method CapicuaGen::Feature::new
# File lib/CapicuaGen/template_feature.rb, line 46
def initialize(atributes= {})
  super(atributes)


  # Define las interfaces del proyectowh
  @templates           = []

  # Define los objetivos concretos de los templates
  @template_targets    = []

  # Directorios donde conseguir los templates
  @template_directories= []

end

Private Class Methods

inherited(subclass) click to toggle source

Called from b.rb at `class A < B`. `subclass` is the Class object B. This method makes sure every subclass (class B, class C…) has get_file defined correctly for instances of the subclass.

# File lib/CapicuaGen/template_feature.rb, line 332
def self.inherited (subclass)
  subclass.instance_eval do
    # This array contains strings like "/path/to/a.rb:3:in `instance_eval'".
    strings_ary   = caller

    # We look for the last string containing "<top (required)>".
    require_index = strings_ary.index { |x| x.include?("<top (required)>") }
    require_string= strings_ary[require_index]

    # We use a regex to extract the filepath from require_string.
    filepath      = require_string[/^(.*):\d+:in `<top \(required\)>'/, 1]

    # This defines the method #get_file for instances of `subclass`.
    define_method(:get_class_file) { filepath }
  end
end

Public Instance Methods

add_template(template) click to toggle source

Agrega una característica en el generador

# File lib/CapicuaGen/template_feature.rb, line 68
def add_template(template)
  @templates<<template
end
add_template_target(template_target) click to toggle source

Agrega una template_target en el generador

# File lib/CapicuaGen/template_feature.rb, line 100
def add_template_target(template_target)
  @template_targets<<template_target
end
clean() click to toggle source
Calls superclass method CapicuaGen::Feature#clean
# File lib/CapicuaGen/template_feature.rb, line 183
def clean
  super()

  message_helper.add_indent

  # Genera una a una todas los objetivos de los templates
  self.template_targets.each do |t|
    clean_template_target(t)
  end

  message_helper.remove_indent
  puts
end
configure_template_directories() click to toggle source
# File lib/CapicuaGen/template_feature.rb, line 148
def configure_template_directories
  # Configuro las rutas de los templates
  template_local_dir = get_template_local_dir(get_class_file)
  self.template_directories << template_local_dir if template_local_dir
  self.template_directories << File.join(File.dirname(get_class_file), '../template')

end
configure_template_targets() click to toggle source

Configura los objetivos de las platillas (despues de establecer el generador)

# File lib/CapicuaGen/template_feature.rb, line 157
def configure_template_targets

end
generate() click to toggle source

Genero el código, usando todas las plantillas configuradas

Calls superclass method CapicuaGen::Feature#generate
# File lib/CapicuaGen/template_feature.rb, line 162
def generate
  super()

  message_helper.add_indent

  # Genera una a una todas los objetivos de los templates
  self.template_targets.each do |t|
    begin
      generate_template_target(t)
    rescue => e
      error_message="Error en #{t.inspect}"
      message_helper.puts_error_message error_message
      message_helper.remove_indent
      raise e
    end
  end

  message_helper.remove_indent
  puts
end
generator=(value) click to toggle source

Configura el generador y se

Calls superclass method CapicuaGen::Feature#generator=
# File lib/CapicuaGen/template_feature.rb, line 137
def generator= (value)
  super(value)

  if @generator
    configure_template_directories()
    configure_template_targets()
  end

end
get_template_by_name(template_name) click to toggle source

Obtiene la característica en base al nombre

# File lib/CapicuaGen/template_feature.rb, line 90
def get_template_by_name(template_name)
  return @templates.detect { |f| f.name==template_name }
end
get_template_target_by_name(template_target_name) click to toggle source

Obtiene la template_target en base al nombre

# File lib/CapicuaGen/template_feature.rb, line 132
def get_template_target_by_name(template_target_name)
  return @template_targets.detect { |f| f.name==template_target_name }
end
remove_template(template) click to toggle source

Quita la característica

# File lib/CapicuaGen/template_feature.rb, line 80
def remove_template(template)
  @templates.delete(template)
end
remove_template_by_name(template_name) click to toggle source

Quita la caracterisitca en base al nombre

# File lib/CapicuaGen/template_feature.rb, line 85
def remove_template_by_name(template_name)
  @templates.delete_if { |f| f.name==template_name }
end
remove_template_target(template_target) click to toggle source

Quita la template_target

# File lib/CapicuaGen/template_feature.rb, line 122
def remove_template_target(template_target)
  @template_targets.delete(template_target)
end
remove_template_target_by_name(template_target_name) click to toggle source

Quita la caracterisitca en base al nombre

# File lib/CapicuaGen/template_feature.rb, line 127
def remove_template_target_by_name(template_target_name)
  @template_targets.delete_if { |f| f.name==template_target_name }
end
set_template(name, template) click to toggle source

Agrega una característica en el generador

# File lib/CapicuaGen/template_feature.rb, line 73
def set_template(name, template)
  remove_template_by_name(name)
  template.name= name
  @templates<<template
end
set_template_target(name, template_target) click to toggle source

Agrega una template_target en el generador

# File lib/CapicuaGen/template_feature.rb, line 105
def set_template_target(name, template_target)
  remove_template_target_by_name(name)
  template_target.name= name
  if name=~ /^([^\/]+)\//
    template_target.template_name= $1
  else
    template_target.template_name= name unless template_target.template_name
  end

  @template_targets<<template_target

  # Devuelve el template recien configurado
  return template_target

end

Protected Instance Methods

clean_template_target(template_target, current_binding= nil) click to toggle source

Limpio el resultado de una plantilla (borro archivos)

# File lib/CapicuaGen/template_feature.rb, line 252
def clean_template_target(template_target, current_binding= nil)

  # Localizo la plantilla
  template= self.get_template_by_name(template_target.template_name)

  # Obtengo la salida
  if template_target.out_file.blank?
    return
  else
    out_file= File.join(self.generation_attributes[:out_dir], template_target.out_file)
  end

  return if !File.exist?(out_file)

  # Elimino el archivo
  File.delete(out_file)

  message_helper.puts_created_template(File.basename(template.file), out_file, :delete)


end
generate_template_target(template_target, current_binding= nil) click to toggle source

Genero una plantilla en particular

# File lib/CapicuaGen/template_feature.rb, line 201
def generate_template_target(template_target, current_binding= nil)

  # Localizo la plantilla
  template     = self.get_template_by_name(template_target.template_name)

  # Obtengo el archivo del template
  template_file= ''
  @template_directories.each do |template_directory|
    template_file= File.join(template_directory, template.file)
    break if File.exist?(template_file)
  end


  # Obtengo la salida
  if template_target.out_file.blank?
    out_file= nil
  else
    out_file= File.join(self.generation_attributes[:out_dir], template_target.out_file)
  end

  current_binding= binding unless current_binding

  if template_target.copy_only

    exists= File.exist?(out_file)

    # Creo el directorio
    FileUtils::mkdir_p File.dirname(out_file)

    if exists
      if @generator.argv_options.force
        FileUtils.cp template_file, out_file
        message_helper.puts_created_template(File.basename(out_file), out_file, :override)
      else
        message_helper.puts_created_template(File.basename(out_file), out_file, :ignore)
      end
    else
      FileUtils.cp template_file, out_file
      message_helper.puts_created_template(File.basename(out_file), out_file, :new)
    end

  else
    # Creo la salida
    return TemplateHelper.generate_template(template_file, current_binding, :out_file => out_file, :feature => self, :force => @generator.argv_options.force)
  end


end
get_class_file() click to toggle source

For instances of class A only, we use the __FILE__ keyword. This method is overwritten by the get_file method defined above.

# File lib/CapicuaGen/template_feature.rb, line 324
def get_class_file
  __FILE__
end
get_out_file_information(values= {}) click to toggle source

Devuelve los archivos generados por esta características

# File lib/CapicuaGen/template_feature.rb, line 276
def get_out_file_information(values= {})

  # Recupero los parametros
  types = values[:types]
  types = [types] if types and not types.instance_of?(Array)

  #recupero los archivos pertinentes
  result= []

  self.template_targets.each do |t|
    # si no hay tipos definidos o los tipos tienen algo en común, lo agrego a los resultados
    next unless types.blank? or t.is_any_type?(types)
    next unless t.respond_to?('out_file')
    next if t.out_file.blank?


    file_information= FileInformation.new(:file_name => File.join(self.generation_attributes[:out_dir], t.out_file))

    result << file_information

  end

  return result

end
get_template_local_dir(file) click to toggle source

Directorio local para obtener los templates

# File lib/CapicuaGen/template_feature.rb, line 305
def get_template_local_dir(file)
  begin
    feacture_directory= File.dirname(file).split('/')
    feacture_name     = feacture_directory[feacture_directory.count-2]
    package_name      = feacture_directory[feacture_directory.count-3]
    gem_name          = feacture_directory[feacture_directory.count-4]
    template_local    = File.join(@generator.local_templates, gem_name, package_name, feacture_name)

    return template_local

  rescue
    #Seguramente no sigue la estructura indicada para templates
    return nil
  end
end