def __init__(self): self.atributos = dict() self.atributosAProcesar = [] self.generadores = dict() self.generadores['boolean'] = GeneradorBooleano() self.generadores['decimal'] = GeneradorDecimal() self.generadores['text'] = GeneradorText() self.generadores['string'] = GeneradorString() self.generadores['datetime'] = GeneradorDatetime() self.generadores['default'] = GeneradorDefault() self.generadores['image'] = GeneradorImage() self.generadores['OneToMany'] = GeneradorOneToMany() self.manejadorForm = ManejadorForm() self.generadorGrupo = GeneradorGrupo() self.path = None self.mensajes = [] self.versionBootstap = 2 self.parsearValor = re.compile('(?P<indice>\d+)$|(?P<rangoInferior>\d+)..(?P<rangoSuperior>\d+)')
def setUp(self): self.manejador = ManejadorForm() self.manejador.namespace = 'Gse\AppBundle\Entity' self.manejador.clase = 'Institucion'
class TddManejadorForm(unittest.TestCase): def setUp(self): self.manejador = ManejadorForm() self.manejador.namespace = 'Gse\AppBundle\Entity' self.manejador.clase = 'Institucion' def primera_diferencia(self, primero, segundo): contador = 0 for primer , segund in zip(list(primero), list(segundo)): if primer != segund: print 'diferencia \033[91m %s != %s \033[0m' % (primero[contador - 10 :contador + 10],segundo[contador -10:contador+ 10]) diff = (str(list(primero[contador - 10 :contador])), str(list(primero[contador])), str(list(primero[contador:contador + 10])),str(list(segundo[contador -10:contador+ 1])), str(list(segundo[contador])), str(list(segundo[contador:contador +10]))) print 'diferencia \033[91m %s \033[0m \033[92m %s \033[0m \033[91m%s != %s \033[0m \033[92m %s \033[0m \033[91m %s \033[0m' % diff print 'en la posicion \033[91m %i \033[0m' % contador return False contador +=1 def test_crear_nameSpace(self): resultado ="Gse\AppBundle\Form\Admin" self.manejador.namespace = 'Gse\AppBundle\Entity\Admin' self.failUnlessEqual(resultado, self.manejador.crearNameSpace()) def test_crear_nameSpace(self): resultado ="Gse\AppBundle\Form" self.manejador.namespace = 'Gse\AppBundle\Entity' self.failUnlessEqual(resultado, self.manejador.crearNameSpace()) def test_crear_nombre(self): resultado ="gse_app_institucion" self.manejador.namespace = 'Gse\AppBundle\Entity' self.clase = 'Institucion' self.failUnlessEqual(resultado, self.manejador.crearNombre()) def test_crear_nombre_subcarpeta(self): resultado ="gse_app_admin_institucion" self.manejador.namespace = 'Gse\AppBundle\Entity\Admin' self.clase = 'Institucion' self.failUnlessEqual(resultado, self.manejador.crearNombre()) def test_crear_nameSpace_vacio(self): self.manejador.namespace = '' self.failUnlessEqual('', self.manejador.crearNameSpace()) def test_generar_vacio(self): self.manejador.atributosAProcesar = [] resultado = '' self.failUnlessEqual(resultado, self.manejador.generar()) def test_generar_un_atributo(self): atributo = Atributo('esAlgunaPropiedad') atributo.agregarPropiedad('tipo','boolean') atributo.agregarPropiedad('required', False) atributo.agregarPropiedad('pathTraductor','entidad.capacitacion.aval.form.label') self.namespace = 'Gse\AppBundle\Entity' self.clase = 'Institucion' self.manejador.atributosAProcesar = [atributo] resultado = """<?php namespace Gse\AppBundle\Form; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormEvent; use Symfony\Component\Form\FormEvents; use Symfony\Component\OptionsResolver\OptionsResolverInterface; use Symfony\Component\Form\FormInterface; class InstitucionType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('esAlgunaPropiedad', 'checkbox', array( 'required' => False, )); } public function setDefaultOptions(OptionsResolverInterface $resolver) { $resolver->setDefaults(array( 'data_class' => 'Gse\AppBundle\Entity\Institucion', )); } public function getName() { return 'gse_app_institucion'; } } """ self.primera_diferencia(resultado, self.manejador.generar()) self.failUnlessEqual(resultado, self.manejador.generar())
class ManejadorTwig(): def __init__(self): self.atributos = dict() self.atributosAProcesar = [] self.generadores = dict() self.generadores['boolean'] = GeneradorBooleano() self.generadores['decimal'] = GeneradorDecimal() self.generadores['text'] = GeneradorText() self.generadores['string'] = GeneradorString() self.generadores['datetime'] = GeneradorDatetime() self.generadores['default'] = GeneradorDefault() self.generadores['image'] = GeneradorImage() self.generadores['OneToMany'] = GeneradorOneToMany() self.manejadorForm = ManejadorForm() self.generadorGrupo = GeneradorGrupo() self.path = None self.mensajes = [] self.versionBootstap = 2 self.parsearValor = re.compile('(?P<indice>\d+)$|(?P<rangoInferior>\d+)..(?P<rangoSuperior>\d+)') def imprimirError(self, error): print error def cambiarBootstrap(self): versionAnterior = self.versionBootstap self.versionBootstap = 2 + (self.versionBootstap +1) % 2 Interfaz.info('Se cambio de la version:%i por la version:%i' % (versionAnterior, self.versionBootstap)) def parsearValorInput(self, inputString): result = [] for x in inputString.split(','): dictGrupo = self.parsearValor.match(x.strip()).groupdict() if dictGrupo['indice'] is None: listaRango = range(int(dictGrupo['rangoInferior']), int(dictGrupo['rangoSuperior']) + 1) result += listaRango else: result.append(x.strip()) return result def validarEntradaAtributo(self, inputs): keys = inputs.split(',') for indice in keys: matcher = self.parsearValor.match(indice) if (matcher is None) : return False else: dictGrupo = matcher.groupdict() if not (dictGrupo['rangoSuperior'] is None) and int(dictGrupo['rangoSuperior']) + 1 > len(self.atributos): return False elif (not (dictGrupo['indice'] is None)) and int(dictGrupo['indice']) > len(self.atributos): return False return True def crearGrupo(self,nombre, inputs): result = [] for key in inputs.split(','): result.append(self.atributos[int(key)]) return (nombre, result) def agregarAtibutosAPropocesar(self): inputs = raw_input('Ingrese un indice o los indices seguido por coma ejemplo 1, 2, 3, 5\n\n') if self.validarEntradaAtributo(inputs): for key in self.parsearValorInput(inputs): #import pdb;pdb.set_trace() self.atributosAProcesar.append(self.atributos[int(key)]) else: self.imprimirError('Alguno de los indice no son correctos') def configurarGrupo(self): nombre = raw_input('Ingrese el nombre del Agrupador\n\n') inputs = raw_input('Ingrese los indices de los atributos seguidos por coma ejemplo 1, 2,3 ,4,2,2,3,4\n\n') if self.validarEntradaAtributo(inputs): self.atributosAProcesar.append(self.crearGrupo(nombre, inputs)) else: self.imprimirError('Alguno de los indices no son correctos') def mostrarAtributos(self): result = '' for indice, atributo in enumerate(self.atributos): result += "%s - %s : prop:%s\n" % (indice, atributo.nombre,str(atributo.propiedades)) print result def generarTodo(self): os.system('clear') result = "" salvarProcesar = [x for x in self.atributosAProcesar] self.atributosAProcesar = [x for x in self.atributos] self.generarTwig() self.atributosAProcesar = salvarProcesar def mostrarAGenerar(self): os.system('clear') print '\ncola para generar:\n' for elemento in self.atributosAProcesar: if isinstance(elemento, tuple): print "Grupo %s" % elemento[0] for atributoGrupo in elemento[1]: print '\t -%s' % atributoGrupo.nombre else: print "- %s" % (elemento.nombre) def getGenerador(self,key): if key in self.generadores.keys(): generador = self.generadores[key] else: generador = self.generadores['default'] if self.versionBootstap == 2: generador.bootstrap2 = True else: generador.bootstrap2 = False return generador def eliminarAtributosAsociadosImagen(self, atributoImage): nombre = atributoImage.nombre.partition('File')[0] for atributo in self.atributosAProcesar: if atributo.nombre.startswith(nombre) and atributo != atributoImage: self.atributosAProcesar.remove(atributo) def preProcesar(self): for atributo in self.atributosAProcesar: if atributo.get('tipo') == 'image': atributo_imagen = atributo self.eliminarAtributosAsociadosImagen(atributo) def definirPath(self): path = raw_input(Interfaz.buildColor('azul','Ingrese el nombre del path del traductor sin espacio en blanco. ejemplo:campus.modulos.aval.form\n')) if (path.find(' ') != -1): Interfaz.err('Ingresó con espacio') else : self.path = path def generarTwig(self): os.system('clear') result = "" self.preProcesar() for atributoTwig in self.atributosAProcesar: if isinstance(atributoTwig, tuple): grupoStr = self.generadorGrupo.plantillaGrupo % atributoTwig[0] grupos = "" for atributo in atributoTwig[1]: atributo.setPathTraductor(self.path) generador = self.getGenerador(atributo.get('tipo')) generador.grupo = True grupos += generador.generar(atributo) result += grupoStr % grupos else: if atributoTwig.nombre.lower() in ('id','translations', 'translationsproxy','create_at', 'update_at'): pass else: if atributoTwig.get('OneToMany', False): generador = self.getGenerador('OneToMany') elif atributoTwig.get('ManyToOne', False): generador = self.getGenerador('ManyToOne') else: generador = self.getGenerador(atributoTwig.get('tipo')) generador.grupo = False atributoTwig.setPathTraductor(self.path) result += "\n{%% set field = form.%s %%}" % atributoTwig.nombre result += generador.generarTwig(atributoTwig) + '\n' Interfaz.infog(result) return result def generarForm(self): self.manejadorForm.atributosAProcesar = self.atributosAProcesar self.manejadorForm.clase = self.clase self.manejadorForm.namespace = self.namespace Interfaz.infog(self.manejadorForm.generar()) return def capitalizarConEspacios(self,string): result = '' for i, caracter in enumerate(string): if caracter.isupper() and i!=0: result += ' ' + caracter else : result += caracter return result.title() def generarConGuionBajo(self, string): result = [] anterior = 0 for i, x in enumerate(string): if x.isupper(): result.append(string[anterior:i].lower()) anterior = i result.append(string[anterior:].lower()) if '' in result: result.remove('') if len(result) == 1: return result[0] return '_'.join(result) def generarTraducciones(self): tabulador = ' ' for i, x in enumerate(self.namespace.partition('\\Entity')[2].split('\\')): if x != '': tabulador = ' '*i print '%s%s:' % (tabulador,self.generarConGuionBajo(x)) tabulador = ' '*(i+1) print '%s%s:' % (tabulador,self.generarConGuionBajo(self.clase).lower()) muchoAUno= [] print '%s%s' % (' '*(i+2), 'form:') print '%s%s' % (' '*(i+3), 'label:') tabulador = ' ' * (i+4) for atributo in self.atributosAProcesar: if not atributo.nombre in ('id','createdBy','updatedBy','created','updated','translationsproxy', 'translations'): if atributo.get('OneToMany', False): muchoAUno.append(atributo) else: print tabulador + self.generarConGuionBajo(atributo.nombre) + ': ' + self.capitalizarConEspacios(atributo.nombre) if len(muchoAUno) > 0: print '%s%s' % (' '* (i+3), 'legend:') for atributo in muchoAUno: print '%s%s: %s' % (tabulador, self.generarConGuionBajo(atributo.nombre), self.capitalizarConEspacios(atributo.nombre))