def test_curriculo(self): opcao = 6912 # Mecatrônica disciplinas = Cursos.curriculo(opcao, nivel=Nivel.GRADUACAO, verbose=False) self.assertIn('obrigatórias', disciplinas) self.assertIn('167657', disciplinas['obrigatórias']) disciplina = disciplinas['obrigatórias']['167657'] self.assertIn('Nome', disciplina) self.assertEqual('CONTROLE PARA AUTOMAÇÃO', disciplina['Nome']) self.assertIn('Créditos', disciplina) self.assertIn('Teoria', disciplina['Créditos']) self.assertEqual(3, disciplina['Créditos']['Teoria']) self.assertIn('Prática', disciplina['Créditos']) self.assertEqual(1, disciplina['Créditos']['Prática']) self.assertIn('Extensão', disciplina['Créditos']) self.assertEqual(0, disciplina['Créditos']['Extensão']) self.assertIn('Estudo', disciplina['Créditos']) self.assertEqual(4, disciplina['Créditos']['Estudo']) self.assertIn('Área', disciplina) self.assertEqual('AC', disciplina['Área']) self.assertIn('cadeias', disciplinas) self.assertIn('6', disciplinas['cadeias']) for item in disciplinas['cadeias']['6']: self.assertTrue(('167011' in item) or ('111830' in item and '111848' in item)) self.assertIn('optativas', disciplinas) self.assertIn('113417', disciplinas['optativas'])
def lista_obrigatorias(habilitacoes, deptos, nivel=Nivel.GRADUACAO, campus=Campus.DARCY_RIBEIRO, verbose=False): '''Retorna, para cada curso dado, um dicionário contendo as disciplinas consideradas obrigatórias: as listadas como tal no currículo e as listadas como cadeias/ciclos). Argumentos: habilitacoes -- coleção de códigos de habilitações com disciplinas (da oferta) em seus currículos deptos -- coleção de siglas de departamentos da UnB para os quais se deseja identificar as disciplinas obrigatórias nivel -- nível acadêmico das disciplinas buscadas (default Nivel.GRADUACAO) campus -- o campus onde a habilitação é oferecida (default Campus.DARCY_RIBEIRO) verbose -- indicação dos procedimentos sendo adotados (default False) ''' lista = {} for opcao in habilitacoes: lista[opcao] = {} curriculo = Cursos.curriculo(opcao, nivel, verbose) obrigatorias = curriculo.get('obrigatórias') for ciclo in curriculo.get('cadeias'): for item in curriculo['cadeias'][ciclo]: obrigatorias.update(item) for disciplina in obrigatorias: infos = Disciplina.informacoes(disciplina, nivel, verbose) depto = infos.get('Sigla do Departamento') if depto in deptos: if depto not in lista[opcao]: lista[opcao][depto] = {} lista[opcao][depto][disciplina] = infos['Denominação'] return lista
def test_habilitacoes(self): curso = 949 # Eng. Mecatrônica habilitacoes = Cursos.habilitacoes(curso, nivel=Nivel.GRADUACAO, campus=Campus.DARCY_RIBEIRO, verbose=False) self.assertIn('6912', habilitacoes) habilitacao = habilitacoes['6912'] self.assertIn('Nome', habilitacao) self.assertEqual('Engenharia de Controle e Automação', habilitacao['Nome']) self.assertIn('Grau', habilitacao) self.assertEqual('Engenheiro de Controle e Automação', habilitacao['Grau']) self.assertIn('Limite mínimo de permanência', habilitacao) self.assertEqual('8', habilitacao['Limite mínimo de permanência']) self.assertIn('Limite máximo de permanência', habilitacao) self.assertEqual('18', habilitacao['Limite máximo de permanência']) self.assertIn('Créditos para Formatura', habilitacao) self.assertEqual('274', habilitacao['Créditos para Formatura']) self.assertIn('Mínimo de Créditos Optativos na Área de Concentração', habilitacao) self.assertEqual('0', habilitacao['Mínimo de Créditos Optativos na ' 'Área de Concentração']) self.assertIn('Quantidade mínima de Créditos Optativos na Área Conexa', habilitacao) self.assertEqual('0', habilitacao['Quantidade mínima de Créditos ' 'Optativos na Área Conexa']) self.assertIn('Quantidade máxima de Créditos no Módulo Livre', habilitacao) self.assertEqual('24', habilitacao['Quantidade máxima de Créditos no ' 'Módulo Livre'])
def test_relacao(self): cursos = Cursos.relacao(nivel=Nivel.GRADUACAO, campus=Campus.DARCY_RIBEIRO, verbose=False) # Códigos selecionados aleatoriamente for curso in ['19', '264', '1511', '230', '1414', '281', '451', '167', '1163', '299']: self.assertIn(curso, cursos)
def test_relacao(self): cursos = Cursos.relacao(nivel=Nivel.GRADUACAO, campus=Campus.DARCY_RIBEIRO, verbose=False) # Códigos selecionados aleatoriamente for curso in [ '19', '264', '1511', '230', '1414', '281', '451', '167', '1163', '299' ]: self.assertIn(curso, cursos)
def test_curriculoCrawler(): opcao = '1856' # Ciência da Comp. curriculo = Cursos.curriculo(opcao, nivel=Nivel.GRADUACAO, verbose=False) jsonOutput = json.dumps( curriculo, ensure_ascii=False) #15.8 KB de dados para opção 1856 outFile = open(Main.curriculoFileName, 'w') outFile.write(jsonOutput) outFile.close()
def test_fluxo(self): opcao = 1741 # Eng. Computação fluxo = Cursos.fluxo(opcao, nivel=Nivel.GRADUACAO, verbose=False) for p in range(1, 11): self.assertIn(p, fluxo) oitavo_periodo = fluxo[8] self.assertIn('Créditos', oitavo_periodo) self.assertEqual('16', oitavo_periodo['Créditos']) self.assertIn('Disciplinas', oitavo_periodo) for d in ['168921', '184802', '207438']: self.assertIn(d, oitavo_periodo['Disciplinas'])
def test_fluxoCrawler(): opcao = '1856' # Ciência da Comp. fluxo = Cursos.fluxo(opcao, nivel=Nivel.GRADUACAO, verbose=False) numSemestres = len(fluxo) outFile = open(Main.fluxoFileName, 'w') csvText = str(numSemestres) + '\n' for idx in fluxo: line = "" for disciplina_cod in fluxo[idx]['Disciplinas']: line = line + str(disciplina_cod) + ', ' csvText = csvText + line[:-2] + '\n' outFile.write(csvText) outFile.close()
def turmas_reservadas_no_fluxo(habilitacao, filtro_reserva=''): '''Mostra a lista de turmas com reserva de vagas das disciplinas do fluxo da habilitação dada. Argumentos: habilitacao -- código da habilitação com disciplinas da oferta filtro_reserva -- filtro para reduzir o escopo da busca (default '') ''' fluxo = Cursos.fluxo(habilitacao) for periodo in sorted(fluxo.keys()): print('Período: %d' % periodo) for disciplina in fluxo[periodo]['Disciplinas']: turmas = Oferta.turmas(disciplina).items() for turma, detalhes in turmas: if 'Turma Reservada' in detalhes: for reserva, vagas in detalhes['Turma Reservada'].items(): if filtro_reserva in reserva: print('\t %s (%s) %s %s' % (disciplina, turma, reserva, vagas))
def test_habilitacoes(self): curso = 949 # Eng. Mecatrônica habilitacoes = Cursos.habilitacoes(curso, nivel=Nivel.GRADUACAO, campus=Campus.DARCY_RIBEIRO, verbose=False) self.assertIn('6912', habilitacoes) habilitacao = habilitacoes['6912'] self.assertIn('Nome', habilitacao) self.assertEqual('Engenharia de Controle e Automação', habilitacao['Nome']) self.assertIn('Grau', habilitacao) self.assertEqual('Engenheiro de Controle e Automação', habilitacao['Grau']) self.assertIn('Limite mínimo de permanência', habilitacao) self.assertEqual('8', habilitacao['Limite mínimo de permanência']) self.assertIn('Limite máximo de permanência', habilitacao) self.assertEqual('18', habilitacao['Limite máximo de permanência']) self.assertIn('Créditos para Formatura', habilitacao) self.assertEqual('274', habilitacao['Créditos para Formatura']) self.assertIn('Mínimo de Créditos Optativos na Área de Concentração', habilitacao) self.assertEqual( '0', habilitacao['Mínimo de Créditos Optativos na ' 'Área de Concentração']) self.assertIn('Quantidade mínima de Créditos Optativos na Área Conexa', habilitacao) self.assertEqual( '0', habilitacao['Quantidade mínima de Créditos ' 'Optativos na Área Conexa']) self.assertIn('Quantidade máxima de Créditos no Módulo Livre', habilitacao) self.assertEqual( '24', habilitacao['Quantidade máxima de Créditos no ' 'Módulo Livre'])
def ocupacao(oferta, cursos, nivel=Nivel.GRADUACAO, verbose=False): '''Retorna dois dicionários (obrigatórias e optativas) com o total de alunos inscritos em cada turma de cada disciplina ofertada por cada curso. Argumentos: oferta -- dicionário com a lista de oferta cursos -- lista com os cursos com disciplinas (da oferta) em seus currículos nivel -- nível acadêmico da disciplina buscada (default Nivel.GRADUACAO) verbose -- indicação dos procedimentos sendo adotados (default False) ''' obr, opt = set(), set() for codigo in cursos: disciplinas = Cursos.curriculo(codigo, nivel, verbose) if 'obrigatórias' in disciplinas: obr.update(disciplinas['obrigatórias']) if 'optativas' in disciplinas: opt.update(disciplinas['optativas']) opt = opt.difference(obr) obrigatorias, optativas = {}, {} for cod in obr: if cod in oferta: turmas = Oferta.turmas(cod) for t in turmas: key = cod + ' ' + t obrigatorias[key] = turmas[t]['Alunos Matriculados'] for cod in opt: if cod in oferta: turmas = Oferta.turmas(cod) for t in turmas: key = cod + ' ' + t optativas[key] = turmas[t]['Alunos Matriculados'] return obrigatorias, optativas
def curriculoCrawler(opcao='1856'): #Ciência da Comp. try: outFile = open( Main.fluxoFileName, 'w', newline='' ) #py2.7 needs to open as wb (http://stackoverflow.com/a/3348664) except: print('(E) Nao foi possível abrir arquivo de saída ({0}).'.format( Main.fluxoFileName)) return False curriculo = Cursos.curriculo(opcao, nivel=Nivel.GRADUACAO, verbose=False) #caso base onde somente disciplinas obrigatorias são consideradas obg = curriculo['optativas'] if (len(obg) == 0): print('(E) Falha ao exportar disciplinas. Verifique o código do curso ({0})'\ ' e/ou a conexao com a internet.'.format(opcao)\ ) return False disciplinaList = [] idx = 0 cod_toID = {} for cod in obg: cre_info = obg[cod]['Créditos'] nom_info = obg[cod]['Nome'] cre_total = 0 cre_total += cre_info['Teoria'] cre_total += cre_info['Prática'] req_info = mwDisciplina.pre_requisitos(cod, nivel=Nivel.GRADUACAO, verbose=False) reqList = [] if (len(req_info) > 0): reqList = req_info[0] # ignorar [[cod,cod...] OU [cod,...]] newDisciplina = Disciplina(cod) newDisciplina.creditos = cre_total newDisciplina.nome = nom_info newDisciplina.fator = 0 newDisciplina.requisitos = reqList disciplinaList.append(newDisciplina) cod_toID[cod] = idx idx += 1 #Export to csv csvWriter = csv.writer(outFile, dialect='excel') csvWriter.writerow([ 'CODIGO (Cod)', 'NOME (N)', 'CREDITOS (Cr)', 'FATOR (f)', 'REQUISITOS...' ]) print('(I) Encontrada(s) {0} disciplinas.'.format(len(disciplinaList))) for disc in disciplinaList: req = disc.requisitos if (idConversionEnabled): req = [] for cod in disc.requisitos: try: req.append(cod_toID[cod]) except KeyError: #semantically this should not happen but just in case req.append(-1) csvWriter.writerow([disc.codigo, disc.nome, disc.creditos, ''] + req) outFile.close() return True