Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
f1b491a
gerando framework
rafaelghiorzi May 25, 2026
19cd386
adicionando suporte para cucumber]
rafaelghiorzi May 25, 2026
6eb995a
remove temp error
rafaelghiorzi May 25, 2026
8e592a9
add AGENTS.md to gitignore
diegogontijo May 25, 2026
a0e1211
add .md file to gitignore
diegogontijo May 25, 2026
7add62d
feat: add auth BDD scenarios
diegogontijo May 25, 2026
11b2d8c
dependencies
diegogontijo May 25, 2026
601f7d6
Feat: Adicionar BDDs de admin - templates
rafaelghiorzi May 25, 2026
41ba695
feat: adicionar BDDs
lfducat May 26, 2026
718c242
fix: arrumar conflito de nomes em features
lfducat May 26, 2026
af00edc
feat: BDDs de participante e exportacao de resultados
GabLopes12 May 27, 2026
84b772f
Merge pull request #1 from GabLopes12/sprint-1
rafaelghiorzi Jun 10, 2026
02f7ada
feat: criando banco de dados
rafaelghiorzi Jun 11, 2026
8b27727
feat: respostas e exportacao CSV ( #99 e #101)
GabLopes12 Jun 14, 2026
c546e20
test: testes de integracao com rspec (#99 e #101)
GabLopes12 Jun 14, 2026
4e680f8
feat: issues #112 #111 #103 #102 feitas
rafaelghiorzi Jun 15, 2026
34e52ea
refac: Adicionando factories para RSpec
rafaelghiorzi Jun 15, 2026
fee8a51
feat: implementar fluxo de autenticação
diegogontijo Jun 15, 2026
35b9f55
fix: correcting tests and seed files
rafaelghiorzi Jun 16, 2026
bc31226
refac: consolidating users into a single model
rafaelghiorzi Jun 16, 2026
331ae53
Feat: listagem, resposta de alunos e exportação CSV
GabLopes12 Jun 17, 2026
42f2b04
feat: importar/atualizar com dados do SIGAA
lfducat Jun 17, 2026
532e585
Revert "feat: importar/atualizar com dados do SIGAA"
lfducat Jun 17, 2026
3c0ac70
Reapply "feat: importar/atualizar com dados do SIGAA"
lfducat Jun 17, 2026
2aadf00
fix: corrigindo falhas do RSpec (clonagem de questões e autenticação …
rafaelghiorzi Jun 23, 2026
b60e19f
feat: corrigindo cenários BDD e implementando gerenciamento de turmas…
rafaelghiorzi Jun 23, 2026
acee1cf
test: cobertura RSpec acima de 90% via SimpleCov e remoção de scaffol…
rafaelghiorzi Jun 23, 2026
db2c4a2
feat: aplicando design do Figma (paleta, layout, telas)
rafaelghiorzi Jun 23, 2026
bc3b594
chore: limpando código órfão e atualizando documentação do domínio
rafaelghiorzi Jun 23, 2026
0a809cc
fix: corrigindo visualização das respostas dos formulários
rafaelghiorzi Jun 23, 2026
72309cc
feat: adicionando gema de coverage para testes de cobertura
rafaelghiorzi Jun 30, 2026
6007a7f
corrigindo erros de formatação com rubocop
rafaelghiorzi Jun 30, 2026
7eed8cf
refac: Incrementando cobertura de código RSPEC
rafaelghiorzi Jun 30, 2026
342f07b
refac: Melhorando ABC score dos métodos críticos
rafaelghiorzi Jun 30, 2026
476e2df
refac: Reduzindo complexidade ciclomática de métodos detectados
rafaelghiorzi Jun 30, 2026
7572231
feat: adicionando configuração Docker para desenvolvimento e testes
rafaelghiorzi Jun 30, 2026
f294070
docs: relatório de qualidade com tabelas de coverage, ABC score e com…
rafaelghiorzi Jun 30, 2026
e3f6477
criar documentacao completa. (project/doc/index.html)
diegogontijo Jun 30, 2026
9cc70a9
fix: corrigindo conflitos de merge
rafaelghiorzi Jun 30, 2026
7f3bfd9
feat: README (gerado por IA)
rafaelghiorzi Jun 30, 2026
4062351
fix:começando correção de CI
rafaelghiorzi Jun 30, 2026
296dff2
fix:CI refatorado
rafaelghiorzi Jul 1, 2026
ed48eec
fix: corrigindo versões de gemas e CI
rafaelghiorzi Jul 1, 2026
2df3952
fix:esqueci de commitar o CI
rafaelghiorzi Jul 1, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
9 changes: 9 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# See https://git-scm.com/docs/gitattributes for more about git attribute files.

# Mark the database schema as having been generated.
project/db/schema.rb linguist-generated

# Mark any vendored files as having been vendored.
project/vendor/* linguist-vendored
project/config/credentials/*.yml.enc diff=rails_credentials
project/config/credentials.yml.enc diff=rails_credentials
12 changes: 12 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
version: 2
updates:
- package-ecosystem: bundler
directory: "/project"
schedule:
interval: weekly
open-pull-requests-limit: 10
- package-ecosystem: github-actions
directory: "/project"
schedule:
interval: weekly
open-pull-requests-limit: 10
139 changes: 139 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
name: CI

defaults:
run:
working-directory: project

on:
pull_request:
push:
branches: [ main, sprint-3 ]

jobs:
scan_ruby:
runs-on: ubuntu-latest

steps:
- name: Checkout code
uses: actions/checkout@v6

- name: Set up Ruby
uses: ruby/setup-ruby@v1
with:
bundler-cache: true
working-directory: project

- name: Scan for common Rails security vulnerabilities using static analysis
run: bin/brakeman --no-pager

- name: Scan for known security vulnerabilities in gems used
run: bin/bundler-audit

scan_js:
runs-on: ubuntu-latest

steps:
- name: Checkout code
uses: actions/checkout@v6

- name: Set up Ruby
uses: ruby/setup-ruby@v1
with:
bundler-cache: true
working-directory: project

- name: Scan for security vulnerabilities in JavaScript dependencies
run: bin/importmap audit

lint:
runs-on: ubuntu-latest
env:
RUBOCOP_CACHE_ROOT: tmp/rubocop
steps:
- name: Checkout code
uses: actions/checkout@v6

- name: Set up Ruby
uses: ruby/setup-ruby@v1
with:
bundler-cache: true
working-directory: project

- name: Prepare RuboCop cache
uses: actions/cache@v4
env:
DEPENDENCIES_HASH: ${{ hashFiles('project/.ruby-version', '**/.rubocop.yml', '**/.rubocop_todo.yml', 'project/Gemfile.lock') }}
with:
path: project/${{ env.RUBOCOP_CACHE_ROOT }}
key: rubocop-${{ runner.os }}-${{ env.DEPENDENCIES_HASH }}-${{ github.ref_name == github.event.repository.default_branch && github.run_id || 'default' }}
restore-keys: |
rubocop-${{ runner.os }}-${{ env.DEPENDENCIES_HASH }}-

- name: Lint code for consistent style
run: bin/rubocop -f github

test:
runs-on: ubuntu-latest

# services:
# redis:
# image: valkey/valkey:8
# ports:
# - 6379:6379
# options: --health-cmd "redis-cli ping" --health-interval 10s --health-timeout 5s --health-retries 5
steps:
- name: Checkout code
uses: actions/checkout@v6

- name: Install packages
run: sudo apt-get update && sudo apt-get install --no-install-recommends -y libvips

- name: Set up Ruby
uses: ruby/setup-ruby@v1
with:
bundler-cache: true
working-directory: project

- name: Run tests
env:
RAILS_ENV: test
# RAILS_MASTER_KEY: ${{ secrets.RAILS_MASTER_KEY }}
# REDIS_URL: redis://localhost:6379/0
run: bin/rails db:test:prepare && bundle exec rspec

system-test:
runs-on: ubuntu-latest

# services:
# redis:
# image: valkey/valkey:8
# ports:
# - 6379:6379
# options: --health-cmd "redis-cli ping" --health-interval 10s --health-timeout 5s --health-retries 5
steps:
- name: Checkout code
uses: actions/checkout@v6

- name: Install packages
run: sudo apt-get update && sudo apt-get install --no-install-recommends -y libvips

- name: Set up Ruby
uses: ruby/setup-ruby@v1
with:
bundler-cache: true
working-directory: project

- name: Run System Tests
env:
RAILS_ENV: test
# RAILS_MASTER_KEY: ${{ secrets.RAILS_MASTER_KEY }}
# REDIS_URL: redis://localhost:6379/0
run: bin/rails db:test:prepare && bundle exec cucumber

- name: Keep screenshots from failed system tests
uses: actions/upload-artifact@v4
if: failure()
with:
name: screenshots
path: ${{ github.workspace }}/project/tmp/screenshots
if-no-files-found: ignore
42 changes: 42 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
# See https://help.github.com/articles/ignoring-files for more about ignoring files.
#
# Temporary files generated by your text editor or operating system
# belong in git's global ignore instead:
# `$XDG_CONFIG_HOME/git/ignore` or `~/.config/git/ignore`

# Ignore bundler config.
project/.bundle

# Ignore all environment files.
project/.env*

# Ignore all logfiles and tempfiles.
project/log/*
project/tmp/*
!project/log/.keep
!project/tmp/.keep

# Ignore pidfiles, but keep the directory.
project/tmp/pids/*
!project/tmp/pids/
!project/tmp/pids/.keep

# Ignore storage (uploaded files in development and any SQLite databases).
project/storage/*
!project/storage/.keep
project/tmp/storage/*
!project/tmp/storage/
!project/tmp/storage/.keep

project/public/assets

# Ignore key files for decrypting credentials and more.
project/config/*.key

AGENTS.md
PROJECT_CONTEXT.md

CLAUDE.md
.claude/

codex/
94 changes: 93 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,94 @@
# CAMAAR
Sistema para avaliação de atividades acadêmicas remotas do CIC

**CAMAAR** (Sistema para Avaliação de Atividades Acadêmicas Remotas) é uma aplicação web desenvolvida para o **CIC (Departamento de Ciência da Computação)** que automatiza a criação, aplicação e análise de questionários de avaliação de disciplinas e turmas. O sistema substitui processos manuais de coleta de feedback acadêmico, integrando-se aos dados institucionais do **SIGAA** para gerenciar turmas, docentes e discentes.

Projeto desenvolvido como parte da disciplina de Engenharia de Software (forked de `EngSwCIC/CAMAAR`), ao longo de três sprints de desenvolvimento documentadas na [Wiki do repositório](https://github.com/GabLopes12/CAMAAR/wiki).

## Equipe

- Diego Guedes Gontijo
- Gabriel Lopes Soares Damasceno
- Luiz Felipe Ducat — *Product Owner*
- Rafael Dias Ghiorzi — *Scrum Master*

## Funcionalidades

### Importação e gestão de dados (SIGAA)
- Importação de turmas, departamentos, docentes e discentes a partir de arquivos do SIGAA
- Detecção e relatório de inconsistências durante a importação
- Provisionamento automático de contas de usuário, com notificação por e-mail
- Definição e recuperação de senha por token enviado por e-mail

### Templates e formulários
- Criação de templates de questionário reutilizáveis pelo administrador
- Geração de formulários de avaliação a partir de templates, distribuídos para turmas específicas
- Exclusão de templates sem afetar formulários já gerados a partir deles

### Respostas e submissões
- Listagem de formulários pendentes e respondidos para cada participante (docente/discente)
- Submissão de respostas a questionários pelos participantes das turmas
- Exportação dos resultados de um formulário em CSV para análise externa

### Autenticação e perfis
- Login por e-mail ou matrícula, com senha segura (`has_secure_password`)
- Controle de acesso por papel (administrador, docente, discente)
- Dashboard inicial com visão geral das atividades pendentes

## Tecnologias

| Categoria | Tecnologia |
|---|---|
| Linguagem / Framework | Ruby 3.4.9, Rails ~> 8.1 |
| Frontend | Hotwire (Turbo + Stimulus), Propshaft |
| Banco de dados | SQLite |
| Servidor de aplicação | Puma |
| Autenticação | bcrypt (`has_secure_password`) |
| Testes unitários/integração | RSpec, FactoryBot, SimpleCov |
| Testes BDD | Cucumber (Gherkin) |
| Qualidade de código | RuboCop, Brakeman, RubyCritic |
| Documentação | RDoc |
| Containerização | Docker |
| Deploy | Kamal |

## Como executar o projeto

A aplicação Rails está em [`project/`](project).

### Pré-requisitos
- Ruby 3.4.9
- Bundler

### Instalação local

```bash
cd project
bundle install
bin/rails db:setup
bin/rails server
```

A aplicação ficará disponível em `http://localhost:3000`.

### Via Docker

```bash
cd project
docker build -f Dockerfile.dev -t camaar-dev .
docker run -p 3000:3000 camaar-dev
```

### Executando os testes

```bash
cd project
bundle exec rspec # testes unitários e de integração
bundle exec cucumber # cenários BDD
```

## Histórico de desenvolvimento

O projeto foi construído em três sprints, documentadas na wiki:

- [Sprint 1](https://github.com/GabLopes12/CAMAAR/wiki/Documenta%C3%A7%C3%A3o-e-Implementa%C3%A7%C3%A3o:-Sprint-1) — definição do escopo, padrões de desenvolvimento e estrutura inicial do projeto (login, templates, formulários, importação SIGAA, exportação CSV).
- [Sprint 2](https://github.com/GabLopes12/CAMAAR/wiki/Documenta%C3%A7%C3%A3o-e-Implementa%C3%A7%C3%A3o:-Sprint-2) — implementação das funcionalidades principais: templates de formulário, submissão de respostas, exportação CSV, autenticação e sincronização com o SIGAA.
- [Sprint 3](https://github.com/GabLopes12/CAMAAR/wiki/Documenta%C3%A7%C3%A3o-e-Implementa%C3%A7%C3%A3o:-Sprint-3) — refino e qualidade: redução de complexidade ciclomática, eliminação de violações de ABC Score, ampliação da cobertura de testes (RSpec/SimpleCov) e documentação via RDoc.
17 changes: 17 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
services:
web:
build:
context: ./project
dockerfile: Dockerfile.dev
ports:
- "3000:3000"
volumes:
- ./project:/rails
- ./class_members.json:/class_members.json:ro
- ./classes.json:/classes.json:ro
- bundle_cache:/usr/local/bundle
environment:
RAILS_ENV: development

volumes:
bundle_cache:
51 changes: 51 additions & 0 deletions project/.dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
# See https://docs.docker.com/engine/reference/builder/#dockerignore-file for more about ignoring files.

# Ignore git directory.
/.git/
/.gitignore

# Ignore bundler config.
/.bundle

# Ignore all environment files.
/.env*

# Ignore all default key files.
/config/master.key
/config/credentials/*.key

# Ignore all logfiles and tempfiles.
/log/*
/tmp/*
!/log/.keep
!/tmp/.keep

# Ignore pidfiles, but keep the directory.
/tmp/pids/*
!/tmp/pids/.keep

# Ignore storage (uploaded files in development and any SQLite databases).
/storage/*
!/storage/.keep
/tmp/storage/*
!/tmp/storage/.keep

# Ignore assets.
/node_modules/
/app/assets/builds/*
!/app/assets/builds/.keep
/public/assets

# Ignore CI service files.
/.github

# Ignore Kamal files.
/config/deploy*.yml
/.kamal

# Ignore development files
/.devcontainer

# Ignore Docker-related files
/.dockerignore
/Dockerfile*
7 changes: 7 additions & 0 deletions project/.document
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# Ruby production code documented by RDoc.
app/controllers
app/helpers
app/jobs
app/mailers
app/models
app/services
1 change: 1 addition & 0 deletions project/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
coverage/
3 changes: 3 additions & 0 deletions project/.kamal/hooks/docker-setup.sample
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#!/bin/sh

echo "Docker set up on $KAMAL_HOSTS..."
3 changes: 3 additions & 0 deletions project/.kamal/hooks/post-app-boot.sample
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#!/bin/sh

echo "Booted app version $KAMAL_VERSION on $KAMAL_HOSTS..."
Loading