-
Notifications
You must be signed in to change notification settings - Fork 0
Documentação e Implementação: Sprint 3
Sem Docker:
- Ruby 3.4.9
- Bundler
Com Docker:
- Docker Engine 20+
- Docker Compose v2+
A partir do diretório project/:
bundle install
bundle exec rails db:migrate
bundle exec rails db:seed
bundle exec rails serverAcesse em: http://localhost:3000
Na raiz do repositório (CAMAAR/):
# 1. Build inicial
docker compose build
# 2. Configurar o banco de dados
docker compose run --no-deps --rm web bundle exec rails db:migrate
docker compose run --no-deps --rm web bundle exec rails db:seed
# 3. Iniciar a aplicação
docker compose upAcesse em: http://localhost:3000
Os comandos das seções seguintes devem ser executados a partir do diretório
project/. Com Docker, prefixe cada comando com:docker compose run --no-deps --rm web <comando>
Para popular turmas, docentes e discentes a partir dos JSONs:
- Faça login como admin em http://localhost:3000
- Acesse o menu "Importar dados do SIGAA"
- Selecione o semestre desejado e confirme a importação
Após a importação, os usuários participantes receberão e-mails com links para definir sua senha. Em ambiente de desenvolvimento, esses e-mails são exibidos diretamente no log do servidor.
Admin (disponível após rails db:seed):
| Senha | |
|---|---|
| admin.cic@unb.br | Senha@123 |
Professores e alunos são criados automaticamente ao importar os dados do SIGAA. O seed não cria esses usuários.
Os comandos abaixo devem ser executados a partir do diretório project/.
bundle exec rspecA gema SimpleCov é embutida no processo de testagem e gera ao final um relatório HTML no diretório coverage/index.html.
bundle exec cucumberOs cenários requerem que os dados do SIGAA estejam importados previamente.
# ABC score e complexidade ciclomática
bundle exec rubocop --only Metrics/AbcSize
bundle exec rubocop --only Metrics/CyclomaticComplexity
# Relatório completo de qualidade de código
bundle exec rubycritic app/O relatório do RubyCritic é salvo em tmp/rubycritic/overview.html.
A documentação do código foi produzida com a gema RDoc, adicionada às dependências de desenvolvimento. O escopo da documentação foi definido no arquivo .document, incluindo controllers, helpers, jobs, mailers, models e services.
O arquivo .rdoc_options foi configurado para utilizar codificação UTF-8, incluir métodos privados e definir o título da documentação.
Para gerar a documentação, a partir do diretório project/, execute:
bundle install
bundle exec rdocO relatório HTML é gerado no diretório doc/ e pode ser visualizado abrindo doc/index.html.
Após análise do código com rubocop e rubycritic, todos os métodos com ABC score acima de 15 e complexidade ciclomática acima de 7 foram refatorados. Os resultados estão apresentados abaixo.
| Arquivo | Coverage antes | Coverage depois | Mudanças realizadas |
|---|---|---|---|
app/controllers/course_classes_controller.rb |
0.00% | 100% | Criado spec/requests/course_classes_spec.rb com testes de index (listagem por departamento) e show (acesso negado para turmas de outro departamento) |
app/jobs/application_job.rb |
0.00% | 100% | Criado spec/jobs/application_job_spec.rb verificando herança de ActiveJob::Base
|
app/helpers/formularios_helper.rb |
55.56% | 100% | Criado spec/helpers/formularios_helper_spec.rb cobrindo todos os branches: boolean (Sim/Não/—), rating (valor/—) e text (valor/—) |
app/controllers/password_resets_controller.rb |
86.67% | 100% | Adicionados testes para: senha incompatível com confirmação, exibição do formulário edit com token válido |
app/controllers/sessions_controller.rb |
89.47% | 100% | Adicionado teste para ação destroy (logout) |
app/controllers/templates_controller.rb |
90.41% | 100% | Adicionados testes para: ação show, botão + (add_questao) durante edição |
app/controllers/formularios_controller.rb |
93.88% | 100% | Adicionados testes para: ação new e show para usuário não-admin |
| Total geral | 92.74% | 99.14% | — |
| Arquivo / Método | ABC score antes | ABC score depois | Mudanças realizadas |
|---|---|---|---|
sessions_controller.rb#create |
20.78 | ≤15 | Extraídos handle_pending_setup, handle_login_success, handle_login_failure
|
password_resets_controller.rb#update |
15.56 | ≤15 | Extraídos passwords_match?, render_password_mismatch, apply_password_reset
|
resposta_controller.rb#create |
20.83 | ≤15 | Extraídos carregar_formulario_e_respostas, redirect_para_formulario_com_alerta, salvar_respostas
|
formularios_controller.rb#create |
20.71 | ≤15 | Extraídos render_create_success, render_create_failure
|
formularios_controller.rb#exportar_csv |
17.83 | ≤15 | Extraídos gerar_csv, cabecalho_csv, linha_csv
|
formularios_controller.rb#formularios_pendentes_para |
16.43 | ≤15 | Extraído papel_por_turma
|
templates_controller.rb#create |
20.83 | ≤15 | Extraído salvar_novo_template
|
templates_controller.rb#update |
32.26 | ≤15 | Extraídos processar_atualizacao_template, atualizar_template, persistir_questao
|
class_members_importer.rb#call |
19.85 | ≤15 | Extraído process_member
|
class_members_importer.rb#department_for |
16.16 | ≤15 | Extraído resolve_department_code
|
class_members_importer.rb#sync_user |
27.44 | ≤15 | Extraídos create_user, apply_user_updates, build_user_updates
|
classes_importer.rb#call |
17.72 | ≤15 | Extraídos find_course_class, sync_course_class
|
classes_importer.rb#department_for |
16.16 | ≤15 | Extraído resolve_department_code
|
data_synchronizer.rb#call |
20.42 | ≤15 | Extraído build_result
|
Resultado: rubocop --only Metrics/AbcSize - 0 ofensas detectadas.
RubyCritic: 84.44% do código nota A
| Arquivo / Método | Complexidade antes | Complexidade depois | Mudanças realizadas |
|---|---|---|---|
class_members_importer.rb#department_for |
8 | ≤7 | Extração de resolve_department_code eliminou a cadeia de || com safe navigation do método principal |
class_members_importer.rb#sync_user |
9 | ≤7 | Extração de create_user, apply_user_updates e build_user_updates distribuiu os branches condicionais |
classes_importer.rb#department_for |
8 | ≤7 | Extração de resolve_department_code (mesmo padrão do importer acima) |
Resultado: rubocop --only Metrics/CyclomaticComplexity - 0 ofensas detectadas.
Nota 1: A ferramenta
Saikuronão possuía versão estável para Ruby > 4.5; por isso orubocopfoi utilizado como ferramenta principal de análise de complexidade ciclomática.
Nota 2: a redução de complexidade ciclomática foi obtida como consequência direta da refatoração do ABC score. Os mesmos métodos eram fonte de ambos os problemas.
Para análise do ABC Score foram utilizadas as gemas rubycritic e rubocop. O RubyCritic gerava um documento indicando a qualidade do código por arquivo com notas de A até F, enquanto o RuboCop indicava quais arquivos precisavam de atenção e correção imediata:
bundle exec rubocop --only Metrics/AbcSize
bundle exec rubycritic app/O painel do RubyCritic é gerado e armazenado no diretório tmp/rubycritic/.
Foram documentados, para cada método:
- Sua finalidade;
- Os argumentos recebidos;
- Os valores de retorno possíveis;
- Seus efeitos colaterais, como alterações no banco, envio de e-mails, renderizações e redirecionamentos.
Exemplo do padrão utilizado:
##
# Localiza um usuário pelo e-mail ou pela matrícula.
#
# === Argumentos
#
# +identifier+:: E-mail ou matrícula informada no login.
#
# === Retorno
#
# Retorna o User encontrado ou +nil+ quando não há correspondência.
#
# === Efeitos colaterais
#
# Consulta o banco de dados.
def self.find_for_login(identifier)A gema SimpleCov já faz parte do pacote de testes RSpec. Foram adicionados os testes necessários para completar os métodos novos da sprint, além de refatorados os testes já existentes de acordo com o nível de cobertura indicado pela análise. Foi alcançada uma cobertura de 99.14% no final da sprint.
Os testes criados ou refatorados foram todos implementados contemplando os caminhos feliz e triste. Os cenários BDD já foram implementados com ambos os caminhos desde a sprint 1, garantindo que fosse possível ajustar o funcionamento da aplicação com eles em mente desde o início.
TODO DESCRIÇÃO DO FLUXO