CapicuaGen 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -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