CapicuaGen 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +19 -0
- data/.rspec +2 -0
- data/.travis.yml +4 -0
- data/CODE_OF_CONDUCT.md +49 -0
- data/CapicuaGen.gemspec +57 -0
- data/Gemfile +4 -0
- data/LICENSE +165 -0
- data/README.md +36 -0
- data/Rakefile +2 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/exe/capicuagen.rb +26 -0
- data/lib/CapicuaGen/Examples/Example/Source/example_feature.rb +63 -0
- data/lib/CapicuaGen/Examples/Example/Template/SplashForm.designer.erb +141 -0
- data/lib/CapicuaGen/Examples/Example/Template/SplashForm.erb +160 -0
- data/lib/CapicuaGen/Examples/Example/Template/SplashForm.resx.erb +535 -0
- data/lib/CapicuaGen/Mixins/attributes_mixin.rb +62 -0
- data/lib/CapicuaGen/Mixins/parameter_mixin.rb +46 -0
- data/lib/CapicuaGen/Mixins/reflection_mixin.rb +83 -0
- data/lib/CapicuaGen/Tools/message_helper.rb +105 -0
- data/lib/CapicuaGen/Tools/template_helper.rb +87 -0
- data/lib/CapicuaGen/Tools/xml_helper.rb +100 -0
- data/lib/CapicuaGen/attribute_mixer.rb +77 -0
- data/lib/CapicuaGen/capicua_gen.rb +38 -0
- data/lib/CapicuaGen/feature.rb +151 -0
- data/lib/CapicuaGen/file_information.rb +52 -0
- data/lib/CapicuaGen/generator.rb +289 -0
- data/lib/CapicuaGen/generator_command_line.rb +216 -0
- data/lib/CapicuaGen/target.rb +49 -0
- data/lib/CapicuaGen/template.rb +39 -0
- data/lib/CapicuaGen/template_feature.rb +331 -0
- data/lib/CapicuaGen/template_target.rb +60 -0
- data/lib/CapicuaGen/version.rb +3 -0
- metadata +185 -0
@@ -0,0 +1,62 @@
|
|
1
|
+
=begin
|
2
|
+
CapicuaGen
|
3
|
+
|
4
|
+
CapicuaGen es un software que ayuda a la creación automática de
|
5
|
+
sistemas empresariales a través de la definición y ensamblado de
|
6
|
+
diversos generadores de características.
|
7
|
+
|
8
|
+
El proyecto fue iniciado por José Luis Bautista Martin, el 6 de enero
|
9
|
+
del 2016.
|
10
|
+
|
11
|
+
Puede modificar y distribuir este software, según le plazca, y usarlo
|
12
|
+
para cualquier fin ya sea comercial, personal, educativo, o de cualquier
|
13
|
+
índole, siempre y cuando incluya este mensaje, y se permita acceso el
|
14
|
+
código fuente.
|
15
|
+
|
16
|
+
Este software es código libre, y se licencia bajo LGPL.
|
17
|
+
|
18
|
+
Para más información consultar http://www.gnu.org/licenses/lgpl.html
|
19
|
+
=end
|
20
|
+
|
21
|
+
=begin
|
22
|
+
Este mixin se encarga de agegar caractristicas de
|
23
|
+
=end
|
24
|
+
|
25
|
+
require_relative 'parameter_mixin'
|
26
|
+
|
27
|
+
module CapicuaGen
|
28
|
+
|
29
|
+
public
|
30
|
+
|
31
|
+
# Devuelve una coleccion atributos de unos terminadas caracteristicas de cierto tipo
|
32
|
+
def get_attributes(values= {})
|
33
|
+
|
34
|
+
# Atributos a generar
|
35
|
+
attributes = initialize_array_parameter(values[:attributes])
|
36
|
+
# Tipo de caracteristicas a buscar
|
37
|
+
target_types= initialize_array_parameter(values[:target_types])
|
38
|
+
|
39
|
+
# Agrego los atributes requeridos
|
40
|
+
result = {}
|
41
|
+
attributes.each do |a|
|
42
|
+
result[a]= []
|
43
|
+
end
|
44
|
+
|
45
|
+
|
46
|
+
# Busco las caracteristicas que contiene entidades de SQL para una table
|
47
|
+
generator.get_features_in_targets_by_type(target_types).each do |f|
|
48
|
+
|
49
|
+
attributes.each do |a|
|
50
|
+
result[a]<<f.generation_attributes[a] if f.generation_attributes[a]
|
51
|
+
end
|
52
|
+
|
53
|
+
result.each_pair do |k, v|
|
54
|
+
yield k, v
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
|
61
|
+
end
|
62
|
+
|
@@ -0,0 +1,46 @@
|
|
1
|
+
=begin
|
2
|
+
|
3
|
+
CapicuaGen
|
4
|
+
|
5
|
+
CapicuaGen es un software que ayuda a la creación automática de
|
6
|
+
sistemas empresariales a través de la definición y ensamblado de
|
7
|
+
diversos generadores de características.
|
8
|
+
|
9
|
+
El proyecto fue iniciado por José Luis Bautista Martin, el 6 de enero
|
10
|
+
del 2016.
|
11
|
+
|
12
|
+
Puede modificar y distribuir este software, según le plazca, y usarlo
|
13
|
+
para cualquier fin ya sea comercial, personal, educativo, o de cualquier
|
14
|
+
índole, siempre y cuando incluya este mensaje, y se permita acceso el
|
15
|
+
código fuente.
|
16
|
+
|
17
|
+
Este software es código libre, y se licencia bajo LGPL.
|
18
|
+
|
19
|
+
Para más información consultar http://www.gnu.org/licenses/lgpl.html
|
20
|
+
=end
|
21
|
+
|
22
|
+
=begin
|
23
|
+
Este mixin se presentar herramientas para trabajar con parametros
|
24
|
+
=end
|
25
|
+
|
26
|
+
|
27
|
+
module CapicuaGen
|
28
|
+
|
29
|
+
# Inicializa un parametro que debe ser un array
|
30
|
+
def initialize_array_parameter(value)
|
31
|
+
|
32
|
+
# Configuro los parametros de tipo
|
33
|
+
result= []
|
34
|
+
if value
|
35
|
+
result= value
|
36
|
+
if result and not result.instance_of?(Array)
|
37
|
+
result= [result]
|
38
|
+
end
|
39
|
+
else
|
40
|
+
result= []
|
41
|
+
end
|
42
|
+
return result
|
43
|
+
end
|
44
|
+
|
45
|
+
|
46
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
=begin
|
2
|
+
|
3
|
+
CapicuaGen
|
4
|
+
|
5
|
+
CapicuaGen es un software que ayuda a la creación automática de
|
6
|
+
sistemas empresariales a través de la definición y ensamblado de
|
7
|
+
diversos generadores de características.
|
8
|
+
|
9
|
+
El proyecto fue iniciado por José Luis Bautista Martin, el 6 de enero
|
10
|
+
del 2016.
|
11
|
+
|
12
|
+
Puede modificar y distribuir este software, según le plazca, y usarlo
|
13
|
+
para cualquier fin ya sea comercial, personal, educativo, o de cualquier
|
14
|
+
índole, siempre y cuando incluya este mensaje, y se permita acceso el
|
15
|
+
código fuente.
|
16
|
+
|
17
|
+
Este software es código libre, y se licencia bajo LGPL.
|
18
|
+
|
19
|
+
Para más información consultar http://www.gnu.org/licenses/lgpl.html
|
20
|
+
=end
|
21
|
+
|
22
|
+
=begin
|
23
|
+
Este mixin se encarga de agegar funcionalidad que permite que una clase
|
24
|
+
cree propieades dinamicas y permite inicializarlas a traves de un hash
|
25
|
+
pasado al contructor.
|
26
|
+
=end
|
27
|
+
|
28
|
+
|
29
|
+
# Agrega opciones de refleccion a las clases que lo implementan
|
30
|
+
module CapicuaGen
|
31
|
+
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
|
36
|
+
# Crea un metodo
|
37
|
+
def create_method(name, &block)
|
38
|
+
self.singleton_class.send(:define_method, name, &block)
|
39
|
+
end
|
40
|
+
|
41
|
+
# Crea una propiedad
|
42
|
+
def create_attr(name)
|
43
|
+
create_method("#{name}=".to_sym) { |val| instance_variable_set("@" + name, val) }
|
44
|
+
create_method(name.to_sym) { instance_variable_get("@" + name) }
|
45
|
+
end
|
46
|
+
|
47
|
+
# Establece una propiedad
|
48
|
+
def set_property(prop_name, prop_value)
|
49
|
+
self.send("#{prop_name}=", prop_value)
|
50
|
+
end
|
51
|
+
|
52
|
+
protected
|
53
|
+
|
54
|
+
|
55
|
+
|
56
|
+
public
|
57
|
+
# Inicializa las propiedades de un objeto, si no dichas propiedades las crea
|
58
|
+
def initialize_properties(properties, create_new_properties= true)
|
59
|
+
|
60
|
+
# Recorro las propiedades
|
61
|
+
properties.each do |key, value|
|
62
|
+
|
63
|
+
# convierto el simbolo en un string
|
64
|
+
key_s= key.to_s
|
65
|
+
|
66
|
+
# Compruebo si existe y si no lo creo
|
67
|
+
if not self.respond_to?(key.to_s)
|
68
|
+
if create_new_properties
|
69
|
+
create_attr(key.to_s)
|
70
|
+
else
|
71
|
+
raise ("No se permite la propiedad '#{key}' para el tipo '#{self.class.name}'")
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
# Establezco el valor
|
76
|
+
set_property(key_s, value)
|
77
|
+
|
78
|
+
end
|
79
|
+
|
80
|
+
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
|
2
|
+
=begin
|
3
|
+
|
4
|
+
CapicuaGen
|
5
|
+
|
6
|
+
CapicuaGen es un software que ayuda a la creación automática de
|
7
|
+
sistemas empresariales a través de la definición y ensamblado de
|
8
|
+
diversos generadores de características.
|
9
|
+
|
10
|
+
El proyecto fue iniciado por José Luis Bautista Martin, el 6 de enero
|
11
|
+
del 2016.
|
12
|
+
|
13
|
+
Puede modificar y distribuir este software, según le plazca, y usarlo
|
14
|
+
para cualquier fin ya sea comercial, personal, educativo, o de cualquier
|
15
|
+
índole, siempre y cuando incluya este mensaje, y se permita acceso el
|
16
|
+
código fuente.
|
17
|
+
|
18
|
+
Este software es código libre, y se licencia bajo LGPL.
|
19
|
+
|
20
|
+
Para más información consultar http://www.gnu.org/licenses/lgpl.html
|
21
|
+
=end
|
22
|
+
|
23
|
+
|
24
|
+
# Agrega opciones de refleccion a las clases que lo implementan
|
25
|
+
module CapicuaGen
|
26
|
+
|
27
|
+
# Ayuda a mostar mensajes en pantalla con un forma y de una forma determinada
|
28
|
+
class MessageHelper
|
29
|
+
|
30
|
+
public
|
31
|
+
# Inicializa el objeto
|
32
|
+
def initialize
|
33
|
+
@indent= 0
|
34
|
+
end
|
35
|
+
|
36
|
+
# Agrega una tabulacion a la derecha
|
37
|
+
def add_indent
|
38
|
+
@indent+= 1
|
39
|
+
end
|
40
|
+
|
41
|
+
# Elimina una tabulación
|
42
|
+
def remove_indent
|
43
|
+
@indent-= 1
|
44
|
+
@indent= 0 if @indent<0
|
45
|
+
end
|
46
|
+
|
47
|
+
# Numero de las indentaciones
|
48
|
+
def indent
|
49
|
+
return indent
|
50
|
+
end
|
51
|
+
|
52
|
+
# Devuelve los espacios
|
53
|
+
def puts_spaces(spaces= @indent)
|
54
|
+
@indent.times do |i|
|
55
|
+
print "\t"
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
# Imprime un mensaje
|
60
|
+
def puts_message(text)
|
61
|
+
puts_spaces
|
62
|
+
puts(text)
|
63
|
+
end
|
64
|
+
|
65
|
+
# Mensaje "Procesando caracteristica"
|
66
|
+
def puts_generating_feature(feature)
|
67
|
+
puts_message "Procesando caracteristica: '#{feature.name} -> #{feature.class.name}'"
|
68
|
+
end
|
69
|
+
|
70
|
+
|
71
|
+
# Mesaje para plantilla creada
|
72
|
+
def puts_created_template(template, out_file, mode)
|
73
|
+
|
74
|
+
result= ''
|
75
|
+
|
76
|
+
case mode
|
77
|
+
when :override
|
78
|
+
result= "* #{template} -> '#{out_file}': Sobreescrito"
|
79
|
+
when :new
|
80
|
+
result= "+ #{template} -> '#{out_file}': Creado"
|
81
|
+
when :ignore
|
82
|
+
result= "! #{template} -> '#{out_file}': NO creado"
|
83
|
+
when :delete
|
84
|
+
result= "- #{template} -> '#{out_file}': Eliminado"
|
85
|
+
else
|
86
|
+
result= "? #{template} -> '#{out_file}': #{mode.to_s}"
|
87
|
+
end
|
88
|
+
|
89
|
+
puts_message result
|
90
|
+
|
91
|
+
end
|
92
|
+
|
93
|
+
# Mensaje gneracion acabada
|
94
|
+
def puts_end_generate(start_time, end_time)
|
95
|
+
|
96
|
+
total_time=end_time-start_time
|
97
|
+
puts_message "Finalizado, tiempo total: #{total_time} segundos."
|
98
|
+
puts
|
99
|
+
end
|
100
|
+
|
101
|
+
|
102
|
+
end
|
103
|
+
|
104
|
+
|
105
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
=begin
|
2
|
+
|
3
|
+
CapicuaGen
|
4
|
+
|
5
|
+
CapicuaGen es un software que ayuda a la creación automática de
|
6
|
+
sistemas empresariales a través de la definición y ensamblado de
|
7
|
+
diversos generadores de características.
|
8
|
+
|
9
|
+
El proyecto fue iniciado por José Luis Bautista Martin, el 6 de enero
|
10
|
+
del 2016.
|
11
|
+
|
12
|
+
Puede modificar y distribuir este software, según le plazca, y usarlo
|
13
|
+
para cualquier fin ya sea comercial, personal, educativo, o de cualquier
|
14
|
+
índole, siempre y cuando incluya este mensaje, y se permita acceso el
|
15
|
+
código fuente.
|
16
|
+
|
17
|
+
Este software es código libre, y se licencia bajo LGPL.
|
18
|
+
|
19
|
+
Para más información consultar http://www.gnu.org/licenses/lgpl.html
|
20
|
+
=end
|
21
|
+
|
22
|
+
|
23
|
+
module CapicuaGen
|
24
|
+
|
25
|
+
require 'fileutils'
|
26
|
+
require 'ERB'
|
27
|
+
|
28
|
+
|
29
|
+
# Clase ayudante para crear arvhiso a partir de Template
|
30
|
+
class TemplateHelper
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def initialize
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
public
|
39
|
+
|
40
|
+
# Genera un archivo en base a un template
|
41
|
+
def self.generate_template (erb_file, current_binding, values= {})
|
42
|
+
|
43
|
+
|
44
|
+
erb = ERB.new(File.open(erb_file, 'r').read)
|
45
|
+
|
46
|
+
|
47
|
+
# Archivo de salida
|
48
|
+
out_file = values[:out_file] if values[:out_file]
|
49
|
+
force = values[:force] if values[:force]
|
50
|
+
|
51
|
+
#caracteristica
|
52
|
+
feature = values[:feature] if values[:feature]
|
53
|
+
message_helper= feature.message_helper if feature
|
54
|
+
message_helper= MessageHelper.new unless message_helper
|
55
|
+
|
56
|
+
# Genero la plantilla
|
57
|
+
result = erb.result(current_binding)
|
58
|
+
|
59
|
+
# Devuelve el resultado si no hay archivo de salida
|
60
|
+
return result unless out_file
|
61
|
+
|
62
|
+
|
63
|
+
exists= File.exist?(out_file)
|
64
|
+
|
65
|
+
|
66
|
+
if exists and not force
|
67
|
+
message_helper.puts_created_template(File.basename(erb_file), out_file, :ignore)
|
68
|
+
return result
|
69
|
+
end
|
70
|
+
|
71
|
+
|
72
|
+
# Creo el directorio
|
73
|
+
FileUtils::mkdir_p File.dirname(out_file)
|
74
|
+
|
75
|
+
# Escribo el resultado
|
76
|
+
File.open(out_file, 'w') { |file| file.write(result) }
|
77
|
+
|
78
|
+
if exists
|
79
|
+
message_helper.puts_created_template(File.basename(erb_file), out_file, :override)
|
80
|
+
else
|
81
|
+
message_helper.puts_created_template(File.basename(erb_file), out_file, :new)
|
82
|
+
end
|
83
|
+
|
84
|
+
return result
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,100 @@
|
|
1
|
+
=begin
|
2
|
+
|
3
|
+
CapicuaGen
|
4
|
+
|
5
|
+
CapicuaGen es un software que ayuda a la creación automática de
|
6
|
+
sistemas empresariales a través de la definición y ensamblado de
|
7
|
+
diversos generadores de características.
|
8
|
+
|
9
|
+
El proyecto fue iniciado por José Luis Bautista Martin, el 6 de enero
|
10
|
+
del 2016.
|
11
|
+
|
12
|
+
Puede modificar y distribuir este software, según le plazca, y usarlo
|
13
|
+
para cualquier fin ya sea comercial, personal, educativo, o de cualquier
|
14
|
+
índole, siempre y cuando incluya este mensaje, y se permita acceso el
|
15
|
+
código fuente.
|
16
|
+
|
17
|
+
Este software es código libre, y se licencia bajo LGPL.
|
18
|
+
|
19
|
+
Para más información consultar http://www.gnu.org/licenses/lgpl.html
|
20
|
+
=end
|
21
|
+
|
22
|
+
require 'nokogiri'
|
23
|
+
require "rexml/document"
|
24
|
+
|
25
|
+
module CapicuaGen
|
26
|
+
|
27
|
+
# Clase ayudante para tratar con archivos XML
|
28
|
+
class XMLHelper
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def initialize
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
public
|
37
|
+
|
38
|
+
# obtiene un nodo de un xml
|
39
|
+
def self.get_node_from_xml_document(xml, xpath)
|
40
|
+
|
41
|
+
# Busco el nodo
|
42
|
+
xml_node_xpath= xml.root.xpath(xpath)
|
43
|
+
|
44
|
+
# Si no xml_node_xpath un primer nodo
|
45
|
+
return xml_node_xpath.first if xml_node_xpath.first
|
46
|
+
|
47
|
+
return create_node(xml.root, xpath)
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
# Localiza un nodo y si no existe lo crea
|
54
|
+
def self.create_node(xml_node, path)
|
55
|
+
|
56
|
+
paths= path.split(/\//).select { |x| !x.blank? }
|
57
|
+
|
58
|
+
|
59
|
+
current_node_name= paths.shift
|
60
|
+
|
61
|
+
# Alcance el ultimo nodo lo creo
|
62
|
+
if paths.count==0
|
63
|
+
current_node= Nokogiri::XML::Node.new(clear_node_name(current_node_name), xml_node)
|
64
|
+
xml_node.add_child(current_node)
|
65
|
+
return current_node
|
66
|
+
end
|
67
|
+
|
68
|
+
# Si no existe lo creo
|
69
|
+
current_node= xml_node.xpath(current_node_name).first
|
70
|
+
unless current_node
|
71
|
+
current_node= Nokogiri::XML::Node.new(clear_node_name(current_node_name), xml_node)
|
72
|
+
xml_node.add_child(current_node)
|
73
|
+
end
|
74
|
+
|
75
|
+
return create_node current_node, paths.join('/')
|
76
|
+
|
77
|
+
end
|
78
|
+
|
79
|
+
# Limpia un atributo del nombre de un nodo
|
80
|
+
def self.clear_node_name(node_string)
|
81
|
+
if node_string=~/([^\[]+)\[/
|
82
|
+
return $1
|
83
|
+
else
|
84
|
+
return node_string
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
|
89
|
+
# Formate el xml
|
90
|
+
def self.format(xml_string)
|
91
|
+
doc= REXML::Document.new(xml_string)
|
92
|
+
doc.context[:attribute_quote]= :quote
|
93
|
+
formatted= ""
|
94
|
+
doc.write(formatted, 2)
|
95
|
+
return formatted
|
96
|
+
end
|
97
|
+
|
98
|
+
|
99
|
+
end
|
100
|
+
end
|