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.
@@ -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